yanyan 1 month ago
parent
commit
5bb4d503dd
  1. 7
      src/api/factory/accessDept.js
  2. 2
      src/api/srm/srmSupplier.js
  3. 327
      src/views/common/home.vue
  4. 32
      src/views/modules/srmSupplier/supplierContractRequest.vue
  5. 44
      src/views/modules/srmSupplier/supplierList.vue
  6. 476
      src/views/modules/sys/department.vue
  7. 149
      src/views/modules/sys/user.vue

7
src/api/factory/accessDept.js

@ -0,0 +1,7 @@
import { createAPI } from '@/utils/httpRequest.js'
export const listAccessDeptMembers = data => createAPI('/site/accessDept/listMembers', 'post', data)
export const saveAccessDeptMember = data => createAPI('/site/accessDept/saveMember', 'post', data)
export const updateAccessDeptMember = data => createAPI('/site/accessDept/updateMember', 'post', data)
export const deleteAccessDeptMember = data => createAPI('/site/accessDept/deleteMember', 'post', data)
export const listAccessDeptByUsername = data => createAPI('/site/accessDept/listByUsername', 'post', data)

2
src/api/srm/srmSupplier.js

@ -2,6 +2,8 @@ import { createAPI } from '@/utils/httpRequest.js'
export const searchSrmSupplierList = data => createAPI('/srmSupplier/searchSrmSupplierList', 'POST', data)
export const supplierDocExpireReminder = data => createAPI('/srmSupplier/supplierDocExpireReminder', 'POST', data || {})
export const supplierContractRequestExpireReminder = data => createAPI('/srmSupplier/supplierContractRequestExpireReminder', 'POST', data || {})
export const searchSupplierGroupRequestList = data => createAPI('/srmSupplier/searchSupplierGroupRequestList', 'POST', data)
export const getSupplierGroupRequestList = data => createAPI('/srmSupplier/getSupplierGroupRequestList', 'POST', data)
export const createNewSupplierRequest = data => createAPI('/srmSupplier/createNewSupplierRequest', 'POST', data)

327
src/views/common/home.vue

