This commit is contained in:
cclu 2024-10-13 21:12:37 +08:00
parent b3d2593da4
commit 898e90adbc
15 changed files with 1138 additions and 853 deletions

Binary file not shown.

View File

@ -527,6 +527,18 @@
}
]
},
{
"root": "pages/robot",
"pages": [
{
"path": "index",
"style":
{
"navigationBarTitleText": "数智助手"
}
}
]
},
{
"root": "pages/map",
"pages": [

View File

@ -27,7 +27,7 @@
<view class="detailFixed" :style="{top: menu.bottom + 12 +'px'}" v-if="showDetailFixed">
<view class="itemDetail">
<text :class="res.RevenueINC.increaseRate>0?'value red':res.RevenueINC.increaseRate<0?'value green':''">{{ res.RevenueINC.increaseRate?res.RevenueINC.increaseRate>0?`+${res.RevenueINC.increaseRate}%`:res.RevenueINC.increaseRate<0?`${res.RevenueINC.increaseRate}%`:'0':'-' }}</text>
<text class="label">对客销售</text>
<text class="label">销售明细</text>
</view>
<view class="itemDetail">
<text :class="res.BayonetINC.increaseRate>0?'value red':res.BayonetINC.increaseRate<0?'value green':''">{{ res.BayonetINC.increaseRate?res.BayonetINC.increaseRate>0?`+${res.BayonetINC.increaseRate}%`:res.BayonetINC.increaseRate<0?`${res.BayonetINC.increaseRate}%`:'0':'-' }}</text>
@ -41,7 +41,7 @@
<image class="bg" src="https://eshangtech.com/ShopICO/ahyd-BID/warning/detailTopBg1.png"/>
<view class="typeBoxTop" style="display: flex;justify-content: space-between;align-items: center">
<view>
<text class="title">对客销售</text>
<text class="title">销售明细</text>
<text class="unit">/万元</text>
</view>
<text class="monthText">{{date || ''}}</text>
@ -112,7 +112,7 @@
<text class="monthText">
{{selectType===1?`${res.ServerpartName}${date || ''}度车流`:selectType===2?`${res.ServerpartName}${date || ''}车流`:selectType===3?`${res.ServerpartName}${date || ''}车流`:selectType===4?`${res.ServerpartName}${date || ''}车流`:''}}
<text>{{res.BayonetINC.increaseRate>0?'增加':res.BayonetINC.increaseRate<0?'减少':''}}<text :style="{color:res.BayonetINC.increaseRate>0?'#E83944':res.BayonetINC.increaseRate<0?'#127E5B':''}">{{res.BayonetINC.increaseRate?`${Math.abs(res.BayonetINC.increaseRate)}%`:'-'}}</text></text>
{{selectType===1?'对客销售':selectType===2?',门店的营收减少':selectType===3?'对客销售':selectType===4?'对客销售':''}}
{{selectType===1?'销售明细':selectType===2?',门店的营收减少':selectType===3?'销售明细':selectType===4?'销售明细':''}}
<text v-if="selectType!==2">{{res.RevenueINC.increaseRate>0?'增加':res.RevenueINC.increaseRate<0?'减少':''}}<text :style="{color:res.RevenueINC.increaseRate>0?'#E83944':res.RevenueINC.increaseRate<0?'#127E5B':''}">{{res.RevenueINC.increaseRate?`${Math.abs(res.RevenueINC.increaseRate)}%`:'-'}}</text></text>
</text>

View File

@ -154,7 +154,7 @@
</view>
<view class="sortItem" style="width: 25%;justify-content: flex-end" @click="handleChangeSortName(1)">
<text class="sortName">对客销售</text>
<text class="sortName">销售明细</text>
<view class="sortIconBox">
<image class="upIcon" :style="{transform: sortName===1?sortType===1?``:`rotate(180deg)`:``}" :src="sortType===1?'https://eshangtech.com/ShopICO/ahyd-BID/car/upDesc.svg':sortName===1?'https://eshangtech.com/ShopICO/ahyd-BID/car/downDesc.svg':'https://eshangtech.com/ShopICO/ahyd-BID/car/upDesc.svg'"/>
<image class="bottomIcon" :style="{transform: sortName===1?sortType===1?``:`rotate(180deg)`:'rotate(-180deg)'}":src="sortType===1 && sortName===1?'https://eshangtech.com/ShopICO/ahyd-BID/car/downDesc.svg':'https://eshangtech.com/ShopICO/ahyd-BID/car/upDesc.svg'"/>
@ -196,7 +196,7 @@
</view>
<view class="secondItemTop">
<view>
<text class="itemTopName">对客销售</text>
<text class="itemTopName">销售明细</text>
<text class="itemTopUnit">/万元</text>
</view>
<image v-if="false" class="addReduce" :src="Number(item.RevenueINC.increaseRate)>0?'https://eshangtech.com/ShopICO/ahyd-BID/examine/add.svg':Number(item.RevenueINC.increaseRate)<0?'https://eshangtech.com/ShopICO/ahyd-BID/examine/reduce.svg':''"/>

File diff suppressed because it is too large Load Diff

View File

@ -78,7 +78,7 @@
selectFestival===5?'#3E8958':
selectFestival===6?'#3E8958':
''}"></div>
<text class="modalText">{{ type===1?'对客销售':type===2?'营业收入':type===3?'入区车流':'' }}</text>
<text class="modalText">{{ type===1?'销售明细':type===2?'营业收入':type===3?'入区车流':'' }}</text>
<text class="modalUnit">{{type===3?'/万辆':'/万元'}}</text>
</div>
</div>

View File

@ -118,7 +118,7 @@
</div>
<div class="overAllDataBottom">
<div class="contentTitleBox" style="margin-bottom: 16rpx">
<text class="contentTitle">对客销售</text>
<text class="contentTitle">销售明细</text>
<div style="display: flex;align-items: center">
<div class="YOYNumber">
<text class="YOYNumberText">增长</text>
@ -673,7 +673,7 @@
selectFestival===5?'#DA5015':
selectFestival===6?'#D52020':
''}"></div>
<text class="modalText">对客销售</text>
<text class="modalText">销售明细</text>
<text class="modalUnit">/万元</text>
</div>
<div class="moreBox" @click="handleGoMorePage(1)">
@ -706,7 +706,7 @@
selectFestival===5?'#DA5015':
selectFestival===6?'#D52020':
''}"></div>
<text class="modalText">对客销售</text>
<text class="modalText">销售明细</text>
<text class="modalUnit">/万元</text>
</div>
<div class="moreBox" @click="handleGoMorePage(1)">

