import { Component, OnInit, TemplateRef, ViewChild } from "@angular/core";
import { NavigationEnd, Router } from "@angular/router";
import { MainService } from "../../services/main.service";
import { NzMessageService } from "ng-zorro-antd/message";
import { WebsocketMainService } from "../../services/websocket-main.service";
import http from "../../../assets/js/http";
import { NzNotificationService } from "ng-zorro-antd/notification";
import { OverlayScrollbarsComponent } from "overlayscrollbars-ngx";
import { ToolService } from "../../services/tool.service";
import { filter } from "rxjs/operators";
@Component({
selector: "app-main",
templateUrl: "./main.component.html",
styleUrls: ["./main.component.less"],
})
export class MainComponent implements OnInit {
userInfo: any = JSON.parse(localStorage.getItem("user"));
menus: any = JSON.parse(localStorage.getItem("menu"));
currentHospital; //当前院区
routerEventsListener; //监听路由
deskRole: boolean = false; //调度台权限
nurseRole: boolean = false; //护士端权限
pharmacyRole: boolean = false; //药房端权限
largeScreenRole: boolean = false; //大屏端权限
largeScreenRole2: boolean = false; //大屏端权限
specimenViewRole: boolean = false; //业务视图权限
specimenViewRole2: boolean = false; //标本视图权限
specimenRoomView: boolean = false; //标本间权限
pathology: boolean = false; //病理科权限
sampling: boolean = false; //门诊病理采样端权限
communicationBook: boolean = false; //病理交接本权限
disinfectionSupplyRole: boolean = false; //全局业务查看权限
realtimeBroadcastRole: boolean = false; //全局业务查看权限
incidentConfigRole: boolean = false; //事件配置权限
otherConfigRole: boolean = false; //三方配置权限
pageConfigRole: boolean = false; //业务页面控制权限
nurseConfigRole: boolean = false; //护士端配置控制权限
PCCommutesToWork: boolean = false; //PC上下班权限
newStatisticsRole: boolean = false; //新版统计权限
@ViewChild("osComponentRef1", {
read: OverlayScrollbarsComponent,
static: false,
})
osComponentRef1: OverlayScrollbarsComponent;
constructor(
public router: Router,
private mainService: MainService,
private msg: NzMessageService,
private notification: NzNotificationService,
private webs: WebsocketMainService,
public tool: ToolService
) {}
ngOnInit() {
this.highlightMenuByUrl();
this.routerEventsListener = this.router.events
.pipe(filter((event) => event instanceof NavigationEnd))
.subscribe((event) => {
this.highlightMenuByUrl();
});
this.currentHospital = this.tool.getCurrentHospital();
this.initLogin();
this.initMenu();
this.getWebsocket();
}
// 离开管理端
ngOnDestroy() {
//取消路由监听
this.routerEventsListener.unsubscribe();
// 断掉连接
this.webs.closeWs(true);
}
// 菜单图标名称是否包含transport-
isTransportIcon(icon:any) {
if(icon){
return icon.indexOf("transport-") > -1;
}else{
return false;
}
}
//上下班
loading3 = false;
workModal: boolean = false; //模态框
showWorkModal() {
this.workModal = true;
}
hideWorkModal() {
this.workModal = false;
}
confirmWork() {
this.loading3 = true;
if (this.userInfo.user.online) {
// 判断当前启用的工作方案是自主还是综合排班
this.getUserWorkDept().then((ress:any) => {
if (ress.status == 200) {
let workType = ress.settings ? ress.settings.workType : -1; //1是综合,2是自主
// 自主下班,并且是科室绑定人员,科室绑定分组,绑定分组
if (workType == 2) {
this.loading3 = false;
this.msg.info('不支持此上班模式!');
} else {
this.mainService.onOrOffLine({
type: "off",
}).subscribe((res:any) => {
if (res.status == 200) {
this.getCurrentUserNow();
} else {
this.loading3 = false;
this.msg.error('操作失败');
}
});
}
} else if (ress.status == 500) {
//500的时候自选下班
this.customOff();
} else {
this.loading3 = false;
this.msg.error('操作失败');
}
});
} else {
this.getWorkScheme();
}
}
// 获取启动中的工作分配方案
workSchemeType:any = ""; //启动中工作分配方案类型
getWorkScheme() {
let postData = {
idx: 0,
workScheme: {
status: 1,
hosId: this.currentHospital.id
},
sum: 1,
};
this.mainService.getFetchDataList("simple/data", "workScheme", postData).subscribe((res) => {
if (res.status == 200) {
if(Array.isArray(res.list) && res.list.length){
this.workSchemeType = res.list[0].workType;
if (this.workSchemeType == 2) {
this.loading3 = false;
this.msg.info('不支持此上班模式!');
} else if (this.workSchemeType == 1) {
this.mainService.onOrOffLine({
type: "on",
}).subscribe((res:any) => {
if (res.status == 200) {
this.getCurrentUserNow();
} else {
this.loading3 = false;
this.msg.error('操作失败');
}
});
}
}
} else {
this.loading3 = false;
this.msg.error('操作失败');
}
});
}
// 下班
customOff() {
this.mainService.onOrOffLine({
type: "off",
customWorking: "off",
}).subscribe((res:any) => {
if (res.status == 200) {
this.getCurrentUserNow();
} else {
this.loading3 = false;
this.msg.error('操作失败');
}
});
}
// 获取执行中列表
getWorkingNum() {
return this.mainService.coopWorkerOrder("executingOrders", {
idx: 0,
sum: 1,
}).toPromise();
}
// 获取启动中的工作分配方案
getUserWorkDept() {
return this.mainService.getUserWorkDept({}).toPromise();
}
// 获取当前用户信息
getCurrentUserNow() {
this.mainService.getCurrentUser1().subscribe((data:any) => {
this.loading3 = false;
if (data.status == 200) {
let user = JSON.parse(localStorage.getItem("user"));
user.user = data.data;
this.userInfo.user = data.data;
localStorage.setItem("user", JSON.stringify(user));
this.hideWorkModal();
this.msg.success('操作成功!');
}
});
}
// 上下班
types = "";
async GoWork() {
let workingNum = 0;
if (this.userInfo.user.online) {
this.maskFlag = this.msg.loading("正在加载中..", {
nzDuration: 0,
}).messageId;
let workingNumResult = await this.getWorkingNum();
this.msg.remove(this.maskFlag);
this.maskFlag = false;
if (workingNumResult.status == 200) {
workingNum = workingNumResult.data.data.length;
}
if (workingNum) {
this.types = "您还有未完成的工单,确定下班后,未完成工单将不计算积分。";
} else {
this.types = "确定是否下班 ?";
}
} else {
this.types = "确定是否上班 ?";
}
this.showWorkModal();
}
// 根据url高亮菜单baba
highlightMenuByUrl() {
console.log(this.router.url);
let navOne, navTwo;
let link = this.router.url.split("/").slice(-1)[0];
let menus = JSON.parse(localStorage.getItem("menu"));
if (link == "home") {
this.toMenu("首页");
} else {
menus.forEach((oneNav) => {
if (oneNav.childrens) {
let findTwoNav = oneNav.childrens.find(
(twoNav) => twoNav.link == link
);
if (findTwoNav) {
navTwo = findTwoNav;
navOne = oneNav;
this.toMenu(navTwo.title, navTwo, navOne);
}
}
});
}
}
// 一级导航点击
clickMenuOne(data) {
let menus = JSON.parse(localStorage.getItem("menu"));
data.flag = !data.flag;
menus.find((item) => item.id == data.id).flag = data.flag;
localStorage.setItem("menu", JSON.stringify(menus));
}
initMenu() {
let menus = JSON.parse(localStorage.getItem("menu"));
let arr = [];
menus.forEach((e) => {
if (e.link == "nurse") {
this.nurseRole = true;
console.log("护士端权限");
}
if (e.link == "dispatchingDesk") {
this.deskRole = true;
console.log("调度台权限");
}
if (e.link == "pharmacy") {
this.pharmacyRole = true;
console.log("药房端权限");
}
if (e.link == "largeScreen") {
this.largeScreenRole = true;
console.log("大屏端权限");
}
if (e.link == "largeScreen2") {
this.largeScreenRole2 = true;
console.log("大屏端2权限");
}
if (e.link == "specimenView") {
this.specimenViewRole = true;
console.log("业务视图权限");
}
if (e.link == "specimenView2") {
this.specimenViewRole2 = true;
console.log("标本视图权限");
}
if (e.link == "specimenRoomView") {
this.specimenRoomView = true;
console.log("标本间权限");
}
if (e.link == "pathology") {
this.pathology = true;
console.log("病理科权限");
}
if (e.link == "pathologySample") {
this.sampling = true;
console.log("门诊病理采样端权限");
}
if (e.link == "pathologyCommunicationBook") {
this.communicationBook = true;
console.log("病理交接本权限");
}
if (e.link == "disinfectionSupply") {
this.disinfectionSupplyRole = true;
console.log("全局业务查看权限");
}
if (e.link == "realtimeBroadcast") {
this.realtimeBroadcastRole = true;
console.log("故障实时播报权限");
}
if (e.link == "incidentConfig") {
this.incidentConfigRole = true;
console.log("事件配置权限");
}
if (e.link == "otherConfig") {
this.otherConfigRole = true;
console.log("三方配置权限");
}
if (e.link == "pageConfig") {
this.pageConfigRole = true;
console.log("业务页面控制权限");
}
if (e.link == "nurseConfig") {
this.nurseConfigRole = true;
console.log("护士端配置控制权限");
}
if (e.link == "PCCommutesToWork") {
this.PCCommutesToWork = true;
console.log("PC上下班");
}
if (e.type == "newStatistics") {
this.newStatisticsRole = true;
console.log("新版统计");
}
if (!e.link) {
arr.push(e);
}
});
this.menus = arr.filter(v => v.type === 'default');
}
// 判断登录是否已失效
initLogin() {
if (!this.userInfo) {
this.msg.error("您的登录已失效,请重新登录!", {
nzDuration: 3000,
});
setTimeout(() => {
this.router.navigateByUrl("login");
}, 2000);
return;
}
}
// 新密码失去焦点
enoughRegFlag = true; //弱
mediumRegFlag = false; //中
strongRegFlag = false; //强
blurNewPwd(){
let enoughReg = /^.{0,6}$/;//密码强度-弱
let strongReg = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\!\@\#\$\%\^\&\*]).{9,}$/;//密码强度-强
this.enoughRegFlag = enoughReg.test(this.upModalData.newPwd);
this.strongRegFlag = strongReg.test(this.upModalData.newPwd);
this.mediumRegFlag = !this.enoughRegFlag && !this.strongRegFlag;
console.log(this.enoughRegFlag,this.mediumRegFlag,this.strongRegFlag);
}
// 跳转页面
menuLabel: string; //当前菜单名称
indexFlag = localStorage.getItem("index") === "true" ? true : false; //首页高亮
toMenu(title, item?, data?) {
sessionStorage.setItem("title", title);
this.menuLabel = sessionStorage.getItem("title");
if (item && data) {
// 首页取消高亮
this.indexFlag = false;
localStorage.setItem("index", "false");
// 操作本地存储
let menus = JSON.parse(localStorage.getItem("menu"));
menus.forEach((item1) => {
item1.flagBg = false;
if (item1.childrens) {
item1.childrens.forEach((value) => {
value.flag = false;
});
}
});
let obj = menus.find((value) => value.id == data.id);
obj.flagBg = true;
obj.flag = true;
obj.childrens.find((value) => value.id == item.id).flag = true;
localStorage.setItem("menu", JSON.stringify(menus));
// 操作菜单一级 二级
this.menus = menus.filter((item) => !item.link);
} else {
// 首页高亮
this.indexFlag = true;
localStorage.setItem("index", "true");
// 操作本地存储
let menus = JSON.parse(localStorage.getItem("menu"));
menus.forEach((item1) => {
item1.flagBg = false;
// item1.flag = false;
if (item1.childrens) {
item1.childrens.forEach((value) => {
value.flag = false;
});
}
});
localStorage.setItem("menu", JSON.stringify(menus));
// 操作菜单一级 二级
this.menus = menus.filter((item) => !item.link);
}
}
// 子路由跳转事件
activeRoute() {
this.menuLabel = sessionStorage.getItem("title");
}
// 调度台
toFuwutai(): void {
this.router.navigateByUrl("dispatchingDesk");
}
// 护士建单
toHuShi(): void {
this.router.navigateByUrl("nurse");
}
// 药房端
toPharmacy(): void {
this.router.navigateByUrl("pharmacy");
}
// 药房端2
toPharmacy2(): void {
this.router.navigateByUrl("pharmacy2");
}
// 标本视图
toSpecimenView2(): void {
this.router.navigateByUrl("specimenView2");
}
// 标本间
toSpecimenRoomView(): void {
this.router.navigateByUrl("specimenRoomView");
}
// 病理科
toPathology(): void {
this.router.navigateByUrl("pathology");
}
// 门诊病理采样端
toSampling(): void {
this.router.navigateByUrl("pathologySample");
}
// 病理交接本
toCommunicationBook(): void {
this.router.navigateByUrl("pathologyCommunicationBook");
}
// 全局业务查看
toDisinfectionSupply(): void {
this.router.navigateByUrl("disinfectionSupply");
}
// 故障实时播报
toRealtimeBroadcast(): void {
this.router.navigateByUrl("realtimeBroadcast");
}
// 配置中心
toConfigurationCenter(): void {
this.iShowMenuModal = true;
// this.router.navigateByUrl("configurationCenter");
}
// 统计
toNewStatistics(): void {
let menus = JSON.parse(localStorage.getItem("menu"));
let firstMenu = menus.find((item) => item.type == "newStatistics");
this.router.navigateByUrl(`newStatistics/${firstMenu.link}/${firstMenu.childrens[0].link}`);
}
// 大屏端或视图端
screenType;
hosFlag = false;
toBigScreen(type): void {
this.screenType = type;
this.submitFormHand(this.currentHospital.id);
}
submitFormHand(id) {
if (this.screenType === "largeScreen") {
window.open(http.bigScreenHost + "/#/" + id);
} else if (this.screenType === "largeScreen2") {
window.open(http.bigScreenHost2 + "/#/" + id);
} else if (this.screenType === "specimenView") {
window.open(http.specimenViewHost + "/#/" + id);
}
}
//获取系统设置中的科室类型
getTypeByDept(id) {
let postData = {
idx: 0,
sum: 1,
systemConfiguration: { keyconfig: "busiViewDeptId" },
};
this.maskFlag = this.msg.loading("正在加载中..", {
nzDuration: 0,
}).messageId;
this.mainService
.getFetchDataList("simple/data", "systemConfiguration", postData)
.subscribe((result) => {
this.msg.remove(this.maskFlag);
this.maskFlag = false;
if (result.status == 200) {
let remember = JSON.parse(localStorage.getItem("remember"));
window.open(
http.specimenViewHost +
"/#/" +
id +
"/" +
encodeURIComponent(remember.username) +
"/" +
encodeURIComponent(remember.password) +
"/" +
result.list[0].valueconfig
);
}
});
}
hosFlagHand(flag) {
if (!flag) {
this.hosFlag = false;
}
}
// 选择菜单-知道了
iShowMenuModal:boolean = false;
cancelMenuModal(flag) {
this.iShowMenuModal = false;
}
// 下拉
showDropdown:boolean = false;
showDropdown1:boolean = false;
// 选择院区
selectHospital(){
this.hosFlag1 = true
}
// 退出
logOut(): void {
// 假退出
let hospital = this.tool.getCurrentHospital();
if(hospital){
this.router.navigate(["login", hospital.id]);
}else{
this.router.navigateByUrl("login");
}
localStorage.removeItem("user");
localStorage.removeItem("menu");
localStorage.removeItem("index");
// 假退出
this.mainService.logOut().subscribe((data) => {
if (data.status == 200) {
if(hospital){
this.router.navigate(["login", hospital.id]);
}else{
this.router.navigateByUrl("login");
}
localStorage.removeItem("user");
localStorage.removeItem("menu");
localStorage.removeItem("index");
}
});
}
// 连接websocket
getWebsocket() {
this.webs
.connectWs(http.mainWs, { userCount: this.userInfo.user.account })
.subscribe((data) => {
console.log(data);
if (data && data.content) {
this.createBasicNotification(data);
}
});
}
@ViewChild("msgTemplate1", { static: false }) msgTemplate1: TemplateRef; //消息通知模板
// 消息提醒
createBasicNotification(msgs): void {
this.notification.template(this.msgTemplate1, {
nzDuration: 0,
nzData: msgs,
});
}
//打开修改密码弹窗
pwdAfterOpen(){
this.passwordVisible = false;
this.pwdIsOkLoading = false;
this.enoughRegFlag = true; //弱
this.mediumRegFlag = false; //中
this.strongRegFlag = false; //强
this.upModalData = {
userid: "",
pwdOld: "",
newPwd: "",
newPwd2: "",
};
}
// 修改密码
passwordVisible = false;
password?: string;
isPwdVisible = false;
pwdIsOkLoading = false;
upModalData = {
userid: "",
pwdOld: "",
newPwd: "",
newPwd2: "",
};
upPwd(): void {
if(this.upModalData.pwdOld.trim() === ''){
this.msg.error('请填写原始密码!', {
nzDuration: 5000,
});
return;
}
if(!this.strongRegFlag){
this.msg.error('新密码不符合要求!', {
nzDuration: 5000,
});
return;
}
if(this.upModalData.newPwd !== this.upModalData.newPwd2){
this.msg.error('新密码与确认新密码不一致!', {
nzDuration: 5000,
});
return;
}
this.pwdIsOkLoading = true;
let userid = JSON.parse(localStorage.getItem("user")).user.id;
this.upModalData.userid = userid;
this.mainService.upPwd(this.upModalData).subscribe((data) => {
if (data.status == 200) {
this.isPwdVisible = false;
this.pwdIsOkLoading = false;
this.msg.success("修改成功!", {
nzDuration: 5000,
});
} else {
this.pwdIsOkLoading = false;
this.msg.error(data.error, {
nzDuration: 5000,
});
}
});
}
showUpPwd(): void {
this.isPwdVisible = true;
}
pwdHandleOk(): void {
this.upPwd();
}
pwdHandleCancel(): void {
this.isPwdVisible = false;
}
delModal = false;
tipsMsg1 = "是否确定离开该界面,如果未点击生效,数据可能会遗失?";
navInfo = {};
// 隐藏模态框
hideDelModal() {
this.delModal = false;
}
// 模态框确认
confirmDel() {
this.delModal = false;
if (this.navInfo["title"] == "首页") {
this.router.navigateByUrl("/main/home");
this.toMenu("首页");
} else {
this.router.navigateByUrl("/main/" + this.navInfo["item"].link);
this.toMenu(
this.navInfo["title"],
this.navInfo["item"],
this.navInfo["data"]
);
}
}
//前往菜单连接(拦截版)
totoMenu(title, item?, data?) {
let url = location.href.split("#")[1];
if (url.includes("/main/quickCombination")) {
//拦截
this.delModal = true;
this.navInfo = {
title,
item,
data,
};
} else {
//正常情况
if (title == "首页") {
this.router.navigateByUrl("/main/home");
this.toMenu("首页");
} else {
this.router.navigateByUrl("/main/" + item.link);
this.toMenu(title, item, data);
}
}
}
// 切换院区
maskFlag: any = false;
hosFlag1 = false;
submitFormHand1(id) {
if(this.currentHospital.id == id){
return;
}
this.maskFlag = this.msg.loading("正在加载中..", {
nzDuration: 0,
}).messageId;
this.mainService
.changeHospital({ currentHosId: +id, loginType: "PC" })
.subscribe((result) => {
this.msg.remove(this.maskFlag);
this.maskFlag = false;
if (result.status == 200) {
localStorage.setItem("user", JSON.stringify(result.user));
location.reload(true);
} else {
this.msg.create("error", "切换院区失败");
}
});
}
hosFlagHand1(flag) {
if (!flag) {
this.hosFlag1 = false;
}
}
}