Files
dou_fire/pages/work/service.vue
2022-12-27 09:17:32 +08:00

468 lines
11 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="content">
<!-- 服务包列表 -->
<view class="services">
<view class="services-null" v-if="services.length <= 0">
<u-empty
mode="data"
icon="http://cdn.uviewui.com/uview/empty/data.png"
text="暂无添加服务包"
>
</u-empty>
</view>
<view class="services-list" v-else>
<view class="services-item" v-for="(item, index) in services" :key="index">
<view class="services-header">
<view class="title">{{item.title}}<text>{{item.tag}}</text></view>
<view class="remove" @click="onRemove(item, index)">移出</view>
</view>
<view class="services-content">
<block v-for="(citem, cindex) in item.items" :key="cindex">
<view class="services-content-item">
<view class="services-flex">
<label class="services-flex-label nowrap">服务类型</label>
<view class="services-flex-val nowrap">{{citem.business}}({{citem.type}})</view>
</view>
<view class="services-flex">
<label class="services-flex-title nowrap">{{citem.title}}</label>
<view class="services-flex-price nowrap"><text></text>{{citem.price}}</view>
</view>
</view>
</block>
</view>
<view class="services-price">服务包价格<text>{{item.price}}</text></view>
</view>
</view>
</view>
<!-- 选择业务 -->
<u-popup :show="institutionsShow" round="20rpx" closeable @close="institutionsShow = false, itemsVal = []">
<view class="institutions">
<view class="institutions-title">选择业务</view>
<scroll-view scroll-y class="institutions-scroll">
<view class="institutions-lists" v-if="institutions.length > 0">
<view class="institutions-block" :class="{ 'active': item.isChoose }" v-for="(item, index) in institutions" :key="index" @click="onInstitution(item, index)">
<view class="institutions-block-item">
<label>业务类型</label>
<view class="val nowrap">{{item.business}}({{item.type}})</view>
</view>
<view class="institutions-block-item">
<label>业务机构</label>
<view class="val nowrap">{{item.title}}</view>
</view>
<view class="institutions-block-item">
<label>金额</label>
<view class="val price nowrap">{{item.price}}</view>
</view>
</view>
</view>
<view v-else class="institutions-null">
<u-empty
mode="list"
icon="http://cdn.uviewui.com/uview/empty/list.png"
text="暂无可分配的业务"
>
</u-empty>
</view>
</scroll-view>
<view class="institutions-footer">
<button class="btn" @click="onAddService" :disabled="itemsVal.length <= 0">选好了({{itemsVal.length}})</button>
</view>
</view>
</u-popup>
<!-- footer -->
<view class="footer">
<view class="footer-total">{{services.length}}个服务包总价格<text>{{total}}</text></view>
<button class="footer-btn" :disabled="services.length <= 0" @click="onServiceOver">保存配置服务包</button>
</view>
</view>
</template>
<script>
import { service, serviceAdd, serviceRemove, serviceOver } from '@/apis/interfaces/order.js'
export default {
data() {
return {
total : '0.00',
orderId : '',
institutions : [],
services : [],
itemsVal : [],
institutionsShow: false
};
},
created() {
this.orderId = this.$Route.query.orderId
// 开始配置服务包
this.getService()
},
methods: {
// 获取业务
getService(){
service(this.orderId).then(res => {
let { institutions, services, total } = res;
this.institutions = institutions.map(val => {
val.isChoose = false
return val;
})
this.total = total;
this.services = services;
}).catch(err => {
uni.showToast({
title: err.message,
icon : 'none'
})
})
},
// 选择业务
onInstitution(val, index){
let idIndex = this.itemsVal.findIndex(e => e === val.item_id)
if(idIndex >= 0){
val.isChoose = !val.isChoose;
this.itemsVal.splice(idIndex, 1)
this.$set(this.institutions, index, val)
return
}
if(idIndex < 0 && this.itemsVal.length <= 2){
val.isChoose = !val.isChoose;
this.itemsVal.push(val.item_id)
this.$set(this.institutions, index, val)
return
}
uni.showToast({
title: '单一服务包业务数量不可以超过3项',
icon : 'none'
})
},
// 新增服务包
onAddService(){
serviceAdd(this.orderId, this.itemsVal).then(res => {
let { institutions, services, total } = res;
this.institutions = institutions.map(val => {
val.isChoose = false
return val;
});
this.total = total;
this.services = services
this.itemsVal = []
this.institutionsShow = false
}).catch(err => {
uni.showToast({
title: err.message,
icon : 'none'
})
})
},
// 删除服务包
onRemove(val, index){
serviceRemove(this.orderId, {
group_no: val.group_no
} ).then(res => {
let { institutions, services, total } = res;
this.institutions = institutions.map(val => {
val.isChoose = false
return val;
});
this.total = total;
this.services = services;
}).catch(err => {
uni.showToast({
title: err.message,
icon : 'none'
})
})
},
// 保存配置服务包
onServiceOver(){
if(this.institutions.length > 0){
uni.showModal({
title : '提示',
content : '当前还有' + this.institutions.length + '项业务未匹配服务包,是否放弃未匹配的业务继续保存服务包?',
cancelText : '继续配置',
cancelColor : '#FFAB3F',
confirmText : '立即保存',
confirmColor: '#446EFE',
success : res => {
if(res.confirm){
this.onSubmitService()
}
}
})
return
}
this.onSubmitService()
},
// 提交保存服务
onSubmitService(){
uni.showModal({
title : '提示',
content : '是否确认提交服务包配置给客户,提交后不可修改',
cancelText : '稍后',
confirmText : '提交',
success : ModalRes => {
if(ModalRes.confirm){
wx.showLoading({
title: '保存中...',
mask : true
})
serviceOver(this.orderId).then(res => {
uni.showModal({
content : res.message,
showCancel : false,
confirmColor: '#446EFE',
success : res => {
if(res.confirm){
this.$store.commit('setOrderId', this.orderId)
uni.navigateBack()
}
}
})
}).catch(err => {
uni.showToast({
title: err.message,
icon : 'none'
})
})
}
}
})
}
},
onNavigationBarButtonTap() {
this.institutionsShow = true
}
}
</script>
<style lang="scss">
// 服务包列表
.services{
padding-bottom: 250rpx;
box-sizing: border-box;
.services-null{
height: 70vh;
display: flex;
justify-content: center;
align-items: center;
}
// 服务包列表
.services-list{
padding: 10rpx 30rpx;
.services-item{
background: white;
border-radius: 20rpx;
padding: 30rpx;
margin: 30rpx 0;
.services-header{
display: flex;
justify-content: space-between;
align-items: center;
padding-bottom: 20rpx;
.title{
font-size: 32rpx;
font-weight: bold;
color: #111;
width: calc(100% - 150rpx);
text{
background: $main-color;
color: white;
font-weight: normal;
font-size: 26rpx;
border-radius: 10rpx;
padding: 0 10rpx;
margin-left: 10rpx;
line-height: 40rpx;
}
}
.remove{
background: rgba(68, 110, 254, .1);
color: #446EFE;
height: 50rpx;
line-height: 50rpx;
width: 100rpx;
border-radius: 25rpx;
text-align: center;
font-size: 28rpx;
}
}
.services-content{
background-color: rgba(68, 110, 254, .03);
border-radius: 10rpx;
margin: 15rpx 0;
padding: 0 25rpx;
.services-content-item{
border-bottom: solid 1rpx #f6f6f6;
padding: 20rpx 0;
&:last-child{
border: none;
}
}
.services-flex{
display: flex;
font-size: 30rpx;
line-height: 55rpx;
.services-flex-label{
width: 150rpx;
color: #111111;
}
.services-flex-val{
width: calc(100% - 150rpx);
text-align: right;
color: gray;
}
.services-flex-title{
width: 50%;
color: #111111;
font-size: 30rpx;
}
.services-flex-price{
font-size: 30rpx;
width: 50%;
text-align: right;
font-weight: bold;
color: #111111;
}
}
}
.services-price{
display: flex;
justify-content: space-between;
align-items: center;
font-size: 30rpx;
color: gray;
line-height: 60rpx;
text{
color: $text-price;
font-weight: bold;
font-size: 34rpx;
}
}
}
}
}
// 添加服务包
.institutions{
padding: 0 0 180rpx;
position: relative;
// 标题
.institutions-title{
padding: 30rpx;
text-align: center;
font-size: 36rpx;
font-weight: bold;
line-height: 60rpx;
}
// 列表
.institutions-scroll{
height: 65vh;
.institutions-null{
height: 50vh;
display: flex;
justify-content: center;
align-items: center;
}
.institutions-lists{
padding: 15rpx 0;
.institutions-block{
margin: 15rpx 30rpx;
background: #f8f8f8;
padding: 30rpx;
border-radius: 20rpx;
border:solid 1rpx #f8f8f8;
box-sizing: border-box;
.institutions-block-item{
display: flex;
justify-content: space-between;
line-height: 50rpx;
font-size: 30rpx;
label{
color: gray;
width: 200rpx;
}
.val{
width: calc(100% - 200rpx);
text-align: right;
&.price{
color: $text-price;
font-weight: bold;
}
}
}
&.active{
background-color: #E4E8F7;
border-color: $main-color;
}
}
}
}
// footer
.institutions-footer{
position: absolute;
bottom: 0;
left: 0;
right: 0;
padding: 30rpx 30rpx 50rpx;
.btn{
background: $main-color;
height: 100rpx;
line-height: 100rpx;
color: white;
font-size: 32rpx;
border-radius: $radius-lg;
&::after{
display: none;
}
&[disabled]{
background-color: $main-color;
color: white;
opacity: .7;
}
}
}
}
// footer
.footer{
padding: 30rpx 30rpx 50rpx;
background: white;
position: fixed;
width: 100%;
box-sizing: border-box;
bottom: 0;
left: 0;
z-index: 9;
box-shadow: 0 0 10rpx 10rpx rgba(0, 0, 0, .02);
.footer-total{
padding-bottom: 30rpx;
text-align: center;
font-size: 30rpx;
color: gray;
line-height: 40rpx;
text{
font-weight: bold;
color: red;
}
}
.footer-btn{
background: $main-color;
height: 100rpx;
line-height: 100rpx;
color: white;
font-size: 32rpx;
border-radius: $radius-lg;
&::after{
display: none;
}
.icon{
display: inline-block;
vertical-align: middle;
margin-right: 10rpx;
margin-bottom: 5rpx;
}
&[disabled]{
background-color: $main-color;
color: white;
opacity: .7;
}
}
}
</style>