You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

563 lines
16 KiB

8 months ago
7 months ago
8 months ago
3 months ago
8 months ago
8 months ago
8 months ago
8 months ago
7 months ago
8 months ago
8 months ago
8 months ago
3 months ago
8 months ago
  1. <template>
  2. <nav class="site-navbar" :class="'site-navbar--' + navbarLayoutType">
  3. <div class="site-navbar__header">
  4. <!-- @click="$router.push({ name: 'home' })"-->
  5. <h1 class="site-navbar__brand">
  6. <el-menu
  7. class="site-navbar__menu"
  8. mode="horizontal">
  9. <el-menu-item class="site-navbar__switch" index="0" @click="sidebarFold = !sidebarFold">
  10. <icon-svg name="zhedie"></icon-svg>
  11. </el-menu-item>
  12. </el-menu>
  13. <a class="site-navbar__brand-lg" href="javascript:;">WMS</a>
  14. <a class="site-navbar__brand-mini" href="javascript:;">{{ pageLanguage.abbreviation }}</a>
  15. </h1>
  16. </div>
  17. <div class="site-navbar__body clearfix">
  18. <el-menu
  19. class="site-navbar__menu site-navbar__menu--right"
  20. mode="horizontal">
  21. <el-menu-item class="site-navbar__factory" index="0.5" v-if="siteList.length > 0">
  22. <div class="factory-selector">
  23. <i class="el-icon-office-building factory-icon"></i>
  24. <el-select
  25. v-model="selectedSite"
  26. @change="handleSiteChange"
  27. placeholder="选择工厂"
  28. class="factory-select"
  29. popper-class="factory-select-dropdown"
  30. size="small">
  31. <el-option
  32. v-for="item in siteList"
  33. :key="item.siteCode"
  34. :label="item.siteName"
  35. :value="item.siteCode">
  36. </el-option>
  37. </el-select>
  38. </div>
  39. </el-menu-item>
  40. <el-menu-item class="site-navbar__avatar" index="1">
  41. <span class="el-dropdown-link" @click="userSetting">
  42. <icon-svg name="editTable" style="width: 25px;height: 25px;margin-top: 5px"></icon-svg>
  43. </span>
  44. </el-menu-item>
  45. <el-menu-item v-if="isAuth('review:show')" class="site-navbar__avatar" index="1">
  46. <span class="el-dropdown-link">
  47. <router-link :to="{path:'purchaseorder-procurementReview',query:{'': ''}}">
  48. 工具待审核
  49. </router-link>
  50. <el-badge isAuth :value="pending.pendingReview" class="item" style="margin-top: 10px"/>
  51. </span>
  52. </el-menu-item>
  53. <el-menu-item class="site-navbar__avatar" index="2">
  54. <span style=" color: #909399;" @click="helpFileList()">
  55. 帮助
  56. <!-- <icon-svg name="help" style="width: 25px;height: 25px;margin-top: 5px"></icon-svg>-->
  57. </span>
  58. </el-menu-item>
  59. <el-submenu index="3">
  60. <template slot="title">{{ pageLanguage.setting }}</template>
  61. <el-submenu index="2-1">
  62. <template slot="title">{{ pageLanguage.languageSetting }}</template>
  63. <el-menu-item index="2-1-1" :key="index" :value="item.languageCode" v-for="(item,index) in languageList "
  64. @click.native="switch_the_language(item.languageCode)">{{ item.languageName }}
  65. </el-menu-item>
  66. </el-submenu>
  67. <el-submenu index="2-2">
  68. <template slot="title">{{ pageLanguage.userSetting }}</template>
  69. <el-menu-item index="2-2-1" @click.native="updatePasswordHandle()">{{ pageLanguage.updatePassword }}
  70. </el-menu-item>
  71. <el-menu-item index="2-2-2" @click.native="updateLanguageHandle()">{{ pageLanguage.updateDefaultLanguage }}
  72. </el-menu-item>
  73. </el-submenu>
  74. <el-menu-item index="2-3" @click="$router.push({ name: 'theme' })">{{ pageLanguage.cssSetting }}
  75. </el-menu-item>
  76. <el-menu-item index="2-4" @click="printList()">{{ pageLanguage.printSetting }}</el-menu-item>
  77. </el-submenu>
  78. <el-menu-item class="site-navbar__avatar" index="4">
  79. <el-dropdown :show-timeout="0" placement="bottom">
  80. <span class="el-dropdown-link">
  81. <img src="~@/assets/img/ccl.png" :alt="userName">{{ userName }}
  82. </span>
  83. <el-dropdown-menu slot="dropdown">
  84. <el-dropdown-item @click.native="logoutHandle()">退出</el-dropdown-item>
  85. </el-dropdown-menu>
  86. </el-dropdown>
  87. </el-menu-item>
  88. </el-menu>
  89. </div>
  90. <!-- 弹窗, 修改密码 -->
  91. <update-password v-if="updatePassowrdVisible" ref="updatePassowrd"></update-password>
  92. <!-- 弹窗, 修改默认语言 -->
  93. <update-language v-if="updateLanguageVisible" ref="updateLanguage"></update-language>
  94. <!-- 文件列表 -->
  95. <FileListView ref="fileListView" v-if="helpFileVisible"></FileListView>
  96. <!-- 打印机列表 -->
  97. <UserPrintList ref="userPrintList" v-if="printListVisible"></UserPrintList>
  98. <!-- 动态列 -->
  99. <column v-if="visible" ref="column" @refreshData="getTableUserColumn" v-drag></column>
  100. </nav>
  101. </template>
  102. <script>
  103. import UpdatePassword from './main-navbar-update-password'
  104. import UpdateLanguage from './main-navbar-update-language'
  105. import {clearLoginInfo} from '@/utils'
  106. import FileListView from './modules/common/file-list-view'
  107. import UserPrintList from './modules/common/user-print-list'
  108. import column from "./modules/common/column";
  109. import {
  110. searchFunctionButtonList,
  111. saveButtonList,
  112. searchSysLanguage,
  113. } from "@/api/sysLanguage.js"
  114. import {getUserAuthorizedSites} from '@/api/factory/accessSite.js'
  115. export default {
  116. inject: ['refresh'],
  117. data() {
  118. return {
  119. visible: false,
  120. updatePassowrdVisible: false,
  121. updateLanguageVisible: false,
  122. helpFileVisible: false,
  123. printListVisible: false,
  124. message: this.$t('language.name'),
  125. languageList: [],
  126. siteList: [],
  127. selectedSite: '',
  128. pageLanguage: {
  129. XjSysManage: '旭捷管理系统',
  130. abbreviation: '旭捷',
  131. setting: '设置',
  132. languageSetting: '语言设置',
  133. userSetting: '用户设置',
  134. updatePassword: '修改密码',
  135. updateDefaultLanguage: '修改默认语言',
  136. cssSetting: '主提设置',
  137. printSetting: '打印设置',
  138. },
  139. // 导出 end
  140. pageLanguageList: [
  141. {
  142. functionId: "systemInformation",
  143. languageValue: '旭捷管理系统',
  144. objectId: 'XjSysManage',
  145. objectType: "label",
  146. tableId: "systemInformation"
  147. },
  148. {
  149. functionId: "systemInformation",
  150. languageValue: '首页',
  151. objectId: 'homePage',
  152. objectType: "label",
  153. tableId: "systemInformation"
  154. },
  155. {
  156. functionId: "systemInformation",
  157. languageValue: '旭捷',
  158. objectId: 'abbreviation',
  159. objectType: "label",
  160. tableId: "systemInformation"
  161. },
  162. {
  163. functionId: "systemInformation",
  164. languageValue: '设置',
  165. objectId: 'setting',
  166. objectType: "label",
  167. tableId: "systemInformation"
  168. },
  169. {
  170. functionId: "systemInformation",
  171. languageValue: '语言设置',
  172. objectId: 'languageSetting',
  173. objectType: "label",
  174. tableId: "systemInformation"
  175. },
  176. {
  177. functionId: "systemInformation",
  178. languageValue: '用户设置',
  179. objectId: 'userSetting',
  180. objectType: "label",
  181. tableId: "systemInformation"
  182. },
  183. {
  184. functionId: "systemInformation",
  185. languageValue: '修改密码',
  186. objectId: 'updatePassword',
  187. objectType: "label",
  188. tableId: "systemInformation"
  189. },
  190. {
  191. functionId: "systemInformation",
  192. languageValue: '修改用户语言',
  193. objectId: 'updateDefaultLanguage',
  194. objectType: "label",
  195. tableId: "systemInformation"
  196. },
  197. {
  198. functionId: "systemInformation",
  199. languageValue: '主题设置',
  200. objectId: 'cssSetting',
  201. objectType: "label",
  202. tableId: "systemInformation"
  203. },
  204. {
  205. functionId: "systemInformation",
  206. languageValue: '打印设置',
  207. objectId: 'printSetting',
  208. objectType: "label",
  209. tableId: "systemInformation"
  210. }
  211. ],
  212. pending: {
  213. pendingReview: 0,
  214. pendingSum: 0,
  215. },
  216. queryToolReview: {
  217. site: this.$store.state.user.site,
  218. userId: this.$store.state.user.name,
  219. strUserId: this.$store.state.user.id,
  220. },
  221. toolReviewTimer: null,
  222. }
  223. },
  224. watch: {
  225. pending: {
  226. deep: true,
  227. handler: function (newV, oldV) {
  228. this.pending.pendingSum = this.pending.pendingReview
  229. }
  230. },
  231. },
  232. components: {
  233. UpdatePassword,
  234. UpdateLanguage,
  235. FileListView,
  236. UserPrintList,
  237. column,
  238. },
  239. computed: {
  240. navbarLayoutType: {
  241. get() {
  242. return this.$store.state.common.navbarLayoutType
  243. }
  244. },
  245. sidebarFold: {
  246. get() {
  247. return this.$store.state.common.sidebarFold
  248. },
  249. set(val) {
  250. this.$store.commit('common/updateSidebarFold', val)
  251. }
  252. },
  253. mainTabs: {
  254. get() {
  255. return this.$store.state.common.mainTabs
  256. },
  257. set(val) {
  258. this.$store.commit('common/updateMainTabs', val)
  259. }
  260. },
  261. userName: {
  262. get() {
  263. return this.$store.state.user.userDisplay
  264. }
  265. }
  266. },
  267. activated() {
  268. },
  269. mounted() {
  270. },
  271. beforeDestroy() {
  272. clearInterval(this.toolReviewTimer);
  273. },
  274. methods: {
  275. // 打开页面设置
  276. userSetting() {
  277. this.visible = true;
  278. let queryTable = {
  279. userId: this.$store.state.user.name,
  280. functionId: this.$route.meta.menuId,
  281. languageCode: this.$i18n.locale,
  282. tableId: '',
  283. }
  284. this.$nextTick(() => {
  285. this.$refs.column.init(queryTable);
  286. })
  287. },
  288. getTableUserColumn() {
  289. this.$nextTick(() => {
  290. this.refresh()
  291. })
  292. },
  293. // 打印机列表
  294. printList() {
  295. this.printListVisible = true;
  296. this.$nextTick(() => {
  297. this.$refs.userPrintList.init()
  298. })
  299. },
  300. // 帮助文档列表
  301. helpFileList() {
  302. let fileMappingDto = {
  303. fileId: '',
  304. fileType: '功能帮助文档',
  305. orderRef1: this.$route.meta.menuId,
  306. orderRef2: '',
  307. orderRef3: '',
  308. }
  309. this.helpFileVisible = true;
  310. this.$nextTick(() => {
  311. this.$refs.fileListView.init(fileMappingDto)
  312. })
  313. },
  314. // 获取多语言列表
  315. getLanguageList() {
  316. searchSysLanguage({languageCode: this.$i18n.locale}).then(({data}) => {
  317. this.languageList = data.rows
  318. })
  319. },
  320. // 获取页面多语言数据
  321. getFunctionButtonList() {
  322. let queryButton = {
  323. functionId: 'systemInformation',
  324. tableId: 'systemInformation',
  325. languageCode: this.$i18n.locale,
  326. objectType: 'label'
  327. }
  328. searchFunctionButtonList(queryButton).then(({data}) => {
  329. if (data.code === 0) {
  330. this.pageLanguage = data.data
  331. }
  332. })
  333. },
  334. // 注3:增加语言切换函数
  335. switch_the_language(val) {
  336. localStorage.setItem('locale', val)
  337. this.$i18n.locale = val; // 修改当前语言
  338. location.reload()
  339. },
  340. // 修改密码
  341. updatePasswordHandle() {
  342. this.updatePassowrdVisible = true
  343. this.$nextTick(() => {
  344. this.$refs.updatePassowrd.init()
  345. })
  346. },
  347. // 修改用户默认语言
  348. updateLanguageHandle() {
  349. this.updateLanguageVisible = true
  350. this.$nextTick(() => {
  351. this.$refs.updateLanguage.init()
  352. })
  353. },
  354. // 退出
  355. logoutHandle() {
  356. this.$confirm(`确定进行[退出]操作?`, '提示', {
  357. confirmButtonText: '确定',
  358. cancelButtonText: '取消',
  359. type: 'warning'
  360. }).then(() => {
  361. this.$http({
  362. url: this.$http.adornUrl('/sys/logout'),
  363. method: 'post',
  364. data: this.$http.adornData()
  365. }).then(({data}) => {
  366. if (data && data.code === 0) {
  367. clearLoginInfo()
  368. this.$router.push({name: 'login'})
  369. }
  370. })
  371. }).catch(() => {
  372. })
  373. },
  374. // 初始化工厂选择
  375. initSiteSelection() {
  376. // 从localStorage获取当前选择的工厂
  377. this.selectedSite = localStorage.getItem('site') || '';
  378. // 获取当前用户的工厂列表
  379. const userName = localStorage.getItem('userName');
  380. if (userName) {
  381. this.getUserSiteList(userName);
  382. }
  383. },
  384. // 获取用户授权的工厂列表
  385. getUserSiteList(userName) {
  386. if (!userName || !userName.trim()) {
  387. this.siteList = [];
  388. return;
  389. }
  390. getUserAuthorizedSites({ userName: userName.trim() }).then(({data}) => {
  391. if (data && data.code === 0) {
  392. this.siteList = data.data || data.list || [];
  393. // 如果当前选择的工厂不在列表中,清空选择
  394. if (this.selectedSite && !this.siteList.find(site => site.siteCode === this.selectedSite)) {
  395. this.selectedSite = '';
  396. localStorage.removeItem('site');
  397. }
  398. // 如果没有选择工厂但有工厂列表,选择第一个
  399. if (!this.selectedSite && this.siteList.length > 0) {
  400. this.selectedSite = this.siteList[0].siteCode;
  401. localStorage.setItem('site', this.selectedSite);
  402. }
  403. } else {
  404. this.siteList = [];
  405. console.error('获取工厂列表失败:', data.msg);
  406. }
  407. }).catch(error => {
  408. this.siteList = [];
  409. console.error('获取工厂列表失败:', error);
  410. })
  411. },
  412. // 工厂选择变更处理
  413. handleSiteChange(siteCode) {
  414. const selectedSite = this.siteList.find(site => site.siteCode === siteCode);
  415. const siteName = selectedSite ? selectedSite.siteName : siteCode;
  416. localStorage.setItem('site', siteCode);
  417. this.$message({
  418. message: `已切换到工厂:${siteName}`,
  419. type: 'success',
  420. duration: 2000,
  421. showClose: true
  422. });
  423. // 添加切换动画效果
  424. const factorySelect = document.querySelector('.factory-select');
  425. if (factorySelect) {
  426. factorySelect.style.transform = 'scale(1.05)';
  427. setTimeout(() => {
  428. factorySelect.style.transform = 'scale(1)';
  429. }, 200);
  430. }
  431. }
  432. },
  433. created() {
  434. this.getLanguageList()
  435. this.getFunctionButtonList()
  436. this.initSiteSelection()
  437. }
  438. }
  439. </script>
  440. <style lang="scss">
  441. .icon-svg {
  442. width: 2em;
  443. }
  444. .el-menu--collapse .el-menu .el-submenu, .el-menu--popup, .el-menu-item {
  445. min-width: 50px !important;
  446. }
  447. .site-navbar__brand-lg, .site-navbar__brand-mini {
  448. margin: 0 5px;
  449. color: #fff;
  450. margin-left: -45px;
  451. }
  452. // 工厂选择器样式
  453. .site-navbar__factory {
  454. padding: 0 15px !important;
  455. .factory-selector {
  456. display: flex;
  457. align-items: center;
  458. gap: 8px;
  459. .factory-icon {
  460. color: #409EFF;
  461. font-size: 16px;
  462. margin-right: 4px;
  463. }
  464. .factory-select {
  465. width: 140px;
  466. transition: transform 0.2s ease;
  467. .el-input__inner {
  468. background: rgba(64, 158, 255, 0.1);
  469. border: 1px solid rgba(64, 158, 255, 0.3);
  470. border-radius: 20px;
  471. color: #409EFF;
  472. font-size: 13px;
  473. height: 32px;
  474. line-height: 32px;
  475. transition: all 0.3s ease;
  476. &:hover {
  477. background: rgba(64, 158, 255, 0.15);
  478. border-color: #409EFF;
  479. box-shadow: 0 2px 8px rgba(64, 158, 255, 0.2);
  480. }
  481. &:focus {
  482. background: rgba(64, 158, 255, 0.1);
  483. border-color: #409EFF;
  484. box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.2);
  485. }
  486. }
  487. .el-input__suffix {
  488. .el-input__suffix-inner {
  489. .el-select__caret {
  490. color: #409EFF;
  491. transition: transform 0.3s ease;
  492. }
  493. }
  494. }
  495. &.is-focus {
  496. .el-input__suffix-inner .el-select__caret {
  497. transform: rotateZ(180deg);
  498. }
  499. }
  500. }
  501. }
  502. &:hover {
  503. background-color: rgba(64, 158, 255, 0.05) !important;
  504. }
  505. }
  506. // 工厂选择下拉选项样式 - 使用popper-class限制作用域,避免影响全局下拉框
  507. .factory-select-dropdown {
  508. .el-select-dropdown__item {
  509. &:hover {
  510. background-color: rgba(64, 158, 255, 0.1);
  511. color: #409EFF;
  512. }
  513. &.selected {
  514. background-color: #409EFF;
  515. color: #fff;
  516. font-weight: 500;
  517. &::after {
  518. content: '✓';
  519. position: absolute;
  520. right: 15px;
  521. font-weight: bold;
  522. }
  523. }
  524. }
  525. }
  526. .el-menu--horizontal > .el-menu-item {
  527. color: #3b4249;
  528. }
  529. </style>