You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
udiwms-vue/src/views/home/index.vue

845 lines
26 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<el-container class="wrapper">
<el-scrollbar
class="container-left"
wrap-class="container-left-wrap"
:class="{ 'slide-hide': isCollapse, 'slide-in-left': menuShow }"
>
<div class="logo">
<!--图片logo-->
<img
alt="element-logo"
style="width: 100px; height: 100px; margin: 15px 15px 0px 15px"
src="../../assets/ic_launcher.png"
/>
<!--文字logo-->
<span>UDI管理系统</span>
</div>
<el-menu
class="menu"
:default-active="onRoutes"
:collapse="isCollapse"
style="border: none"
text-color="#696969"
background-color="#F5F5F5"
active-text-color="#B22222"
unique-opened
router
>
<sidebar-item
v-for="item in routers"
:key="item.path"
:item="item"
></sidebar-item>
</el-menu>
</el-scrollbar>
<el-container
class="container-box"
v-bind:class="{ 'slide-hide': isCollapse, 'slide-in-left': menuShow }"
>
<el-header class="header">
<div class="header-left">
<div
class="header-toggle"
@click="
menuShow = !menuShow;
showSideBar();
"
>
<span></span>
<span></span>
<span></span>
</div>
<div
class="slide-toggle"
:class="{ 'slide-toggle-open': isCollapse }"
@click="toggleSideBar"
>
<span></span>
<span></span>
<span></span>
</div>
</div>
<div class="header-tabs-box">
<el-breadcrumb class="app-levelbar" separator="/">
<el-breadcrumb-item v-for="(item, index) in levelList" :key="item.path" >
<span v-if="
item.redirect === 'noredirect' ||
index == levelList.length - 1
"
class="no-redirect"
>{{ item.name }}</span
>
<router-link v-else :to="item.redirect || item.path">{{
item.name
}}
</router-link>
</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="header-right">
<div>
<h3>
<span style=" margin-top: 2px ;
font-weight: bold;color: #303133;">{{ hospitalName }}</span>
<span
style="margin-top: 2px;margin-right: 18px;color: #2d8cf0;font-size: 12px;">({{
curInv
}})</span>
</h3>
</div>
<!-- <span style="margin-right: 10px; margin-top: 2px">{{ username }}</span>-->
<el-dropdown trigger="click">
<!--<i class="el-icon-setting" style="margin-right: 15px"></i>-->
<span style=" font-size: 14px;font-weight: bold;color: #303133;">{{ title }}<i class="el-icon-arrow-down el-icon--right"></i></span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item><span @click="changeInv">切换仓库</span></el-dropdown-item>
<el-dropdown-item><span @click="handlePassword">修改密码</span></el-dropdown-item>
<el-dropdown-item><span @click="loginOut">退出登录</span></el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
<!--新增界面-->
<el-dialog
title="修改密码"
:visible.sync="passwordFormVisible"
width="85%"
top="5vh"
:close-on-click-modal="false"
:close-on-press-escape="false"
>
<el-form
:model="passwordFormData"
:rules="passwordFormDataRules"
ref="passwordFormData"
>
<el-form-item label="原始密码" prop="oldPassword">
<el-input
type="password"
v-model="passwordFormData.oldPassword"
auto-complete="off"
></el-input>
</el-form-item>
<el-form-item label="新密码" prop="newPassword">
<el-input
type="password"
v-model="passwordFormData.newPassword"
auto-complete="off"
></el-input>
</el-form-item>
<el-form-item label="确认密码" prop="check_new_password">
<el-input
type="password"
v-model="passwordFormData.check_new_password"
auto-complete="off"
></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button
@click.native="passwordFormVisible = !passwordFormVisible"
>取消
</el-button
>
<el-button
type="primary"
@click.native="addSubmit('passwordFormData')"
:loading="passwordLoading"
>提交
</el-button
>
</div>
</el-dialog>
</el-header>
<!--遮板-->
<div
class="main-mask"
v-show="menuShow"
@click="menuShow = !menuShow"
></div>
<el-main class="main">
<transition name="move" mode="out-in">
<router-view></router-view>
</transition>
</el-main>
<!-- <div-->
<!-- style="-->
<!-- position: absolute;-->
<!-- bottom: 0;-->
<!-- left: 50%;-->
<!-- transform: translate(-50%, -50%);-->
<!-- "-->
<!-- >-->
<!-- <a-->
<!-- href="http://www.beian.gov.cn/portal/registerSystemInfo"-->
<!-- style="color: #000000; font-size: 12px"-->
<!-- >-->
<!-- 技术支持:厦门高立新鹏软件科技有限公司&nbsp; &nbsp;闽公网安备35020302034269号&nbsp;-->
<!-- </a>-->
<!-- <a-->
<!-- href="http://beian.miit.gov.cn"-->
<!-- style="color: #000000; font-size: 10px"-->
<!-- >闽ICP备17019234号</a-->
<!-- >-->
<!-- </div>-->
</el-container>
<el-dialog
title="请选择当前仓库和分仓"
:visible.sync="selInvVisible"
:close-on-click-modal="false"
:close-on-press-escape="false"
width="40%"
v-if="selInvVisible"
>
<el-form :model="userInfo">
<el-row :gutter="20">
<el-col :span="4">
<div class="ao-text">
<span>当前仓库:</span>
</div>
</el-col>
<el-col :span="16">
<el-form-item prop="locStorageCode">
<el-select v-model="userInfo.locInvCode" placeholder="当前仓库信息" clearable
@change="locCHange"
>
<el-option
v-for="item in storageList"
:key="item.name"
:label="item.name"
:value="item.code">
<span style="float: left">{{ item.name }}</span>
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="4">
<div class="ao-text">
<span>当前分库:</span>
</div>
</el-col>
<el-col :span="16">
<el-form-item prop="locInvCode">
<el-select v-model="userInfo.locSubInvCode" placeholder="当前分库信息" clearable
>
<el-option
v-for="item in subInvList"
:key="item.name"
:label="item.name"
:value="item.code">
<span style="float: left">{{ item.name }}</span>
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<div style="margin-top: 8px ; color: #F71616;">
<span>提示:进入系统请先选择您当前所在仓库与分库&nbsp;</span>
</div>
<div style='text-align: center; margin-bottom: 10px;margin-top: 18px ;'>
<el-button type="primary" @click="submitInv">提交</el-button>
<el-button type="primary" @click="closeDialog">取消</el-button>
</div>
</el-form>
</el-dialog>
</el-container>
</template>
<script>
import {mapGetters} from "vuex";
import SidebarItem from "./SidebarItem.vue";
import {password, userInfo} from "../../api/auth/login";
import {getAdminId} from "../../utils/auth";
import {getCompany} from "../../api/inout/company";
import {socket} from '../../socket'
import store from "../../store/index";
import {filterAllByUser} from "@/api/basic/invWarehouse";
import {filterSubByInv} from "@/api/basic/invSubWarehouse";
import {updateInv} from "@/api/auth/authAdmin";
import * as types from "../../store/mutation-types";
import axios from "axios";
export default {
data() {
let validatePass = (rule, value, callback) => {
if (value === "") {
callback(new Error("请输入密码"));
} else {
if (this.passwordFormData.check_new_password !== "") {
this.$refs.passwordFormData.validateField("check_new_password");
}
callback();
}
};
let validatePass2 = (rule, value, callback) => {
if (value === "") {
callback(new Error("请再次输入密码"));
} else if (value !== this.passwordFormData.newPassword) {
callback(new Error("两次输入密码不一致!"));
} else {
callback();
}
};
return {
tagsList: [],
collapse: false,
menuShow: false,
levelList: null,
passwordLoading: false,
passwordFormVisible: false,
company: "",
curInv: "",
passwordFormData: {
oldPassword: "",
newPassword: "",
check_new_password: "",
},
employName: "",
name: "",
passwordFormDataRules: {
oldPassword: [
{
required: true,
message: "请输入原始密码",
trigger: "blur",
},
],
newPassword: [
{
required: true,
message: "请输入新密码",
trigger: "blur",
},
{validator: validatePass, trigger: "blur"},
],
check_new_password: [
{
required: true,
message: "请再次输入密码",
trigger: "blur",
},
{validator: validatePass2, trigger: "blur"},
],
},
userInfo: {},
storageList: [],
subInvList: [],
hospitalName:"",
selInvVisible: false,
locInvName: "",
locSubInvName: "",
title: "udi管理系统",
};
},
components: {
SidebarItem,
},
computed: {
...mapGetters({
routers: "routers",
}),
onRoutes() {
return this.$route.path;
},
username() {
let username = this.$store.getters.employeeName;
return username + "" + this.$store.getters.locInvName + " " + this.$store.getters.locSubInvName + "";
},
isCollapse() {
return false;
},
},
mounted() {
},
methods: {
toggleSideBar() {
this.$store.dispatch("ToggleSideBar");
},
showSideBar() {
this.$store.dispatch("ShowSideBar");
},
getBreadcrumb() {
let matched = this.$route.matched.filter((item) => item.name);
const first = matched[0];
if (first && (first.name !== "首页" || first.path !== "")) {
matched = [{name: "首页", path: "/"}].concat(matched);
}
this.levelList = matched;
},
getCompanyData() {
this.employName = this.$store.state.admin.employeeName;
this.loading = true;
let tquery = {
customerId: store.getters.customerId,
};
getCompany(tquery).then((response) => {
this.loading = false;
this.company = response.data.name;
});
},
loginOut() {
this.$confirm("此操作将退出系统, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
this.$store.dispatch("loginOut").then(() => {
location.reload(); // 为了重新实例化vue-router对象 避免bug
});
})
.catch(() => {
// this.$message({
// type: "error",
// message: "操作失败",
// });
});
},
getStorage() {
this.storageList = [];
filterAllByUser()
.then((response) => {
this.storageList = response.data || [];
this.findSubInvByInv();
})
.catch(() => {
});
},
locCHange() {
if (this.$isNotBlank(this.userInfo.locSubInvCode)) {
this.userInfo.locSubInvCode = "";
}
this.findSubInvByInv();
},
findSubInvByInv() {
this.subInvList = [];
let query = {
pcode: this.userInfo.locInvCode
};
filterSubByInv(query)
.then((response) => {
this.subInvList = response.data || [];
if (this.subInvList != null && this.subInvList.length > 1) {
this.userInfo.locSubInvCode = this.subInvList[0].code;
}
})
.catch(() => {
});
},
getUserInfo() {
userInfo()
.then((response) => {
if (response.code == 20000) {
this.userInfo = response.data;
this.locInvName = this.userInfo.locInvName;
this.locSubInvName = this.userInfo.locSubInvName;
if (this.$isBlank(this.userInfo.locInvCode)) {
this.selInvVisible = true;
} else {
this.$store.commit(types.RECEIVE_LOCINVCODE, this.userInfo.locInvCode);
this.$store.commit(types.RECEIVE_LOCSUBINVCODE, this.userInfo.locSubInvCode);
this.$store.commit(types.RECEIVE_LOCINVNAME, this.locInvName);
this.$store.commit(types.RECEIVE_LOCSUBINVNAME, this.locInvName);
let username = this.$store.getters.employeeName;
this.curInv = "仓库:" + this.locInvName + "; 分库:" + this.locSubInvName + " ";
this.title = username + "" + this.userInfo.userName + "";
this.getStorage();
}
}
})
.catch(() => {
this.customerId = "";
});
},
// 显示修改密码界面
handlePassword() {
this.passwordFormVisible = true;
this.passwordFormData = {
oldPassword: "",
newPassword: "",
check_new_password: "",
};
},
submitInv() {
if (this.$isBlank(this.userInfo.locInvCode)) {
this.$message.error("当前仓库不能为空!");
return;
}
if (this.userInfo.customerId == 110) {
if (this.$isBlank(this.userInfo.locSubInvCode)) {
this.$message.error("当前分库不能为空!");
return;
}
}
updateInv(this.userInfo).then((res) => {
if (res.code == 20000) {
this.$message.success("设置成功!");
this.selInvVisible = false;
this.getUserInfo();
} else {
this.$message.error(res.message);
}
}).catch(() => {
this.selInvVisible = false;
});
},
closeDialog() {
this.selInvVisible = false;
},
addSubmit(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
this.passwordLoading = true;
let data = Object.assign({}, this.passwordFormData);
data.adminId = getAdminId();
password(data)
.then((res) => {
this.passwordLoading = false;
if (res.code != 20000) {
this.$message({
message: res.message,
type: "error",
});
} else {
this.$message({
message: "修改成功",
type: "success",
});
// 刷新表单
this.$refs["passwordFormData"].resetFields();
this.passwordFormVisible = false;
this.$store.dispatch("loginOut").then(() => {
location.reload(); // 为了重新实例化vue-router对象 避免bug
});
}
})
.catch(() => {
this.$message({
type: "error",
message: "操作失败",
});
});
}
});
},
changeInv() {
this.selInvVisible = true;
},
},
created() {
console.log("监听变化。,,,,,,,,,,,,,,,,,,,,,,,,,,,");
this.getBreadcrumb();
this.getCompanyData();
this.getStorage();
this.findSubInvByInv();
this.getUserInfo();
socket.init(this)
axios.get("./config.json").then(res => {
// 基础地址
this.hospitalName = res.data.hosp_name;
});
},
watch: {
$route() {
this.getBreadcrumb();
},
'$store.state.admin.userName'() {
this.getUserInfo();
}
},
};
</script>
<style type="text/scss" lang="scss">
@import "../../styles/mixin";
.el-header {
/*background-color: #eef1f6;*/
color: #333;
padding: 0 10px;
}
.el-aside {
color: #333;
}
.el-main {
position: relative;
padding: 0 10px 10px;
background-color: #fff;
margin-left: 7px;
margin-top: 5px;
}
.main-mask {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 200%;
z-index: 100;
background-color: #000;
opacity: 0.3;
}
.move-enter-active,
.move-leave-active {
transition: opacity 0.5s;
}
.move-enter,
.move-leave {
opacity: 0;
}
.wrapper {
height: 100%;
overflow-y: hidden;
background-color: #f5f7f9;
}
.container-box {
height: 100%;
transition: -webkit-transform 0.3s ease-in-out;
transition: transform 0.3s ease-in-out, -webkit-transform 0.3s ease-in-out;
overflow-y: auto;
}
.container-left {
background-color: #f5f5f5;
transition: left 0.23s ease-in-out;
height: 100%;
flex: 0 0 auto;
}
.container-left-wrap {
overflow-x: hidden !important;
}
.container-left .svg-icon {
font-size: 20px;
margin-right: 5px;
}
.container-left:not(.slide-hide) {
width: 200px;
}
.container-left.slide-hide {
.logo img {
display: none;
}
.logo span {
display: inline-block;
}
}
.menu {
width: 100% !important;
}
/*.menu::-webkit-scrollbar{*/
/*display: none;*/
/*}*/
.header {
position: relative;
text-align: left;
font-size: 12px;
line-height: $header-height;
border-bottom: 1px solid #d8dce5;
background-color: #fff;
}
.logo {
display: block;
width: 100%;
line-height: 80px;
text-align: center;
color: #fff;
transition: display 0.7s ease-in-out;
img {
vertical-align: middle;
}
span {
display: none;
}
}
.header-left {
display: inline-block;
height: $header-height;
overflow: hidden;
}
.header-tabs-box {
display: inline-block;
height: $header-height;
max-width: 60%;
overflow: hidden;
}
.header-right {
display: flex;
height: 100%;
margin-left: 10px;
float: right;
.el-dropdown {
display: flex;
cursor: pointer;
}
span {
display: inline-block;
@include text-overflow;
}
i {
line-height: $header-height;
margin-top: 2px;
}
}
.app-levelbar {
margin-left: 20px;
line-height: 57px !important;
}
/**/
.slide-toggle {
display: inline-block;
height: $header-height;
line-height: $header-height;
text-align: center;
cursor: pointer;
}
.slide-toggle span {
display: inline-block;
width: 2px;
height: 12px;
background-color: rgba(135, 141, 153, 0.8);
margin-left: 5px;
}
.slide-toggle-open span {
display: block;
margin-left: 4px;
margin-top: 4px;
width: 16px;
height: 2px;
}
.slide-toggle-open {
padding-top: 17px;
}
@media screen and (min-width: 768px) {
.main-mask {
display: none;
}
}
/*.slide-hide {*/
/*width: 64px !important;*/
/*}*/
@media screen and (max-width: 768px) {
.main {
overflow-y: scroll !important;
-webkit-overflow-scrolling: touch;
}
.slide-hide.slide-in-left {
-webkit-transform: translate3d(64px, 0, 0) !important;
transform: translate3d(64px, 0, 0) !important;
}
.container-left.slide-hide.slide-in-left {
left: -64px;
width: 64px;
}
.container-left.slide-in-left {
left: 0;
}
.container-left {
margin-right: 0;
opacity: 1;
position: absolute !important;
top: 0;
left: -225px;
z-index: 10;
padding: 0;
}
.container-box.slide-in-left {
min-width: 0;
opacity: 1;
-webkit-transform: translate3d(187px, 0, 0);
transform: translate3d(187px, 0, 0);
overflow: initial;
}
.header-toggle {
display: block;
/*background-color: #26a2ff;*/
border-radius: 4px;
/*border: 1px solid #fff;*/
height: 40px;
margin: 10px 0;
padding: 2px 6px;
outline: none;
width: 40px;
z-index: 10;
}
.header-toggle span {
display: block;
width: 100%;
height: 4px;
margin: 5px auto;
background-color: rgba(135, 141, 153, 0.8);
}
.logo {
display: none;
}
.slide-toggle {
display: none;
}
}
</style>