Commit 5c307df8 by sunchao

战队业绩详情

parent f59e2f68
......@@ -32,7 +32,9 @@
"node_modules/ng-zorro-antd-mobile/src/ng-zorro-antd-mobile.min.css",
"src/styles.scss"
],
"scripts": [], // 引入全局脚步,构建时会打包进来,常用于第三方库引入的脚本
"scripts": [
"node_modules/echarts/dist/echarts.min.js"
], // 引入全局脚步,构建时会打包进来,常用于第三方库引入的脚本
"es5BrowserSupport": true
},
"configurations": {
......
......@@ -3070,6 +3070,14 @@
"safer-buffer": "^2.1.0"
}
},
"echarts": {
"version": "4.9.0",
"resolved": "https://registry.npm.taobao.org/echarts/download/echarts-4.9.0.tgz",
"integrity": "sha1-qbm6oD8Doqcx5jQMVb77V6nhNH0=",
"requires": {
"zrender": "4.3.2"
}
},
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz",
......@@ -6125,6 +6133,14 @@
"tslib": "^1.9.0"
}
},
"ngx-echarts": {
"version": "3.2.0",
"resolved": "https://registry.npm.taobao.org/ngx-echarts/download/ngx-echarts-3.2.0.tgz",
"integrity": "sha1-abw32fwmFWEXwsC7m6ETgiIo3EM=",
"requires": {
"tslib": "^1.9.0"
}
},
"nice-try": {
"version": "1.0.5",
"resolved": "https://registry.npm.taobao.org/nice-try/download/nice-try-1.0.5.tgz",
......@@ -10475,6 +10491,11 @@
"version": "0.8.29",
"resolved": "https://registry.npm.taobao.org/zone.js/download/zone.js-0.8.29.tgz",
"integrity": "sha1-jc6Sqg3VU7ULxb+7kK+Zhq2EWhI="
},
"zrender": {
"version": "4.3.2",
"resolved": "https://registry.npm.taobao.org/zrender/download/zrender-4.3.2.tgz?cache=0&sync_timestamp=1597683497625&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fzrender%2Fdownload%2Fzrender-4.3.2.tgz",
"integrity": "sha1-7HQy+UFcgsc1hLa3uMR+GwFiCcY="
}
}
}
......@@ -24,8 +24,10 @@
"buffer": "^5.4.3",
"core-js": "^2.5.4",
"dayjs": "^1.8.35",
"echarts": "^4.9.0",
"html2canvas": "^1.0.0-rc.5",
"ng-zorro-antd-mobile": "^0.12.5",
"ngx-echarts": "^3.2.0",
"rxjs": "~6.3.3",
"tslib": "^1.9.0",
"uuid": "^3.3.3",
......
......@@ -49,11 +49,11 @@
<div style="font-size: 18px;">选择任务需要的时间</div>
<div class="timeContent">
<div class="picker_list">
<PickerView [data]="seasons" [cascade]="false" [(ngModel)]="addTrack.taskTimeFrom" (ngModelChange)="onChange($event,1)"></PickerView>
<PickerView [data]="seasons" [cols]='3' [cascade]="false" [ngModel]="addTrack.taskTimeFrom" (ngModelChange)="onChange($event,1)"></PickerView>
</div>
<div style="color: #d9dadc;width: 10%;text-align: center;"></div>
<div class="picker_list">
<PickerView [data]="seasons" [cascade]="false" [(ngModel)]="addTrack.taskTimeEnd" (ngModelChange)="onChange($event,2)"></PickerView>
<PickerView [data]="seasons" [cascade]="false" [cols]='3' [ngModel]="addTrack.taskTimeEnd" (ngModelChange)="onChange($event,2)"></PickerView>
</div>
</div>
</div>
......
......@@ -99,15 +99,19 @@ export class AddTaskComponent implements OnInit {
//如果有缓存切换到缓存数据
if(JSON.parse(sessionStorage.getItem('pageDwellDtatus'))){
this.tabType = JSON.parse(sessionStorage.getItem('pageDwellDtatus'))['tabType'];
this.dropOptionsQuery(this.tabType);
this.addTrack.taskType = JSON.parse(sessionStorage.getItem('pageDwellDtatus'))['taskType'];
setTimeout(() => {
this.dropOptionsQuery(this.tabType);
this.addTrack.mdDropOptionId = JSON.parse(sessionStorage.getItem('pageDwellDtatus'))['mdDropOptionId'];
}, 300);
}else{
this.tabType = 'bizchance_promotion_action';
this.addTrack.taskType = 1;
this.addTrack.mdDropOptionId = null;
}
//如果有日程时间就取缓存没有就默认当天
if(sessionStorage.getItem('trackDate')){
this.addTrack.trackTime = sessionStorage.getItem('trackDate');
if(sessionStorage.getItem('trackTime')){
this.addTrack.trackTime = sessionStorage.getItem('trackTime');
}else{
this.addTrack.trackTime = dayjs().format('YYYY-MM-DD');
}
......@@ -163,11 +167,12 @@ export class AddTaskComponent implements OnInit {
onChange(result,type) {
if(type===1){
this.addTrack.taskTimeFrom = result[0]['label'];
this.addTrack.taskTimeFrom = result;
}
if(type===2){
this.addTrack.taskTimeEnd = result[0]['label'];
this.addTrack.taskTimeEnd = result;
}
console.log(this.addTrack.taskTimeFrom,this.addTrack.taskTimeEnd)
}
selectTask(id){
......@@ -301,7 +306,9 @@ export class AddTaskComponent implements OnInit {
this.addTrack = {
...this.addTrack,
taskImportantTag:this.addTrack.taskImportantTag?1:0,
isActive:1
isActive:1,
taskTimeFrom:this.addTrack.taskTimeFrom[0]['label'],
taskTimeEnd:this.addTrack.taskTimeEnd[0]['label']
}
this.myService.addScheduleTrack(this.addTrack).subscribe((res)=>{
const toast = ToastService.show(`${res['message']}`, 0);
......
......@@ -32,15 +32,18 @@ import { OrderDetailComponent } from './order-detail/order-detail.component';
import { SalaryComponent } from './salary/salary.component';
import { TodoListComponent } from './todo-list/todo-list.component';
import { AddTaskComponent } from './add-task/add-task.component';
import { NgZorroAntdMobileModule, ModalServiceComponent, ToastComponent } from 'ng-zorro-antd-mobile';
import { NgZorroAntdMobileModule, ModalServiceComponent, ToastComponent } from 'ng-zorro-antd-mobile';
import {NgxEchartsModule} from 'ngx-echarts'
@NgModule({
declarations: [MyCenterHomeComponent, MkMaterialComponent, MkMaterialDetailComponent, FileUploadComponent, ImportantAnnouncementComponent, SalesDetailComponent, AnnouncementDetailComponent, MyBusinessComponent, MyBusinessDetailComponent, PickerComponent, MyToastComponent, SalesRankComponent, TeamRankComponent, RecruitingComponent, RecruitingDetailComponent, ThanksComponent, MySettingComponent, MySettingDetailComponent, MyNewsComponent, MyTargetComponent, TeamPanelComponent, SwitchNumberPipe, TeamSalesScoreComponent, ScoreDetailsComponent, BusinessCardComponent, OrderDetailComponent, SalaryComponent, TodoListComponent, AddTaskComponent],
imports: [
CommonModule,
LifeCommonModule,
MyRoutingModule,
NgZorroAntdMobileModule
NgZorroAntdMobileModule,
NgxEchartsModule
],
entryComponents: [ModalServiceComponent, ToastComponent],
providers: [
......
......@@ -359,4 +359,11 @@ export class MyService {
return this.http
.post(url, JSON.stringify(param));
}
//PEP详情得分
queryPEPScoreDetail(param){
const url = this.ydapi + '/practitioner/queryPEPScoreDetail';
return this.http
.post(url, JSON.stringify(param));
}
}
<div class="scoreDetail_wrapper">
<div>
<div class="head">
<div class="title">战绩</div>
<div class="top">
<div style="font-size: 16px;font-family:'Source Han Sans CN'">
......@@ -7,19 +7,31 @@
</div>
<ul>
<!-- <li [ngClass]="{selected:selectedTime===''}" (click)="salesScoreDetailQuery('')">全部</li> -->
<li [ngClass]="{selected:selectedTime==='D'}" (click)="salesScoreDetailQuery('D')">今天</li>
<li [ngClass]="{selected:selectedTime==='W'}" (click)="salesScoreDetailQuery('W')">本周</li>
<li [ngClass]="{selected:selectedTime==='M'}" (click)="salesScoreDetailQuery('M')">本月</li>
<li [ngClass]="{selected:selectedTime==='D'}" (click)="queryPEPScoreDetail('D')">今天</li>
<li [ngClass]="{selected:selectedTime==='W'}" (click)="queryPEPScoreDetail('W')">本周</li>
<li [ngClass]="{selected:selectedTime==='M'}" (click)="queryPEPScoreDetail('M')">本月</li>
</ul>
</div>
</div>
<div class="contentWrapper">
<div *ngIf="salesScoreDetails?.length>0">
<div class="content" *ngFor="let scoreItem of salesScoreDetails">
<span>{{scoreItem.dropOptionsName}}</span>
<span>{{scoreItem.number * scoreItem.score}}</span>
</div>
<div class="body">
<div class="contentWrapper">
<ul class="content_detail">
<li>{{salesScoreDetails?.recruitScore}}</li>
<li>{{salesScoreDetails?.saleScore}}</li>
<li>{{salesScoreDetails?.coachScore}}</li>
<li>{{salesScoreDetails?.trainScore}}</li>
<li>{{salesScoreDetails?.meetingScore}}</li>
</ul>
<ul class="content_detail">
<li>增员</li>
<li>销售</li>
<li>辅导</li>
<li>培训</li>
<li>会议</li>
</ul>
</div>
<div class="tips" *ngIf="salesScoreDetails?.length<=0">暂无销售活动量得分</div>
<div style="height: 35px;line-height: 35px;margin: 10px auto 0 auto;">数据分析:</div>
<div echarts [options]="chartOption" class="chart" style="height: 300px;"></div>
</div>
</div>
\ No newline at end of file
......@@ -3,49 +3,58 @@ ul ,ol{
}
.scoreDetail_wrapper{
padding: 10px 0;
.title{
width: 100%;
text-align: center;
height: 60px;
line-height: 60px;
background: #1B5B99FF;
color: #fff;
font-size: 18px;
font-weight: bold;
}
.top{
display: flex;
justify-content: space-between;
align-items: center;
height: 70px;
margin-bottom: 15px;
padding: 10px 15px;
ul{
width: 40%;
height: 100%;
.head{
.title{
width: 100%;
text-align: center;
height: 60px;
line-height: 60px;
background: #1B5B99FF;
color: #fff;
font-size: 18px;
font-weight: bold;
}
.top{
display: flex;
justify-content: space-between;
align-items: center;
color: #333333FF;
li.selected{
font-weight: bold;
border-bottom: 2px #F8002EFF solid;
color: #F8002EFF;
height: 70px;
padding: 10px 15px;
ul{
width: 40%;
display: flex;
justify-content: space-between;
align-items: center;
color: #333333FF;
li.selected{
font-weight: bold;
border-bottom: 2px #F8002EFF solid;
color: #F8002EFF;
}
}
}
}
.contentWrapper{
.body{
padding: 10px 15px;
.content{
display: flex;
justify-content: space-between;
align-items: center;
height: 30px;
}
.tips{
text-align: center;
height: 40px;
line-height: 40px;
.contentWrapper{
padding: 15px 0px;
background-color: #c9d6e6;
.content_detail{
display: flex;
justify-content: space-around;
align-items: center;
li{
height: 35px;
line-height: 35px;
font-size: 16px;
font-family: '微软雅黑';
}
}
.content_detail:nth-child(1){
font-weight: bold;
}
}
}
}
\ No newline at end of file
import { Component, OnInit } from '@angular/core';
import { MyService } from '../my.service';
import { ActivatedRoute, Router } from "@angular/router";
import { EChartOption } from 'echarts';
@Component({
selector: 'ydlife-score-details',
templateUrl: './score-details.component.html',
styleUrls: ['./score-details.component.scss']
})
export class ScoreDetailsComponent implements OnInit {
salesScoreDetails: Array<any>;
salesScoreDetails: any;
selectedTime: string;
practitionerId:number;
chartOption: EChartOption = {}
constructor(private activateRoute: ActivatedRoute,private myService: MyService) { }
ngOnInit() {
this.selectedTime = 'D';
this.salesScoreDetailQuery('D');
this.queryPEPScoreDetail('D');
if(this.activateRoute.snapshot.paramMap.get('practitionerId')){
this.practitionerId = Number(this.activateRoute.snapshot.paramMap.get('practitionerId'));
}else{
this.practitionerId = JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'];
}
}
//销售活动量详情D-天 W-周 M-月
salesScoreDetailQuery(time) {
queryPEPScoreDetail(time) {
this.selectedTime = time;
const practitionerId = JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'];
this.myService.salesScoreDetailQuery({ practitionerId: practitionerId, time: this.selectedTime }).subscribe((res) => {
this.myService.queryPEPScoreDetail({ practitionerId: practitionerId, time: this.selectedTime }).subscribe((res) => {
if (res['success']) {
this.salesScoreDetails = res['data']['salesScoreDetails'];
this.salesScoreDetails = res['data']['detail'];
this.chartOption ={
tooltip: {
trigger: 'item',
formatter: '{a} <br/>{b}: {c} ({d}%)'
},
legend: {
orient: 'horizontal',
bottom: 0,
data: ['营销', '辅导', '会议', '培训', '增员'],
itemWidth:10,
itemHeight:10,
},
series: [
{
name: 'PEP得分',
type: 'pie',
radius: ['20%', '40%'],
avoidLabelOverlap: false,
label: {
show: true,
position: 'outside',
//显示的标签的内容
formatter: "{b}:{c}分",
},
emphasis: {
label: {
show: true,
fontSize: '18',
fontWeight: 'bold'
}
},
labelLine: {
show: true
},
data: [
{value: this.salesScoreDetails.saleScore, name: '营销',itemStyle:{color:'#CF3153FF'}},
{value: this.salesScoreDetails.coachScore, name: '辅导',itemStyle:{color:'#F1C13FFF'}},
{value: this.salesScoreDetails.meetingScore, name: '会议',itemStyle:{color:'#34A0BEFF'}},
{value: this.salesScoreDetails.trainScore, name: '培训',itemStyle:{color:'#5C66ADFF'}},
{value: this.salesScoreDetails.recruitScore, name: '增员',itemStyle:{color:'#00447AFF'}}
]
}
]
}
}
})
}
......
......@@ -14,19 +14,18 @@
</div>
<div class="taem_panel_item_content">
<ul>
<li class="big">{{this.teamActionsData?.scoreDayAverage?this.teamActionsData?.scoreDayAverage:'0'}}</li>
<li class="big">{{this.teamActionsData?.scoreWeekAverage?this.teamActionsData?.scoreWeekAverage:'0'}}</li>
<li class="big">{{this.teamActionsData?.scoreMonthAverage?this.teamActionsData?.scoreMonthAverage:'0'}}</li>
<li class="big">{{this.teamActionsData?.opportunitiesNum?this.teamActionsData?.opportunitiesNum:'0'}}</li>
<li class="big">{{this.averageData?.dayScore}}</li>
<li class="big">{{this.averageData?.weekScore}}</li>
<li class="big">{{this.averageData?.monthScore}}</li>
<li class="big">{{this.averageData?.rate}}</li>
</ul>
<ul>
<li>今天平均</li>
<li>本周平均</li>
<li>本月平均</li>
<li>本周新增商机</li>
<li>月平均分效</li>
</ul>
</div>
</div>
<!-- <div class="taem_panel_item_wrapper">
......
......@@ -24,13 +24,15 @@ export class TeamPanelComponent implements OnInit {
recruitingStatistics: any;
selectedRecruitingItem: any;
statisticInfo: any;
averageData:any;
constructor(private myService: MyService, public lifeCommonService: LifeCommonService) { }
ngOnInit() {
this.practitionerId = JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'];
this.subordinateSystemName = sessionStorage.getItem('subordinateSystemName');
this.teamActionsAverageQuery();
this.potentialActivityQuery();
// this.potentialActivityQuery();
this.subordinateSystemMemberQuery(1);
this.queryPEPScore();
}
teamActionsAverageQuery() {
......@@ -81,10 +83,20 @@ export class TeamPanelComponent implements OnInit {
}
//增员统计
potentialActivityQuery() {
this.myService.potentialActivityQuery({ practitionerId: this.practitionerId }).subscribe((res) => {
if (res['success']) {
this.recruitingStatistics = res['data'];
// potentialActivityQuery() {
// this.myService.potentialActivityQuery({ practitionerId: this.practitionerId }).subscribe((res) => {
// if (res['success']) {
// this.recruitingStatistics = res['data'];
// }
// })
// }
//活动量得分统计
queryPEPScore(){
this.myService.queryPEPScore({ practitionerId: this.practitionerId }).subscribe((res)=>{
console.log(res)
if(res['success']){
this.averageData = res['data']['average'];
}
})
}
......
......@@ -21,17 +21,17 @@
<li></li>
</ul>
<div style="width: 100%;text-align: center;float: left;height: 35px;"
*ngIf="playerSalesActivityInfo?.length <=0">
*ngIf="personalList?.length <=0">
暂无战队成员,努力去增员吧
</div>
<ul *ngFor="let playerSalesActivityItem of playerSalesActivityInfo;index as i;">
<ul *ngFor="let personalItem of personalList;index as i;">
<li><span> {{i + 1}} </span>
{{playerSalesActivityItem.name}}</li>
<li class="day">{{playerSalesActivityItem.scoreDay!=null?playerSalesActivityItem.scoreDay:'-'}}</li>
<li>{{playerSalesActivityItem.scoreWeek!=null?playerSalesActivityItem.scoreWeek:'-'}}</li>
<li>{{playerSalesActivityItem.scoreMonth!=null?playerSalesActivityItem.scoreMonth:'-'}}</li>
<li>{{playerSalesActivityItem.addOpportunityNum!=null?playerSalesActivityItem.addOpportunityNum:'-'}}</li>
<li><i class="iconfont icon-ar-r" style="color: #A4A4A4FF;font-size: 12px;" [routerLink]="['/scoreDeatil',playerSalesActivityItem.practitionerId]"></i></li>
{{personalItem.name}}</li>
<li class="day">{{personalItem.dayScore}}</li>
<li>{{personalItem.weekScore}}</li>
<li>{{personalItem.monthScore}}</li>
<li>{{personalItem.rate}}</li>
<li><i class="iconfont icon-ar-r" style="color: #A4A4A4FF;font-size: 12px;" [routerLink]="['/scoreDeatil',personalItem.practitionerId]"></i></li>
</ul>
</div>
......@@ -50,7 +50,7 @@
</ul>
</div>
<div class="content_wrapper forecast">
<ul>
<ul style="border-bottom: none;">
<li class="name">姓名</li>
<li>FYP</li>
<li>FYC</li>
......@@ -62,7 +62,7 @@
暂无战队成员,努力去增员吧
</div>
<ul *ngFor="let forecastItem of salesPerformanceForecastInfos;index as i;">
<li class="name">{{forecastItem.name}}</li>
<li class="name"><span>{{i+1}}</span>{{forecastItem.name}}</li>
<li>{{forecastItem.premium!=null?'¥'+lifeCommonService.transform(forecastItem.premium):'-'}}</li>
<li>{{forecastItem.commission!=null?'¥'+lifeCommonService.transform(forecastItem.commission):'-'}}</li>
<li class="count">{{forecastItem.pieces!=null?forecastItem.pieces:'-'}}</li>
......
......@@ -18,7 +18,7 @@
overflow: hidden;
border-radius: 6px;
color: #fff;
height: 135px;
height: 125px;
img{
width: 12%;
margin-left: -8%;
......@@ -120,9 +120,15 @@
}
.content_wrapper.forecast{
ul li{
width: 28%;
width: 26%;
margin: 0;
overflow: hidden;
span{
position: absolute;
left: 0;
width: 15px;
text-align: center;
}
}
ul li:nth-child(2),ul li:nth-child(3){
text-align: right;
......@@ -134,7 +140,7 @@
width: 16%;
}
ul li.name{
width: 15%;
width: 20%;
}
}
......
......@@ -15,6 +15,7 @@ export class TeamSalesScoreComponent implements OnInit {
playerSalesActivityInfo: Array<any>;
selectedSalseItem: any;
salesPerformanceForecastInfos: Array<any>;
personalList:Array<any>;
constructor(private activateRoute: ActivatedRoute, private router: Router,
private myService: MyService, public lifeCommonService: LifeCommonService) { }
......@@ -24,7 +25,7 @@ export class TeamSalesScoreComponent implements OnInit {
//判断显示销售得分还是销售预测
this.showType = this.activateRoute.snapshot.paramMap.get('type');
if (this.showType === 'teamSalesScore') {
this.playerSalesActivityQuery()
this.queryPEPScore();
}
if (this.showType === 'forecast') {
this.salesPerformanceForecastListQuery('m')
......@@ -32,13 +33,13 @@ export class TeamSalesScoreComponent implements OnInit {
}
//获取成员销售活动量得分
playerSalesActivityQuery() {
this.myService.playerSalesActivityQuery({ practitionerId: this.practitionerId }).subscribe((res) => {
if (res['success']) {
this.playerSalesActivityInfo = res['data']['playerSalesActivityInfo']
}
})
}
// playerSalesActivityQuery() {
// this.myService.playerSalesActivityQuery({ practitionerId: this.practitionerId }).subscribe((res) => {
// if (res['success']) {
// this.playerSalesActivityInfo = res['data']['playerSalesActivityInfo']
// }
// })
// }
salesPerformanceForecastListQuery(type) {
this.selectedSalseItem = type;
......@@ -52,4 +53,15 @@ export class TeamSalesScoreComponent implements OnInit {
}
})
}
//活动量得分统计
queryPEPScore(){
this.myService.queryPEPScore({ practitionerId: this.practitionerId }).subscribe((res)=>{
console.log(res)
if(res['success']){
this.personalList = res['data']['personalList'];
console.log( this.personalList)
}
})
}
}
......@@ -108,13 +108,20 @@ input::placeholder {
}
.timeContent{
// .am-picker-col{
.am-picker-col{
// height: 102px;
// .am-picker-col-mask{
// background-size: 100% 34px!important;
// }
// }
.am-picker-col-indicator {
background: #f6f6f6;
border-radius: 50px;
z-index: 0;
}
.am-picker-col-indicator::before,.am-picker-col-indicator::after{
background-color: transparent;
}
}
}
.search_wrapper{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment