Commit 73ce0e34 by Sweet Zhang

合并

parents 215ed529 47852285
{
"version": "2.0.0",
"tasks": [
{
"type": "npm",
"script": "start",
"problemMatcher": [],
"label": "npm: start",
"detail": "ng serve --host 0.0.0.0 --port 4205 -o"
}
]
}
Stack trace:
Frame Function Args
000FFFFBC30 001800606B9 (000FFFFBE38, 000FFFFCE00, 001801214F5, 000FFFFDE50)
00000000002 0018006259A (00000000064, 00000000000, 000000008F0, 00000000000)
000FFFFBF10 0018012932B (7FFF6D7E5B89, 00000000000, 00000000000, 00000000000)
000FFFFC1F0 0018012590E (001800A3A25, 00000000000, 00000000000, 00000001000)
00600000000 00180125E04 (3A6D39335B1BA3BD, 656C69706D6F4320, 7365636375732064, 00000000006)
00600000000 00180126049 (000FFFFC430, 00000000000, 0018011D727, 00000000001)
00600000000 0018012632F (00000001000, 00100493280, 00100498320, 00100497D80)
00600000000 001801623C8 (0018013A3BA, 7FFF6D4610C4, 000FFFFC430, 00100497D80)
00100493280 001800C02FF (00000000000, 00180328E30, 001004981D0, 00000000000)
00100493280 001801214AB (00000000000, 00180328E30, 001004981D0, 00000000000)
00100493280 0010042E591 (001004932B9, FFFFFFFFFFFFFFFF, 7FFF6F735602, 00000000000)
00000000039 0010040AD0F (000FFFFC510, 7FFF6F777110, 00100497D68, 00600000001)
000FFFFC510 0010043FF45 (00180192FEC, 0000000000E, 00180059960, 0000000000E)
000FFFFCCD0 00180049E84 (00000000000, 00000000000, 00000000000, 00000000000)
00000000000 00180047963 (00000000000, 00000000000, 00000000000, 00000000000)
000FFFFFFF0 00180047A14 (00000000000, 00000000000, 00000000000, 00000000000)
End of stack trace (more stack frames may be present)
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
"core-js": "^2.5.4", "core-js": "^2.5.4",
"dayjs": "1.10.4", "dayjs": "1.10.4",
"echarts": "^4.9.0", "echarts": "^4.9.0",
"html2canvas": "^1.0.0-rc.7", "html2canvas": "^1.4.1",
"jquery": "^3.5.1", "jquery": "^3.5.1",
"jspdf": "^2.3.0", "jspdf": "^2.3.0",
"ng-zorro-antd-mobile": "^0.12.5", "ng-zorro-antd-mobile": "^0.12.5",
......
<!--The content below is only a placeholder and can be replaced.--> <!--The content below is only a placeholder and can be replaced.-->
<router-outlet></router-outlet> <div ydlifeScroll>
<ydlife-guide-page *ngIf="shareGuidePageEnable"></ydlife-guide-page> <div [ngStyle]="{'padding-bottom':isShowIndexBtn ? '70px' : '0'}">
<ydlife-alert *ngIf="isNeedAlert" [dialogInfo]="dialogInfo" (popInfo)="getPopInfo()"></ydlife-alert> <router-outlet></router-outlet>
<div class="returnIndexBox" *ngIf="isShowIndexBtn" appDrag> </div>
<div><i class="iconfont icon-shouye"></i></div> <ydlife-guide-page *ngIf="shareGuidePageEnable"></ydlife-guide-page>
<div>首页</div> <ydlife-alert *ngIf="isNeedAlert" [dialogInfo]="dialogInfo" (popInfo)="getPopInfo()"></ydlife-alert>
</div> <!-- <div class="returnIndexBox" *ngIf="isShowIndexBtn" appDrag [routerLink]="'/'">
\ No newline at end of file <div><i class="iconfont icon-shouye"></i></div>
<div>首页</div>
</div> -->
<div class="questionContainer" id="menuContainer" *ngIf="iconShowFlag" appDrag>
<div style="position: relation;" *ngIf="askIconFlag">
<div [routerLink]="'/underwriting_knowledge'">
<img src="assets/images/ask.gif" alt="" srcset="">
</div>
<div class="closeIcon" (click)="close()">X</div>
</div>
</div>
<footer *ngIf="isShowIndexBtn">
<ul>
<li *ngFor="let item of menuLists" (click)="menuSelect(item)">
<div>
<img [src]="'./assets/images/indexIcons/'+item.icon + (selectedMenuKey===item.key ? 'Activated' : 'Inactivated') + '.png'" alt="" srcset="">
</div>
<div>{{item.name}}</div>
</li>
</ul>
</footer>
</div>
<!--弹窗提醒 -->
<div class="tipsInfoContainer" *ngIf="viewStatus===0" (click)="closeDialog($event)">
<div class="tipsInfoContent">
<img src="./assets/images/bell.png" alt="" class="bell">
<img src="./assets/images/dialogBg.png" alt="" style="margin-top:-2px">
<div>您有续期保单待处理</div>
<button (click)="viewDetail()">立即查看</button>
</div>
</div>
.questionContainer{
position: fixed;
right: 0;
top: 50%;
width: 96px;
height: 96px;
#menuListContainer{
li{
height: 50px;
text-align: center;
background: rgba(0,0,0,0.5);
margin-bottom: 5px;
line-height: 50px;
color: #fff;
}
}
.closeIcon{
position: absolute;
right: 2px;
top: -15px;
color: #fff;
font-size: 18px;
border-radius: 50%;
width: 26px;
height: 26px;
display: flex;
justify-content: center;
align-items: center;
background: #c7c7c7;
}
&#menuContainer{
transition: all 0.5s ease-out;
}
}
footer{
position: fixed;
bottom: 0;
left: 50%;
width: 100%;
height: 70px;
border-top: 1px solid #f5f5f5;
background: #fff;
color: #333;
font-size: 12px;
min-width: 320px;
max-width: 640px;
padding-bottom: 20px;
transform: translateX(-50%);
ul{
display: flex;
align-items: center;
justify-content: space-around;
li{
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
>div:first-child{
width: 30px;
}
}
}
}
.tipsInfoContainer {
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
position: fixed;
left: 0;
top: 0;
display: flex;
align-items: center;
.tipsInfoContent {
position: relative;
width: 85%;
padding-bottom: 10px;
margin: 0 auto;
background: #fff;
border-radius: 10px;
text-align: center;
color: #1b5b99;
max-width: 500px;
div{
font-size: 20px;
margin-bottom: 30px;
margin-top: 20px;
}
button {
background: #1b5b99;
color: #fff;
width: 142px;
height: 33px;
line-height: 33px;
text-align: center;
border:none;
outline:none;
border-radius:35px;
}
.bell{
position: absolute;
left: 50%;
top: 0;
transform: translate(-50%,-50%);
width: 30px
}
}
}
\ No newline at end of file
import { Component, OnDestroy, OnInit } from '@angular/core'; import { Component, ElementRef, OnDestroy, OnInit } from '@angular/core';
import { AuthService } from "./auth/auth.service"; import { AuthService } from "./auth/auth.service";
import { LifeCommonService } from "./common/life-common.service"; import { LifeCommonService } from "./common/life-common.service";
import { Subscription } from "rxjs/index"; import { Subscription } from "rxjs/index";
import {Router, NavigationStart} from '@angular/router'; import {Router, NavigationStart, ActivatedRoute, NavigationEnd, ActivationEnd} from '@angular/router';
import { MyService } from './my/my.service';
declare var wx: any; declare var wx: any;
@Component({ @Component({
...@@ -19,14 +21,55 @@ export class AppComponent implements OnInit, OnDestroy { ...@@ -19,14 +21,55 @@ export class AppComponent implements OnInit, OnDestroy {
// 是否显示首页浮标 // 是否显示首页浮标
isShowIndexBtn: boolean; isShowIndexBtn: boolean;
loginId:any; loginId:any;
constructor(private router: Router,private authService: AuthService, private lifeCommonService: LifeCommonService) { // 提问icon显示隐藏
askIconFlag:boolean = true;
iconShowFlag:boolean = true;
// 0是未看 1是已看
viewStatus:number;
lifeCustomerInfo:any;
constructor(private router: Router,
private authService: AuthService,
private lifeCommonService: LifeCommonService,
private activatedRoute:ActivatedRoute,
private myService:MyService,
private el:ElementRef) {
this.subscription = lifeCommonService.shareStatus$.subscribe(status => { this.subscription = lifeCommonService.shareStatus$.subscribe(status => {
this.shareGuidePageEnable = status == '1'; this.shareGuidePageEnable = status == '1';
}); })
} }
public menuLists = [
{key:1,name:'首页',icon:'index',link:'/'},
{key:2,name:'产品库',icon:'product',link:'/product'},
{key:3,name:'日程',icon:'schedule',link:'/todo'},
{key:4,name:'我的',icon:'mine',link:'/mine'},
]
public selectedMenuKey:number=1;
// 点击底部菜单
menuSelect(item){
this.selectedMenuKey = item.key;
this.router.navigate([item.link]);
}
closeDialog(e){
if(e.target.className.indexOf('tipsInfoContainer')>-1){
this.viewStatus = 1;
sessionStorage.setItem('hadView','true')
}
}
viewDetail(){
this.viewStatus = 1;
sessionStorage.setItem('hadView','true');
this.router.navigate(['/renewal_reminder'])
}
ngOnInit() { ngOnInit() {
this.loginId = localStorage.getItem('lifeCustomerInfo')?JSON.parse(localStorage.getItem('lifeCustomerInfo')).mobileNo:null; sessionStorage.setItem('iconShowFlag','true');
this.lifeCustomerInfo = JSON.parse(localStorage.getItem('lifeCustomerInfo')) ? JSON.parse(localStorage.getItem('lifeCustomerInfo')) : null;
this.loginId = this.lifeCustomerInfo ? this.lifeCustomerInfo.mobileNo:null;
this.authService.obtainToken(this.loginId).subscribe(res => { this.authService.obtainToken(this.loginId).subscribe(res => {
if (res['success']) { if (res['success']) {
localStorage.setItem('lifeToken', res['data']['token']); localStorage.setItem('lifeToken', res['data']['token']);
...@@ -37,8 +80,40 @@ export class AppComponent implements OnInit, OnDestroy { ...@@ -37,8 +80,40 @@ export class AppComponent implements OnInit, OnDestroy {
this.getVersion(); this.getVersion();
this.router.events.forEach((event) => { this.router.events.forEach((event) => {
if (event instanceof NavigationStart) { if (event instanceof NavigationStart) {
// 控制首页浮标显示与否 // 控制首页浮标显示与否和底部菜单
this.isShowIndexBtn = event.url == '/approval_list'; this.isShowIndexBtn = event.url.indexOf('/login') < 0;
this.iconShowFlag = !!localStorage.getItem('lifeCustomerInfo');
if(event.url.indexOf('/material/')>=0
|| event.url.indexOf('/inviter')>=0
|| event.url.indexOf('/register')>=0
|| event.url.indexOf('/invitees')>=0
){
this.isShowIndexBtn = false;
}
// 更新底部图标状态
if(event.url.indexOf('/product')===0){
this.selectedMenuKey = 2
}else if(event.url.indexOf('/todo')===0){
this.selectedMenuKey = 3
}else if(event.url == '/' || event.url == '/my'){
this.selectedMenuKey = 1
// 查询是否有续期提醒订单
if(sessionStorage.getItem('hadView')){
this.viewStatus = 1;
}else{
if(this.lifeCustomerInfo){
this.queryNoticeList();
}
}
}else if(event.url.indexOf('/mine')===0){
this.selectedMenuKey = 4
}else{
this.selectedMenuKey = 0;
}
}
if(event instanceof ActivationEnd){
this.lifeCommonService.setTitle(`${event.snapshot.data[0] && event.snapshot.data[0].title ? event.snapshot.data[0].title : '银盾保险经纪'}`)
} }
}); });
} }
...@@ -47,7 +122,6 @@ export class AppComponent implements OnInit, OnDestroy { ...@@ -47,7 +122,6 @@ export class AppComponent implements OnInit, OnDestroy {
this.subscription.unsubscribe(); this.subscription.unsubscribe();
} }
// 微信JS-SDK注册 // 微信JS-SDK注册
ydWxConfig() { ydWxConfig() {
const url = encodeURIComponent(location.href.split('#')[0]); const url = encodeURIComponent(location.href.split('#')[0]);
...@@ -65,6 +139,19 @@ export class AppComponent implements OnInit, OnDestroy { ...@@ -65,6 +139,19 @@ export class AppComponent implements OnInit, OnDestroy {
}); });
} }
// 获取是否有续期提醒订单
queryNoticeList(){
this.myService.queryNoticeList({practitionerId:this.lifeCustomerInfo.practitionerId,status:0}).subscribe(res=>{
if(res['success']){
if(res['data']['list'] && res['data']['list'].length > 0){
this.viewStatus = 0;
}else{
sessionStorage.setItem('hadView','true')
}
}
})
}
// 关闭弹窗 // 关闭弹窗
getPopInfo() { getPopInfo() {
this.isNeedAlert = false; this.isNeedAlert = false;
...@@ -88,6 +175,7 @@ export class AppComponent implements OnInit, OnDestroy { ...@@ -88,6 +175,7 @@ export class AppComponent implements OnInit, OnDestroy {
const Version = localStorage.getItem('Version'); const Version = localStorage.getItem('Version');
//如果缓存有版本号对比本地和接口版本 //如果缓存有版本号对比本地和接口版本
if (Version != this.currentVersion) { if (Version != this.currentVersion) {
localStorage.clear();
this.isNeedAlert = true; this.isNeedAlert = true;
this.dialogInfo = { this.dialogInfo = {
title: null, title: null,
...@@ -100,4 +188,9 @@ export class AppComponent implements OnInit, OnDestroy { ...@@ -100,4 +188,9 @@ export class AppComponent implements OnInit, OnDestroy {
}) })
} }
close(){
this.askIconFlag=this.iconShowFlag=false
sessionStorage.setItem('iconShowFlag',this.iconShowFlag+'')
}
} }
...@@ -14,13 +14,15 @@ import { SafeHtmlPipe } from './safe-html.pipe'; ...@@ -14,13 +14,15 @@ import { SafeHtmlPipe } from './safe-html.pipe';
import { LocalStorage } from './domain/local.storage'; import { LocalStorage } from './domain/local.storage';
import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
import { DragDirective } from './directive/drag.directive'; import { DragDirective } from './directive/drag.directive';
import { ScrollDirective } from './directive/scroll.directive';
@NgModule({ @NgModule({
declarations: [ declarations: [
AppComponent, AppComponent,
PageNotFoundComponent, PageNotFoundComponent,
SafeHtmlPipe, SafeHtmlPipe,
DragDirective DragDirective,
ScrollDirective
], ],
imports: [ imports: [
BrowserModule, BrowserModule,
......
...@@ -43,9 +43,9 @@ export class AuthService { ...@@ -43,9 +43,9 @@ export class AuthService {
/** /**
* 获取TOKEN * 获取TOKEN
*/ */
obtainToken(loginId) { obtainToken(loginId,customerId=localStorage.getItem('lifeCustomerInfo') ? JSON.parse(localStorage.getItem('lifeCustomerInfo')).customerId:null) {
const url = this.API + '/authorize/obtainToken'; const url = this.API + '/authorize/obtainToken';
return this.http.post(url, JSON.stringify({ ticket: "life",loginId:loginId})); return this.http.post(url, JSON.stringify({ ticket: "life",loginId:loginId,customerId:customerId}));
} }
//获取微信配置ydLife公众号 //获取微信配置ydLife公众号
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
} }
.weui-form{ .weui-form{
padding: 56px 15px 0px 15px; padding: 56px 15px 0px 15px;
height: 100vh;
} }
.weui-form__opr-area{ .weui-form__opr-area{
.login{ .login{
......
...@@ -90,7 +90,7 @@ export class LoginComponent implements OnInit, OnDestroy { ...@@ -90,7 +90,7 @@ export class LoginComponent implements OnInit, OnDestroy {
sessionStorage.setItem('subordinateSystemName', response['data']['practitionerBasicInfo']['subordinateName']) sessionStorage.setItem('subordinateSystemName', response['data']['practitionerBasicInfo']['subordinateName'])
} }
const lifeCustomerInfo = { ...response.data, mobileNo: this.userInfo.mobileNo, commonResult: null }; const lifeCustomerInfo = { ...response.data, mobileNo: this.userInfo.mobileNo, commonResult: null };
this.authService.obtainToken(this.userInfo.mobileNo).subscribe((res)=>{ this.authService.obtainToken(this.userInfo.mobileNo,response['data']['customerId']).subscribe((res)=>{
if (res['success']) { if (res['success']) {
localStorage.setItem('lifeToken', res['data']['token']); localStorage.setItem('lifeToken', res['data']['token']);
} }
...@@ -108,7 +108,7 @@ export class LoginComponent implements OnInit, OnDestroy { ...@@ -108,7 +108,7 @@ export class LoginComponent implements OnInit, OnDestroy {
this.redirect = this.authService.redirectUrl ? this.router.parseUrl(this.authService.redirectUrl) : '/my'; this.redirect = this.authService.redirectUrl ? this.router.parseUrl(this.authService.redirectUrl) : '/my';
this.router.navigateByUrl(this.redirect); this.router.navigateByUrl(this.redirect);
} else { } else {
this.redirect = this.authService.redirectUrl ? this.router.parseUrl(this.authService.redirectUrl) : '/thanks'; this.redirect = this.authService.redirectUrl ? this.router.parseUrl(this.authService.redirectUrl) : '/thanks?type=1';
this.router.navigateByUrl(this.redirect); this.router.navigateByUrl(this.redirect);
} }
} }
...@@ -117,7 +117,7 @@ export class LoginComponent implements OnInit, OnDestroy { ...@@ -117,7 +117,7 @@ export class LoginComponent implements OnInit, OnDestroy {
this.redirect = this.authService.redirectUrl ? this.router.parseUrl(this.authService.redirectUrl) : '/my'; this.redirect = this.authService.redirectUrl ? this.router.parseUrl(this.authService.redirectUrl) : '/my';
this.router.navigateByUrl(this.redirect); this.router.navigateByUrl(this.redirect);
} else { } else {
this.redirect = this.authService.redirectUrl ? this.router.parseUrl(this.authService.redirectUrl) : '/thanks'; this.redirect = this.authService.redirectUrl ? this.router.parseUrl(this.authService.redirectUrl) : '/thanks?type=1';
this.router.navigateByUrl(this.redirect); this.router.navigateByUrl(this.redirect);
} }
} }
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
</div> </div>
<div class="weui-dialog__ft"> <div class="weui-dialog__ft">
<a href="javascript:;" class="weui-dialog__btn" [ngClass]="footer.className" <a href="javascript:;" class="weui-dialog__btn" [ngClass]="footer.className"
*ngFor="let footer of dialogInfo.footer" (click)="sendInfo()">{{footer.value}}</a> *ngFor="let footer of dialogInfo.footer" (click)="sendInfo(footer.value)">{{footer.value}}</a>
</div> </div>
</div> </div>
</div> </div>
......
a:hover.weui-dialog__ft{ a:hover.weui-dialog__ft{
color: #fff; color: #fff;
text-decoration: none; text-decoration: none;
}
.weui-dialog__btn_default{
color: #666;
} }
\ No newline at end of file
...@@ -21,7 +21,7 @@ export class AlertComponent implements OnInit { ...@@ -21,7 +21,7 @@ export class AlertComponent implements OnInit {
ngOnInit() { ngOnInit() {
} }
sendInfo() { sendInfo(e) {
this.popInfo.emit(); this.popInfo.emit(e);
} }
} }
import { SafeResourceUrlPipe } from './safe-resource-url.pipe';
describe('SafeResourceUrlPipe', () => {
it('create an instance', () => {
const pipe = new SafeResourceUrlPipe();
expect(pipe).toBeTruthy();
});
});
import { Pipe, PipeTransform } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
@Pipe({
name: 'safeResourceUrl'
})
export class SafeResourceUrlPipe implements PipeTransform {
constructor(private sanitized:DomSanitizer){}
transform(value: any, args?: any): any {
return this.sanitized.bypassSecurityTrustResourceUrl(value);
}
}
<video *ngIf="!pdfPath" #video
[src]="videoSrc"
controls="true"
width="100%" preload="auto" (contextmenu)="menuPrevent()" x5-playsinline="true" playsinline="true" webkit-playsinline="true" disablePictureInPicture>
您的浏览器不支持 video 标签。
</video>
<!-- <button type="button" class="downloadBtn" (click)="download(videoSrc)" *ngIf="permissions.isDownload&&deviceType!='1'&&!pdfPath">下载资源</button> -->
<iframe *ngIf="pdfPath" [src]="pdfPath | safeResourceUrl" frameborder="0" width="100%" height="100%" style="min-height: 100vh;"></iframe>
\ No newline at end of file
.downloadBtn{
background: #1b5b99;
color: #fff;
padding: 5px 10px;
border: none;
outline: none;
border-radius: 4px;
float: right;
margin-right: 15px;
}
\ No newline at end of file
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { VideoComponent } from './video.component';
describe('VideoComponent', () => {
let component: VideoComponent;
let fixture: ComponentFixture<VideoComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ VideoComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(VideoComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { AfterViewInit, Component, ElementRef, OnDestroy, OnInit, ViewChild, } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { MyService } from 'src/app/my/my.service';
import { LifeCommonService } from '../life-common.service';
@Component({
selector: 'ydlife-video',
templateUrl: './video.component.html',
styleUrls: ['./video.component.scss']
})
export class VideoComponent implements OnInit, AfterViewInit, OnDestroy {
@ViewChild('video') video: ElementRef;
videoSrc: string;
pdfPath: any;
permissions: any;
lifeCustomerInfo: any;
timer: any;
timer2: any;
videoPlaybacks: Array<any>;
originTime: number = 0;
fileId:string;
deviceType:string;
maxViewTime:number = 0;
constructor(private activatedRoute: ActivatedRoute, private myService: MyService,private lifeCommonService:LifeCommonService) { }
ngOnInit() {
this.deviceType = this.lifeCommonService.checkDeviceType();
this.videoSrc = sessionStorage.getItem('videoPath');
this.permissions = JSON.parse(sessionStorage.getItem('permissions'));
this.pdfPath = this.activatedRoute.snapshot.queryParams['path'];
this.lifeCustomerInfo = JSON.parse(localStorage.getItem('lifeCustomerInfo'));
this.fileId = this.activatedRoute.snapshot.params['fileId'];
if(!this.pdfPath){
this.queryVideoPlayback(1);
}
}
ngAfterViewInit(): void {
if(!this.pdfPath){
this.video.nativeElement.addEventListener('pause', ()=> { //暂停开始执行的函数
clearInterval(this.timer);
clearInterval(this.timer2);
console.log('暂停播放')
this.saveVideoPlayback();
});
this.video.nativeElement.addEventListener('play', ()=> { //开始执行的函数
this.timer = setInterval(() => {
console.log('开始播放')
this.saveVideoPlayback();
}, 1000 * 20)
this.queryVideoPlayback(2)
});
if (this.permissions.isDownload == '2') {
this.video.nativeElement.setAttribute('controlslist', this.video.nativeElement.getAttribute('controlslist') + ' nodownload')
} else {
this.video.nativeElement.setAttribute('controlslist', this.video.nativeElement.getAttribute('controlslist'))
}
if (this.permissions.isControlPlayback == '2') {
this.video.nativeElement.setAttribute('controlslist', this.video.nativeElement.getAttribute('controlslist') + ' noplaybackrate')
} else {
this.video.nativeElement.setAttribute('controlslist', this.video.nativeElement.getAttribute('controlslist'))
}
}
}
ngOnDestroy(): void {
if(!this.pdfPath){
clearInterval(this.timer);
clearInterval(this.timer2);
this.saveVideoPlayback();
}
}
menuPrevent() {
return false;
}
saveVideoPlayback() {
// playbackStatus 视频播放状态(1:未播放完;2:已播放完) 【必填】
const param = {
id: '',
customerId: this.lifeCustomerInfo.customerId,
practitionerId: this.lifeCustomerInfo.practitionerId,
fileId: this.fileId,
totalTime: this.video.nativeElement.duration,
viewTime: this.video.nativeElement.currentTime,
playbackStatus: this.video.nativeElement.currentTime >= this.video.nativeElement.duration ? 2 : 1,
}
this.myService.saveVideoPlayback(param).subscribe(res => {
console.log(res);
})
}
queryVideoPlayback(type) {
const param = {
id: null,
customerId: this.lifeCustomerInfo.customerId,
practitionerId: this.lifeCustomerInfo.practitionerId,
fileId: this.fileId,
}
this.myService.queryVideoPlayback(param).subscribe(res => {
if (res['success']) {
this.videoPlaybacks = res['data']['videoPlaybacks'];
this.maxViewTime = this.videoPlaybacks[0]['maxViewTime'];
if(type===1){
// 设置开始播放时间为上次离开时间
this.originTime = this.video.nativeElement.currentTime = this.videoPlaybacks.length > 0 ? this.videoPlaybacks[0]['viewTime'] : 0;
}else{
// 监测有没有拖动进度条
this.timer2 = setInterval(()=>{
if (this.video.nativeElement.currentTime - this.originTime > 1 && this.video.nativeElement.currentTime > this.maxViewTime) {
this.video.nativeElement.currentTime = this.originTime;
}
this.originTime = this.video.nativeElement.currentTime;
},500)
}
} else {
this.video.nativeElement.currentTime = 0;
}
console.log(res);
})
}
download(path){
window.open(path)
}
}
import {Directive, ElementRef, OnInit, HostListener} from '@angular/core'; import {Directive, ElementRef, OnInit, HostListener, Input} from '@angular/core';
import {Router} from '@angular/router'; import {Router} from '@angular/router';
...@@ -6,6 +6,7 @@ import {Router} from '@angular/router'; ...@@ -6,6 +6,7 @@ import {Router} from '@angular/router';
selector: '[appDrag]' selector: '[appDrag]'
}) })
export class DragDirective implements OnInit { export class DragDirective implements OnInit {
@Input() isNeedReturn = '';
isDown = false; isDown = false;
cur: any = { cur: any = {
x: 0, x: 0,
...@@ -47,7 +48,9 @@ export class DragDirective implements OnInit { ...@@ -47,7 +48,9 @@ export class DragDirective implements OnInit {
@HostListener('mouseup', ['$event']) @HostListener('mouseup', ['$event'])
onMouseup(event) { onMouseup(event) {
// 只用当元素移动过了,离开函数体才会触发。 // 只用当元素移动过了,离开函数体才会触发。
this.router.navigate(['/']); if(this.isNeedReturn=='1'){
this.router.navigate(['/']);
}
} }
ngOnInit() { ngOnInit() {
...@@ -109,16 +112,12 @@ export class DragDirective implements OnInit { ...@@ -109,16 +112,12 @@ export class DragDirective implements OnInit {
if (this.disX !== 0 || this.disY !== 0) { if (this.disX !== 0 || this.disY !== 0) {
if (parseInt(this.el.nativeElement.style.left, 0) < document.body.clientWidth / 2) { if (parseInt(this.el.nativeElement.style.left, 0) < document.body.clientWidth / 2) {
this.el.nativeElement.style.left = '0px'; this.el.nativeElement.style.left = '0px';
this.el.nativeElement.style.right = 'auto';
} else { } else {
this.el.nativeElement.style.left = 'calc(100% - 70px)'; this.el.nativeElement.style.left = 'auto';
this.el.nativeElement.style.right = '10px';
} }
return; return;
} else { }
// 阻止点透事件
setTimeout(() => {
this.router.navigate(['/'])
}, 300)
}
} }
} }
import { ScrollDirective } from './scroll.directive';
describe('ScrollDirective', () => {
it('should create an instance', () => {
const directive = new ScrollDirective();
expect(directive).toBeTruthy();
});
});
import { Directive, ElementRef, HostListener, Input } from '@angular/core';
@Directive({
selector: '[ydlifeScroll]'
})
export class ScrollDirective {
@Input('display') display:string;
constructor(private el:ElementRef) { }
@HostListener('touchmove') onTouchmove(){
if(this.el.nativeElement.querySelector('#menuContainer')){
if(parseInt(this.el.nativeElement.querySelector('#menuContainer').style.left, 0) < document.body.clientWidth / 2){
this.el.nativeElement.querySelector('#menuContainer').style.transform = 'translateX(-50px)'
}else{
this.el.nativeElement.querySelector('#menuContainer').style.transform = 'translateX(50px)'
}
}
}
@HostListener('touchend') onTouchcancel(){
setTimeout(()=>{
if(this.el.nativeElement.querySelector('#menuContainer')){
if(sessionStorage.getItem('iconShowFlag')=='false'){
this.el.nativeElement.querySelector('#menuContainer').style.display = 'none'
}else{
this.el.nativeElement.querySelector('#menuContainer').style.display = 'block'
this.el.nativeElement.querySelector('#menuContainer').style.transform = 'translateX(0)'
}
}
},1000)
}
}
...@@ -26,7 +26,8 @@ export class BusinessQuery { ...@@ -26,7 +26,8 @@ export class BusinessQuery {
public expertType?: any, public expertType?: any,
public expertPractitionerId?: any, public expertPractitionerId?: any,
public expertPractitionerName?: any, public expertPractitionerName?: any,
public mdDropOptionName?: any public mdDropOptionName?: any,
public birthDate?: any,
) { ) {
......
...@@ -15,7 +15,13 @@ export class EmployQuery { ...@@ -15,7 +15,13 @@ export class EmployQuery {
public subsystemOwnerId?:number, public subsystemOwnerId?:number,
public subsystemOwner?:string, public subsystemOwner?:string,
public branchId?:number, public branchId?:number,
public branch?:string public branch?:string,
public s3SubordinateSystemName?:string,
public s3TeamLeaderName?:string,
public s2SubordinateSystemName?:string,
public s2TeamLeaderName?:string,
public s1SubordinateSystemName?:string,
public s1TeamLeaderName?:string,
) { ) {
} }
} }
\ No newline at end of file
...@@ -6,7 +6,8 @@ export class SettingInfo { ...@@ -6,7 +6,8 @@ export class SettingInfo {
public practitionerId?: any, public practitionerId?: any,
public wxQRImgUrl?: any, public wxQRImgUrl?: any,
public isMobileShow?: any, public isMobileShow?: any,
public isNameShow?: any public isNameShow?: any,
public bioIntroTwo?: any,
) { ) {
} }
} }
<div class="todo_wrapper"> <div class="todo_wrapper">
<!-- <div Button (onClick)="showAlert()">customized buttons</div> --> <!-- <div Button (onClick)="showAlert()">customized buttons</div> -->
<div class="top"> <div class="top">
<div class="head"> <!-- <div class="head">
<h3 (click)="goBack()" style="position: absolute;left: 10px;">&lt;</h3> <h3 (click)="goBack()" style="position: absolute;left: 10px;">&lt;</h3>
<h3>新建日程</h3> <h3>新建日程</h3>
<div></div> <div></div> -->
<!-- <div id="add_calendar_wrapper"> <!-- <div id="add_calendar_wrapper">
<List className="calendar-list" style="backgroundColor: 'white'"> <List className="calendar-list" style="backgroundColor: 'white'">
<ListItem (onClick)="clickCalendar()"> <ListItem (onClick)="clickCalendar()">
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
(onConfirm)="triggerConfirm($event)" (onConfirm)="triggerConfirm($event)"
></Calendar> ></Calendar>
</div> --> </div> -->
</div> <!-- </div> -->
<ul class="nav"> <ul class="nav">
<li *ngFor="let tabItem of tabList;index as i;" [ngClass]="{'selected':tabItem.code === tabType}" (click)="selectTab(tabItem.code,tabItem.taskType)"> <li *ngFor="let tabItem of tabList;index as i;" [ngClass]="{'selected':tabItem.code === tabType}" (click)="selectTab(tabItem.code,tabItem.taskType)">
<span> {{tabItem.name}} </span> <span> {{tabItem.name}} </span>
...@@ -98,7 +98,7 @@ ...@@ -98,7 +98,7 @@
</ul> </ul>
</div> </div>
<div class="part_wrapper part4" > <div class="part_wrapper part4" >
<div style="font-size: 18px;margin-bottom: 10px;">添加备注</div> <div style="font-size: 18px;margin-bottom: 10px;">添加备注/日志</div>
<textarea style="border:0;border-radius:5px;background:#f6f6f6;width: 100%;height: 100px;padding: 10px;resize: none;" [(ngModel)]="addTrack.notice"></textarea> <textarea style="border:0;border-radius:5px;background:#f6f6f6;width: 100%;height: 100px;padding: 10px;resize: none;" [(ngModel)]="addTrack.notice"></textarea>
</div> </div>
</div> </div>
......
...@@ -60,6 +60,8 @@ ul,ol{ ...@@ -60,6 +60,8 @@ ul,ol{
border-radius: 10px; border-radius: 10px;
margin:5px 1%; margin:5px 1%;
position: relative; position: relative;
white-space: nowrap;
font-size: 12px;
} }
li.selected{ li.selected{
background: #1b5b99; background: #1b5b99;
...@@ -129,7 +131,10 @@ ul,ol{ ...@@ -129,7 +131,10 @@ ul,ol{
color: #fff; color: #fff;
text-align: center; text-align: center;
position: fixed; position: fixed;
bottom: 0; bottom: 70px;
color: #fff;
text-align: center;
width: 100%;
font-size: 20px; font-size: 20px;
font-weight: bold; font-weight: bold;
} }
......
.wrapper{ .wrapper{
padding: 10px 8px; padding: 10px 8px;
background-color: #fff;
.headWrapper{ .headWrapper{
.title{ .title{
text-align: center; text-align: center;
......
<div class="wrapper"> <div class="wrapper">
<div class="title"> <div class="title">
<div><span class="line"></span>银行卡号</div> <div><span class="line"></span>银行卡号</div>
<span class="page_mark"> 5/8</span> <span class="page_mark"> 7/11</span>
</div> </div>
<div class="content"> <div class="content">
<div class="contentDetail employ"> <div class="contentDetail employ">
...@@ -16,12 +16,12 @@ ...@@ -16,12 +16,12 @@
</div> </div>
<div class="contentItem" *ngIf="approveStatus==null || approveStatus=='-1'"> <div class="contentItem" *ngIf="approveStatus==null || approveStatus=='-1'">
<input class="form-control" name="" id="" style="text-align: left;padding: 6px 0;" placeholder="再次输入银行卡号以确认" <input class="form-control" name="" id="" style="text-align: left;padding: 6px 0;" placeholder="再次输入银行卡号以确认"
[(ngModel)]="sureBankAccountId" (blur)="bs(3)" onkeyup="this.value=this.value.replace(/\D/g,'')" [(ngModel)]="sureBankAccountId" (blur)="bs(3)" onkeyup="this.value=this.value.replace(/\D/g,'')"
[disabled]="approveStatus!=null && approveStatus!='-1'" maxlength="19"/> [disabled]="approveStatus!=null && approveStatus!='-1'" maxlength="19"/>
</div> </div>
</div> </div>
<div class="tips"> <div class="tips">
<p>此开户银行和银行卡号将做为于经纪人佣金的支付账号,</p> <p>此开户银行和银行卡号将于经纪人佣金的支付账号,</p>
<p>请您确保正确。</p> <p>请您确保正确。</p>
</div> </div>
</div> </div>
......
<div class="wrapper"> <div class="wrapper">
<div class="title"> <div class="title">
<div><span class="line"></span>申请人基本资料</div> <div><span class="line"></span>申请人基本资料</div>
<span class="page_mark"> 1/8</span> <span class="page_mark"> 1/11</span>
</div> </div>
<div class="content"> <div class="content">
<div class="contentDetail employ"> <div class="contentDetail employ">
......
<div class="wrapper"> <div class="wrapper">
<div class="title"> <div class="title">
<div><span class="line"></span>学历信息</div> <div><span class="line"></span>学历信息</div>
<span class="page_mark"> 4/8</span> <span class="page_mark"> 5/11</span>
</div> </div>
<div class="content"> <div class="content">
<div class="contentDetail employ"> <div class="contentDetail employ">
......
...@@ -57,7 +57,7 @@ export class EmployeeEducationComponent implements OnInit { ...@@ -57,7 +57,7 @@ export class EmployeeEducationComponent implements OnInit {
} }
this.myService.saveLastGraduateGrade(param).subscribe((res)=>{ this.myService.saveLastGraduateGrade(param).subscribe((res)=>{
if(res['success']){ if(res['success']){
this.router.navigate(['/bank_card'],{ queryParams: { hiringBasicInfoId:this.hiringBasicInfoId} }); this.router.navigate(['/qrcode_upload'],{ queryParams: { hiringBasicInfoId:this.hiringBasicInfoId} });
}else{ }else{
this.toastDialog = true; this.toastDialog = true;
this.toastInfo = { this.toastInfo = {
...@@ -160,7 +160,7 @@ export class EmployeeEducationComponent implements OnInit { ...@@ -160,7 +160,7 @@ export class EmployeeEducationComponent implements OnInit {
} }
viewNext(){ viewNext(){
this.router.navigate(['/bank_card'],{ queryParams: { hiringBasicInfoId:this.hiringBasicInfoId} }); this.router.navigate(['/qrcode_upload'],{ queryParams: { hiringBasicInfoId:this.hiringBasicInfoId} });
} }
goBack(){ goBack(){
......
<div class="wrapper"> <div class="wrapper">
<div class="title"> <div class="title">
<div><span class="line"></span>个人证件资料</div> <div><span class="line"></span>个人证件资料</div>
<span class="page_mark"> 3/8</span> <span class="page_mark"> 4/11</span>
</div> </div>
<div class="sub_title"> <div class="sub_title">
<strong>身份证件</strong> <strong>身份证件</strong>
......
...@@ -67,7 +67,7 @@ ...@@ -67,7 +67,7 @@
.choseBtn{ .choseBtn{
position: absolute; position: absolute;
font-size: 13px; font-size: 13px;
bottom: 15%; bottom: 19%;
} }
} }
.showImg{ .showImg{
......
...@@ -17,16 +17,32 @@ ...@@ -17,16 +17,32 @@
<div>{{membership?.introducer}}</div> <div>{{membership?.introducer}}</div>
</div> </div>
<div class="contentItem"> <div class="contentItem">
<span>体系名</span> <span>分公司</span>
<div>{{membership?.subsystem}}</div> <div>{{membership?.branch}}</div>
</div>
<div class="contentItem">
<span>S3纵队</span>
<div>{{membership?.s3SubordinateSystemName}}</div>
</div>
<div class="contentItem">
<span>纵队负责人</span>
<div>{{membership?.s3TeamLeaderName}}</div>
</div>
<div class="contentItem">
<span>S2体系</span>
<div>{{membership?.s2SubordinateSystemName}}</div>
</div> </div>
<div class="contentItem"> <div class="contentItem">
<span>体系负责人</span> <span>体系负责人</span>
<div>{{membership?.subsystemOwner}}</div> <div>{{membership?.s2TeamLeaderName}}</div>
</div> </div>
<div class="contentItem"> <div class="contentItem">
<span>分公司</span> <span>S1分部</span>
<div>{{membership?.branch}}</div> <div>{{membership?.s1SubordinateSystemName}}</div>
</div>
<div class="contentItem">
<span>分部负责人</span>
<div>{{membership?.s1TeamLeaderName}}</div>
</div> </div>
</div> </div>
</div> </div>
......
...@@ -8,11 +8,12 @@ ...@@ -8,11 +8,12 @@
color: #333; color: #333;
width: 100%; width: 100%;
text-align: center; text-align: center;
margin: 20px auto 0 auto; padding-top: 20px;
} }
.content { .content {
padding: 10px 5px; padding: 10px 5px;
position: relative; position: relative;
padding-bottom: 70px;
.contentDetail { .contentDetail {
.contentItem { .contentItem {
display: flex; display: flex;
......
<div class="wrapper"> <div class="wrapper">
<div class="title"> <div class="title">
<div><span class="line"></span>薪资单上传</div> <div><span class="line"></span>薪资单上传</div>
<span class="page_mark"> 5/8</span> <span class="page_mark"> 8/11</span>
</div> </div>
<div class="content"> <div class="content">
<div class="photo_wrapper" (click)="selectPic()" *ngIf="!vxUrl"> <div class="photo_wrapper" (click)="selectPic()" *ngIf="!vxUrl">
......
...@@ -38,7 +38,9 @@ ...@@ -38,7 +38,9 @@
line-height: 40px; line-height: 40px;
left: 0; left: 0;
right: 0; right: 0;
bottom: 8%; bottom: 12%;
margin: 0 auto;
text-align: center;
} }
} }
......
<div class="wrapper"> <div class="wrapper">
<div class="title"> <div class="title">
<div><span class="line"></span>个人证件照片资料</div> <div><span class="line"></span>个人证件照片资料</div>
<span class="page_mark"> 3/8</span> <span class="page_mark"> 3/11</span>
</div> </div>
<div class="content"> <div class="content">
<div class="photo_wrapper" (click)="selectPic()" *ngIf="!vxUrl"> <div class="photo_wrapper" (click)="selectPic()" *ngIf="!vxUrl">
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<div class="wrapper" *ngIf="type=='personal_statement'"> <div class="wrapper" *ngIf="type=='personal_statement'">
<div class="title"> <div class="title">
<div><span class="line"></span>个人声明</div> <div><span class="line"></span>个人声明</div>
<span class="page_mark"> 6/8</span> <span class="page_mark"> 9/11</span>
</div> </div>
<div class="content"> <div class="content">
<ul> <ul>
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
<div class="wrapper" *ngIf="type =='contract'"> <div class="wrapper" *ngIf="type =='contract'">
<div class="title"> <div class="title">
<div>合同文档确认</div> <div>合同文档确认</div>
<span class="page_mark"> 7/8</span> <span class="page_mark"> 10/11</span>
</div> </div>
<div class="content"> <div class="content">
<ul> <ul>
......
<div class="wrapper">
<div class="title">
<div><span class="line"></span>微信二维码</div>
<span class="page_mark"> 6/11</span>
</div>
<div class="content">
<div class="photo_wrapper" (click)="selectPic()" *ngIf="!vxUrl">
<img src="assets/images/camera.png" alt="" style="width: 29px;height: 29px;margin-bottom: 20px;"/>
<div>点击添加</div>
</div>
<img alt="微信二维码" src="{{vxUrl}}" *ngIf="vxUrl" (click)="selectPic()">
</div>
<footer class="fixed" (click)="next()" *ngIf="approveStatus==null || approveStatus=='-1'">
保存并下一步
</footer>
<div id="page" *ngIf="approveStatus!=null && approveStatus !='-1'">
<div (click)="goBack()">上一页</div>
<div (click)="viewNext()">下一页</div>
</div>
</div>
<ydlife-toast *ngIf="toastDialog" [toastInfo]="toastInfo"></ydlife-toast>
<ydlife-alert *ngIf="isNeedAlert" [dialogInfo]="dialogInfo" (popInfo)="getPopInfo()"></ydlife-alert>
.wrapper {
font-size: 18px;
background: #fff;
min-height: 100%;
padding: 10px 13px 0 13px;
select{
-webkit-appearance: none;
}
.title{
display: flex;
justify-content: space-between;
font-weight: bold;
align-items: center;
font-size: 20px;
div {
display: flex;
align-items: center;
.line{
width: 5px;
height: 18px;
display: inline-block;
background: #C81B1E;
margin-right: 5px;
}
}
}
.content{
padding: 15px 0 65px 0;
position: relative;
.photo_wrapper{
width: 189px;
min-height: 222px;
margin: 20px auto 0 auto;
text-align: center;
background: #F8F8F8;
border: 1px #8D8D8D dashed;
border-radius: 4px;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
font-size: 14px;
color: #333;
}
.tips{
text-align: center;
font-size: 12px;
margin: 20px auto;
}
}
}
\ No newline at end of file
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { QrcodeUploadComponent } from './qrcode-upload.component';
describe('QrcodeUploadComponent', () => {
let component: QrcodeUploadComponent;
let fixture: ComponentFixture<QrcodeUploadComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ QrcodeUploadComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(QrcodeUploadComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit ,ChangeDetectorRef} from '@angular/core';
import { MyService } from '../../my.service';
import { ActivatedRoute,Router } from "@angular/router";
import { LifeCommonService } from "../../../common/life-common.service";
declare const wx: any;
@Component({
selector: 'ydlife-qrcode-upload',
templateUrl: './qrcode-upload.component.html',
styleUrls: ['./qrcode-upload.component.scss']
})
export class QrcodeUploadComponent implements OnInit {
hiringBasicInfoId:any;
serverId: any;
vxUrl:any = null;
toastDialog: boolean;
toastInfo: any;
isNeedAlert: boolean;
dialogInfo: any;
approveStatus:any;
constructor(private activatedRoute: ActivatedRoute,
private router: Router,public lifeCommonService:LifeCommonService,
public myService:MyService,private changeDetectorRef: ChangeDetectorRef) { }
ngOnInit() {
const title = this.activatedRoute.snapshot.data[0]['title'];
this.lifeCommonService.setTitle(title);
this.hiringBasicInfoId = this.activatedRoute.snapshot.queryParams.hiringBasicInfoId?this.activatedRoute.snapshot.queryParams.hiringBasicInfoId:null;
this.queryWholeInfo(this.hiringBasicInfoId)
}
selectPic(){
if(this.approveStatus==null || this.approveStatus=='-1'){
if(this.lifeCommonService.isWeiXin()){
// 5.1 拍照、本地选图
const t = this;
wx.chooseImage({
count: 1, // 默认9
sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
success: function (res) {
this.localId = res.localIds[0]; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
const THIS = t;
wx.uploadImage({
localId: this.localId, // 需要上传的图片的本地ID,由chooseImage接口获得
isShowProgressTips: 1, // 默认为1,显示进度提示
success: function (response) {
THIS.serverId = response.serverId; // 返回图片的服务器端ID
const m = {
mediaId: response.serverId,
origin: 'ydLife'
};
THIS.myService.mediaGet(m).subscribe(async e => {
if (e['success']) {
THIS.vxUrl = e['data']['imgUrl'];
THIS.changeDetectorRef.markForCheck();
THIS.changeDetectorRef.detectChanges();
} else {
alert(e['message']);
}
});
}
});
}
});
}else{
this.openPopInfo('请在微信端操作!')
}
}
}
next(){
if(!this.vxUrl){
this.openPopInfo('您的微信二维码不能为空,请在微信端上传!')
return;
}
const param = {
hiringBasicInfoId:this.hiringBasicInfoId,
vxUrlQRcode:this.vxUrl
}
this.myService.saveWeChatQRcode(param).subscribe((res)=>{
if(res['success']){
this.router.navigate(['/bank_card'],{ queryParams: { hiringBasicInfoId:this.hiringBasicInfoId} });
}else{
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: res['message'],
timeout: 3000,
align: 'center'
};
}
})
}
// 打开弹窗
openPopInfo(message) {
this.isNeedAlert = true;
this.dialogInfo = {
title: null,
content: { value: message, align: 'center' },
footer: [{ value: '我知道了', routerLink: '', className: 'weui-dialog__btn_primary' }],
};
}
// 关闭弹窗
getPopInfo() {
this.isNeedAlert = false;
}
queryWholeInfo(hiringBasicInfoId){
this.myService.queryWholeInfo({hiringBasicInfoId:hiringBasicInfoId}).subscribe((res)=>{
if(res['success']){
this.approveStatus = res['data']['hiringBasicInfo']['approveStatus'];
this.vxUrl = res['data']['hiringBasicInfo']['wechatQRcodeOssPath']
}else{
this.vxUrl = null;
}
})
}
viewNext(){
this.router.navigate(['/bank_card'],{ queryParams: { hiringBasicInfoId:this.hiringBasicInfoId} });
}
goBack(){
history.go(-1)
}
}
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
</div> </div>
</div> </div>
<footer style="width: 80%;margin-top: 30px;" (click)="checkVerificationCode()">下一步</footer> <footer style="width: 80%;margin-top: 30px;" (click)="checkVerificationCode()">下一步</footer>
<img style="position: relative;bottom: 0;left: 0;z-index: 1;" src="assets/images/register_bg.png" alt="" *ngIf="type!='identify'"> <img style="position: relative;bottom: 0;left: 0;" src="assets/images/register_bg.png" alt="" *ngIf="type!='identify'">
</div> </div>
<ydlife-alert *ngIf="isNeedAlert" [dialogInfo]="dialogInfo" (popInfo)="getPopInfo()"></ydlife-alert> <ydlife-alert *ngIf="isNeedAlert" [dialogInfo]="dialogInfo" (popInfo)="getPopInfo()"></ydlife-alert>
<ydlife-toast *ngIf="toastDialog" [toastInfo]="toastInfo"></ydlife-toast> <ydlife-toast *ngIf="toastDialog" [toastInfo]="toastInfo"></ydlife-toast>
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
margin: 0 auto; margin: 0 auto;
text-align: center; text-align: center;
position: relative; position: relative;
background-color: #fff;
img.logo{ img.logo{
width: 25%; width: 25%;
margin-top: 15%; margin-top: 15%;
...@@ -29,4 +30,15 @@ ...@@ -29,4 +30,15 @@
padding-left: 10px; padding-left: 10px;
} }
} }
}
footer{
background: #c81b1e;
color: #fff;
font-size: 18px;
font-weight: 700;
border-radius: 4px;
height: 40px;
line-height: 40px;
text-align: center;
margin: 15px auto 0;
} }
\ No newline at end of file
...@@ -177,7 +177,6 @@ export class RegisterComponent implements OnInit { ...@@ -177,7 +177,6 @@ export class RegisterComponent implements OnInit {
// 通过ID获取用户信息 // 通过ID获取用户信息
queryInformedSheetById(){ queryInformedSheetById(){
this.myService.queryInformedSheetById({'id':this.eNoticeId}).subscribe(res=>{ this.myService.queryInformedSheetById({'id':this.eNoticeId}).subscribe(res=>{
console.log(res);
if(res['success']){ if(res['success']){
const informed = res['data']['informed']; const informed = res['data']['informed'];
this.userInfo = { this.userInfo = {
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<div> <div>
电子签名<span style="font-size: 10px;font-weight: normal;">(请书写工整,字迹清晰)</span> 电子签名<span style="font-size: 10px;font-weight: normal;">(请书写工整,字迹清晰)</span>
</div> </div>
<span class="page_mark" *ngIf="(type!='eNotice') && (type!='continuationRate')"> 8/8</span> <span class="page_mark" *ngIf="(type!='eNotice') && (type!='continuationRate')"> 11/11</span>
</div> </div>
<div class="signatureContent"> <div class="signatureContent">
<signature-pad *ngIf="!isSignatureShow" #signaturePad [options]="signaturePadOptions" (onBeginEvent)="drawStart()" (onEndEvent)="drawComplete()"> <signature-pad *ngIf="!isSignatureShow" #signaturePad [options]="signaturePadOptions" (onBeginEvent)="drawStart()" (onEndEvent)="drawComplete()">
...@@ -18,10 +18,10 @@ ...@@ -18,10 +18,10 @@
<img src="assets/images/clear.png" alt="清除" (click)="clearSignature();"/> <img src="assets/images/clear.png" alt="清除" (click)="clearSignature();"/>
<img src="assets/images/revoke.png" *ngIf="!isSignatureShow" alt="上一步" (click)="revokeSignature()"/> <img src="assets/images/revoke.png" *ngIf="!isSignatureShow" alt="上一步" (click)="revokeSignature()"/>
</div> </div>
<footer class="fixed" (click)="next()" *ngIf="(approveStatus==null || approveStatus=='-1') && (type != 'eNotice') && (type !='continuationRate')"> <footer class="fixed" (click)="next()" *ngIf="(approveStatus==null || approveStatus=='-1') && (type != 'eNotice') && (type !='continuationRate') && (type !='unionSaleSignature')">
我自愿签订经纪人合同书 我自愿签订经纪人合同书
</footer> </footer>
<footer class="fixed" (click)="saveDigitalSignatures()" *ngIf="(type == 'eNotice') || (type=='continuationRate')" style="margin:45px;width:auto;border-radius:60px"> <footer class="fixed" (click)="saveDigitalSignatures()" *ngIf="(type == 'eNotice') || (type=='continuationRate') || (type =='unionSaleSignature') " style="margin:45px 15px;width:auto;border-radius:60px">
确认提交 确认提交
</footer> </footer>
<div id="page" *ngIf="approveStatus!=null && approveStatus !='-1'"> <div id="page" *ngIf="approveStatus!=null && approveStatus !='-1'">
......
...@@ -78,7 +78,7 @@ export class SignatureComponent implements OnInit,OnDestroy,AfterViewInit { ...@@ -78,7 +78,7 @@ export class SignatureComponent implements OnInit,OnDestroy,AfterViewInit {
} }
const title = this.activatedRoute.snapshot.data[0]['title']; const title = this.activatedRoute.snapshot.data[0]['title'];
this.lifeCommonService.setTitle(title); this.lifeCommonService.setTitle(title);
if(this.type!='eNotice' && this.type !='continuationRate'){ if(this.type!='eNotice' && this.type !='continuationRate' && this.type != 'unionSaleSignature'){
this.hiringBasicInfoId = this.activatedRoute.snapshot.queryParams.hiringBasicInfoId?this.activatedRoute.snapshot.queryParams.hiringBasicInfoId:null; this.hiringBasicInfoId = this.activatedRoute.snapshot.queryParams.hiringBasicInfoId?this.activatedRoute.snapshot.queryParams.hiringBasicInfoId:null;
this.queryWholeInfo(this.hiringBasicInfoId) this.queryWholeInfo(this.hiringBasicInfoId)
this.viewApprovalInfo = sessionStorage.getItem('viewApprovalInfo'); this.viewApprovalInfo = sessionStorage.getItem('viewApprovalInfo');
...@@ -90,9 +90,7 @@ export class SignatureComponent implements OnInit,OnDestroy,AfterViewInit { ...@@ -90,9 +90,7 @@ export class SignatureComponent implements OnInit,OnDestroy,AfterViewInit {
this.saveDigitalSignatures(); this.saveDigitalSignatures();
}else{ }else{
this.saveRecord(); this.saveRecord();
this.myService.customerBehaviorTrackSave(`经纪人合同签署 - ${JSON.parse(localStorage.getItem('lifeCustomerInfo')).practitionerBasicInfo.insurerBranchName}${JSON.parse(localStorage.getItem('lifeCustomerInfo')).practitionerBasicInfo.subordinateName}体系下,经纪人${JSON.parse(localStorage.getItem('lifeCustomerInfo')).practitionerBasicInfo.name}点击了【我自愿签订经纪人合同书】`).subscribe(res=>{ this.router.navigate(['/employee_submit'],{queryParams:{ hiringBasicInfoId:this.hiringBasicInfoId,status:this.approveStatus}});
this.router.navigate(['/employee_submit'],{queryParams:{ hiringBasicInfoId:this.hiringBasicInfoId,status:this.approveStatus}});
})
} }
} }
...@@ -111,8 +109,6 @@ export class SignatureComponent implements OnInit,OnDestroy,AfterViewInit { ...@@ -111,8 +109,6 @@ export class SignatureComponent implements OnInit,OnDestroy,AfterViewInit {
} }
if(this.type=='eNotice'){ if(this.type=='eNotice'){
this.saveRecord(); this.saveRecord();
this.myService.customerBehaviorTrackSave(`客户告知书 - 客户点击了【确认提交】,告知书ID为${sessionStorage.getItem('eNoticeId')}`).subscribe(res=>{
})
this.myService.signInformedSheet({'id':sessionStorage.getItem('eNoticeId'),imgStr:this.imgStr}).subscribe(res=>{ this.myService.signInformedSheet({'id':sessionStorage.getItem('eNoticeId'),imgStr:this.imgStr}).subscribe(res=>{
if(res['success']){ if(res['success']){
// 确认提交 // 确认提交
...@@ -123,8 +119,6 @@ export class SignatureComponent implements OnInit,OnDestroy,AfterViewInit { ...@@ -123,8 +119,6 @@ export class SignatureComponent implements OnInit,OnDestroy,AfterViewInit {
}) })
}else if(this.type == 'continuationRate'){ }else if(this.type == 'continuationRate'){
this.saveRecord(); this.saveRecord();
this.myService.customerBehaviorTrackSave(`保单继续率承诺书 - ${JSON.parse(localStorage.getItem('lifeCustomerInfo')).practitionerBasicInfo.insurerBranchName}${JSON.parse(localStorage.getItem('lifeCustomerInfo')).practitionerBasicInfo.subordinateName}体系下,经纪人${JSON.parse(localStorage.getItem('lifeCustomerInfo')).practitionerBasicInfo.name}点击了【确认提交】`).subscribe(res=>{
})
// console.log('继续率承诺书'); // console.log('继续率承诺书');
const param = { const param = {
practitionerId: localStorage.getItem('lifeCustomerInfo')?JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId']:null, practitionerId: localStorage.getItem('lifeCustomerInfo')?JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId']:null,
...@@ -140,6 +134,21 @@ export class SignatureComponent implements OnInit,OnDestroy,AfterViewInit { ...@@ -140,6 +134,21 @@ export class SignatureComponent implements OnInit,OnDestroy,AfterViewInit {
this.openPopInfo(res['message']); this.openPopInfo(res['message']);
} }
}) })
}else if(this.type == 'unionSaleSignature'){
const param = {
practitionerId:localStorage.getItem('lifeCustomerInfo')?JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId']:null,
imgStr:this.imgStr,
unionSalesPractitionerId:this.activatedRoute.snapshot.queryParams['unionSalesPractitionerId'],
unionSalesId:this.activatedRoute.snapshot.queryParams['unionSalesId']
}
this.myService.signUnionSales(param).subscribe(res=>{
if(res['success']){
// 确认提交
this.router.navigate(['/eNotice_submit']);
}else{
this.openPopInfo(res['message']);
}
})
}else{ }else{
const param = { const param = {
hiringBasicInfoId:this.hiringBasicInfoId, hiringBasicInfoId:this.hiringBasicInfoId,
......
<div class="wrapper"> <div class="wrapper">
<div class="title"> <div class="title">
<div><span class="line"></span>工作经历</div> <div><span class="line"></span>工作经历</div>
<span class="page_mark"> 2/8</span> <span class="page_mark"> 2/11</span>
</div> </div>
<div class="content" *ngIf="approveStatus==null || approveStatus=='-1'"> <div class="content" *ngIf="approveStatus==null || approveStatus=='-1'">
<div class="contentDetail employ"> <div class="contentDetail employ">
......
...@@ -8,9 +8,21 @@ ...@@ -8,9 +8,21 @@
<textarea class="form-control" cols="30" rows="10" [(ngModel)]="rejectNote" placeholder="请填写备注,字数限制为100字" maxlength="100"></textarea> <textarea class="form-control" cols="30" rows="10" [(ngModel)]="rejectNote" placeholder="请填写备注,字数限制为100字" maxlength="100"></textarea>
</div> </div>
<div id="page" style="border-top: 1px #e1e1e1 solid;"> <div id="page" style="border-top: 1px #e1e1e1 solid;">
<div style="background-color: #fff;color: #333;" (click)="showAlert(0)">拒绝</div> <div style="background-color: #fff;color: #333;" (click)="showAlert(0)">退回</div>
<div style="background-color: #1b5b99;" (click)="showAlert(1)">通过</div> <div style="background-color: #1b5b99;" (click)="showAlert(1)">通过</div>
</div> </div>
<div *ngIf="backToFlag" class="dialogContainer">
<div>
<label for="">请选择退回到哪一环节</label>
<select class="form-control" [(ngModel)]="stepsSeqBackTo">
<option *ngFor="let item of approvalOptionLists" [value]="item.value" [disabled]="item.disabled">{{item.name}}</option>
</select>
<div class="confirm">
<button class="btn cancel" (click)="backToFlag=false">取消</button>
<button class="btn sure" (click)="hiringApprove();backToFlag=true" style=" margin-left: 15px;background-color: #1b5b99;color:#fff">确认</button>
</div>
</div>
</div>
</div> </div>
<ydlife-toast *ngIf="toastDialog" [toastInfo]="toastInfo"></ydlife-toast> <ydlife-toast *ngIf="toastDialog" [toastInfo]="toastInfo"></ydlife-toast>
<ydlife-alert *ngIf="isNeedAlert" [dialogInfo]="dialogInfo" (popInfo)="getPopInfo()"></ydlife-alert> <ydlife-alert *ngIf="isNeedAlert" [dialogInfo]="dialogInfo" (popInfo)="getPopInfo()"></ydlife-alert>
\ No newline at end of file
.wrapper{ .wrapper{
padding: 10px 15px; padding: 10px 15px 60px 15px;
font-size: 15px; font-size: 15px;
.title{ .title{
font-size: 18px; font-size: 18px;
...@@ -9,4 +9,35 @@ ...@@ -9,4 +9,35 @@
.form-control{ .form-control{
font-size: 16px; font-size: 16px;
} }
}
.dialogContainer{
min-width: 320px;
max-width: 640px;
position: fixed;
bottom: 0;
left: 0;
right: 0;
margin: 0 auto;
width: 100%;
height: 100%;
background: rgba(0,0,0,.5);
display: flex;
justify-content: center;
align-items: center;
z-index: 2;
>div{
background-color: #fff;
width: 80%;
padding: 20px 15px;
border-radius: 6px;
margin-top: -40%;
.confirm{
margin-top: 20px;
display: flex;
>button{
flex: 1;
}
}
option[disabled]{background-color: #f0f0f0;}
}
} }
\ No newline at end of file
...@@ -17,8 +17,18 @@ export class ApprovalCommentsComponent implements OnInit { ...@@ -17,8 +17,18 @@ export class ApprovalCommentsComponent implements OnInit {
isNeedAlert: boolean; isNeedAlert: boolean;
dialogInfo: any; dialogInfo: any;
//控制弹框 //控制弹框
toastDialog: boolean; toastDialog: boolean;
toastInfo: any; toastInfo: any;
stepsSeqBackTo:string = 'null';
backToFlag:boolean = false;
approvalOptionLists = [
{id:0,value:'null',name:'报聘人',disabled:false},
{id:1,value:'-2',name:'辅导人',disabled:false},
{id:2,value:'1',name:'体系负责人',disabled:false},
{id:3,value:'2',name:'公司运营主管',disabled:false},
{id:4,value:'3',name:'寿险总经理',disabled:false},
{id:5,value:'4',name:'公司总经理',disabled:false}
]
constructor(private myService:MyService,private _modal: ModalService, private _toast: ToastService,private activatedRoute: ActivatedRoute, constructor(private myService:MyService,private _modal: ModalService, private _toast: ToastService,private activatedRoute: ActivatedRoute,
private router: Router) { } private router: Router) { }
...@@ -26,15 +36,24 @@ export class ApprovalCommentsComponent implements OnInit { ...@@ -26,15 +36,24 @@ export class ApprovalCommentsComponent implements OnInit {
this.hiringBasicInfoId = this.activatedRoute.snapshot.queryParams.hiringBasicInfoId?this.activatedRoute.snapshot.queryParams.hiringBasicInfoId:null; this.hiringBasicInfoId = this.activatedRoute.snapshot.queryParams.hiringBasicInfoId?this.activatedRoute.snapshot.queryParams.hiringBasicInfoId:null;
this.approvalIdentity = this.activatedRoute.snapshot.queryParams.approvalIdentity?this.activatedRoute.snapshot.queryParams.approvalIdentity:null; this.approvalIdentity = this.activatedRoute.snapshot.queryParams.approvalIdentity?this.activatedRoute.snapshot.queryParams.approvalIdentity:null;
this.practitionerId = JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId']; this.practitionerId = JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'];
// 将不符合条件的回退环节disabled掉
this.approvalOptionLists.forEach(item=>{
if(item.id >= parseInt(sessionStorage.getItem('hiringApproveStepsSeq'),0)){
item.disabled=true;
}
})
} }
showAlert(approvingStatus) { showAlert(approvingStatus) {
this.approvingStatus = approvingStatus; this.approvingStatus = approvingStatus;
ModalService.alert(`${this.approvingStatus==1?'通过审批':'确认拒绝'}`, `是否确定${this.approvingStatus==1?'通过':'拒绝'}该经纪人报聘?`, [ if(approvingStatus===1){
{ text: '取消', onPress: () => console.log('取消') }, ModalService.alert(`${this.approvingStatus==1?'通过审批':'确认拒绝'}`, `是否确定${this.approvingStatus==1?'通过':'拒绝'}该经纪人报聘?`, [
{ text: '确定', onPress: () => this.hiringApprove()} { text: '取消', onPress: () => console.log('取消') },
]); { text: '确定', onPress: () => this.hiringApprove()}
]);
}else{
this.backToFlag = true;
}
} }
hiringApprove(){ hiringApprove(){
...@@ -49,11 +68,18 @@ export class ApprovalCommentsComponent implements OnInit { ...@@ -49,11 +68,18 @@ export class ApprovalCommentsComponent implements OnInit {
rejectNote:this.rejectNote, rejectNote:this.rejectNote,
interviewAssessment:this.interviewAssessment, interviewAssessment:this.interviewAssessment,
plateform:1, plateform:1,
hiringApproveStepsSeq:sessionStorage.getItem('hiringApproveStepsSeq') hiringApproveStepsSeq:sessionStorage.getItem('hiringApproveStepsSeq'),
stepsSeqBackTo:this.stepsSeqBackTo
}
if(this.stepsSeqBackTo == 'null'){
param.stepsSeqBackTo = null;
}
if(!this.stepsSeqBackTo){
this.openPopInfo('请选择要退回到哪个环节!');
} }
this.myService.hiringApprove(param).subscribe((res)=>{ this.myService.hiringApprove(param).subscribe((res)=>{
if(res['success']){ if(res['success']){
this.openPopInfo('你的审批成功!'); this.openPopInfo(res['message']);
sessionStorage.setItem('viewApprovalInfo','1') sessionStorage.setItem('viewApprovalInfo','1')
}else{ }else{
this.openPopInfo(res['message']); this.openPopInfo(res['message']);
......
...@@ -16,8 +16,6 @@ export class ApprovalListComponent implements OnInit { ...@@ -16,8 +16,6 @@ export class ApprovalListComponent implements OnInit {
constructor(public lifeCommonService:LifeCommonService,private myService:MyService,private router:Router,private activatedRoute: ActivatedRoute) { } constructor(public lifeCommonService:LifeCommonService,private myService:MyService,private router:Router,private activatedRoute: ActivatedRoute) { }
ngOnInit() { ngOnInit() {
const title = this.activatedRoute.snapshot.data[0]['title'];
this.lifeCommonService.setTitle(title);
this.practitionerId = JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId']; this.practitionerId = JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'];
this.titleList = [ this.titleList = [
{ id: 0, name: '待审批' }, { id: 0, name: '待审批' },
......
.wrapper{ .wrapper{
padding:10px 13px 56px 13px; padding:10px 13px 56px 13px;
background-color: #fff;
.record_wrapper{ .record_wrapper{
.record_content{ .record_content{
...@@ -90,7 +91,7 @@ ...@@ -90,7 +91,7 @@
min-width: 320px; min-width: 320px;
max-width: 640px; max-width: 640px;
position: fixed; position: fixed;
bottom: 0; bottom: 70px;
left: 0; left: 0;
right: 0; right: 0;
height: 56px; height: 56px;
......
...@@ -89,7 +89,7 @@ ...@@ -89,7 +89,7 @@
width: 100%; width: 100%;
height: 48px; height: 48px;
line-height: 48px; line-height: 48px;
bottom: 0; bottom: 70px;
left: 0; left: 0;
background: #ff9700; background: #ff9700;
text-align: center; text-align: center;
......
...@@ -17,8 +17,11 @@ ...@@ -17,8 +17,11 @@
min-width: 320px; min-width: 320px;
max-width: 640px; max-width: 640px;
margin: 0 auto; margin: 0 auto;
bottom: 0; bottom: 70px;
left: 0; left: 0;
position: fixed; position: fixed;
width: 100%;
color: #fff;
text-align: center;
} }
} }
<div class="businessCardContainer"> <div class="businessCardContainer">
<div class="brokerCardPositive" id="brokerCardPositive" *ngIf="showFlag==false"> <div style="text-align: right;padding-top: 15px;">
<!-- <div class="dividingContainer"> <button class="applyEmailBtn" (click)="applyEmail()" *ngIf="practitionerInfo?.emailIsActive==0">申请公司邮箱</button>
</div>
<div *ngIf="practitionerInfo?.businessCardProsImg" style="text-align: center;color: red;">长按可保存名片到相册</div>
<div id="saveImgContainer">
<div>
<img src="{{practitionerInfo?.businessCardProsImg}}" alt="" class="img-responsive">
</div>
<div>
<img src="{{practitionerInfo?.businessCardConsImg}}" alt="" class="img-responsive">
</div>
<!-- <div class="brokerCardPositive">
<div class="qrcodeBox">
<div>
<div style="margin-bottom: 20%;"><img src="assets/images/ydShield.png" alt="银盾保险经纪" class="img-responsive">
</div>
<div><img src="assets/images/ydCompanyName.png" alt="银盾保险经纪" class="img-responsive"></div>
</div>
<div><img [src]="practitionerInfo?.wxQRImgUrl" alt="" class="img-responsive"></div>
</div>
<div class="dividingContainer">
<div class="dividingBox"></div> <div class="dividingBox"></div>
<div class="dividingLine"></div> <div class="dividingLine"></div>
</div> --> </div>
<div class="brokerInfo"> <div class="brokerInfo">
<div class="brokerBasicInfo"> <div class="brokerBasicInfo">
<div class="brokerName"> <div class="nameTitleContent">
<div> <div class="brokerName">
{{lifeCustomerInfo.practitionerBasicInfo.name}} <div>{{practitionerInfo?.practitionerName}}</div>
<span>Neo Zheng</span> <div>{{practitionerInfo?.practitionerNameEn}}</div>
</div>
<div class="brokerTitle">
<div>{{practitionerInfo?.levelName}}</div>
<div>{{practitionerInfo?.levelNameEn}} </div>
</div> </div>
</div> </div>
</div> <div class="certifyLists" *ngIf="practitionerInfo?.certificateList">
<div class="brokerCompanyInfo"> <p *ngFor="let item of practitionerInfo.certificateList">
<div style="font-size: 14px">上海银盾保险经纪有限公司</div> <span>{{item.certName}}</span> <span style="margin-left: 5px;">{{item.certNameEn}}</span>
<div style="font-size:10px;">上海市浦东新区张杨路560号中融恒瑞国际西楼1502室</div> </p>
</div>
<div class="brokerContactInfo">
<div>
<i class="iconfont icon-shouji"></i>
<span>手机: {{lifeCustomerInfo.mobileNo}}</span>
</div>
<div>
<i class="iconfont icon-youxiang1"></i>
<span>邮箱:50262253@qq.com</span>
</div>
<div style="margin-bottom: 0;">
<i class="iconfont icon-gongsiwangzhi"></i>
<span>网址:www.ydinsurance.com</span>
</div>
</div>
</div>
<div class="qrcodeBox">
<div>
<div style="margin-bottom: 20%;"><img src="assets/images/ydShield.png" alt="银盾保险经纪" class="img-responsive">
</div> </div>
<div><img src="assets/images/ydCompanyName.png" alt="银盾保险经纪" class="img-responsive"></div>
</div> </div>
<div> <div class="brokerCompanyInfo">
<img src="{{lifeCustomerInfo.practitionerBasicInfo.qrCodePath ?lifeCustomerInfo.practitionerBasicInfo.qrCodePath:'assets/images/online.jpg'}}" alt="" class="img-responsive"> <div style="font-size: 15px">{{practitionerInfo?.insurerName}}</div>
<div style="font-size: 13px;">{{practitionerInfo?.insurerUrl}}</div>
<div>全球保险集团BHL成员</div>
<div>T: {{practitionerInfo?.mobileNo}}</div>
<div *ngIf="practitionerInfo?.email">E: {{practitionerInfo?.email}}</div>
<div>{{practitionerInfo?.insurerAddress}}</div>
</div> </div>
</div> </div>
</div> </div>
<img src="{{canvasImg}}" *ngIf="showFlag==true">
<div class="brokerCardOpposite"> <div class="brokerCardOpposite">
<img src="assets/images/card_opposite.jpg" alt="" class="img-responsive"> <img src="assets/images/card_opposite.jpg" alt="" class="img-responsive">
</div> </div> -->
</div>
</div> </div>
<!-- <ydlife-alert *ngIf="isNeedAlert" [dialogInfo]="dialogInfo" (popInfo)="getPopInfo($event)"></ydlife-alert>
<div (click) = "downLoadJspdfs()">导出pdf</div> -->
.businessCardContainer { .businessCardContainer {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
color: #000;
font-weight: 600;
letter-spacing: 1px;
.applyEmailBtn{
border: 1px solid #0767bf;
background: transparent;
padding: 5px 10px;
border-radius: 5px;
color: #fff;
background: #0767bf;
margin: 0 5px;
display: inline-block;
outline: none;
border: none;
text-decoration-line: none;
}
.brokerCardPositive { .brokerCardPositive {
display: flex; display: flex;
padding:7% 5% 10% 5%; padding-top: 7%;
padding-left: 2%;
margin-bottom: 10%;
.qrcodeBox { .qrcodeBox {
width: 18%; width: 15%;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: space-between; justify-content: space-between;
} }
.dividingContainer { .dividingContainer {
padding-top: 45px; padding-top: 45px;
margin-right: 11px; margin-right: 7px;
margin-left: 5%; margin-left: 5%;
.dividingBox { .dividingBox {
width: 10px; width: 10px;
...@@ -27,32 +45,52 @@ ...@@ -27,32 +45,52 @@
} }
.brokerInfo { .brokerInfo {
flex: 1; flex: 1;
line-height: 1.5;
.brokerBasicInfo { .brokerBasicInfo {
display: flex; display: flex;
align-items: flex-end;
justify-content: space-between; justify-content: space-between;
padding-right: 5%; padding-right: 2%;
margin-bottom: 10%; margin-bottom: 5%;
color: #231f20; flex-direction: column;
align-items: flex-start;
.brokerName { .brokerName {
font-size: 20px; div:first-child {
font-size: 29px;
letter-spacing: 3px;
line-height: 1.1; line-height: 1.1;
}
div:last-child {
font-size: 13px;
}
} }
} .brokerTitle {
.brokerCompanyInfo { font-size: 12px;
margin-bottom: 10%; text-align: right;
} }
.brokerContactInfo { .certifyLists{
line-height: 1.1; margin-top: 10px;
div{
margin-bottom: 5px;
} }
.iconfont { .nameTitleContent{
margin-right: 5px; width: 100%;
color: #ee262e; display: flex;
justify-content: space-between;
align-items: baseline;
white-space: nowrap;
} }
} }
.brokerCompanyInfo {
font-size: 14px;
line-height: 1.4;
}
} }
} }
} }
#saveImgContainer{
padding: 0 5px;
>div{
box-shadow: 1px 1px 5px rgba(0,0,0,.35);
margin-bottom: 15px;
}
}
import {Component, ElementRef, OnInit, ViewChild} from '@angular/core'; import {Component, OnDestroy, OnInit} from '@angular/core';
import jspdf from 'jspdf'; import { MyService } from '../my.service';
import html2canvas from 'html2canvas';
@Component({ @Component({
selector: 'ydlife-business-card', selector: 'ydlife-business-card',
...@@ -8,65 +7,68 @@ import html2canvas from 'html2canvas'; ...@@ -8,65 +7,68 @@ import html2canvas from 'html2canvas';
styleUrls: ['./business-card.component.scss'] styleUrls: ['./business-card.component.scss']
}) })
export class BusinessCardComponent implements OnInit { export class BusinessCardComponent implements OnInit {
element:any;
lifeCustomerInfo: any; lifeCustomerInfo: any;
canvasImg:any; practitionerInfo:any;
showFlag:boolean = false; isNeedAlert: boolean;
constructor() { dialogInfo: any;
constructor(private myService:MyService) {
} }
ngOnInit() { ngOnInit() {
this.lifeCustomerInfo = JSON.parse(localStorage.getItem('lifeCustomerInfo')); this.lifeCustomerInfo = JSON.parse(localStorage.getItem('lifeCustomerInfo'));
setTimeout(()=>{ this.businessCard();
this.getImg();
},500)
} }
getImg(){ savePicture(Url) {
this.element = document.getElementById("brokerCardPositive"); var blob = new Blob([''], { type: 'application/octet-stream' });
html2canvas(this.element).then(canvas => { var url = URL.createObjectURL(blob);
// 修改生成的宽度 var a = document.createElement('a');
canvas.style.width = "1000px"; a.href = Url;
console.log(canvas, "生成的画布文件"); a.download = Url.replace(/(.*\/)*([^.]+.*)/ig, "$2").split("?")[0];
var e = document.createEvent('MouseEvents');
this.canvasImg = canvas.toDataURL("image/png"); e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
if(canvas){ a.dispatchEvent(e);
this.showFlag = true; URL.revokeObjectURL(url);
}
// 申请企业邮箱
applyEmail(){
this.isNeedAlert = true;
this.dialogInfo = {
title: null,
content: { value: '您的银盾保险专属办公邮箱将在2个工作日内为您生成,欢迎使用!祝业绩长虹!', align: 'center' },
footer: [{ value: '取消', routerLink: '', className: 'weui-dialog__btn_default' },{ value: '确定', routerLink: '', className: 'weui-dialog__btn_primary' }],
};
}
getPopInfo(e) {
this.isNeedAlert = false;
if(e==='确定'){
this.myService.applyEmail({practitionerId:this.practitionerInfo.practitionerId,email:this.practitionerInfo.email}).subscribe(res=>{
this.isNeedAlert = true;
if(res['success']){
this.dialogInfo = {
title: null,
content: { value: '申请成功!', align: 'center' },
footer: [{ value: '确认', routerLink: '', className: 'weui-dialog__btn_primary' }],
};
}else{
this.dialogInfo = {
title: null,
content: { value: res['message'], align: 'center' },
footer: [{ value: '确认', routerLink: '', className: 'weui-dialog__btn_primary' }],
};
}
})
}
}
businessCard(){
this.myService.businessCard({practitionerId:this.lifeCustomerInfo.practitionerId,businessCardType:2}).subscribe(res=>{
if(res['success']){
this.practitionerInfo = res['data'];
this.practitionerInfo.certificateList = this.practitionerInfo.certificateList.splice(0,3)
} }
}) })
} }
// downLoadJspdfs(){
// this.element = document.getElementById("brokerCardPositive");
// html2canvas(this.element,{
// logging:false //一开始canvas设置不渲染页面
// }).then((canvas)=>{
// let pdf:any = new jspdf('p','mm','a4') //纵向,单位mm,A4纸张大小
// let ctx:any = canvas.getContext('2d'); //预设2维画布
// let a4w:number = 190; //设置显示内容的大小,A4大小:210*297;最后显示在A4内部区域大小为:190*360
// let a4h:number = 200;
// let imgHeight:number = Math.floor(a4h*canvas.width/a4w); //按A4显示比例换算一页图像的像素高度
// let renderedHeight:number = 0;
// while(renderedHeight<canvas.height){//判断页面有内容时
// let page:any = document.createElement('canvas'); //创建画布
// page.width = canvas.width; //设置画布宽高等于内容宽高
// page.height = Math.min(imgHeight,canvas.height-renderedHeight); //画布的高等于内容的最小的高度(不足一页)
// //用getImageData裁剪指定区域,并绘制到前面创建的canvas对象中
// let a:any = page.getContext('2d');
// a.putImageData(ctx.getImageData(0,renderedHeight,canvas.width,Math.min(imgHeight,canvas.height-renderedHeight)),0,0);
// pdf.addImage(page.toDataURL('image/jpeg',1.0),'JPEG',10,10,a4w,Math.min(a4h,a4w*page.height/page.width)); //添加图片到页面,保留10mm边距
// renderedHeight += imgHeight;
// if(renderedHeight < canvas.height){
// pdf.addPage();
// }
// }
// pdf.save('content.pdf')
// });
// }
} }
<div class="customer_wrapper"> <div class="customer_wrapper">
<h4 *ngIf="customerList && customerList.length<=0" style="font-size:22px;color:#888;padding-top:10%;text-align:center">暂无客户关系</h4>
<ng-container *ngIf="customerList && customerList.length>0">
<ul class="customer_content" *ngFor="let customerItem of customerList;index as i;">
<img src="assets/images/man.png" alt="男" *ngIf="customerItem.gender=='男'">
<img src="assets/images/women.png" alt="女" *ngIf="customerItem.gender=='女'">
<li>
<span>姓名:{{customerItem.name}}</span>
</li>
<li >
<span>被保人关系:{{customerItem.relationType}}</span>
</li>
<li>
<span>生日:{{customerItem.birthDate}}</span>
</li>
<li>
<span>手机号:{{customerItem.mobileNo}}</span>
</li>
</ul>
</ng-container>
<ul class="customer_content" *ngFor="let customerItem of customerList;index as i;"> <ul class="customer_content" *ngFor="let customerItem of customerList;index as i;">
<img src="assets/images/man.png" alt="男" *ngIf="customerItem.gender=='男'"> <img src="assets/images/man.png" alt="男" *ngIf="customerItem.gender=='男'">
<img src="assets/images/women.png" alt="女" *ngIf="customerItem.gender=='女'"> <img src="assets/images/women.png" alt="女" *ngIf="customerItem.gender=='女'">
......
.customer_wrapper{ .customer_wrapper{
color: #333; color: #333;
position: relative; position: relative;
background-color: #fff;
min-height: calc(100vh - 70px);
.customer_content{ .customer_content{
border-bottom: 1px #e2e2e2 solid; border-bottom: 1px #e2e2e2 solid;
padding: 10px 15px; padding: 10px 15px;
......
...@@ -51,9 +51,7 @@ export class ENoticeSignComponent implements OnInit,OnDestroy,AfterContentInit { ...@@ -51,9 +51,7 @@ export class ENoticeSignComponent implements OnInit,OnDestroy,AfterContentInit {
} }
agree(){ agree(){
this.saveRecord(); this.saveRecord();
this.myService.customerBehaviorTrackSave(`客户告知书 - 客户点击了【同意并签署】`).subscribe(res=>{ this.router.navigate(['/eNoticeSignature'],{ queryParams: { type:'eNotice'} })
this.router.navigate(['/eNoticeSignature'],{ queryParams: { type:'eNotice'} })
})
} }
} }
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
} }
.send{ .send{
position: fixed; position: fixed;
bottom: 30px; bottom: 80px;
width: 100%; width: 100%;
div{ div{
margin: 0 40px; margin: 0 40px;
......
...@@ -23,7 +23,7 @@ export class ENoticeComponent implements OnInit,OnDestroy { ...@@ -23,7 +23,7 @@ export class ENoticeComponent implements OnInit,OnDestroy {
} }
ngOnInit() { ngOnInit() {
this.pageType = this.activatedRoute.snapshot.data.type; this.pageType = this.activatedRoute.snapshot.data[0].type;
if(this.pageType == 1){ if(this.pageType == 1){
this.pageInfo = { this.pageInfo = {
type:6, type:6,
...@@ -60,13 +60,9 @@ export class ENoticeComponent implements OnInit,OnDestroy { ...@@ -60,13 +60,9 @@ export class ENoticeComponent implements OnInit,OnDestroy {
agree(type){ agree(type){
this.saveRecord(); this.saveRecord();
if(type===1){ if(type===1){
this.myService.customerBehaviorTrackSave(`客户告知书 - 客户点击了【同意并签署】`).subscribe(res=>{ this.router.navigate(['/eNoticeSignature'],{ queryParams: { type:'eNotice'} })
this.router.navigate(['/eNoticeSignature'],{ queryParams: { type:'eNotice'} })
})
}else{ }else{
this.myService.customerBehaviorTrackSave(`保单继续率承诺书 - ${JSON.parse(localStorage.getItem('lifeCustomerInfo')).practitionerBasicInfo.insurerBranchName}${JSON.parse(localStorage.getItem('lifeCustomerInfo')).practitionerBasicInfo.subordinateName}体系下,经纪人${JSON.parse(localStorage.getItem('lifeCustomerInfo')).practitionerBasicInfo.name}点击了【同意并签署】`).subscribe(res=>{ this.router.navigate(['/eNoticeSignature'],{ queryParams: { type:'continuationRate'} })
this.router.navigate(['/eNoticeSignature'],{ queryParams: { type:'continuationRate'} })
})
} }
......
...@@ -10,10 +10,34 @@ ...@@ -10,10 +10,34 @@
<div class="contentList" [ngStyle]="{'margin-top':type == 'fileUpload'?'10px':'auto'}"> <div class="contentList" [ngStyle]="{'margin-top':type == 'fileUpload'?'10px':'auto'}">
<ul> <ul>
<li *ngFor="let fileUploadItem of fileUploadItemList"> <li *ngFor="let fileUploadItem of fileUploadItemList">
<a href="{{fileUploadItem.filePath}}" download="{{fileUploadItem.itemName}}" target="_blank"> <a href="{{fileUploadItem.filePath}}" download="{{fileUploadItem.itemName}}" *ngIf="!judgmentFile(fileUploadItem.filePath) && !judgmentFile(fileUploadItem.filePath,'pdf')">
<div><i class="iconfont icon-pdf"></i></div> <div style="overflow-x: hidden; white-space: nowrap;text-overflow: ellipsis;">
<div title="{{fileUploadItem.itemName}}">{{fileUploadItem.itemName}}</div> <i class="iconfont icon-ziliao"></i>
<div style="position: absolute;right: 5px;top: 6px;"><i class="iconfont icon-xiazai"></i></div> <span title="{{fileUploadItem.itemName}}">{{fileUploadItem.itemName}}</span>
</div>
<div style="flex-basis: 30px;text-align: right;">
<i class="iconfont" style="margin-right: 0;" [ngClass]="fileUploadItem.isDownload=='1' ? 'icon-xiazai' : 'icon-xianshi'"></i>
</div>
</a>
<a href="javascript:;" (click)="viewPdf(fileUploadItem)" *ngIf="!judgmentFile(fileUploadItem.filePath) && judgmentFile(fileUploadItem.filePath,'pdf')">
<div style="overflow-x: hidden; white-space: nowrap;text-overflow: ellipsis;">
<i class="iconfont icon-pdf"></i>
<span title="{{fileUploadItem.itemName}}">{{fileUploadItem.itemName}}</span>
</div>
<div style="flex-basis: 30px;text-align: right;">
<i class="iconfont" style="margin-right: 0;" [ngClass]="fileUploadItem.isDownload=='1' ? 'icon-xiazai' : 'icon-xianshi'"></i>
</div>
</a>
<a href="javascript:;" [routerLink]="['/video',{'fileId':fileUploadItem.fileId}]" *ngIf="judgmentFile(fileUploadItem.filePath)" (click)="setVideoPath(fileUploadItem)">
<div style="overflow-x: hidden; white-space: nowrap;text-overflow: ellipsis;">
<img src="assets/images/videoIcon.png" alt="视频" *ngIf="judgmentFile(fileUploadItem.filePath)" style=" width: 26px;
margin-right: 6px;">
<span title="{{fileUploadItem.itemName}}">{{fileUploadItem.itemName}}</span>
</div>
<div style="flex-basis: 30px;text-align: right;">
<img src="assets/images/playIcon.png" alt="播放"
style=" width: 26px;">
</div>
</a> </a>
</li> </li>
</ul> </ul>
......
...@@ -48,6 +48,8 @@ ...@@ -48,6 +48,8 @@
border-bottom: 1px solid #dcdcdc; border-bottom: 1px solid #dcdcdc;
padding: 4px 20px; padding: 4px 20px;
position: relative; position: relative;
height: 42px;
line-height: 42px;
.icon-xiazai { .icon-xiazai {
font-size: 22px; font-size: 22px;
color: #ec2d37; color: #ec2d37;
...@@ -56,7 +58,9 @@ ...@@ -56,7 +58,9 @@
a { a {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between;
color: #000; color: #000;
height: 100%;
.iconfont { .iconfont {
color: #ec2d37; color: #ec2d37;
font-size: 22px; font-size: 22px;
......
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { MyService } from "../my.service"; import { MyService } from "../my.service";
import { ActivatedRoute } from "@angular/router"; import { ActivatedRoute, Router } from "@angular/router";
@Component({ @Component({
selector: 'ydlife-file-upload', selector: 'ydlife-file-upload',
...@@ -9,29 +9,81 @@ import { ActivatedRoute } from "@angular/router"; ...@@ -9,29 +9,81 @@ import { ActivatedRoute } from "@angular/router";
}) })
export class FileUploadComponent implements OnInit { export class FileUploadComponent implements OnInit {
fileUploadItemList: Array<any>; fileUploadItemList: Array<any>;
// 判断是文件下载还是教育培训 // 判断是文件下载还是教育培训还是培训视频
type: string; type: string;
categoryList: Array<any>; categoryList: Array<any>;
selectedCategoryId: any; selectedCategoryId: any;
fileUploadType:any; fileUploadType:any;
constructor(private myService: MyService, private activatedRoute: ActivatedRoute) { constructor(private myService: MyService, private activatedRoute: ActivatedRoute,private router:Router) {
}
viewPdf(fileUploadItem){
this.router.navigate(['/pdfView'],{queryParams:{path:`assets/pdfjs/web/viewer.html?file=${fileUploadItem.filePath}&isneeddownload=${fileUploadItem.isDownload=='1'?'true':'false'}`}})
sessionStorage.setItem('permissions',JSON.stringify({isDownload: fileUploadItem.isDownload,isControlPlayback:fileUploadItem.isControlPlayback}))
}
setVideoPath(fileUploadItem){
sessionStorage.setItem('videoPath',fileUploadItem.filePath);
sessionStorage.setItem('permissions',JSON.stringify({isDownload: fileUploadItem.isDownload,isControlPlayback:fileUploadItem.isControlPlayback}))
} }
ngOnInit() { ngOnInit() {
this.type = this.activatedRoute.snapshot.data[0]['type']; this.type = this.activatedRoute.snapshot.data[0]['type'];
this.fileUploadType = this.activatedRoute.snapshot.queryParams.fileUploadType ? this.activatedRoute.snapshot.queryParams.fileUploadType : null; if(this.type === 'trainingVideo' || this.type === 'yd_trainning_file_type'){
this.fileUploadType = true;
}else{
this.fileUploadType = this.activatedRoute.snapshot.queryParams.fileUploadType ? this.activatedRoute.snapshot.queryParams.fileUploadType : null;
}
this.dropOptionsQuery(); this.dropOptionsQuery();
if (this.type === 'fileUpload') { if (this.type === 'fileUpload') {
this.fileUpload(3, 0, 19, 'yd_download_file_type', this.selectedCategoryId); this.fileUpload(3, 0, 19, 'yd_download_file_type', this.selectedCategoryId);
} else if (this.type === 'training') { } else if (this.type === 'training') {
this.fileUpload(3, 0, 23, 'yd_trainning_file_type', this.selectedCategoryId); this.fileUpload(3, 0, 23, 'yd_trainning_file_type', this.selectedCategoryId);
} else if (this.type === 'trainingVideo') {
this.fileUpload(3, 0, 23, 'yd_trainning_file_type', 'trainingVideo');
} else if(this.type === 'yd_trainning_file_type'){
const path = this.activatedRoute.snapshot.routeConfig.path;
if(path == 'prejobTraining'){
this.selectedCategoryId = 'salestopic';
}else if(path == 'advanceTraining'){
this.selectedCategoryId = 'conception';
}else if(path == 'cffpTraining'){
this.selectedCategoryId = 'lawbiz';
}else if(path == 'productTraining'){
this.selectedCategoryId = 'product';
}else if(path == 'newTraining'){
this.selectedCategoryId = 'requirementanalys'
}
this.fileUpload(3, 0, 23, 'yd_trainning_file_type', this.selectedCategoryId);
} }
}
// 判断是不是视频文件
judgmentFile(picUrl,type='video') {
let filename = picUrl; //文件路径地址
let index1 = filename.lastIndexOf(".");
let index2 = filename.length;
let postf = filename.substring(index1, index2).toLowerCase(); //获取文bai件后缀名duzhi
if(type==='video'){
//判断文件后缀名是否等于视频文件的后缀名
if (postf===".avi"||postf===".mp4"||postf===".rmvb"||postf===".mov") {
return true
}else{
return false
}
}else if(type==='pdf'){
//判断文件后缀名是否等于pdf
if (postf===".pdf") {
return true
}else{
return false
}
}
} }
// 文件下载 // 文件下载
fileUpload(itemType, itemId, fileCategory, code, mdDropOptionId) { fileUpload(itemType, itemId, fileCategory, code, mdDropOptionId) {
this.myService.filePath(itemType, itemId, fileCategory, code, mdDropOptionId).subscribe(res => { const customerId = JSON.parse(localStorage.getItem('lifeCustomerInfo')).customerId;
this.myService.filePath(itemType, itemId, fileCategory, code, mdDropOptionId,customerId).subscribe(res => {
if (res['success']) { if (res['success']) {
this.fileUploadItemList = res['data']['fileUploadItemList']; this.fileUploadItemList = res['data']['fileUploadItemList'];
} }
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
} }
.materialContainer{ .materialContainer{
background-color: #fff;
.materialItem{ .materialItem{
padding: 5px 10px 5px 50px; padding: 5px 10px 5px 50px;
border-bottom: 1px #ddd solid; border-bottom: 1px #ddd solid;
......
...@@ -25,9 +25,7 @@ export class ImportantAnnouncementComponent implements OnInit, AfterViewInit { ...@@ -25,9 +25,7 @@ export class ImportantAnnouncementComponent implements OnInit, AfterViewInit {
} }
ngAfterViewInit() { ngAfterViewInit() {
setTimeout(() => {
this.switchCategory(this.selectedCategoryId)
}, 500);
} }
// 获取所有的公告类型 // 获取所有的公告类型
......
<div class="integrationDetailContainer">
<ul class="tabs">
<li (click)="queryLists(1)"><span [ngClass]="{'actived':status===1}">全部</span></li>
<li (click)="queryLists(2)"><span [ngClass]="{'actived':status===2}">积分</span></li>
<li (click)="queryLists(3)"><span [ngClass]="{'actived':status===3}">兑换</span></li>
</ul>
<ul class="dateContent">
<li>
<ListItem DatePicker [mode]="'month'" [(ngModel)]="searchDateFormat" (onOk)="onOk($event)">
{{searchDateFormat | date:'yyyy-MM'}} <i class="iconfont icon-xiangxia" style="margin-left: 10px;"></i>
</ListItem>
<span> - </span>
<ListItem DatePicker [mode]="'month'" [(ngModel)]="searchDateEndFormat" (onOk)="onOk($event)">
{{searchDateEndFormat | date:'yyyy-MM'}} <i class="iconfont icon-xiangxia" style="margin-left: 10px;"></i>
</ListItem>
</li>
</ul>
<ul class="detailLists">
<li *ngFor="let item of lists">
<div [ngStyle]="{'color':item.status==1 ? '#646464' : '#ccc'}">
<p>{{item.integralRuleName}}</p>
<p [ngStyle]="{'color':item.status==1 ? '#8c8c8c' : '#ccc'}">{{item.grantDate}}</p>
</div>
<div [ngStyle]="{'color':item.integralType=='1' ? '#E56124' : '#333','font-weight':'bold'}" *ngIf="item.status==1"><span>{{item.integralType=='1' ? '+' : ''}}</span><span>{{item.integralNumber}}</span></div>
<div [ngStyle]="{'color':'#ccc','font-weight':'bold'}" *ngIf="item.status!=1"><span>{{item.integralType=='1' ? '+' : ''}}</span><span>{{item.integralNumber}}</span></div>
</li>
</ul>
</div>
.tabs{
display: flex;
padding: 0 20px;
justify-content: space-between;
li{
height: 40px;
line-height: 40px;
text-align: center;
span{
border-bottom: 1px solid transparent;
height: 100%;
display: inline-block;
&.actived{
border-color: #1B5B99;
}
}
}
}
.dateContent{
background-color: #f9f9f9;
li{
height: 44px;
line-height: 44px;
display: flex;
}
}
.detailLists{
li{
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid #f9f9f9;
padding: 10px 20px;
div{
p:last-child{
color: #8c8c8c;
font-size: 12px;
}
}
}
}
\ No newline at end of file
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { IntegrationDetailComponent } from './integration-detail.component';
describe('IntegrationDetailComponent', () => {
let component: IntegrationDetailComponent;
let fixture: ComponentFixture<IntegrationDetailComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ IntegrationDetailComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(IntegrationDetailComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { LifeCommonService } from 'src/app/common/life-common.service';
import { MyService } from '../my.service';
@Component({
selector: 'ydlife-integration-detail',
templateUrl: './integration-detail.component.html',
styleUrls: ['./integration-detail.component.scss']
})
export class IntegrationDetailComponent implements OnInit {
integralGrantInfos:Array<any>;
lists:Array<any>;
status:number = 1;
searchDateFormat:Date = new Date(new Date().getFullYear(), 0);
searchDateEndFormat:Date = new Date(new Date().getFullYear(),new Date().getMonth() +1,0);
constructor(private myService:MyService,private lifeCommonService:LifeCommonService) { }
ngOnInit() {
this.queryPractitionerIntegralList(this.lifeCommonService.dateFormat(this.searchDateFormat,'yyyy-MM-01'),this.lifeCommonService.dateFormat(this.searchDateEndFormat,'yyyy-MM-dd'));
}
queryLists(status){
this.status = status;
this.queryPractitionerIntegralList(this.lifeCommonService.dateFormat(this.searchDateFormat,'yyyy-MM-01'),this.lifeCommonService.dateFormat(this.searchDateEndFormat,'yyyy-MM-dd'),this.status);
}
queryPractitionerIntegralList(queryDateStart=null,queryDateEnd=null,queryStatus=1){
this.myService.queryPractitionerIntegralList({queryStatus:queryStatus,practitionerId:localStorage.getItem('lifeCustomerInfo')?JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId']:null,queryDateStart:queryDateStart,queryDateEnd:queryDateEnd}).subscribe(res=>{
if(res['success']){
this.lists = this.integralGrantInfos = res['data']['integralGrantInfos']
}
})
}
onOk(result: Date) {
this.searchDateEndFormat = new Date(this.searchDateEndFormat.getFullYear(),this.searchDateEndFormat.getMonth() + 1,0);
this.queryPractitionerIntegralList(this.lifeCommonService.dateFormat(this.searchDateFormat,'yyyy-MM-01'),this.lifeCommonService.dateFormat(this.searchDateEndFormat,'yyyy-MM-dd'));
}
}
<div class="integrationRuleContainer">
<h4>银盾经纪人积分规则</h4>
<p>为了支持和激励各职级经纪人的从业行为,在公司基本法的佣奖之外,银盾特设立内部 积分制度,使用积分兑换相应公司福利。具体规则如下:</p>
<h5>1. 适用范围及生效日</h5>
<ul>
<li style="display: flex;"><div>(1)</div><div>适用范围:所有适用银盾基本法(含标准基本法和简单基本法)的寿险经纪人均 可享受积分福利。</div></li>
<li style="display: flex;"><div>(2)</div><div>生效日:该积分管理办法自 2022 年 3 月 1 日起试运行。</div></li>
</ul>
<h5>2. 积分项目及积分数</h5>
<ul class="rules">
<li>
<div>项目</div>
<div>积分</div>
<div>说明</div>
</li>
<li *ngFor="let item of integralRuleInfos">
<div>{{item.ruleName}}</div>
<div>{{item.integralNumber}}</div>
<div>{{item.ruleExplain}}</div>
</li>
</ul>
<p>说明:</p>
<ul>
<li style="display: flex;"><div>(1)</div><div>积分的发放:每季度初根据以上项目统计上季度情况,统一进行积分发放;</div></li>
<li style="display: flex;"><div>(2)</div><div>积分有效期:积分有效期至积分发放的次年末,举例:2022 年4 月发放的积分,有效期至2023 年12 月31 日。</div></li>
</ul>
<h5>3. 积分兑换</h5>
<p>经纪人可以用积分来兑换银盾内部的付费培训,旅游奖励等项目。银盾会公布支持积分兑换的项目以及需要的积分数。</p>
<ul class="rules exchange">
<li>
<div>积分可兑换的奖品</div>
<div>需支付的积分</div>
<div>说明</div>
<div>奖励兑现时间</div>
</li>
<li *ngFor="let item of integralExchangeRuleInfos">
<div>{{item.ruleName}}</div>
<div>{{item.integralNumber}}</div>
<div>{{item.ruleExplain}}</div>
<div>{{item.integralTimeDesc}}</div>
</li>
</ul>
<h5>4. 其他说明</h5>
<ul>
<li style="display: flex;"><div>(1)</div><div>银盾运营部负责该积分管理办法的执行,包括发放与兑换,如有任何问题,请与运营部联系;</div></li>
<li style="display: flex;"><div>(2)</div><div>如根据业务的发展情况,需要修改该办法,公司将进行调整并公布最新版本;</div></li>
<li style="display: flex;"><div>(3)</div><div>本积分管理办法最终解释权利归上海银盾保险经纪有限公司所有。</div></li>
</ul>
</div>
\ No newline at end of file
.integrationRuleContainer{
font-size: 14px;
padding: 10px 12px;
h4{
text-align: center;
margin-bottom: 10px;
font-size: 15px;
font-weight: bold;
}
h5{
font-weight: bold;
margin: 10px 0;
}
ul.rules{
li{
display: flex;
div{
border: 1px solid #666;
padding: 6px 2px;
white-space: pre-wrap;
display: flex;
justify-content: center;
align-items: center;
text-align: center;
flex: 1;
width: 1%;
word-break: break-all;
&:nth-child(2){
border-left: none;
border-right: none;
}
}
&:first-child{
background-color: #8DB4E2;
color: #fff;
}
&:nth-child(2n){
div{
border-top: none;
border-bottom: none;
}
}
&:last-child{
div{
border-bottom: 1px solid #666;
}
}
}
&.exchange{
div{
&:nth-of-type(4){
border-left: none;
}
}
}
}
}
\ No newline at end of file
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { IntegrationRuleComponent } from './integration-rule.component';
describe('IntegrationRuleComponent', () => {
let component: IntegrationRuleComponent;
let fixture: ComponentFixture<IntegrationRuleComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ IntegrationRuleComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(IntegrationRuleComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { MyService } from '../my.service';
@Component({
selector: 'ydlife-integration-rule',
templateUrl: './integration-rule.component.html',
styleUrls: ['./integration-rule.component.scss']
})
export class IntegrationRuleComponent implements OnInit {
// 积分项目
integralRuleInfos:Array<any>;
// 积分兑换项目
integralExchangeRuleInfos:Array<any>;
constructor(private myService:MyService) { }
ngOnInit() {
this.queryIntegralRuleList()
}
queryIntegralRuleList(){
this.myService.queryIntegralRuleList().subscribe(res=>{
if(res['success']){
if(res['data']['integralRuleInfos']){
const result = res['data']['integralRuleInfos'];
this.integralRuleInfos = result.filter(item=>item.integralType=='1');
this.integralExchangeRuleInfos = result.filter(item=>item.integralType=='2')
}
}
})
}
}
<div class="integrationContainer">
<header>
<div class="top">
<span [routerLink]="'/integration_rule'">积分规则</span>
</div>
<div class="bottom">
<div><strong>{{practitionerIntegrals?.integralCountNumber ? practitionerIntegrals?.integralCountNumber : 0}}</strong><span class="detail" [routerLink]="'/integration_detail'">积分明细</span></div>
<div style="font-size: 14px;">{{practitionerIntegrals?.integralNumberOld ? practitionerIntegrals?.integralNumberOld : 0}} 积分有效期至 {{practitionerIntegrals?.effectiveOld}}</div>
</div>
</header>
<section>
<img src="assets/images/integrationBannerNew.png" alt="" class="img-responsive">
</section>
</div>
header{
border-radius: 8px;
margin: 5px;
position: relative;
background: url('../../../assets/images/bg.png') no-repeat;
background-size: cover;
color: #fff;
padding: 15px 8px 34px 20px;
strong{
font-size: 50px;
margin-right: 10px;
}
.bottom{
margin-top: -15px;
.detail{
border-radius: 20px;
padding: 3px 10px;
background: #fff;
color: #666;
}
}
.top{
text-align: right;
span{
border-radius: 20px;
padding: 3px 10px;
background: transparent;
color: #fff;
border: 1px solid #fff;
}
}
}
section{
padding-bottom: 30px;
}
\ No newline at end of file
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { IntegrationComponent } from './integration.component';
describe('IntegrationComponent', () => {
let component: IntegrationComponent;
let fixture: ComponentFixture<IntegrationComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ IntegrationComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(IntegrationComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { MyService } from '../my.service';
@Component({
selector: 'ydlife-integration',
templateUrl: './integration.component.html',
styleUrls: ['./integration.component.scss']
})
export class IntegrationComponent implements OnInit {
practitionerIntegrals:any
constructor(private myService:MyService) { }
ngOnInit() {
this.queryPractitionerIntegral();
}
queryPractitionerIntegral(){
this.myService.queryPractitionerIntegral({status:1,practitionerId:localStorage.getItem('lifeCustomerInfo')?JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId']:null}).subscribe(res=>{
if(res['success']){
this.practitionerIntegrals = res['data']['practitionerIntegrals'][0]
}
})
}
}
<div class="jointSaleDetailContainer">
<ul>
<li>投保人:{{unionSalesInfo?.policyholderName}}</li>
<li>保险公司:{{unionSalesInfo?.insurerName}}</li>
<li>产品名称:{{unionSalesInfo?.productName}}</li>
<li>投保单号:{{unionSalesInfo?.proposalNo}}</li>
<li>保单号:{{unionSalesInfo?.policyNo}}</li>
</ul>
<div class="title">
联合销售达成以下约定
</div>
<div class="divisionCommission">
<div class="thTitle">
<span>经纪人</span>
<span>佣金比例</span>
<span>业绩比例</span>
<span>签署状态</span>
</div>
<div *ngFor="let item of unionSalesPractitionerInfos">
<span>{{item.practitionerName}}</span>
<span>{{item.commissionRate}}%</span>
<span>{{item.achievementsRate}}%</span>
<span [ngSwitch]="item.signStatus">
<ng-container *ngSwitchCase="'1'">待签署</ng-container>
<ng-container *ngSwitchCase="'2'">签署中</ng-container>
<ng-container *ngSwitchCase="'3'">已签署</ng-container>
<ng-container *ngSwitchDefault>/</ng-container>
</span>
</div>
</div>
<div class="signBtn" (click)="sign()" *ngIf="unionSalesInfo?.signStatus=='1'">同意并签署</div>
</div>
.jointSaleDetailContainer{
background: #f9f9f9;
height: 100%;
ul,.title,.divisionCommission{
margin: 10px;
background: #fff;
padding: 5px 10px;
li{
height: 40px;
font-size:14px;
}
}
.title{
padding: 10px;
color: #1B5B99;
text-align: center;
}
.divisionCommission{
padding: 5px 0;
div{
color: #666;
display: flex;
font-size: 14px;
text-align: center;
height: 32px;
span{
flex:1;
}
}
.thTitle{
color: #333;
font-size: 16px;
}
}
.signBtn{
width: 210px;
margin: 0 auto;
background-color: #1B5B99;
color: #fff;
text-align: center;
padding: 6px 0;
font-size: 18px;
margin-top: 30px;
border-radius: 40px;
cursor: pointer;
}
}
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { JointSaleDetailComponent } from './joint-sale-detail.component';
describe('JointSaleDetailComponent', () => {
let component: JointSaleDetailComponent;
let fixture: ComponentFixture<JointSaleDetailComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ JointSaleDetailComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(JointSaleDetailComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { AfterViewInit, Component, OnDestroy, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { MyService } from '../my.service';
declare var rrweb:any;
@Component({
selector: 'ydlife-joint-sale-detail',
templateUrl: './joint-sale-detail.component.html',
styleUrls: ['./joint-sale-detail.component.scss']
})
export class JointSaleDetailComponent implements OnInit,OnDestroy {
unionSalesId:any;
unionSalesPractitionerId:any;
unionSalesInfo:any;
unionSalesPractitionerInfos:Array<any>;
timerId:any;
events:Array<any> = [];
pageInfo = {
type:11,
name:'联合销售同意并签署页面'
}
constructor(private myService:MyService,private route:ActivatedRoute,private router:Router) { }
ngOnInit() {
this.unionSalesId = this.route.snapshot.params['unionSalesId'];
this.queryUnionSalesPractitionerList();
}
ngOnDestroy(): void {
clearInterval(this.timerId)
}
creatRecord(){
let _this = this;
_this.events = [];
rrweb.record({
emit(event){
// 将evene存入events数组中
_this.events.push(event);
},
recordCanvas: true
});
}
saveRecord(){
this.myService.rrwebInfo(this.events,this.pageInfo).subscribe(res=>{
this.creatRecord()
})
}
queryUnionSalesPractitionerList(){
this.myService.queryUnionSalesPractitionerList({unionSalesId:this.unionSalesId,isActive:1}).subscribe(res=>{
if(res['success']){
this.unionSalesInfo = res['data']['unionSalesInfo'];
this.unionSalesPractitionerInfos = this.unionSalesInfo.unionSalesPractitionerInfos;
const practitionerId = localStorage.getItem('lifeCustomerInfo')?JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId']:null;
if(practitionerId){
this.unionSalesInfo.signStatus = this.unionSalesPractitionerInfos.filter(item=>item.practitionerId == practitionerId).pop().signStatus
this.unionSalesPractitionerId = this.unionSalesPractitionerInfos.filter(item=>item.practitionerId == practitionerId).pop().id;
if(this.unionSalesInfo.signStatus=='1'){
this.creatRecord();
this.timerId = setInterval(()=>{
if(this.events.length > 100){
this.saveRecord()
}
},10 * 1000);
}
}
}
})
}
sign(){
this.saveRecord();
this.router.navigate(['/signature'],{queryParams:{type:'unionSaleSignature',unionSalesPractitionerId:this.unionSalesPractitionerId,unionSalesId:this.unionSalesId}})
}
}
<div class="jointSalesContainer">
<ul class="tabs">
<li [ngClass]="{actived:index==0}" (click)="onTabClick(0)">待签署</li>
<li [ngClass]="{actived:index==1}" (click)="onTabClick(1)">签署中</li>
<li [ngClass]="{actived:index==2}" (click)="onTabClick(2)">已签署</li>
</ul>
<div class="tabPaneContent">
<div class="item" *ngIf="index===0">
<ul *ngFor="let unionSalesItem of unionSalesInfos">
<li>
<span>保险公司:</span>
<span>{{unionSalesItem.insurerName}}</span>
</li>
<li>
<span>保险产品:</span>
<span>{{unionSalesItem.productName}}</span>
</li>
<li>
<span>投保人:</span>
<span>{{unionSalesItem.policyholderName}}</span>
</li>
<li>
<span>发送时间:</span>
<span>{{unionSalesItem.sendDate}}</span>
</li>
<li>
<label></label>
<button [routerLink]="['/joint_sales_detail',unionSalesItem.id]">查看</button>
</li>
</ul>
</div>
<div class="item" *ngIf="index===1">
<ul *ngFor="let unionSalesItem of unionSalesInfos">
<li>
<span>保险公司:</span>
<span>{{unionSalesItem.insurerName}}</span>
</li>
<li>
<span>保险产品:</span>
<span>{{unionSalesItem.productName}}</span>
</li>
<li>
<span>投保人:</span>
<span>{{unionSalesItem.policyholderName}}</span>
</li>
<li>
<span>发送时间:</span>
<span>{{unionSalesItem.sendDate}}</span>
</li>
<li>
<label></label>
<button [routerLink]="['/joint_sales_detail',unionSalesItem.id]">查看</button>
</li>
</ul>
</div>
<div class="item" *ngIf="index===2">
<ul *ngFor="let unionSalesItem of unionSalesInfos">
<li>
<span>保险公司:</span>
<span>{{unionSalesItem.insurerName}}</span>
</li>
<li>
<span>保险产品:</span>
<span>{{unionSalesItem.productName}}</span>
</li>
<li>
<span>投保人:</span>
<span>{{unionSalesItem.policyholderName}}</span>
</li>
<li>
<span>签署时间:</span>
<span>{{unionSalesItem.signDate}}</span>
</li>
<li>
<label></label>
<button [routerLink]="['/joint_sales_detail',unionSalesItem.id]">查看</button>
</li>
</ul>
</div>
</div>
</div>
.jointSalesContainer{
background-color: #f9f9f9;
height: 100%;
.tabs{
margin-bottom: 10px;
background-color: #fff;
display: flex;
background-color: #fff;
li{
height: 40px;
line-height: 40px;
padding-left: 22px;
position: relative;
font-size:16px;
&.actived{
color: #1B5B99;
}
&.actived::after{
position: absolute;
content: '';
width: 55%;
height: 1px;
background-color: #1B5B99;
left: 0;
bottom: 0;
transform: translateX(70%);
}
}
}
button{
width: 101px;
height: 28px;
line-height: 28px;
text-align: center;
background-color: #1B5B99;
color: #fff;
border-radius: 20px;
border: none;
}
.item{
margin: 10px 5px;
ul{
margin-bottom: 10px;
padding: 12px 19px;
background-color: #fff;
li{
height: 30px;
display: flex;
justify-content: space-between;
font-size:14px;
}
}
}
}
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { JointSalesComponent } from './joint-sales.component';
describe('JointSalesComponent', () => {
let component: JointSalesComponent;
let fixture: ComponentFixture<JointSalesComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ JointSalesComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(JointSalesComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { MyService } from '../my.service';
@Component({
selector: 'ydlife-joint-sales',
templateUrl: './joint-sales.component.html',
styleUrls: ['./joint-sales.component.scss']
})
export class JointSalesComponent implements OnInit {
index = 0;
unionSalesInfos:Array<any>;
onTabClick(i) {
// console.log('onTabClick', item);
this.index = i;
let status;
if(i==0){
status = 1;
}else if(i==1){
status = 2;
}else if(i==2){
status = 3;
}
this.queryUnionSalesList(status);
}
constructor(private myService:MyService) { }
ngOnInit() {
this.queryUnionSalesList(1);
}
queryUnionSalesList(signStatus){
this.myService.queryUnionSalesList({signStatus:signStatus,isActive:1,practitionerId:JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId']}).subscribe(res=>{
if(res['success']){
this.unionSalesInfos = res['data']['unionSalesInfos'];
}
})
}
}
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
</div> </div>
<div class="rankInfoWrapper"> <div class="rankInfoWrapper">
<div class="rankContent"> <div class="rankContent">
<div style="font-size: 18px;margin: 5px auto;text-align: center;">队成员</div> <div style="font-size: 18px;margin: 5px auto;text-align: center;">队成员</div>
<div class="content_wrapper memberList"> <div class="content_wrapper memberList">
<ul style="border: none;background: #e7eef5;border-radius: 5px;"> <ul style="border: none;background: #e7eef5;border-radius: 5px;">
<li style="padding-left: 5px;">姓名/团队</li> <li style="padding-left: 5px;">姓名/团队</li>
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
</ul> </ul>
<div style="width: 100%;text-align: center;float: left;height: 35px;" <div style="width: 100%;text-align: center;float: left;height: 35px;"
*ngIf="teamMemberList?.length <=0"> *ngIf="teamMemberList?.length <=0">
暂无队成员,努力去增员吧 暂无队成员,努力去增员吧
</div> </div>
<ul *ngFor="let teamMemberItem of teamList;index as i;" (click)="goToList(teamMemberItem)"> <ul *ngFor="let teamMemberItem of teamList;index as i;" (click)="goToList(teamMemberItem)">
<li> <li>
......
...@@ -25,7 +25,7 @@ export class MemberListComponent implements OnInit { ...@@ -25,7 +25,7 @@ export class MemberListComponent implements OnInit {
this.queryTeamMemberDetail() this.queryTeamMemberDetail()
} }
//下级列表和队成员列表 //下级列表和队成员列表
queryTeamMemberDetail(){ queryTeamMemberDetail(){
this.myService.queryTeamMemberDetail({systemType:this.systemType,sid:this.sid}).subscribe((res)=>{ this.myService.queryTeamMemberDetail({systemType:this.systemType,sid:this.sid}).subscribe((res)=>{
if(res['success']){ if(res['success']){
......
.menuContainer{ .menuContainer{
background-color: #fff;
min-height: calc(100vh - 49px);
.menuContent{ .menuContent{
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
......
...@@ -46,7 +46,6 @@ export class MenuItemComponent implements OnInit { ...@@ -46,7 +46,6 @@ export class MenuItemComponent implements OnInit {
{ no: 2, subtitle: 'AI保险医生', icon: 'ai', path: `https://${window.location.host}/questionnaire/#/index?campaign=AIRobot&task=AItask1&customerId=${this.lifeCustomerInfo.customerId}`, routerLink: '',showSubMenu:true }, { no: 2, subtitle: 'AI保险医生', icon: 'ai', path: `https://${window.location.host}/questionnaire/#/index?campaign=AIRobot&task=AItask1&customerId=${this.lifeCustomerInfo.customerId}`, routerLink: '',showSubMenu:true },
{ no: 1, subtitle: '獴哥保险诊所', icon: 'clinic', path: `https://${window.location.host}/consulting`, routerLink: '' ,showSubMenu:true}, { no: 1, subtitle: '獴哥保险诊所', icon: 'clinic', path: `https://${window.location.host}/consulting`, routerLink: '' ,showSubMenu:true},
{ no: 4, subtitle: '线上投保', icon: 'online', path: `https://${window.location.host}/index?source=dyd`, routerLink: '' ,showSubMenu:true}, { no: 4, subtitle: '线上投保', icon: 'online', path: `https://${window.location.host}/index?source=dyd`, routerLink: '' ,showSubMenu:true},
{ no: 13, subtitle: '我的商机', icon: 'line', path: '', routerLink: 'business',showSubMenu:true },
{ no: 7, subtitle: '文章分享', icon: 'article', path: '', routerLink: 'article/null' ,showSubMenu:true}, { no: 7, subtitle: '文章分享', icon: 'article', path: '', routerLink: 'article/null' ,showSubMenu:true},
{ no: 3, subtitle: '产品海报', icon: 'poster_p', path: '/salesDetail', routerLink: 'material',showSubMenu:true }, { no: 3, subtitle: '产品海报', icon: 'poster_p', path: '/salesDetail', routerLink: 'material',showSubMenu:true },
{ no: 17, subtitle: '产品库', icon: 'product', path: '', routerLink: 'product' ,showSubMenu:true}, { no: 17, subtitle: '产品库', icon: 'product', path: '', routerLink: 'product' ,showSubMenu:true},
...@@ -74,11 +73,15 @@ export class MenuItemComponent implements OnInit { ...@@ -74,11 +73,15 @@ export class MenuItemComponent implements OnInit {
{ no: 24, subtitle: '目标设置', icon: 'set', path: '', routerLink: 'target',showSubMenu:true }, { no: 24, subtitle: '目标设置', icon: 'set', path: '', routerLink: 'target',showSubMenu:true },
{ no: 21, subtitle: '公司制度', icon: 'management', path: '', routerLink: '',showSubMenu:true }, { no: 21, subtitle: '公司制度', icon: 'management', path: '', routerLink: '',showSubMenu:true },
{ no: 33, subtitle: '佣金政策', icon: 'CommissionPolicy', path: '', routerLink: '',showSubMenu:true }, { no: 33, subtitle: '佣金政策', icon: 'CommissionPolicy', path: '', routerLink: '',showSubMenu:true },
{ no: 12, subtitle: '销售保单', icon: 'policy', path: '', routerLink: '',showSubMenu:true }, { no: 26, subtitle: '投核保知识库', icon: 'ask', path: '', routerLink: 'underwriting_knowledge' ,showSubMenu:true},
{ no: 27, subtitle: '联合销售', icon: 'jointSales', path: '', routerLink: 'joint_sales' ,showSubMenu:true},
{ no: 20, subtitle: '我的客户', icon: 'customer', path: '', routerLink: 'customer',showSubMenu:true }, { no: 20, subtitle: '我的客户', icon: 'customer', path: '', routerLink: 'customer',showSubMenu:true },
{ no: 13, subtitle: '潜在客户', icon: 'line', path: '', routerLink: 'business',showSubMenu:true },
{ no: 35, subtitle: '续期提醒', icon: 'renewalReminder', path: '', routerLink: 'renewal_reminder',showSubMenu:true },
{ no: 12, subtitle: '销售保单', icon: 'policy', path: '', routerLink: '',showSubMenu:true },
// { no: 14, subtitle: '我的佣金', icon: 'commission', path: '', routerLink: '',showSubMenu:true }, // { no: 14, subtitle: '我的佣金', icon: 'commission', path: '', routerLink: '',showSubMenu:true },
{ no: 19, subtitle: '薪资单', icon: 'salary', path: '', routerLink: 'salary',showSubMenu:this.isShowSalay }, { no: 19, subtitle: '薪资单', icon: 'salary', path: '', routerLink: 'salary',showSubMenu:this.isShowSalay },
{ no: 26, subtitle: '投核保知识库', icon: 'ask', path: '', routerLink: 'underwriting_knowledge' ,showSubMenu:true}, { no: 37, subtitle: '我的积分', icon: 'integration', path: '', routerLink: 'integration',showSubMenu:true },
], ],
isShow: true isShow: true
}, },
...@@ -87,9 +90,15 @@ export class MenuItemComponent implements OnInit { ...@@ -87,9 +90,15 @@ export class MenuItemComponent implements OnInit {
type:'trainingCenter', type:'trainingCenter',
content: [ content: [
{ no: 5, subtitle: '保险ABC', icon: 'abc', path: `https://${window.location.host}/issue`, routerLink: '' ,showSubMenu:true}, { no: 5, subtitle: '保险ABC', icon: 'abc', path: `https://${window.location.host}/issue`, routerLink: '' ,showSubMenu:true},
{ no: 6, subtitle: '培训课件', icon: 'train', path: '', routerLink: 'training',showSubMenu:true }, // { no: 6, subtitle: '培训课件', icon: 'train', path: '', routerLink: 'training',showSubMenu:true },
{ no: 10, subtitle: '职业类别', icon: 'job', path: 'https://www.ydinsurance.cn/occupationQry/', routerLink: '',showSubMenu:true }, // { no: 10, subtitle: '职业类别', icon: 'job', path: 'https://www.ydinsurance.cn/occupationQry/', routerLink: '',showSubMenu:true },
{ no: 11, subtitle: '文件下载', icon: 'download', path: 'https://www.ydinsurance.cn/?page_id=13957', routerLink: 'fileUpload',showSubMenu:true }, // { no: 11, subtitle: '文件下载', icon: 'download', path: 'https://www.ydinsurance.cn/?page_id=13957', routerLink: 'fileUpload',showSubMenu:true },
// { no: 36, subtitle: '培训视频', icon: 'trainVideo', path: '', routerLink: 'trainingVideo',showSubMenu:true },
{ no: 39, subtitle: '岗前培训', icon: 'prejobTrainingIcon', path: '', routerLink: 'prejobTraining',showSubMenu:true },
{ no: 40, subtitle: '新人初阶训', icon: 'newTrainingIcon', path: '', routerLink: 'newTraining',showSubMenu:true },
{ no: 41, subtitle: '进阶培训', icon: 'advanceTrainingIcon', path: '', routerLink: 'advanceTraining',showSubMenu:true },
{ no: 42, subtitle: 'CFFP培训', icon: 'cffpTrainingIcon', path: '', routerLink: 'cffpTraining',showSubMenu:true },
{ no: 43, subtitle: '产品培训', icon: 'productTrainingIcon', path: '', routerLink: 'productTraining',showSubMenu:true },
], ],
isShow: true isShow: true
},{ },{
...@@ -99,6 +108,7 @@ export class MenuItemComponent implements OnInit { ...@@ -99,6 +108,7 @@ export class MenuItemComponent implements OnInit {
{ no: 28, subtitle: '欢迎信', icon: 'welcome', path: '', routerLink: 'thanks',showSubMenu:true }, { no: 28, subtitle: '欢迎信', icon: 'welcome', path: '', routerLink: 'thanks',showSubMenu:true },
{ no: 31, subtitle: '新人入职包', icon: 'NewcomerBag', path: '', routerLink: '',showSubMenu:true }, { no: 31, subtitle: '新人入职包', icon: 'NewcomerBag', path: '', routerLink: '',showSubMenu:true },
{ no: 30, subtitle: '执业证书', icon: 'card', path: `https://${window.location.host}/brokerQry/#/brokerDetail/${this.lifeCustomerInfo.practitionerId}?source=0`, routerLink: '',showSubMenu:true }, { no: 30, subtitle: '执业证书', icon: 'card', path: `https://${window.location.host}/brokerQry/#/brokerDetail/${this.lifeCustomerInfo.practitionerId}?source=0`, routerLink: '',showSubMenu:true },
{ no: 38, subtitle: '我的名片', icon: 'practitionerCard', path: '', routerLink: 'businessCard',showSubMenu:true },
{ no: 32, subtitle: '公司介绍', icon: 'introduce', path: '', routerLink: '',showSubMenu:true }, { no: 32, subtitle: '公司介绍', icon: 'introduce', path: '', routerLink: '',showSubMenu:true },
{ no: 27, subtitle: '我的经纪合同', icon: 'contract', path: '', routerLink: 'my_application' ,showSubMenu:true}, { no: 27, subtitle: '我的经纪合同', icon: 'contract', path: '', routerLink: 'my_application' ,showSubMenu:true},
{ no: 34, subtitle: '继续率承诺书', icon: 'jixu', path: '', routerLink: '' ,showSubMenu:true}, { no: 34, subtitle: '继续率承诺书', icon: 'jixu', path: '', routerLink: '' ,showSubMenu:true},
......
<section class="header">
<!-- <div class="topContent">
<i></i>
<i [routerLink]="'/news'">
<img src="assets/images/indexIcons/news.png" alt="" srcset="">
</i>
</div> -->
<!--头部经纪人信息START-->
<div class="brokerInfoContent">
<div class="avatar" routerLink="/setting">
<img style="width: 60px;height: 60px;"
src="{{lifeCustomerInfo?.practitionerBasicInfo?.headImagePath ? lifeCustomerInfo?.practitionerBasicInfo?.headImagePath : './assets/images/icons/meng.png'}}"
alt="头像">
</div>
<div class="brokerInfo">
<div class="brokerName">
<div style="letter-spacing: 2px"><span>{{lifeCustomerInfo?.practitionerBasicInfo?.name}}</span></div>
<span i class="iconfont icon-ar-r" style="font-size:18px;" routerLink="/setting"></span>
</div>
<div class="brokerTag">
<div>
<p>{{lifeCustomerInfo?.practitionerBasicInfo?.insurerBranchName ?
lifeCustomerInfo?.practitionerBasicInfo?.insurerBranchName : '银盾保险'}}</p>
</div>
<div>|</div>
<div>{{lifeCustomerInfo?.practitionerBasicInfo?.subordinateName}}</div>
<div>|</div>
<div><span class="ydTitle">{{lifeCustomerInfo?.practitionerBasicInfo?.levelName}}</span></div>
</div>
</div>
</div>
<!--头部经纪人信息END-->
</section>
<section class="championLists">
<div style="padding-right: 4px">
<div></div>
<div style="display:flex;align-items:center"><img src="assets/images/indexIcons/king.png" alt="" style="width: 30px;margin-right: 3px;">
<span style="font-size: 24px;">龙虎榜</span></div>
<i class="iconfont icon-fanhui" style="color:'#6F1F0D'" (click)="jumpToDetail()"></i>
</div>
<div style="display: flex;flex-direction:column">
<ul class="tab">
<li *ngFor="let item of performanceList" (click)="rank(item.time,1,2)"
[ngClass]="{selected:performanceSelectedFlag==item.time}">
<div style="position: relative;">
<span>{{item.name}}</span>
</div>
</li>
</ul>
<ul>
<li>首年保费</li>
<li>首年佣金</li>
<li>件数</li>
<li style="text-indent: 12px;">完成率</li>
</ul>
<ul>
<li>¥{{onlineInfo?.fyc | number: "1.0-0"}}</li>
<li>¥{{onlineInfo?.fyp | number: "1.0-0"}}</li>
<li>{{onlineInfo?.count?onlineInfo.count:'-'}}</li>
<li style="text-indent: 12px;">{{onlineInfo?.completionRate?onlineInfo.completionRate + '%':'-'}}</li>
</ul>
</div>
</section>
<section class="lists">
<ul>
<li *ngFor="let item of menuLists" (click)="goDetail(item)">
<div>{{item.name}}</div>
<div>
<i class="iconfont icon-fanhui"></i>
</div>
</li>
</ul>
</section>
<section class="copyrightContent">
<p>上海银盾保险经纪有限公司</p>
<p>保险业务经营许可证:269615000000800</p>
<p>
<img src="assets/images/indexIcons/copyright.png" alt="" srcset="">
版权所有©2021银盾保险在线 沪ICP备310115020189293号</p>
</section>
\ No newline at end of file
.icon-fanhui{
display: inline-block;
transform: rotate(180deg);
}
.lists{
ul{
padding-left: 15px;
border-radius: 10px;
background: #fff;
margin: 0 10px;
li{
display: flex;
justify-content: space-between;
align-items: center;
color: #333;
background: #fff;
padding: 14px 5px;
border-bottom: 1px solid #e4e4e4;
&:last-child{
border: none;
}
}
}
}
.brokerInfoContent{
display: flex;
.avatar {
width: 60px;
height: 60px;
border-radius: 50%;
overflow: hidden;
}
.brokerInfo {
flex: 1;
margin-left: 4px;
.brokerName {
display: flex;
justify-content: space-between;
font-weight: normal;
font-size: 16px;
> div:first-child {
display: flex;
align-items: flex-end;
font-size: 20px;
font-weight: 800;
}
}
.brokerTag {
border-radius: 6px;
display: flex;
font-weight: normal;
font-size: 14px;
> div {
display: flex;
align-items: center;
margin-right: 5px;
}
}
}
}
.header{
background: #fff;
padding-left: 16px;
padding-right: 15px;
padding-bottom: 100px;
padding-top: 10px;
.topContent{
padding-top: 10px;
display: flex;
justify-content: space-between;
padding-bottom: 20px;
.icon-fanhui{
transform: rotate(0deg);
}
}
}
.championLists{
background: url(/assets/images/indexIcons/mineBg.png);
min-height: 160px;
margin-left: 9px;
margin-right: 11px;
margin-top: -90px;
background-size: cover;
border-radius: 10px;
>div{
display: flex;
justify-content: space-between;
align-items: center;
span{
font-size: 12px;
color: #6F1F0D;
}
}
ul {
display: flex;
list-style: none;
margin-bottom: 5px;
width: 100%;
justify-content: space-between;
padding-left: 35px;
padding-right: 40px;
li {
flex: 0 0 70px;
font-size: 12px;
color: #6F1F0D;
text-align: center;
font-weight: 600;
&.selected{
span {
position: relative;
font-size: 16px;
&:after{
content: '';
position:absolute;
bottom: -10px;
left: 0;
width: 100%;
height: 2px;
background-color: #6F1F0D;
}
};
}
}
&.tab{
border-bottom: 1px solid #fff;
li{
color: #fff;
line-height: 38px;
height: 38px;
}
}
}
}
.copyrightContent{
margin-top: 23px;
text-align: center;
p{
color: #666;
margin-bottom: 4px;
&:last-child{
color: #999;
font-size:10px;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 33px;
img{
width: 15px;
margin-right: 2px;
}
}
}
}
\ No newline at end of file
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { MineComponent } from './mine.component';
describe('MineComponent', () => {
let component: MineComponent;
let fixture: ComponentFixture<MineComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ MineComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(MineComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { LifeCommonService } from 'src/app/common/life-common.service';
import { MyService } from '../my.service';
@Component({
selector: 'ydlife-mine',
templateUrl: './mine.component.html',
styleUrls: ['./mine.component.scss']
})
export class MineComponent implements OnInit {
lifeCustomerInfo: any = JSON.parse(localStorage.getItem('lifeCustomerInfo')) ? JSON.parse(localStorage.getItem('lifeCustomerInfo')) : null;
public menuLists = [
{id:1,name:'全部工具',link:'/moreFeatures',params:null},
{id:2,name:'公司制度',link:'/fileUpload',params:{fileUploadType:'management'}},
{id:3,name:'新人入口',link:'/newPeople',params:null},
{id:4,name:'我的薪资',link:'/salary',params:null},
{id:5,name:'我的积分',link:'/integration',params:null},
{id:6,name:'我的消息',link:'/news',params:null},
]
performanceList:Array<any>;
performanceSelectedFlag: string = '1';
onlineInfo: any;
offlineInfo: any;
constructor(private lifeCommonService:LifeCommonService,private myService:MyService,private router:Router) { }
ngOnInit() {
this.performanceList = [
{ name: `${this.lifeCommonService.dateFormat(new Date, ('M'))}月`, time: 1 },
{ name: `${this.getQuarter(this.lifeCommonService.dateFormat(new Date, ('M')))}`, time: 3 },
{ name: '本年度', time: 2 },
{ name:'往期历史' , time: 4 }
]
//初始化调本月线上 保费+ 本月线下保费
this.rank(1, 1, 1)
}
goDetail(item){
if(item.link){
this.router.navigate([item.link])
}
if(item.link && item.params){
this.router.navigate([item.link],{queryParams:item.params})
}
}
//获取季度
getQuarter(quarter) {
if (quarter == '1' || quarter == '2' || quarter == '3') {
return '第一季度';
}
if (quarter == '4' || quarter == '5' || quarter == '6') {
return '第二季度';
}
if (quarter == '7' || quarter == '8' || quarter == '9') {
return '第三季度';
}
if (quarter == '10' || quarter == '11' || quarter == '12') {
return '第四季度';
}
}
/**
* time 1-month,2-year,3-季度
* type 1-保费,2-佣金 3-件数
* platform //1-online,2-offline
*/
rank(time, platform, type) {
this.performanceSelectedFlag = time;
if(time==4){
this.router.navigate(['/historical_rank'])
}else{
const param = {
mobileNo: JSON.parse(localStorage.getItem('lifeCustomerInfo'))['mobileNo'],
time: time,
platform: platform,
type: type,
isPersonal:0
}
this.myService.rank(param).subscribe((res) => {
if (res['success']) {
if (platform == 1) {
this.onlineInfo = res['data']['practitionerInfo'];
}
if (platform == 2) {
this.offlineInfo = res['data']['practitionerInfo'];
}
}
});
}
}
jumpToDetail() {
this.router.navigate(['/rank'], { queryParams: { time: this.performanceSelectedFlag } });
}
}
<div *ngFor="let item of feartureLists" class="featureListsContent">
<h5>{{item.title}}</h5>
<ul>
<li *ngFor="let subItem of item.subItems" (click)="featureSelect(subItem)">
<div>
<img [src]="'assets/images/indexIcons/' + subItem.icon + '.png'" alt="">
</div>
<p>{{subItem.name}}</p>
</li>
</ul>
</div>
<Modal [(ngModel)]="this.state.modal1" [transparent]="true" [maskClosable]="true" (onClose)="onClose('modal1')">
<div [ngStyle]="{ height: 100, overflow: 'scroll',color:'#000' }">
此功能暂未开放,敬请期待。
</div>
</Modal>
\ No newline at end of file
header{
height: 44px;
color: #333;
display: flex;
justify-content: space-between;
align-items: center;
padding-left: 15px;
background: #fff;
}
.featureListsContent{
padding: 15px 10px;
background-color: #fff;
h5{
font-size: 15px;
color: #333;
margin-top: 15px;
margin-bottom: 10px;
font-weight: bold;
}
ul{
display: flex;
flex-wrap: wrap;
li{
width: 0;
flex: 0 0 25%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
img{
width: 48px;
}
p{
white-space: nowrap;
font-size: 14px;
}
}
}
}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
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