View File

@ -125,6 +125,7 @@ import request from '@/util/index.js'
endTime: obj.et,
serverpartId: obj.id,
provinceCode: obj.pcode,
BusinessTrade: obj.BusinessTrade,
SearchKeyName:_this.pageOption.searchKey,
SearchKeyValue:_this.pageOption.searchValue,
BusinessType:_this.pageOption.BusinessTypeValue>0?_this.pageOption.BusinessTypeValue:'',

View File

@ -202,41 +202,44 @@
<input v-model="searchText" confirm-type="search" @confirm="getList" placeholder="可以查询门店/服务区/品牌/商家等信息" class="select_input" clear/>
<img src="/static/images/recons/delete.svg" alt="" class="delete" @click="handleDelete">
</div>
<view class="popupTitle">日期选择</view>
<view class="timeList">
<view :class="selectTime===item.value?'timeItem timeSelectItem':'timeItem'" v-for="(item,index) in timeTypeList" :key="index" @click="handleChangeTime(item.value)">{{item.label}}</view>
</view>
<view class="timeList">
<view :class="selectTimeOther?'timeItem timeSelectItem':'timeItem'" @click="handleTimeOther">自定义</view>
</view>
<view class="popupTitle">业态类型</view>
<view class="timeList">
<view :class="BusinessTrade===item.value?'timeItem timeSelectItem':'timeItem'" v-for="(item,index) in tradeList" :key="index" @click="handleChangeTrade(item.value,index)">{{item.label}}</view>
</view>
<view class="timeList" v-if="bigTradeIndex>=0 && tradeList[bigTradeIndex] && tradeList[bigTradeIndex].children && tradeList[bigTradeIndex].children.length>0">
<view :class="BusinessSmallTrade.indexOf(item.value)!==-1 ?'timeItem timeSelectItem':'timeItem'" v-for="(item,index) in tradeList[bigTradeIndex].children" :key="index" @click="handleChangeSmallTrade(item.value)">{{item.label}}</view>
</view>
<view style="height: 380px;overflow-y: scroll">
<view class="popupTitle">日期选择</view>
<view class="timeList">
<view :class="selectTime===item.value?'timeItem timeSelectItem':'timeItem'" v-for="(item,index) in timeTypeList" :key="index" @click="handleChangeTime(item.value)">{{item.label}}</view>
</view>
<view class="timeList">
<view :class="selectTimeOther?'timeItem timeSelectItem':'timeItem'" @click="handleTimeOther">自定义</view>
</view>
<view class="popupTitle">经营模式</view>
<view class="timeList">
<view :class="BusinessTypeValue===item.value?'timeItem timeSelectItem':'timeItem'" v-for="(item,index) in BusinessTypeList" :key="index" @click="handleChangeBusiness(item.value)">{{item.label}}</view>
</view>
<view class="popupTitle" style="display: flex;position: relative;align-items: center">
<span class="title">结算模式</span>
<view class="notice" @click="handleShowNotice">?
<view class="noticeBox" v-if="showNotice" :style="{left: '10%',top:'20px'}">
<span class="noticeText">营收回款经营模式为商家收款商家按月/季度/半年/年度模式返款给驿达</span>
<span class="noticeText">资金返款经营模式为驿达收款驿达按月/季度/半年/年度模式打款给商家</span>
<span class="noticeText">营收分润经营模式为单个业态使用移动支付分账模式移动支付交易按照七三分成的模式营收达到保底后按照合同约定的提成比例进行分成</span>
<span class="noticeText">组合分润经营模式为多个业态使用移动支付分账模式移动支付交易按照七三分成的模式营收达到保底后按照合同约定的提成比例进行分成</span>
<span class="noticeText">阶段提成经营模式为合作分成根据营业额的高低提成比例会进行阶段性的变化</span>
<view class="popupTitle">业态类型</view>
<view class="timeList">
<view :class="BusinessTrade===item.value?'timeItem timeSelectItem':'timeItem'" v-for="(item,index) in tradeList" :key="index" @click="handleChangeTrade(item.value,index)">{{item.label}}</view>
</view>
<view class="timeList" v-if="bigTradeIndex>=0 && tradeList[bigTradeIndex] && tradeList[bigTradeIndex].children && tradeList[bigTradeIndex].children.length>0">
<view :class="BusinessSmallTrade.indexOf(item.value)!==-1 ?'timeItem timeSelectItem':'timeItem'" v-for="(item,index) in tradeList[bigTradeIndex].children" :key="index" @click="handleChangeSmallTrade(item.value)">{{item.label}}</view>
</view>
<view class="popupTitle">经营模式</view>
<view class="timeList">
<view :class="BusinessTypeValue===item.value?'timeItem timeSelectItem':'timeItem'" v-for="(item,index) in BusinessTypeList" :key="index" @click="handleChangeBusiness(item.value)">{{item.label}}</view>
</view>
<view class="popupTitle" style="display: flex;position: relative;align-items: center">
<span class="title">结算模式</span>
<view class="notice" @click="handleShowNotice">?
<view class="noticeBox" v-if="showNotice" :style="{left: '10%',top:'20px'}">
<span class="noticeText">营收回款经营模式为商家收款商家按月/季度/半年/年度模式返款给驿达</span>
<span class="noticeText">资金返款经营模式为驿达收款驿达按月/季度/半年/年度模式打款给商家</span>
<span class="noticeText">营收分润经营模式为单个业态使用移动支付分账模式移动支付交易按照七三分成的模式营收达到保底后按照合同约定的提成比例进行分成</span>
<span class="noticeText">组合分润经营模式为多个业态使用移动支付分账模式移动支付交易按照七三分成的模式营收达到保底后按照合同约定的提成比例进行分成</span>
<span class="noticeText">阶段提成经营模式为合作分成根据营业额的高低提成比例会进行阶段性的变化</span>
</view>
</view>
</view>
</view>
<view class="timeList">
<view :class="SettlementModeValue===item.value?'timeItem timeSelectItem':'timeItem'" v-for="(item,index) in SettlementModeList" :key="index" @click="handleChangeSettlement(item.value)">{{item.label}}</view>
<view class="timeList">
<view :class="SettlementModeValue===item.value?'timeItem timeSelectItem':'timeItem'" v-for="(item,index) in SettlementModeList" :key="index" @click="handleChangeSettlement(item.value)">{{item.label}}</view>
</view>
</view>
</div>
<div class="btn" @click="handleConfirmCheckChange">确认</div>
@ -308,6 +311,7 @@
searchTimePopup: [null,null],
showNotice:false,
showModal:false,//
selectTradeId:'',//
}
},
computed:{
@ -475,7 +479,8 @@
this.$util.toNextRoute('navigateTo', '/pages/operatingStatements/detail?pcode='+item.Province_Code+'&id=' +
item.Serverpart_Id + '&st=' + this.pageData.searchTime[0]+ '&et=' + this.pageData.searchTime[1]+
'&searchKey='+JSON.parse(JSON.stringify(this.checkBoxValue)) + '&searchValue='+this.requestText+
'&BusinessTypeValue='+this.BusinessTypeValue+'&SettlementModeValue='+this.SettlementModeValue)
'&BusinessTypeValue='+this.BusinessTypeValue+'&SettlementModeValue='+this.SettlementModeValue +'&BusinessTrade=' +this.selectTradeId
)
item.visited = true
this.$forceUpdate()
},
@ -524,6 +529,7 @@
}
}
console.log('tradeId',tradeId)
this.selectTradeId = tradeId
req = {
startTime: searchTime[0],
endTime: searchTime[1],
@ -654,7 +660,7 @@
<style lang="scss" >
.page-body {
padding-bottom: 80rpx;
//padding-bottom: 80rpx;
}
.meng{
width: 100vw;

View File

@ -33,7 +33,7 @@
<view class="contentTop">
<view class="contentTopLeft">
<!-- <span class="contentMonth">{{thisMonth?thisMonth+'月':'累计'}}</span>-->
<span class="contentTitle">对客销售<span class="contentUnit">/万元</span></span>
<span class="contentTitle">销售明细<span class="contentUnit">/万元</span></span>
</view>
</view>

View File

@ -46,7 +46,7 @@
<view class="contentTop">
<view class="contentTopLeft">
<!-- <span class="contentMonth">{{thisMonth?thisMonth+'月':'累计'}}</span>-->
<span class="contentTitle">对客销售<span class="contentUnit">/万元</span></span>
<span class="contentTitle">销售明细<span class="contentUnit">/万元</span></span>
</view>
<view class="contentTopRight" @click="handleGoSort(1)">
<span class="moreText">服务区排名</span>

View File

@ -40,7 +40,7 @@
<view class="modalTitleBox">
<view class="modalTitleItem" :style="{width: 'calc(100% - 300rpx)',textAlign:'left'}">
<view class="modalIndex"></view>
<text class="modalText">{{ type===1?'对客销售':type===2?'营业收入':type===3?'入区车流':'' }}</text>
<text class="modalText">{{ type===1?'销售明细':type===2?'营业收入':type===3?'入区车流':'' }}</text>
<text class="modalUnit">{{type===3?'/万辆':'/万元'+`${type===2?' (除税)':''}`}}</text>
</view>
</view>

190
pages/robot/index.vue Normal file
View File

@ -0,0 +1,190 @@
<template>
<view class="main">
<view class="dialogContentBox">
<view :class="item.type===1?'item itemLeft':'item rightItem'" v-for="(item,index) in dialogueList" :key="index" :style="{marginTop: index!==0?'8px':''}">
<text :id="'printBox' + index" :class="item.type===1?`dialogItem white`:`dialogItem green`">
{{ item.text || '' }}
</text>
</view>
<view class="loadingBox" v-if="isLoading">
小驿分析中...
</view>
</view>
<view class="inputBox">
<textarea class="searchText" :value="searchText" @input="handleInput"/>
<view class="searchBtn" @click="handleSubmit">
发送
</view>
</view>
</view>
</template>
<script >
import request from '@/util/index.js'
export default {
data(){
return {
searchText:'',
dialogueList:[],// list type 1 2
printText:'',
isLoading: false,//
}
},
onLoad(){
this.dialogueList.push({text:`您好!我是服务区商业智能助理小驿。\n您想了解服务区哪些方面的信息`,type:1})
this.handlePrintText()
// this.printText = `驿<br>`
},
methods:{
handleSubmit(){
let list = this.dialogueList
console.log('this.searchText',this.searchText)
if(this.searchText){
list.push({text:this.searchText,type:2})
this.dialogueList = list
this.$forceUpdate()
this.handleGetData()
this.searchText= ''
}
},
//
handleInput(e){
console.log('e',e)
this.searchText = e.detail.value
},
//
async handleGetData(){
this.isLoading = true
const data = await request.$webGet('CommercialApi/Analysis/TranslateSentence',{Sentence: this.searchText})
console.log('data',data)
if(data.Result_Code === 999){
this.dialogueList.push({text:`'小驿还无法理解,请换个说法我会不停努力学习的!'`,type:1})
}else{
let str = data.Result_Data.RevenueAnalysis + '\n'
let obj = data.Result_Data.ServerpartList
if(obj){
for(let key in obj){
if(str){
str+=`${key}${this.formatNumber(obj[key].curYearData / 10000)}万元,同比${obj[key].increaseRate>0?'增幅':obj[key].increaseRate<0?'降幅':''}${obj[key].increaseRate ||''}\n`
}else{
str = `${key}${this.formatNumber(obj[key].curYearData / 10000)}万元,同比${obj[key].increaseRate>0?'增幅':obj[key].increaseRate<0?'降幅':''}${obj[key].increaseRate || ''}\n`
}
}
}
this.dialogueList.push({text: str,type:1})
}
this.isLoading = false
},
//
handlePrintText(){
const query = wx.createSelectorQuery();
const contentBox = query.select(`#printBox${this.dialogueList && this.dialogueList.length>0? this.dialogueList.length - 1:0}`)
console.log('contentBox',contentBox)
},
formatNumber(num) {
//
num = Number(num);
if (isNaN(num)) return '0.00'; //
//
let parts = num.toString().split('.');
//
let decimalPart = parts[1] ? parts[1].substring(0, 2) : '00';
if (decimalPart.length < 2) {
decimalPart = decimalPart.padEnd(2, '0'); //
}
//
let integerPart = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
//
return `${integerPart}.${decimalPart}`;
}
}
}
</script>
<style scoped lang="scss">
.main{
width: 100%;
height: 100vh;
background: #f0f0f0;
.dialogContentBox{
width: 100%;
height: calc(100vh - 90px);
overflow-y: scroll;
box-sizing: border-box;
padding: 12px;
.item{
display: flex;
align-items: center;
.dialogItem{
display: block;
max-width: 80vw;
box-sizing: border-box;
padding: 4px;
border-radius: 4px;
}
.white{
border: 1px solid #ccc;
background: #fff;
color: #000;
}
.green{
background: #12A153FF;
color: #fff;
}
}
.itemLeft{
justify-content: flex-start;
}
.rightItem{
justify-content: flex-end;
}
.loadingBox{
font-size: 12px;
color: #ccc;
width: 100%;
display: flex;
justify-content: center;
}
}
.inputBox{
width: 100%;
height: 80px;
background: hsla(0,0%,97%,.98);
border-top: 1px solid #ccc;
position: fixed;
left: 0;
bottom: 0;
box-sizing: border-box;
padding: 0 8px 4px;
display: flex;
align-items: center;
.searchText{
background: #fff;
flex: 1;
height: 40px;
box-sizing: border-box;
border-radius: 8px;
padding: 4px 8px 0;
font-size: 14px;
}
.searchBtn{
width: 80px;
height: 40px;
box-sizing: border-box;
color: #fff;
background: #07c160;
border-radius: 4px;
margin-left: 8px;
display: flex;
align-items: center;
justify-content: center;
font-size: 16px;
}
}
}
</style>

View File

@ -6,8 +6,10 @@
<!-- </view>-->
<view class="scrollPage">
<scroll-view class="scrollBox" scroll-x="true" :scroll-into-view="'item'+selectIndex" scroll-with-animation>
<view :id="'item'+i" :class="selectIndex===i?`scrollItem selectScroll${selectIndex}`:'scrollItem'" v-for="(item,i) in pageList" :key="i" @click="handleToDetail(i)">{{item}}</view>
<scroll-view class="scrollBox" scroll-x="true" :scroll-into-view="'item'+isYD &&selectIndex===1?0:selectIndex" scroll-with-animation>
<view :style="{display: isYD && i===0?'none':''}" :id="'item'+i" :class="selectIndex===i?`scrollItem selectScroll${selectIndex}`:'scrollItem'" v-for="(item,i) in pageList" :key="i" @click="handleToDetail(i)">
{{item}}
</view>
</scroll-view>
</view>
</template>
@ -17,6 +19,7 @@ export default {
data() {
return {
pageList: ["基础信息", "车流统计", "客群统计", "经营统计", "交易统计", "业态品牌", "考核考评", "日常巡检"],
// pageList: [],
urlList: [
'/pages/map/detail',
'/pages/commercialBINew/carPortrait',
@ -37,29 +40,52 @@ export default {
`/pages/newamine/index?type=${1}&comePage=slider`,
`/pages/newamine/index?type=${2}&comePage=slider`,
],// YD
selectIndex: 0
selectIndex: 0,
isYD:false,// 驿
}
},
props: {
index: {
type: Number,
default: 0
},
name:{
type: String,
default: ''
}
},
watch: {
index: {
handler(value) {
console.log('dsjdisjdap',value)
this.selectIndex = value
// let storeServiceInfo = uni.getStorageSync('currentService')
// if(value === 1 && storeServiceInfo.SERVERPART_NAME=== '驿'){
// this.selectIndex = 0
// }else{
// this.selectIndex = value
// }
},
immediate: true
},
},
onLoad() {
let seat = uni.getStorageSync('currentService')
if(seat.SERVERPART_NAME==='安徽驿达'){
this.pageList = [ "","车流统计", "客群统计", "经营统计", "交易统计", "业态品牌", "考核考评", "日常巡检"]
console.log('this.pageList ',this.pageList )
name:{
handler(value) {
console.log('dsadjsakdajs',value)
if(value==='安徽驿达'){
this.isYD = true
}else{
this.isYD = false
}
},
immediate: true
}
},
// onLoad() {
//
// },
onShow(){
},
methods: {
handleToDetail(i) {

View File

@ -25,7 +25,7 @@
</div>
<view style="width: 100%">
<sliderPage :index="selectPortrait" @handleChangeIndex="handleChangeIndex"/>
<sliderPage :index="selectPortrait" @handleChangeIndex="handleChangeIndex" :name="serviceInfo.SERVERPART_NAME"/>
</view>
</view>
@ -96,6 +96,9 @@ export default {
console.log('query',query)
if (query.index){
this.selectPortrait = Number(query.index)
}else{
let seat = uni.getStorageSync('currentService')
this.selectPortrait = seat.SERVERPART_NAME==='安徽驿达' ? 1:0
}
this.query = query
console.log('onLoad')
@ -108,7 +111,7 @@ export default {
let seat = uni.getStorageSync('currentService')
console.log('seat',seat)
this.serviceInfo = seat
this.selectPortrait = this.query.index ? this.query.index: seat.SERVERPART_NAME==='安徽驿达' ? 1:0
this.selectPortrait = this.query.index ? this.query.index: seat.SERVERPART_NAME==='安徽驿达' ? 1:0
},
onHide(){
this.isShowSwiper = false