2025-03-14 16:55:12 +08:00
|
|
|
|
<template>
|
|
|
|
|
|
<view>
|
|
|
|
|
|
<uni-nav-bar leftText=" " :fixed="true" :border="false" leftIcon="back" @clickLeft="leftClick" color="#000000" backgroundColor="#fff" :statusBar="true" title="添加跟进"></uni-nav-bar>
|
|
|
|
|
|
<view class="content">
|
|
|
|
|
|
<view class="cell">
|
|
|
|
|
|
<view>跟进方式</view>
|
|
|
|
|
|
<view class="right">
|
|
|
|
|
|
<u-radio-group v-model="form.followType">
|
|
|
|
|
|
<u-radio name="1">在线跟进</u-radio>
|
|
|
|
|
|
<u-radio name="2">拜访</u-radio>
|
|
|
|
|
|
</u-radio-group>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<u-divider text=""></u-divider>
|
|
|
|
|
|
<view class="cell">
|
|
|
|
|
|
<view>跟进时间</view>
|
|
|
|
|
|
<view class="right" @click="show = true">
|
|
|
|
|
|
<input placeholder="跟进时间" v-model="form.firstFollow" />
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<u-divider text=""></u-divider>
|
|
|
|
|
|
<view class="cell1" v-if="form.followType==1">
|
|
|
|
|
|
<view>上传跟进最后聊天截图</view>
|
|
|
|
|
|
<view>
|
|
|
|
|
|
<uni-file-picker fileMediatype="image" limit="1" :del-icon="false" disable-preview @select="select" @delete="delfn('front_45_degree')">
|
|
|
|
|
|
<image src="/static/image/customer/upimg.png" mode="" class="addimg"></image>
|
|
|
|
|
|
</uni-file-picker>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view class="cell" v-if="form.followType==2">
|
|
|
|
|
|
<view>当前位置</view>
|
|
|
|
|
|
<view class="right">
|
|
|
|
|
|
<input placeholder="输入当前位置" v-model="form.phone" />
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<u-divider text="" v-if="form.followType==2"></u-divider>
|
|
|
|
|
|
<view class="cell1" v-if="form.followType==2">
|
|
|
|
|
|
<view>当前位置拍照上传</view>
|
|
|
|
|
|
<view style="margin-top: 10px;">
|
2025-03-15 15:46:16 +08:00
|
|
|
|
<uni-file-picker fileMediatype="image" limit="1" :del-icon="false" disable-preview @select="select1" @delete="delfn('front_45_degree')">
|
2025-03-14 16:55:12 +08:00
|
|
|
|
<image src="/static/image/customer/upimg.png" mode="" class="addimg"></image>
|
|
|
|
|
|
</uni-file-picker>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<u-divider text="" v-if="form.followType==2"></u-divider>
|
|
|
|
|
|
<view class="cell1" v-if="form.followType==2">
|
|
|
|
|
|
<view>拜访内容</view>
|
|
|
|
|
|
<view class="yuyin">
|
2025-03-15 15:46:16 +08:00
|
|
|
|
<textarea auto-height v-model="form.bf_desc" placeholder="拜访内容..."/>
|
|
|
|
|
|
<image src="/static/image/customer/yuyin.png" mode="" @tap="startRecognizebd"></image>
|
2025-03-14 16:55:12 +08:00
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<u-divider text="" v-if="form.followType==2"></u-divider>
|
|
|
|
|
|
<view class="cell1" v-if="form.followType==2">
|
|
|
|
|
|
<view>备注(非必填)</view>
|
2025-03-15 15:46:16 +08:00
|
|
|
|
<view class="yuyin">
|
2025-03-15 15:52:09 +08:00
|
|
|
|
<textarea auto-height v-model="form.mom_desc" placeholder="详细情况..."/>
|
2025-03-15 15:46:16 +08:00
|
|
|
|
<image src="/static/image/customer/yuyin.png" mode="" @tap="startRecognize"></image>
|
2025-03-14 16:55:12 +08:00
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<u-gap height="10" bgColor="#F6F6F6"></u-gap>
|
|
|
|
|
|
<view class="steps">
|
|
|
|
|
|
<view class="title">
|
|
|
|
|
|
跟进记录 <text class="status">跟进中</text>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<u-steps current="0" direction="column" dot>
|
|
|
|
|
|
<u-steps-item title="在线跟进">
|
|
|
|
|
|
<view slot="desc">
|
|
|
|
|
|
<view class="">
|
|
|
|
|
|
时间:2025-03-11 12:00:01
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view class="">
|
|
|
|
|
|
<image src="/static/image/customer/addr.png" mode=""></image>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</u-steps-item>
|
|
|
|
|
|
<u-steps-item title="拜访跟进">
|
|
|
|
|
|
<view slot="desc" class="desc">
|
|
|
|
|
|
<view class="">
|
|
|
|
|
|
<view class="">
|
|
|
|
|
|
时间:2025-03-11 12:00:01
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view class="">地址:迪拜某某地方</view>
|
|
|
|
|
|
<view class="">拜访内容:讨论需求</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view class="">
|
|
|
|
|
|
<image src="/static/image/customer/addr.png" mode=""></image>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</u-steps-item>
|
|
|
|
|
|
<u-steps-item title="拜访跟进">
|
|
|
|
|
|
<view slot="desc" class="desc">
|
|
|
|
|
|
<view class="">
|
|
|
|
|
|
<view class="">
|
|
|
|
|
|
时间:2025-03-11 12:00:01
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view class="">地址:迪拜某某地方</view>
|
|
|
|
|
|
<view class="">拜访内容:讨论需求</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view class="">
|
|
|
|
|
|
<image src="/static/image/customer/addr.png" mode=""></image>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</u-steps-item>
|
|
|
|
|
|
</u-steps>
|
|
|
|
|
|
<!-- <empty :list="brandList"></empty> -->
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<u-gap height="100" bgColor="#fff"></u-gap>
|
|
|
|
|
|
<view class="foot">
|
|
|
|
|
|
<button class="btn1" @click="nextFn">下次跟进提醒</button>
|
|
|
|
|
|
<button class="btn" @click="nextFn">提交</button>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<u-datetime-picker
|
|
|
|
|
|
:show="show"
|
|
|
|
|
|
v-model="firstFollow"
|
|
|
|
|
|
mode="datetime"
|
|
|
|
|
|
@confirm="confirm"
|
|
|
|
|
|
@cancel="cancel"
|
|
|
|
|
|
@change="change"
|
|
|
|
|
|
></u-datetime-picker>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
<script>
|
2025-03-15 15:46:16 +08:00
|
|
|
|
import permision from "@/common/permission.js"
|
2025-03-14 16:55:12 +08:00
|
|
|
|
import { request,showToast } from '@/api/apiT.js'
|
|
|
|
|
|
export default {
|
|
|
|
|
|
data() {
|
|
|
|
|
|
return {
|
|
|
|
|
|
brandList:[],
|
|
|
|
|
|
energyList:[],
|
|
|
|
|
|
typesList:[],
|
|
|
|
|
|
show:false,
|
|
|
|
|
|
firstFollow: '2025-03-11 12:00:01',
|
|
|
|
|
|
form: {
|
|
|
|
|
|
name: '',
|
|
|
|
|
|
followType: '1',
|
|
|
|
|
|
phone: '',
|
|
|
|
|
|
preference: '赵野军',
|
|
|
|
|
|
level: '初步接触',
|
|
|
|
|
|
region: '',
|
|
|
|
|
|
firstFollow: '2025-03-11 12:00:01',
|
2025-03-15 15:46:16 +08:00
|
|
|
|
details: '',
|
2025-03-15 15:52:09 +08:00
|
|
|
|
bf_desc:'',
|
|
|
|
|
|
mom_desc:'',
|
2025-03-14 16:55:12 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
onLoad() {
|
|
|
|
|
|
const { windowWidth, windowHeight } = uni.getSystemInfoSync();
|
|
|
|
|
|
this.x = windowWidth-70
|
|
|
|
|
|
this.y = windowHeight-185
|
|
|
|
|
|
},
|
|
|
|
|
|
methods: {
|
|
|
|
|
|
|
|
|
|
|
|
leftClick(){
|
|
|
|
|
|
uni.navigateBack({})
|
2025-03-15 15:46:16 +08:00
|
|
|
|
},
|
|
|
|
|
|
nextFn(){
|
|
|
|
|
|
|
2025-03-14 16:55:12 +08:00
|
|
|
|
},
|
|
|
|
|
|
cancel() {
|
|
|
|
|
|
this.show = false
|
|
|
|
|
|
},
|
|
|
|
|
|
confirm(e) {
|
|
|
|
|
|
this.show = false
|
|
|
|
|
|
this.form.firstFollow = this.result(e.value, e.mode)
|
|
|
|
|
|
console.log(this.result(e.value, e.mode))
|
|
|
|
|
|
console.log(this.form.firstFollow )
|
|
|
|
|
|
},
|
|
|
|
|
|
change(e) {
|
|
|
|
|
|
// console.log('change', e)
|
|
|
|
|
|
},
|
|
|
|
|
|
result(time, mode) {
|
|
|
|
|
|
const timeFormat = uni.$u.timeFormat
|
|
|
|
|
|
switch (mode) {
|
|
|
|
|
|
case 'datetime':
|
|
|
|
|
|
return timeFormat(time, 'yyyy-mm-dd hh:MM')
|
|
|
|
|
|
case 'date':
|
|
|
|
|
|
return timeFormat(time, 'yyyy-mm-dd')
|
|
|
|
|
|
case 'year-month':
|
|
|
|
|
|
return timeFormat(time, 'yyyy-mm')
|
|
|
|
|
|
case 'time':
|
|
|
|
|
|
return time
|
|
|
|
|
|
default:
|
|
|
|
|
|
return ''
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
2025-03-15 15:46:16 +08:00
|
|
|
|
delfn(name){
|
|
|
|
|
|
console.log(name)
|
|
|
|
|
|
that.carinfo[name] =''
|
|
|
|
|
|
},
|
|
|
|
|
|
uploadfn(imgUrl,name){
|
|
|
|
|
|
var that = this;
|
|
|
|
|
|
uni.uploadFile({
|
|
|
|
|
|
url: 'https://api.collect.hs.hnzhwlkj.club/upload',
|
|
|
|
|
|
filePath: imgUrl,
|
|
|
|
|
|
name: 'image',
|
|
|
|
|
|
header:{'content-type': 'application/x-www-form-urlencoded','Authorization': 'Bearer ' + uni.getStorageSync('token')},
|
|
|
|
|
|
success: (uploadFileRes) => {
|
|
|
|
|
|
const path=JSON.parse(uploadFileRes.data)
|
|
|
|
|
|
that.carinfo[name] = path.data.image_name
|
|
|
|
|
|
console.log(that.carinfo)
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
},
|
|
|
|
|
|
select(e){
|
|
|
|
|
|
const tempFilePaths = e.tempFilePaths;
|
|
|
|
|
|
const imgUrl=tempFilePaths[0]
|
|
|
|
|
|
this.uploadfn(imgUrl,'front_45_degree')
|
|
|
|
|
|
},
|
|
|
|
|
|
select1(e){
|
|
|
|
|
|
const tempFilePaths = e.tempFilePaths;
|
|
|
|
|
|
const imgUrl=tempFilePaths[0]
|
|
|
|
|
|
this.uploadfn(imgUrl,'front_45_degree')
|
|
|
|
|
|
},
|
|
|
|
|
|
async startRecognizebd () {
|
|
|
|
|
|
// #ifdef APP-PLUS
|
|
|
|
|
|
let status = await this.checkPermission();
|
|
|
|
|
|
if (status !== 1) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
// #endif
|
|
|
|
|
|
// TODO ios 在没有请求过权限之前无法得知是否有相关权限,这种状态下需要直接调用语音,会弹出正在识别的toast
|
|
|
|
|
|
var options = {};
|
|
|
|
|
|
var that = this;
|
|
|
|
|
|
options.engine = 'baidu';
|
2025-03-15 15:52:09 +08:00
|
|
|
|
that.form.bf_desc = "";
|
2025-03-15 15:46:16 +08:00
|
|
|
|
plus.speech.startRecognize(options, function (s) {
|
|
|
|
|
|
console.log(s);
|
2025-03-15 15:52:09 +08:00
|
|
|
|
that.form.bf_desc += s;
|
2025-03-15 15:46:16 +08:00
|
|
|
|
}, function (e) {
|
|
|
|
|
|
console.log("语音识别失败:" + e.message);
|
|
|
|
|
|
});
|
|
|
|
|
|
},
|
|
|
|
|
|
async startRecognize () {
|
|
|
|
|
|
// #ifdef APP-PLUS
|
|
|
|
|
|
let status = await this.checkPermission();
|
|
|
|
|
|
if (status !== 1) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
// #endif
|
|
|
|
|
|
// TODO ios 在没有请求过权限之前无法得知是否有相关权限,这种状态下需要直接调用语音,会弹出正在识别的toast
|
|
|
|
|
|
var options = {};
|
|
|
|
|
|
var that = this;
|
2025-03-15 15:52:09 +08:00
|
|
|
|
that.form.mom_desc = "";
|
2025-03-15 15:46:16 +08:00
|
|
|
|
options.engine = 'iFly';
|
|
|
|
|
|
options.punctuation = false; // 是否需要标点符号
|
|
|
|
|
|
options.timeout = 10 * 1000; //语音录入持续时长
|
|
|
|
|
|
plus.speech.startRecognize(options, function(s) {
|
|
|
|
|
|
console.log(s);
|
2025-03-15 15:52:09 +08:00
|
|
|
|
that.form.mom_desc += s;
|
2025-03-15 15:46:16 +08:00
|
|
|
|
// 关闭语音
|
|
|
|
|
|
plus.speech.stopRecognize();
|
|
|
|
|
|
}, function (e) {
|
|
|
|
|
|
console.log("语音识别失败:" + e.message);
|
|
|
|
|
|
});
|
|
|
|
|
|
},
|
|
|
|
|
|
// #ifdef APP-PLUS
|
|
|
|
|
|
async checkPermission() {
|
|
|
|
|
|
let status = permision.isIOS ? await permision.requestIOS('record') :
|
|
|
|
|
|
await permision.requestAndroid('android.permission.RECORD_AUDIO');
|
|
|
|
|
|
|
|
|
|
|
|
if (status === null || status === 1) {
|
|
|
|
|
|
status = 1;
|
|
|
|
|
|
} else if (status === 2) {
|
|
|
|
|
|
uni.showModal({
|
|
|
|
|
|
content: "系统麦克风已关闭",
|
|
|
|
|
|
confirmText: "确定",
|
|
|
|
|
|
showCancel: false,
|
|
|
|
|
|
success: function(res) {
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
} else {
|
|
|
|
|
|
uni.showModal({
|
|
|
|
|
|
content: "需要麦克风权限",
|
|
|
|
|
|
confirmText: "设置",
|
|
|
|
|
|
success: function(res) {
|
|
|
|
|
|
if (res.confirm) {
|
|
|
|
|
|
permision.gotoAppSetting();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
return status;
|
|
|
|
|
|
}
|
|
|
|
|
|
// #endif
|
2025-03-14 16:55:12 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
<style lang="scss">
|
|
|
|
|
|
textarea {
|
|
|
|
|
|
min-height: 200rpx;// 设置默认高度 ,解决设置自适应高度之后高度无效问题
|
|
|
|
|
|
margin-top: 15px;
|
|
|
|
|
|
background-color: #F6F6F6;
|
|
|
|
|
|
padding: 15px;
|
|
|
|
|
|
border-radius: 10px;
|
|
|
|
|
|
}
|
|
|
|
|
|
.u-divider{
|
|
|
|
|
|
margin: 0px 0px !important;
|
|
|
|
|
|
}
|
|
|
|
|
|
.content{
|
|
|
|
|
|
padding-top: 10px;
|
|
|
|
|
|
background: #FFFFFF;
|
|
|
|
|
|
// height: calc(100vh - 44px);
|
|
|
|
|
|
}
|
|
|
|
|
|
.cell{
|
|
|
|
|
|
position: relative;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
justify-content:space-between;
|
|
|
|
|
|
padding: 18px 20px;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
font-size: 32rpx;
|
|
|
|
|
|
font-weight: 500;
|
|
|
|
|
|
font-size: 32rpx;
|
|
|
|
|
|
color: #666666;
|
|
|
|
|
|
}
|
|
|
|
|
|
.arrowright{
|
|
|
|
|
|
margin-right: -15px;
|
|
|
|
|
|
}
|
|
|
|
|
|
.cell1{
|
|
|
|
|
|
font-size: 32rpx;
|
|
|
|
|
|
padding: 18px 20px;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
font-weight: 500;
|
|
|
|
|
|
color: #666666;
|
|
|
|
|
|
}
|
|
|
|
|
|
.right{
|
|
|
|
|
|
text-align: right;
|
|
|
|
|
|
color: #222222;
|
|
|
|
|
|
}
|
|
|
|
|
|
.foot{
|
|
|
|
|
|
position: fixed;
|
|
|
|
|
|
bottom: 0px;
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
height: 90px;
|
|
|
|
|
|
background: #FFFFFF;
|
|
|
|
|
|
z-index: 1;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
padding-top: 20px;
|
|
|
|
|
|
}
|
|
|
|
|
|
.btn{
|
|
|
|
|
|
background: linear-gradient(to right, #3471FF, #6776FF);
|
|
|
|
|
|
color: white;
|
|
|
|
|
|
border-radius: 50px;
|
|
|
|
|
|
width: 45%;
|
|
|
|
|
|
height: 96rpx;
|
|
|
|
|
|
line-height: 96rpx;
|
|
|
|
|
|
margin-top: 20px;
|
|
|
|
|
|
}
|
|
|
|
|
|
.btn1{
|
|
|
|
|
|
border: 1px solid #3471FF;
|
|
|
|
|
|
background: #fff;
|
|
|
|
|
|
color: #3471FF;
|
|
|
|
|
|
border-radius: 50px;
|
|
|
|
|
|
width: 45%;
|
|
|
|
|
|
height: 96rpx;
|
|
|
|
|
|
line-height: 96rpx;
|
|
|
|
|
|
margin-top: 20px;
|
|
|
|
|
|
}
|
|
|
|
|
|
.addimg{
|
|
|
|
|
|
width: 110px;
|
|
|
|
|
|
height:110px;
|
|
|
|
|
|
}
|
|
|
|
|
|
.yuyin{
|
|
|
|
|
|
position: relative;
|
|
|
|
|
|
image{
|
|
|
|
|
|
width: 20px;
|
|
|
|
|
|
height:24px;
|
|
|
|
|
|
position: absolute;
|
|
|
|
|
|
right: 15px;
|
|
|
|
|
|
bottom: 10px;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
.steps{
|
|
|
|
|
|
padding: 15px;
|
|
|
|
|
|
image{
|
|
|
|
|
|
width: 44px;
|
|
|
|
|
|
height:44px;
|
|
|
|
|
|
}
|
|
|
|
|
|
.desc{
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
color: #999999;
|
|
|
|
|
|
}
|
|
|
|
|
|
.title{
|
|
|
|
|
|
color: #666666;
|
|
|
|
|
|
font-size: 32rpx;
|
|
|
|
|
|
margin-bottom: 15px;
|
|
|
|
|
|
.status{
|
|
|
|
|
|
font-size: 28rpx;
|
|
|
|
|
|
color: #3471FF;
|
|
|
|
|
|
margin-left: 10px;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
</style>
|