@ -1,33 +1,97 @@
<template>
<div class="mod-home">
<div v-if="appName==='CKP'" style="width: 100%;height: 100%">
<iframe frameborder="0" style="width: 100%;height: 100%" :src="url"> </iframe>
<div
class="mod-home mod-home--tech"
:class="{ 'mod-home--pulse-off': !homeCardPulseEnabled }">
<div class="tech-backdrop">
<div class="tech-frame">
<header class="tech-header tech-header--simple">
<h1 class="tech-header__title">代办清单</h1>
</header>
<div class="home-reminders">
<div
v-show="homeTileShow.supplierDocExpire"
class="home-reminder-card tech-card"
:class="{ 'is-clickable': docExpireReminderCount > 0, 'tech-card--active': docExpireReminderCount > 0 }"
@click="onDocCardClick">
<div class="tech-card__grid" aria-hidden="true"></div>
<div class="home-reminder-card__title">Supplier Document Upload</div>
<div class="home-reminder-card__count">{{ docExpireReminderCount }}</div>
<div class="home-reminder-card__hint">{{ docExpireReminderCount > 0 ? 'Jump to supplier list' : 'Null' }}</div>
</div>
<div
v-show="homeTileShow.contractRequestExpire"
class="home-reminder-card tech-card"
:class="{ 'is-clickable': contractExpireReminderCount > 0, 'tech-card--active': contractExpireReminderCount > 0 }"
@click="onContractCardClick">
<div class="tech-card__grid" aria-hidden="true"></div>
<div class="home-reminder-card__title">Supplier Contract Renew Request</div>
<div class="home-reminder-card__count">{{ contractExpireReminderCount }}</div>
<div class="home-reminder-card__hint">{{ contractExpireReminderCount > 0 ? 'Jump to Renew Request' : 'Null' }}</div>
</div>
</div>
</div>
<div v-else>
<h3>旭捷</h3>
<ul>
<li><h3>欢迎: {{ userName }}!!!</h3></li>
</ul>
</div>
</div>
</template>
<script>
import {searchSysLanguagePack} from "../../api/sysLanguage";
import { supplierDocExpireReminder, supplierContractRequestExpireReminder } from '@/api/srm/srmSupplier.js'
export default {
data(){
return {
// url:"http://xujiesoft.vicp.net:9191/bi/Show?uid=be15368c-bceb-11ef-9785-000c29f2c2b8",
//url:"http://192.168.1.90:9191/chart/reportShow?uid=3c800188-b04b-11ef-abf0-000c2947c1cd",
url:"http://172.26.68.20:9191/bi/Show?uid=eefa66f1-b058-11ef-a145-3868dd5b136a",
appName:this.$store.state.common.appName,
docExpireReminderCount: 0,
docExpireReminderIds: [],
contractExpireReminderCount: 0,
contractExpireReminderIds: [],
homeTileShow: {
supplierDocExpire: true,
contractRequestExpire: true,
},
/** 代办卡片悬停外圈脉冲(双环);false 时无任何脉冲描边 */
homeCardPulseEnabled: false,
}
},
methods: {
onDocCardClick () {
this.goSupplierDocExpireList()
},
onContractCardClick () {
this.goContractRequestExpireList()
},
loadDocExpireReminder () {
const site = this.$store.state.user.site
supplierDocExpireReminder({ site }).then(({ data }) => {
if (data && data.code === 0 && data.data) {
this.docExpireReminderCount = data.data.count != null ? data.data.count : 0
this.docExpireReminderIds = Array.isArray(data.data.supplierIds) ? data.data.supplierIds : []
}
}).catch(() => {})
},
goSupplierDocExpireList () {
if (!this.docExpireReminderCount) return
const ids = this.docExpireReminderIds.join(',')
if (!ids) return
this.$router.push({ name: 'srmSupplier-supplierList', query: { docExpireSupplierIds: ids } })
},
loadContractExpireReminder () {
const site = this.$store.state.user.site
supplierContractRequestExpireReminder({ site }).then(({ data }) => {
if (data && data.code === 0 && data.data) {
this.contractExpireReminderCount = data.data.count != null ? data.data.count : 0
this.contractExpireReminderIds = Array.isArray(data.data.contractRequestIds) ? data.data.contractRequestIds : []
}
}).catch(() => {})
},
goContractRequestExpireList () {
if (!this.contractExpireReminderCount) return
const ids = this.contractExpireReminderIds.join(',')
if (!ids) return
this.$router.push({ name: 'srmSupplier-supplierContractRequest', query: { contractExpireRequestIds: ids } })
},
languageRefresh(){
console.log("欢迎使用 旭捷管理系统!!!")
},
@ -57,14 +121,243 @@
this.languageRefresh()
this.languagePack()
},
mounted () {
if (this.homeTileShow.supplierDocExpire) {
this.loadDocExpireReminder()
}
if (this.homeTileShow.contractRequestExpire) {
this.loadContractExpireReminder()
}
},
watch: {
'homeTileShow.supplierDocExpire'(v) {
if (v) {
this.loadDocExpireReminder()
}
},
'homeTileShow.contractRequestExpire'(v) {
if (v) {
this.loadContractExpireReminder()
}
}
},
}
</script>
<style>
.mod-home {
<style scoped>
/* ---------- 浅色简约首页 ---------- */
.mod-home--tech {
--tech-border-hover: #38bdf8;
--home-count-color: #ff0000;
--home-count-muted: #94a3b8;
--card-pulse-opacity-peak: 0.92;
--card-pulse-border: rgba(14, 165, 233, 0.88);
--card-pulse-border-mid: rgba(14, 165, 233, 0.72);
--card-pulse-glow: 0 0 20px rgba(56, 189, 248, 0.48);
line-height: 1.5;
height: 91vh;
width: 100%;
box-sizing: border-box;
position: relative;
overflow: hidden;
font-family: 'Segoe UI', 'Microsoft YaHei', 'PingFang SC', system-ui, sans-serif;
color: #475569;
}
.mod-home--tech.mod-home--pulse-off .tech-card::before,
.mod-home--tech.mod-home--pulse-off .tech-card::after {
display: none;
}
.tech-backdrop {
min-height: 100%;
position: relative;
padding: 28px 22px 36px;
box-sizing: border-box;
background: #fff;
}
.tech-frame {
position: relative;
z-index: 3;
max-width: 1180px;
margin: 0 auto;
padding: 0;
border-radius: 0;
background: transparent;
box-shadow: none;
}
.tech-header--simple {
margin: 0 0 22px 0;
padding: 0 0 12px 0;
text-align: left;
position: relative;
}
.tech-header--simple::after {
content: '';
position: absolute;
left: 0;
bottom: 0;
width: 120px;
height: 2px;
border-radius: 2px;
background: linear-gradient(90deg, #0ea5e9, #6366f1, transparent);
opacity: 0.88;
box-shadow: 0 0 14px rgba(14, 165, 233, 0.35);
}
</style>
.tech-header__title {
margin: 0;
font-size: 20px;
font-weight: 700;
letter-spacing: 0.2em;
line-height: 1.35;
color: #334155;
}
.home-reminders {
padding: 12px 10px 8px;
display: flex;
flex-wrap: wrap;
gap: 22px;
align-items: stretch;
justify-content: flex-start;
}
.home-reminder-card.tech-card {
width: calc(100% / 6);
min-width: 168px;
box-sizing: border-box;
padding: 22px 16px 20px;
text-align: center;
position: relative;
overflow: visible;
border-radius: 12px;
border: 1px solid #e2e8f0;
background: linear-gradient(165deg, #ffffff 0%, #fafbfc 52%, #f8fafc 100%);
box-shadow:
0 1px 2px rgba(15, 23, 42, 0.04),
0 4px 16px rgba(15, 23, 42, 0.06);
color: #334155;
transition:
transform 0.22s ease,
box-shadow 0.22s ease,
border-color 0.28s ease;
}
.tech-card::before,
.tech-card::after {
content: '';
position: absolute;
left: 50%;
top: 50%;
width: 100%;
height: 100%;
border-radius: inherit;
border: 2px solid var(--card-pulse-border-mid);
opacity: 0;
pointer-events: none;
z-index: 1;
transform: translate(-50%, -50%) scale(1);
box-sizing: border-box;
box-shadow: var(--card-pulse-glow);
}
.tech-card:hover::before {
animation: card-hover-ripple 1.45s ease-out infinite;
}
.tech-card:hover::after {
animation: card-hover-ripple 1.45s ease-out 0.48s infinite;
}
@keyframes card-hover-ripple {
0% {
transform: translate(-50%, -50%) scale(0.88);
opacity: var(--card-pulse-opacity-peak);
border-color: var(--card-pulse-border);
}
100% {
transform: translate(-50%, -50%) scale(1.28);
opacity: 0;
border-color: rgba(56, 189, 248, 0);
}
}
.tech-card__grid {
position: absolute;
inset: 0;
z-index: 0;
border-radius: inherit;
opacity: 0.35;
background-image:
linear-gradient(rgba(148, 163, 184, 0.12) 1px, transparent 1px),
linear-gradient(90deg, rgba(148, 163, 184, 0.08) 1px, transparent 1px);
background-size: 18px 18px;
pointer-events: none;
}
.tech-card--active {
border-color: rgba(14, 165, 233, 0.42);
box-shadow:
0 0 0 1px rgba(56, 189, 248, 0.12),
0 6px 20px rgba(15, 23, 42, 0.08),
0 0 20px rgba(14, 165, 233, 0.08);
}
.home-reminder-card.is-clickable {
cursor: pointer;
}
.tech-card.is-clickable:hover {
transform: translateY(-4px);
border-color: var(--tech-border-hover);
box-shadow:
0 0 0 1px rgba(56, 189, 248, 0.2),
0 8px 28px rgba(15, 23, 42, 0.08),
0 0 32px rgba(56, 189, 248, 0.12);
}
.home-reminder-card__title {
position: relative;
z-index: 3;
font-size: 14px;
font-weight: 600;
color: #334155;
line-height: 1.45;
}
.home-reminder-card__count {
position: relative;
z-index: 3;
font-size: 36px;
font-weight: 800;
font-variant-numeric: tabular-nums;
margin-top: 14px;
line-height: 1;
color: var(--home-count-color);
}
.home-reminder-card:not(.tech-card--active) .home-reminder-card__count {
color: var(--home-count-muted);
}
.home-reminder-card__hint {
position: relative;
z-index: 3;
font-size: 11px;
margin-top: 12px;
color: #64748b;
letter-spacing: 0.06em;
opacity: 0.95;
}
.home-reminder-card__meta {
font-size: 12px;
color: #64748b;
margin-top: 6px;
}
</style>

32
src/views/modules/srmSupplier/supplierContractRequest.vue

@ -466,13 +466,35 @@ export default {
this.requestModelData.supplierNo = this.requestModelData.supplierNo.toUpperCase()
}
},
'$route.query.contractExpireRequestIds'(val, oldVal) {
if (val === oldVal) return
if (this._suppressContractExpireRouteWatch) {
this._suppressContractExpireRouteWatch = false
return
}
this.loadMainOrReminder()
}
},
mounted() {
this.$nextTick(() => {
this.height = window.innerHeight - 220;
this.loadMainOrReminder()
})
},
methods: {
loadMainOrReminder () {
const raw = this.$route.query.contractExpireRequestIds
if (raw !== undefined && raw !== null && String(raw).trim() !== '') {
const ids = String(raw).split(',').map(s => parseInt(s.trim(), 10)).filter(n => !isNaN(n))
if (ids.length) {
this.$set(this.searchData, 'contractRequestIdList', ids)
this.pageIndex = 1
this.getMainData({ clearReminderIdFilterAfter: true })
return
}
}
this.getMainData()
},
// S
getBaseList(val, type) {
this.tagNo = val
@ -505,7 +527,8 @@ export default {
}
}
},
getMainData(){
getMainData (opts) {
const clearReminderIdFilterAfter = opts && opts.clearReminderIdFilterAfter === true
this.searchData.limit = this.pageSize
this.searchData.page = this.pageIndex
getContractRequestList(this.searchData).then(({data}) => {
@ -514,6 +537,13 @@ export default {
this.pageIndex = data.page.currPage
this.pageSize = data.page.pageSize
this.totalPage = data.page.totalCount
if (clearReminderIdFilterAfter) {
this.$delete(this.searchData, 'contractRequestIdList')
const q = Object.assign({}, this.$route.query)
delete q.contractExpireRequestIds
this._suppressContractExpireRouteWatch = true
this.$router.replace({ name: this.$route.name, query: q, params: this.$route.params })
}
}
this.dataListLoading = false
})

44
src/views/modules/srmSupplier/supplierList.vue

@ -1099,9 +1099,33 @@ export default {
mounted () {
this.$nextTick(() => {
this.height = (window.innerHeight - 220) / 2
this.loadMainOrReminder()
})
},
watch: {
'$route.query.docExpireSupplierIds'(val, oldVal) {
if (val === oldVal) return
if (this._suppressDocExpireRouteWatch) {
this._suppressDocExpireRouteWatch = false
return
}
this.loadMainOrReminder()
}
},
methods: {
loadMainOrReminder () {
const raw = this.$route.query.docExpireSupplierIds
if (raw !== undefined && raw !== null && String(raw).trim() !== '') {
const ids = String(raw).split(',').map(s => parseInt(s.trim(), 10)).filter(n => !isNaN(n))
if (ids.length) {
this.$set(this.searchData, 'supplierIdList', ids)
this.pageIndex = 1
this.getMainData({ clearReminderIdFilterAfter: true })
return
}
}
this.getMainData()
},
getBaseList (val, type) {
this.tagNo = val
this.$nextTick(() => {
@ -1156,7 +1180,8 @@ export default {
this.currentSupplier.deliveryTerm = val.DeliveryTermID
}
},
getMainData () {
getMainData (opts) {
const clearReminderIdFilterAfter = opts && opts.clearReminderIdFilterAfter === true
this.searchData.limit = this.pageSize
this.searchData.page = this.pageIndex
searchSrmSupplierList(this.searchData).then(({data}) => {
@ -1165,14 +1190,31 @@ export default {
this.pageIndex = data.page.currPage
this.pageSize = data.page.pageSize
this.totalPage = data.page.totalCount
this.$nextTick(() => {
if (this.$refs.mainTable) {
this.$refs.mainTable.clearSelection()
}
this.mainTableSelections = []
})
if (clearReminderIdFilterAfter) {
this.activeName = 'documents'
}
//
if (this.mainDataList.length > 0) {
//
this.$refs.mainTable.setCurrentRow(this.mainDataList[0])
this.changeData(this.mainDataList[0])
}else {
this.changeData(null)
}
if (clearReminderIdFilterAfter) {
this.$delete(this.searchData, 'supplierIdList')
const q = Object.assign({}, this.$route.query)
delete q.docExpireSupplierIds
this._suppressDocExpireRouteWatch = true
this.$router.replace({ name: this.$route.name, query: q, params: this.$route.params })
}
}
this.dataListLoading = false
})

476
src/views/modules/sys/department.vue

@ -8,9 +8,9 @@
<el-form-item :label="'DepartmentName'">
<el-input v-model="searchData.departmentName" style="width: 120px"></el-input>
</el-form-item>
<el-form-item :label="'BU'">
<el-input v-model="searchData.buNo" style="width: 120px" placeholder="BU"></el-input>
</el-form-item>
<!-- <el-form-item :label="'BU'">-->
<!-- <el-input v-model="searchData.buNo" style="width: 120px" placeholder="BU"></el-input>-->
<!-- </el-form-item>-->
<el-form-item :label="' '">
<el-button v-if="!authSearch" @click="getDataList()">Query</el-button>
<el-button v-if="!authSave" type="primary" @click="addModal()">Add</el-button>
@ -32,10 +32,13 @@
</el-form>
<el-table
ref="deptMainTable"
@header-dragend="handleColumnResize"
:height="height"
:height="deptMainTableHeight"
:data="dataList"
border
highlight-current-row
@current-change="onMainDeptCurrentChange"
style="width: 100%;">
<el-table-column
v-for="(item,index) in columnList" :key="index"
@ -56,11 +59,18 @@
fixed="right"
header-align="center"
align="center"
width="100"
width="220"
label="Actions">
<template slot-scope="scope">
<a v-if="!authUpdate" type="text" size="small" @click="updateModal(scope.row)">Edit |</a>
<a v-if="!authDelete" type="text" size="small" @click="deleteDepartment(scope.row)">Delete</a>
<span v-if="!authUpdate">
<a type="text" size="small" @click="updateModal(scope.row)">Edit</a>
<span v-if="!authDelete || isAuth('sys:user:save')"> | </span>
</span>
<span v-if="!authDelete">
<a type="text" size="small" @click="deleteDepartment(scope.row)">Delete</a>
<span v-if="isAuth('sys:user:save')"> | </span>
</span>
<a v-if="isAuth('sys:user:save')" type="text" size="small" @click.stop="onAddMemberClick(scope.row)">Add Member</a>
</template>
</el-table-column>
</el-table>
@ -75,6 +85,83 @@
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
<div style="margin-top: 14px; font-size: 13px; font-weight: 600; color: #303133">部门成员</div>
<div v-if="currentDept" style="margin-top: 6px; font-size: 12px; color: #666">
<!-- 本项目不使用 BU不展示 buNo -->
当前部门{{ currentDept.site }} / {{ currentDept.departmentId }}
<span v-if="currentDept.departmentName"> {{ currentDept.departmentName }}</span>
</div>
<div v-else style="margin-top: 6px; font-size: 12px; color: #999">请在上方部门列表中点击一行或使用操作列新增成员选择部门</div>
<el-table
:height="memberTableHeight"
:data="memberList"
border
v-loading="memberLoading"
style="margin-top: 8px; width: 100%;">
<el-table-column
v-if="isAuth('sys:user:save')"
fixed="left"
header-align="center"
align="center"
width="130"
label="Actions">
<template slot-scope="scope">
<a type="text" size="small" @click="openEditMember(scope.row)">edit</a>
<a type="text" size="small" style="margin-left: 8px" @click="removeMember(scope.row)">delete</a>
</template>
</el-table-column>
<el-table-column prop="username" header-align="center" align="center" min-width="120" label="UserName"></el-table-column>
<el-table-column prop="jobTitle" header-align="center" align="left" min-width="120" label="Job Title" show-overflow-tooltip></el-table-column>
<el-table-column prop="deptManagerFlag" header-align="center" align="center" width="100" label="Dept Manager"></el-table-column>
<el-table-column prop="superiorUsername" header-align="center" align="center" min-width="120" label="Superior"></el-table-column>
</el-table>
<el-dialog
:title="memberDialogTitle"
:close-on-click-modal="false"
v-drag
:visible.sync="memberDialogVisible"
width="450px"
append-to-body>
<el-form :model="memberForm" label-position="top" size="small" style="margin-left: 7px; margin-top: -5px;">
<el-form-item v-if="memberFormMode === 'add'" required>
<span slot="label">
<a class="customer-a" @click.prevent="openMemberUserChooser">UserName</a>
</span>
<el-input v-model="memberForm.username" readonly placeholder="" style="width: 100%"></el-input>
</el-form-item>
<el-form-item v-else label="UserName">
<el-input v-model="memberForm.username" disabled style="width: 100%"></el-input>
</el-form-item>
<el-form-item label="Job Title">
<el-input v-model="memberForm.jobTitle" clearable style="width: 100%"></el-input>
</el-form-item>
<el-form-item label="Dept Manager">
<el-select v-model="memberForm.deptManagerFlag" placeholder="" style="width: 100%">
<el-option label="No" value="N"></el-option>
<el-option label="Yes" value="Y"></el-option>
</el-select>
</el-form-item>
<el-form-item label="Superior">
<el-select v-model="memberForm.superiorUsername" clearable filterable placeholder="Optional" style="width: 100%">
<el-option
v-for="u in superiorOptions"
:key="u"
:label="u"
:value="u">
</el-option>
</el-select>
</el-form-item>
</el-form>
<el-footer style="height:40px;margin-top: 15px;text-align:center">
<el-button type="primary" @click="submitMember">Save</el-button>
<el-button type="primary" @click="memberDialogVisible = false">Cancel</el-button>
</el-footer>
</el-dialog>
<choose-list-eam ref="memberBaseList" @getBaseData="getMemberBaseData"></choose-list-eam>
<el-dialog title="Department" :close-on-click-modal="false" v-drag :visible.sync="modalFlag" width="450px">
<el-form :inline="true" label-position="top" :model="modalData" :rules="rules" style="margin-left: 7px;margin-top: -5px;">
<el-form-item label="Department Id" prop="departmentId" :rules="rules.departmentIdType">
@ -85,13 +172,23 @@
</el-form-item>
</el-form>
<el-form :inline="true" label-position="top" :model="modalData" :rules="rules" style="margin-left: 7px;margin-top: 5px;">
<!-- Site -->
<!--
<el-form-item label="Site" prop="site" :rules="rules.siteType">
<el-input v-model="modalData.site" style="width: 140px"></el-input>
</el-form-item>
-->
<!-- 本项目不使用 BU保存时 buNo 固定为 *满足后端 site_buNo 解析 -->
<!--
<el-form-item label="BU" prop="bu" style="margin-left: 15px" :rules="rules.buType">
<el-input v-model="modalData.bu" style="width: 230px"></el-input>
<el-select v-model="modalData.bu" placeholder="请选择" :disabled="modalDisableFlag" style="width: 230px">
<el-option v-for="i in userBuList" :key="i.buNo" :label="i.buNo" :value="i.buNo"><span style="float:left;width:120px">{{ i.buNo }}</span>
<span style="float:right; color:#8492a6; font-size:11px; width:80px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis">{{ i.buDesc }}</span>
</el-option>
</el-select>
</el-form-item>
-->
</el-form>
<el-footer style="height:40px;margin-top: 15px;text-align:center">
<el-button type="primary" @click="saveData()">Save</el-button>
@ -109,13 +206,27 @@ import {
departmentSearch,
departmentDelete
} from "@/api/department.js"
import {
listAccessDeptMembers,
saveAccessDeptMember,
updateAccessDeptMember,
deleteAccessDeptMember
} from '@/api/factory/accessDept.js'
import { searchUserList } from '@/api/taskManage/task.js'
import { isAuth } from '@/utils'
// import { getSiteAndBuByUserName } from "@/api/auditManagement/auditIndicator.js"
import {getTableDefaultListLanguage, getTableUserListLanguage} from "@/api/table.js"
import {EventBus} from "../../../main";
import {updateColumnSize} from "../../../api/table";
import ChooseListEam from '@/views/modules/common/Chooselist_eam.vue'
export default {
components: {
ChooseListEam
},
watch: {
searchData: {
deep: true,
@ -128,10 +239,18 @@ export default {
handler: function (newV, oldV) {
this.modalData.departmentId = this.modalData.departmentId.toUpperCase()
}
},
memberDialogVisible (v) {
if (!v) {
this.memberPickerActive = false
}
}
},
data () {
return {
/** 本项目不使用 BU;新建部门保存时 buNo 传此占位,后端按 site + '_' + buNo 解析 */
departmentDefaultBuNo: '*',
userBuList: [],
//
favorite: false,
// start
@ -152,7 +271,21 @@ export default {
},
responsibleDepartmentList: [],
selectTypeFlag: [],
height: 200,
deptMainTableHeight: 220,
memberTableHeight: 260,
currentDept: null,
memberList: [],
memberLoading: false,
memberDialogVisible: false,
memberDialogTitle: '',
memberFormMode: 'add',
memberForm: {
username: '',
jobTitle: '',
deptManagerFlag: 'N',
superiorUsername: ''
},
memberPickerActive: false,
pageIndex: 1,
pageSize: 20,
totalPage: 0,
@ -209,42 +342,43 @@ export default {
fixed: '',
columnWidth: 120,
},
{
userId: this.$store.state.user.name,
functionId: 811020,
serialNumber: '811020Table1Site',
tableId: "811020Table1",
tableName: "部门管理表",
columnProp: 'site',
headerAlign: "center",
align: "left",
columnLabel: 'Site',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 140,
},
{
userId: this.$store.state.user.name,
functionId: 811020,
serialNumber: '811020Table1Bu',
tableId: "811020Table1",
tableName: "部门管理表",
columnProp: 'buNo',
headerAlign: "center",
align: "left",
columnLabel: 'BU',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 160,
},
// {
// userId: this.$store.state.user.name,
// functionId: 811020,
// serialNumber: '811020Table1Site',
// tableId: "811020Table1",
// tableName: "",
// columnProp: 'site',
// headerAlign: "center",
// align: "left",
// columnLabel: 'Site',
// columnHidden: false,
// columnImage: false,
// columnSortable: false,
// sortLv: 0,
// status: true,
// fixed: '',
// columnWidth: 140,
// },
// 使 BU
// {
// userId: this.$store.state.user.name,
// functionId: 811020,
// serialNumber: '811020Table1Bu',
// tableId: "811020Table1",
// tableName: "",
// columnProp: 'buNo',
// headerAlign: "center",
// align: "left",
// columnLabel: 'BU',
// columnHidden: false,
// columnImage: false,
// columnSortable: false,
// sortLv: 0,
// status: true,
// fixed: '',
// columnWidth: 160,
// },
{
userId: this.$store.state.user.name,
functionId: 811020,
@ -341,15 +475,14 @@ export default {
trigger: ['blur','change']
}
],
buType:[
{
required: true,
message: ' ',
trigger: ['blur','change']
}
],
// buType:[
// {
// required: true,
// message: ' ',
// trigger: ['blur','change']
// }
// ],
},
// userBuList: [],
authSearch: false,
authSave: false,
authUpdate: false,
@ -358,9 +491,23 @@ export default {
}
},
computed: {
superiorOptions () {
if (!this.memberList || !this.memberList.length) {
return []
}
const self = (this.memberForm.username || '').trim().toLowerCase()
return this.memberList
.map(r => r.username)
.filter(u => u && u.trim().toLowerCase() !== self)
}
},
mounted () {
this.$nextTick(() => {
this.height = window.innerHeight - 210
const h = window.innerHeight
this.deptMainTableHeight = Math.max(180, Math.floor(h * 0.32))
this.memberTableHeight = Math.max(200, Math.floor(h * 0.4))
})
},
@ -371,8 +518,9 @@ export default {
created () {
//
// this.getButtonAuthData()
// site bu
// 使 BU
// this.getSiteAndBuByUserName()
this.getDataList()
//
// this.getTableUserColumn(this.$route.meta.menuId+'table1',1)
@ -381,6 +529,195 @@ export default {
},
methods: {
isAuth,
clearDeptMemberSelection () {
this.currentDept = null
this.memberList = []
this.$nextTick(() => {
if (this.$refs.deptMainTable) {
this.$refs.deptMainTable.setCurrentRow(null)
}
})
},
onMainDeptCurrentChange (row) {
this.currentDept = row
this.memberList = []
if (row) {
this.loadMembers()
}
},
onAddMemberClick (row) {
this.currentDept = row
this.$nextTick(() => {
if (this.$refs.deptMainTable) {
this.$refs.deptMainTable.setCurrentRow(row)
}
this.loadMembers().then(() => {
this.openAddMember()
})
})
},
loadMembers () {
if (!this.currentDept) {
return Promise.resolve()
}
this.memberLoading = true
return listAccessDeptMembers({
site: this.currentDept.site,
buNo: this.currentDept.buNo,
departmentId: this.currentDept.departmentId
}).then(({ data }) => {
this.memberLoading = false
if (data && data.code === 0) {
this.memberList = data.list || []
} else {
this.memberList = []
if (data && data.msg) {
this.$message.error(data.msg)
}
}
}).catch(() => {
this.memberLoading = false
this.memberList = []
})
},
openAddMember () {
if (!this.currentDept) {
this.$message.warning('Please select a department first')
return
}
this.memberFormMode = 'add'
this.memberDialogTitle = 'Add Member'
this.memberForm = {
username: '',
jobTitle: '',
deptManagerFlag: 'N',
superiorUsername: ''
}
this.memberDialogVisible = true
},
openEditMember (row) {
if (!this.currentDept) return
this.memberFormMode = 'edit'
this.memberDialogTitle = 'Edit Member'
const dm = (row.deptManagerFlag || 'N').toString().toUpperCase()
this.memberForm = {
username: row.username,
jobTitle: row.jobTitle || '',
deptManagerFlag: dm === 'Y' ? 'Y' : 'N',
superiorUsername: row.superiorUsername || ''
}
this.memberDialogVisible = true
},
openMemberUserChooser () {
if (!this.currentDept || !this.currentDept.site) {
this.$message.warning('Please select a department first')
return
}
this.memberPickerActive = true
this.$nextTick(() => {
const strVal = (this.memberForm.username || '').trim()
if (this.$refs.memberBaseList) {
this.$refs.memberBaseList.init(519, strVal, '')
}
})
},
getMemberBaseData (val) {
if (!this.memberPickerActive) return
this.memberPickerActive = false
if (val && val.username) {
this.memberForm.username = val.username
}
},
verifyUserExistsInSite (username) {
const u = (username || '').trim()
if (!u || !this.currentDept || !this.currentDept.site) {
return Promise.resolve(false)
}
return searchUserList({
site: this.currentDept.site,
username: u
}).then(({ data }) => {
if (data && data.code === 0) {
const rows = data.rows || []
return rows.some(r => (r.username || '').trim().toLowerCase() === u.toLowerCase())
}
return false
}).catch(() => false)
},
submitMember () {
if (!this.currentDept) return
const username = (this.memberForm.username || '').trim()
if (!username) {
this.$message.warning('Please pick an account (click Account)')
return
}
const payload = {
site: this.currentDept.site,
buNo: this.currentDept.buNo,
departmentId: this.currentDept.departmentId,
username,
jobTitle: this.memberForm.jobTitle || '',
deptManagerFlag: this.memberForm.deptManagerFlag === 'Y' ? 'Y' : 'N',
superiorUsername: this.memberForm.superiorUsername || ''
}
const doSave = () => {
const req = this.memberFormMode === 'add' ? saveAccessDeptMember(payload) : updateAccessDeptMember(payload)
req.then(({ data }) => {
if (data && data.code === 0) {
this.$message.success('Saved')
this.memberDialogVisible = false
this.loadMembers()
} else {
this.$message.error((data && data.msg) || 'Save failed')
}
}).catch(e => {
const msg = (e.response && e.response.data && e.response.data.msg) || e.message || 'Save failed'
this.$message.error(msg)
})
}
if (this.memberFormMode === 'add') {
this.verifyUserExistsInSite(username).then(exists => {
if (!exists) {
this.$message.warning('User does not exist or has no access to this site')
return
}
const dup = this.memberList.some(m => (m.username || '').trim().toLowerCase() === username.toLowerCase())
if (dup) {
this.$message.warning('This member is already in the department')
return
}
doSave()
})
return
}
doSave()
},
removeMember (row) {
if (!this.currentDept) return
this.$confirm('确定从该部门移除「' + row.username + '」?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
deleteAccessDeptMember({
site: this.currentDept.site,
buNo: this.currentDept.buNo,
departmentId: this.currentDept.departmentId,
username: row.username
}).then(({ data }) => {
if (data && data.code === 0) {
this.$message.success('已删除')
this.loadMembers()
} else {
this.$message.error((data && data.msg) || '删除失败')
}
}).catch(e => {
const msg = (e.response && e.response.data && e.response.data.msg) || e.message || '删除失败'
this.$message.error(msg)
})
}).catch(() => {})
},
handleColumnResize(newWidth, oldWidth, column, event){
let inData= this.columnList.filter(item => item.columnProp === column.property)[0]
inData.columnWidth=newWidth
@ -392,6 +729,16 @@ export default {
// })
},
// getSiteAndBuByUserName () {
// let tempData = {
// username: this.$store.state.user.name
// }
// getSiteAndBuByUserName(tempData).then(({ data }) => {
// if (data.code === 0) {
// this.userBuList = data.rows
// }
// })
// },
//excel
@ -430,6 +777,7 @@ export default {
this.pageIndex = data.page.currPage
this.pageSize = data.page.pageSize
this.totalPage = data.page.totalCount
this.clearDeptMemberSelection()
}
})
},
@ -451,6 +799,7 @@ export default {
this.pageIndex = data.page.currPage
this.pageSize = data.page.pageSize
this.totalPage = data.page.totalCount
this.clearDeptMemberSelection()
}
})
},
@ -482,8 +831,7 @@ export default {
this.modalData = {
flag: '1',
site: this.$store.state.user.site,
bu: '',
buNo: '',
bu: this.departmentDefaultBuNo,
departmentId: '',
departmentName: '',
createBy: this.$store.state.user.name,
@ -494,12 +842,10 @@ export default {
},
updateModal (row) {
const buValue = row.buNo || row.bu || '';
this.modalData = {
flag: '2',
site: row.site,
bu: buValue,
buNo: buValue,
bu: row.buNo != null && row.buNo !== '' ? row.buNo : this.departmentDefaultBuNo,
departmentId: row.departmentId,
departmentName: row.departmentName,
createBy: this.$store.state.user.name,
@ -548,16 +894,14 @@ export default {
this.$message.warning('请输入工厂!')
return
}
if (this.modalData.bu === '' || this.modalData.bu == null) {
this.$message.warning('请输入BU!')
return
}
// 使 BUbuNo 使 departmentDefaultBuNo *
const buNoPart = (this.modalData.bu === '' || this.modalData.bu == null) ? this.departmentDefaultBuNo : this.modalData.bu
//
let saveData = {
...this.modalData,
// sitebuNobu
bu: `${this.modalData.site}_${this.modalData.bu}`
// site buNo bu split Java buNo
bu: `${this.modalData.site}_${buNoPart}`
};
if (this.modalData.flag === '1') {

149
src/views/modules/sys/user.vue

@ -12,6 +12,7 @@
<el-button v-if="isAuth('sys:user:save')" type="primary" @click="addOrUpdateHandle()">{{ buttons.add || '新增' }}</el-button>
<el-button v-if="isAuth('sys:user:save')" :disabled="this.showButton" type="primary" @click="siteAuthorize()">{{ buttons.factoryAuthorization || '工厂授权' }}</el-button>
<el-button v-if="isAuth('sys:user:save')" :disabled="this.showButton" type="primary" @click="buAuthorize()">{{ buttons.buAuthorization || 'BU授权' }}</el-button>
<el-button v-if="isAuth('sys:user:save')" :disabled="this.showButton" type="primary" @click="viewUserDept()">{{ buttons.viewUserDept || '查看部门' }}</el-button>
<el-button v-if="isAuth('sys:user:save')" :disabled="this.showButton" type="primary" @click="deptAuthorize()">{{ buttons.deptAuthorization || '部门授权' }}</el-button>
<el-button v-if="isAuth('sys:user:save')" :disabled="this.showButton" type="primary" @click="businessRoleAuthorize()">{{ buttons.businessRoleAuthorization || '岗位' }}
</el-button>
@ -180,6 +181,33 @@
</div>
</span>
</el-dialog>
<!-- 查看用户部门Access_dept -->
<el-dialog
:title="'用户部门 — ' + (selectUser && selectUser.username ? selectUser.username : '')"
:close-on-click-modal="false"
v-drag
:visible.sync="userDeptModalVisible"
width="900px"
append-to-body>
<el-table
:data="userDeptList"
border
v-loading="userDeptLoading"
height="400"
style="width: 100%">
<el-table-column prop="site" header-align="center" align="center" min-width="70" label="工厂"></el-table-column>
<el-table-column prop="buNo" header-align="center" align="center" min-width="80" label="BU"></el-table-column>
<el-table-column prop="buDesc" header-align="center" align="left" min-width="100" label="BU名称" show-overflow-tooltip></el-table-column>
<el-table-column prop="departmentId" header-align="center" align="center" min-width="90" label="部门编码"></el-table-column>
<el-table-column prop="departmentName" header-align="center" align="left" min-width="100" label="部门名称" show-overflow-tooltip></el-table-column>
<el-table-column prop="jobTitle" header-align="center" align="left" min-width="90" label="职称" show-overflow-tooltip></el-table-column>
<el-table-column prop="deptManagerFlag" header-align="center" align="center" width="90" label="部门经理"></el-table-column>
<el-table-column prop="superiorUsername" header-align="center" align="center" min-width="90" label="上级"></el-table-column>
</el-table>
<el-footer style="height:40px;margin-top: 16px;text-align:center">
<el-button type="primary" @click="userDeptModalVisible = false">关闭</el-button>
</el-footer>
</el-dialog>
<!-- 岗位 -->
<el-dialog
@ -631,12 +659,13 @@
<script>
import {getSiteList, addUserSite, delUserSite, getSite, getBuList, addUserBu, delUserBu, getBu, getDeptList, addUserDept, delUserDept, getDept, getBusinessRole, getBusinessRoleList, addUserBusinessRole, delUserBusinessRole} from '@/api/factory/site.js'
import {searchAccessBuList,saveAccessBU,saveBusinessRole} from '@/api/base/site.js'
import { listAccessDeptByUsername } from '@/api/factory/accessDept.js'
import {saveAccessBU, saveBusinessRole} from '@/api/base/site.js'
import AddOrUpdate from './user-add-or-update'
import {getUserBusinessRoleList, saveUserBusinessRole,} from '@/api/auditManagement/auditType.js'
import {getUserSpecialSecurity, saveUserSpecialSecurity, updateUserSpecialSecurity} from '@/api/factory/userSpecialSecurity.js'
import {debounce, throttle} from "../../../utils/common";
import {searchFunctionButtonList} from "@/api/sysLanguage.js"
import {saveUserBusinessRole} from '@/api/auditManagement/auditType.js'
import {updateUserSpecialSecurity} from '@/api/factory/userSpecialSecurity.js'
import {throttle} from '../../../utils/common'
import {searchFunctionButtonList} from '@/api/sysLanguage.js'
import {userFavoriteList, saveUserFavorite, removeUserFavorite} from '@/api/userFavorite.js'
export default {
@ -658,7 +687,7 @@ export default {
//
setUp: {
reviewFlag: false,
saveButton: false,
saveButton: false
},
dataForm: {
userName: '',
@ -669,53 +698,53 @@ export default {
userId: this.$store.state.user.name,
serialNumber: 'security' + this.$route.meta.menuId + 'securitydesc',
tableId: this.$route.meta.menuId + 'security',
tableName: "securityTable",
columnProp: "securitydesc",
headerAlign: "center",
align: "left",
columnLabel: "参数描述",
tableName: 'securityTable',
columnProp: 'securitydesc',
headerAlign: 'center',
align: 'left',
columnLabel: '参数描述',
columnHidden: false,
columnImage: false,
columnWidth: 70,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
fixed: ''
},
{
userId: this.$store.state.user.name,
serialNumber: 'security' + this.$route.meta.menuId + 'securitydesc',
tableId: this.$route.meta.menuId + 'security',
tableName: "securityTable",
columnProp: "module",
headerAlign: "center",
align: "left",
columnLabel: "模块",
tableName: 'securityTable',
columnProp: 'module',
headerAlign: 'center',
align: 'left',
columnLabel: '模块',
columnHidden: false,
columnImage: false,
columnSortable: false,
columnWidth: 20,
sortLv: 0,
status: true,
fixed: '',
fixed: ''
},
{
userId: this.$store.state.user.name,
serialNumber: 'security' + this.$route.meta.menuId + 'securitydesc',
tableId: this.$route.meta.menuId + 'security',
tableName: "securityTable",
columnProp: "itemvalue",
headerAlign: "center",
align: "center",
columnLabel: "参数值",
tableName: 'securityTable',
columnProp: 'itemvalue',
headerAlign: 'center',
align: 'center',
columnLabel: '参数值',
columnHidden: true,
columnImage: false,
columnSortable: false,
columnWidth: 10,
sortLv: 0,
status: true,
fixed: '',
},
fixed: ''
}
],
buttons: {
cz: '操作',
@ -727,6 +756,7 @@ export default {
factoryAuthorization: '工厂授权',
buAuthorization: 'BU授权',
deptAuthorization: '部门授权',
viewUserDept: '查看部门',
businessRoleAuthorization: '岗位',
createTime: '创建时间',
username: '用户账号',
@ -777,6 +807,9 @@ export default {
active: '',
username: ''
},
userDeptModalVisible: false,
userDeptList: [],
userDeptLoading: false,
deptData: {
site: '',
buNo: '',
@ -804,9 +837,8 @@ export default {
roleDesc: '',
active: '',
username: ''
},
}
}
},
components: {
AddOrUpdate
@ -817,8 +849,8 @@ export default {
mounted () {
this.favoriteIsOk()
this.$nextTick(() => {
this.securityHeight = window.innerHeight - 300;
this.height = window.innerHeight - 200;
this.securityHeight = window.innerHeight - 300
this.height = window.innerHeight - 200
})
},
computed: {
@ -845,7 +877,7 @@ export default {
favoriteFunction () {
let userFavorite = {
userId: this.$store.state.user.id,
functionId: this.$route.meta.menuId,
functionId: this.$route.meta.menuId
}
if (this.favorite) {
//
@ -1104,6 +1136,29 @@ export default {
}
})
},
viewUserDept () {
if (!this.selectUser || !this.selectUser.username) {
this.$message.warning('请先在列表中选中用户')
return
}
this.userDeptLoading = true
this.userDeptList = []
this.userDeptModalVisible = true
listAccessDeptByUsername({ username: this.selectUser.username }).then(({ data }) => {
this.userDeptLoading = false
if (data && data.code === 0) {
this.userDeptList = data.list || []
} else {
this.userDeptList = []
if (data && data.msg) {
this.$message.error(data.msg)
}
}
}).catch(() => {
this.userDeptLoading = false
this.userDeptList = []
})
},
//
deptAuthorize () {
@ -1293,15 +1348,12 @@ export default {
})
},
saveBuAssessSite () {
if (this.selectBUList.length == 0) {
this.$message.warning("请选择BU")
return false;
this.$message.warning('请选择BU')
return false
}
let inList=[];
let inList = []
for (let i = 0; i < this.selectBUList.length; i++) {
let inData = {
site: this.$store.state.user.site,
@ -1323,10 +1375,10 @@ export default {
//
saveBusinessRoleSite () {
if (this.selectBusinessRoleList.length == 0) {
this.$message.warning("请选择角色")
return false;
this.$message.warning('请选择角色')
return false
}
let businessRole=[];
let businessRole = []
for (let i = 0; i < this.selectBusinessRoleList.length; i++) {
let inData = {
site: this.$store.state.user.site,
@ -1345,8 +1397,6 @@ export default {
})
},
//
handleCurrentChange (val) {
this.selectUser = val
@ -1358,24 +1408,24 @@ export default {
let currentList = this.checked
//
if (currentList.length == 0) {
this.$confirm("当前未选择记录,是否继续?", '删除提示', {
this.$confirm('当前未选择记录,是否继续?', '删除提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
cancelButtonText: '取消'
}).then(() => {
let data = {
userId: this.currentData.userId,
userId: this.currentData.userId
}
saveList.push(data)
this.saveUserBusinessRole(saveList)
}).catch(() => {
return
})
} else {
for (let i = 0; i < currentList.length; i++) {
let data = {
userId: this.currentData.userId,
roleItemNo: currentList[i],
selectFlag: 'Y',
selectFlag: 'Y'
}
saveList.push(data)
}
@ -1397,7 +1447,6 @@ export default {
})
},
//
getDataList: throttle(function () {
this.dataListLoading = true
@ -1481,7 +1530,7 @@ export default {
}
this.$http({
url: this.$http.adornUrl('/pms/test/getTdo1'),
method: 'get',
method: 'get'
}).then(({data}) => {
if (data && data.code === 0) {
} else {
@ -1490,7 +1539,7 @@ export default {
})
this.$http({
url: this.$http.adornUrl('/qm/test/list'),
method: 'get',
method: 'get'
}).then(({data}) => {
if (data && data.code === 0) {
} else {
@ -1500,7 +1549,7 @@ export default {
},
closeDialog () {
this.$refs.addOrUpdate.closeDialog()
},
}
},
created () {
this.getFunctionButtonList()

Loading…
Cancel
Save