取消职级组,职级相关内容修改

ly
刘妍 2024-04-22 14:30:15 +08:00
parent 510134cfe5
commit b71de47b8b
10 changed files with 207 additions and 179 deletions

View File

@ -71,7 +71,7 @@ export interface addDept {
status: number
}
export interface PositionByOrgParams {
orgid: string
orgId: string
}
/**

View File

@ -57,13 +57,13 @@ enum Api {
UpdatePosition = '/api/SysPosition/Update',
}
export const getPositionsTree = (params: AccountParams) =>
export const getPositionsTree = (params?: AccountParams) =>
defHttp.get<AccountListGetResultModel>({ url: Api.PositionsTree, params });
export const getPositionList = (params: AccountParams) =>
defHttp.get<AccountListGetResultModel>({ url: Api.PositionList, params });
export const getPosGroupList = (params: AccountParams) =>
export const getPosGroupList = (params?: AccountParams) =>
defHttp.get<AccountListGetResultModel>({ url: Api.PosGroupList, params });
export const getAccountList = (params: AccountParams) =>

View File

@ -10,7 +10,7 @@
import { reactive,nextTick} from 'vue';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { getLoadPositionByOrg, deleteAccount } from '@/api/demo/system';
import { getPositionsTree, deleteAccount } from '@/api/demo/system';
import { PageWrapper } from '@/components/Page';
import DeptTree from './DeptTree.vue';
import { useMessage } from '/@/hooks/web/useMessage';
@ -22,8 +22,8 @@
const searchInfo = reactive < Recordable > ({});
const [registerTable, { expandAll,reload, updateTableDataRecord, getSelectRows, clearSelectedRowKeys }] = useTable({
title: '账号列表',
api: getLoadPositionByOrg,
title: '职级列表',
api: getPositionsTree,
rowKey: 'id',
columns,
formConfig: {

View File

@ -1,17 +1,17 @@
<template>
<div class="select-account">
<div class="select-account">
<BasicTable @register="registerTable" :searchInfo="searchInfo"> </BasicTable>
</div>
</template>
<script lang="ts" setup>
import { reactive, } from 'vue';
import { reactive } from 'vue';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { getRoleListByPage, deleteRole } from '@/api/demo/system';
defineOptions({ name: 'RoleManagement' });
const searchInfo = reactive < Recordable > ({});
const searchInfo = reactive<Recordable>({});
const [registerTable, { reload, getSelectRows, clearSelectedRowKeys }] = useTable({
//
@ -34,12 +34,14 @@
rowKey: 'id',
formConfig: {
labelWidth: 120,
schemas: [{
field: 'key',
label: '关键字',
component: 'Input',
colProps: { span: 8 },
}],
schemas: [
{
field: 'key',
label: '关键字',
component: 'Input',
colProps: { span: 8 },
},
],
},
// 使
useSearchForm: true,
@ -50,7 +52,8 @@
//
showIndexColumn: false,
//
rowSelection: {//
rowSelection: {
//
type: 'checkbox',
},
tableSetting: { fullScreen: true },
@ -63,16 +66,15 @@
function getRow() {
let rows = getSelectRows();
return rows
return rows;
}
defineExpose({
getRow
})
getRow,
});
</script>
<style scoped>
.select-account{
.select-account {
display: flex;
height: 100%;
}
</style>
</style>

View File

@ -1,18 +1,41 @@
<template>
<BasicModal v-bind="$attrs" @register="registerModal" title="分配部门和职级" @ok="handleSubmit">
<BasicModal
v-bind="$attrs"
@register="registerModal"
title="分配部门和职级"
@ok="handleSubmit"
:okText="okTextVal"
:destroyOnClose="true"
>
<BasicTree
ref="asyncExpandTreeRef"
title="部门和职级列表"
title="部门列表"
toolbar
treeWrapperClassName="h-[calc(100%-35px)] overflow-auto"
loadData
:clickRowToExpand="false"
:treeData="treeData"
:treeData="treeDeptData"
:fieldNames="{ key: 'id', title: 'name' }"
:defaultExpandAll="true"
:checkable="true"
:checkStrictly="true"
@check="handleSelect"
@check="handleDeptSelect"
v-if="okTextVal == '下一步'"
/>
<BasicTree
ref="asyncExpandTreePosRef"
title="职级列表"
toolbar
treeWrapperClassName="h-[calc(100%-35px)] overflow-auto"
loadData
:clickRowToExpand="false"
:treeData="treePosData"
:fieldNames="{ key: 'id', title: 'name' }"
:defaultExpandAll="true"
:checkable="true"
:checkStrictly="true"
@check="handlePosSelect"
v-else
/>
</BasicModal>
</template>
@ -20,111 +43,103 @@
import { ref, unref, onMounted, nextTick } from 'vue';
import { BasicModal, useModalInner } from '@/components/Modal';
import { BasicTree, TreeItem, TreeActionType } from '@/components/Tree';
import { getOrgPositonTree, userOrgs } from '@/api/demo/system';
import { getDeptList, userOrgs, getPositionsTree } from '@/api/demo/system';
import { useMessage } from '@/hooks/web/useMessage';
defineOptions({ name: 'OrgPositonModal' });
const emit = defineEmits(['success', 'register', 'select']);
const treeData = ref<TreeItem[]>([]);
const treeDeptData = ref<TreeItem[]>([]);
const treePosData = ref<TreeItem[]>([]);
const asyncExpandTreeRef = ref<Nullable<TreeActionType>>(null);
const asyncExpandTreePosRef = ref<Nullable<TreeActionType>>(null);
const { createMessage } = useMessage();
function treeIterator(tree) {
const okTextVal = ref('下一步');
function treeIterator(tree, orgId) {
tree.forEach((node) => {
if (node.key == 0) {
node.name = '部门--' + node.name;
} else {
node.name = '职级--' + node.name;
}
node.children && treeIterator(node.children);
node.orgId = orgId;
node.children && treeIterator(node.children, orgId);
});
}
async function fetch() {
const data = (await getOrgPositonTree()) as unknown as TreeItem[];
treeIterator(data);
treeData.value = await data;
const data = (await getDeptList()) as unknown as TreeItem[];
treeDeptData.value = data;
//
nextTick(() => {
unref(asyncExpandTreeRef)?.expandAll(true);
});
}
let orgList:any = ref([]);
let posList:any = ref([]);
function handleSelect(checkedKeys, e: { checked: boolean; checkedNodes; node; event }) {
const list = e.checkedNodes;
orgList.value = [];
posList.value = [];
list.forEach((element) => {
if (element.key > 0) {
posList.value.push({
orgId: Number(element.tag),
posId: element.id,
});
} else {
orgList.value.push({
orgId: element.id,
posId: 0,
});
}
});
let orgList: any = ref([]);
let posList: any = ref([]);
async function handleDeptSelect(checkedKeys, e: { checked: boolean; checkedNodes; node; event }) {
console.log(e.checkedNodes);
orgList.value = e.checkedNodes;
}
async function handlePosSelect(checkedKeys, e: { checked: boolean; checkedNodes; node; event }) {
posList.value = e.checkedNodes;
}
onMounted(() => {
fetch();
});
const rowId = ref('');
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
// unref(asyncExpandTreeRef)?.setCheckedKeys([1]);
setModalProps({ confirmLoading: false });
orgList.value = []
posList.value = []
fetch()
rowId.value = data.record.id;
okTextVal.value = '下一步';
});
async function handleSubmit() {
try {
let duplicates = {};
for (let i = 0; i < posList.value.length; i++) {
if (!duplicates[posList.value[i].orgId]) {
duplicates[posList.value[i].orgId] = 1;
} else {
duplicates[posList.value[i].orgId]++;
if (okTextVal.value == '下一步') {
console.log(orgList)
if (orgList.value.length == 0) {
return createMessage.warn('请先选择部门');
}
}
for (let key in duplicates) {
if (duplicates[key] > 1) {
return createMessage.warn('一个部门只能选择一个职级');
}
}
var query = {};
const arrs = posList.value.map((item) => {
const data = orgList.value.find((i) => item.orgId == i.orgId);
return {
...data,
...item,
};
});
if (posList.value.length == 0) {
query = {
userId: rowId.value,
orgPoses: orgList.value,
};
} else if (orgList.length == 0) {
query = {
userId: rowId.value,
orgPoses: posList.value,
};
okTextVal.value = '确认';
//
treePosData.value = [];
orgList.value.forEach(async (element) => {
const data = (await getPositionsTree({
orgId: element.id,
})) as unknown as TreeItem[];
treeIterator(data, element.id);
treePosData.value = treePosData.value.concat(data);
//
nextTick(() => {
unref(asyncExpandTreePosRef)?.expandAll(true);
});
});
} else {
query = {
let duplicates = {};
let arr: any = [];
for (let i = 0; i < posList.value.length; i++) {
if (!duplicates[posList.value[i].orgId]) {
arr.push({
orgId: posList.value[i].orgId,
posId: posList.value[i].id,
});
duplicates[posList.value[i].orgId] = 1;
} else {
duplicates[posList.value[i].orgId]++;
}
}
for (let key in duplicates) {
if (duplicates[key] > 1) {
return createMessage.warn('一个部门只能选择一个职级');
}
}
var query = {
userId: rowId.value,
orgPoses: arrs,
orgPoses: arr,
};
}
const data = await userOrgs(query);
if(data){
setModalProps({ confirmLoading: true });
closeModal();
emit('success');
return createMessage.success('成功');
}else{
return createMessage.error('失败');
const data = await userOrgs(query);
if (data) {
setModalProps({ confirmLoading: true });
closeModal();
emit('success');
return createMessage.success('成功');
} else {
return createMessage.error('失败');
}
}
} finally {
setModalProps({ confirmLoading: false });

View File

@ -17,7 +17,14 @@
import { BasicDrawer, useDrawerInner } from '@/components/Drawer';
import { useMessage } from '@/hooks/web/useMessage';
const { createMessage } = useMessage();
import { addPosGroup, editMenu, addPosition, getPosInfo ,updatePosition} from '@/api/demo/system';
import {
addPosGroup,
getDeptList,
addPosition,
getPosInfo,
updatePosition,
getPositionsTree,
} from '@/api/demo/system';
defineOptions({ name: 'MenuDrawer' });
@ -25,7 +32,7 @@
const isUpdate = ref(true);
const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
const [registerForm, { resetFields, setFieldsValue, validate, updateSchema }] = useForm({
labelWidth: 100,
schemas: formSchema,
showActionButtonGroup: false,
@ -47,6 +54,18 @@
...obj,
});
}
const posData = await getPositionsTree();
const treeData = await getDeptList();
updateSchema([
{
field: 'parentId',
componentProps: { treeData:posData },
},
{
field: 'orgId',
componentProps: { treeData },
},
]);
});
const getTitle = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));

View File

@ -28,7 +28,7 @@
<script lang="ts" setup>
import { onMounted, ref, h, nextTick, unref } from 'vue';
import { BasicTree, TreeItem, TreeActionItem, TreeActionType } from '@/components/Tree';
import { getPosGroupList, deleteMenu } from '@/api/demo/system';
import { getDeptList, deleteMenu } from '@/api/demo/system';
import { FormOutlined, DeleteOutlined } from '@ant-design/icons-vue';
import { BasicModal, useModal } from '@/components/Modal';
import { router } from '@/router';
@ -55,7 +55,7 @@
}
async function fetch() {
treeData.value = (await getPosGroupList()) as unknown as TreeItem[];
treeData.value = (await getDeptList()) as unknown as TreeItem[];
//
nextTick(() => {
unref(asyncExpandTreeRef)?.expandAll(true);

View File

@ -1,8 +1,12 @@
<template>
<PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
<PositionTree ref="childRef" class="w-1/4 xl:w-1/5" @select="handleSelect" @edit="editGroup" />
<BasicTable class="w-3/4 xl:w-4/5" @register="registerTable" @fetch-success="onFetchSuccess"
:searchInfo="searchInfo">
<BasicTable
@register="registerTable"
@fetch-success="onFetchSuccess"
:searchInfo="searchInfo"
class="w-3/4 xl:w-4/5"
>
<template #toolbar>
<!-- <a-button type="primary" @click="handleCreate"> </a-button> -->
<PermissionBtn @btnEvent="onBtnClicked"></PermissionBtn>
@ -10,32 +14,31 @@
</BasicTable>
<PositionDrawer @register="registerDrawer" @success="handleSuccess" />
</PageWrapper>
</template>
<script lang="ts" setup>
import { reactive, nextTick,ref } from 'vue';
import { reactive, nextTick, ref } from 'vue';
import { BasicTable, useTable } from '@/components/Table';
import { getPositionsTree} from '@/api/demo/system';
import { getPositionsTree } from '@/api/demo/system';
import { PageWrapper } from '@/components/Page';
import {PermissionBtn} from '@/components/PermissionBtn/index'
import { PermissionBtn } from '@/components/PermissionBtn/index';
import { useDrawer } from '@/components/Drawer';
import {PositionTree} from './page';
import {PositionDrawer} from './page';
import { PositionTree } from './page';
import { PositionDrawer } from './page';
import { columns, searchFormSchema } from './position.data';
import { useMessage } from '@/hooks/web/useMessage';
const { createConfirm,createMessage } = useMessage();
const { createConfirm, createMessage } = useMessage();
defineOptions({ name: 'PositionManagement' });
const searchInfo = reactive < Recordable > ({});
const searchInfo = reactive<Recordable>({});
const [registerDrawer, { openDrawer }] = useDrawer();
const [registerTable, { reload, expandAll, getSelectRows }] = useTable({
title: '职级列表',
api: getPositionsTree,
columns,
rowKey:'id',
rowKey: 'id',
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
@ -46,7 +49,8 @@
showTableSetting: true,
bordered: true,
showIndexColumn: false,
rowSelection: {//
rowSelection: {
//
// type: 'checkbox',
type: 'radio',
},
@ -54,7 +58,7 @@
return info;
},
});
const childRef = ref <any> ()
const childRef = ref<any>();
function handleCreate() {
openDrawer(true, {
isUpdate: false,
@ -63,30 +67,30 @@
function handleEdit() {
let rows = getSelectRows();
if(rows.length == 0){
if (rows.length == 0) {
return createMessage.warn('请选择一个职级进行编辑');
}
const record = rows[0]
record.type = '2'
const record = rows[0];
record.type = '2';
openDrawer(true, {
record,
isUpdate: true,
});
}
async function editGroup(record: Recordable) {
record.type = '1'
record.type = '1';
openDrawer(true, {
record,
isUpdate: true,
});
}
function handleSelect(GroupId = '') {
searchInfo.GroupId = GroupId;
function handleSelect(orgId = '') {
searchInfo.orgId = orgId;
reload();
}
async function handleDelete() {
let rows = getSelectRows();
if(rows.length == 0){
if (rows.length == 0) {
return createMessage.warn('请选择一个职级进行删除');
}
// const query = [rows[0].id]
@ -113,16 +117,16 @@
function onBtnClicked(domId) {
switch (domId) {
case 'btnAdd':
handleCreate()
handleCreate();
break;
case 'btnEdit':
handleEdit()
handleEdit();
break;
case 'btnDelete':
handleDelete()
handleDelete();
break;
default:
break;
}
}
</script>
</script>

View File

@ -2,7 +2,7 @@ import { BasicColumn, FormSchema } from '@/components/Table';
import { h } from 'vue';
import { Tag } from 'ant-design-vue';
import Icon from '@/components/Icon/Icon.vue';
import { getPosGroupList, getPositionsTree } from '@/api/demo/system';
import { getDeptList, getPositionsTree } from '@/api/demo/system';
export const columns: BasicColumn[] = [
{
@ -29,11 +29,11 @@ export const formSchema: FormSchema[] = [
field: 'type',
label: '类型',
component: 'RadioButtonGroup',
defaultValue: '1',
defaultValue: '2',
componentProps: {
options: [
// { label: '目录', value: '0' },
{ label: '职级组', value: '1' },
// { label: '职级组', value: '1' },
{ label: '职级', value: '2' },
],
},
@ -53,38 +53,18 @@ export const formSchema: FormSchema[] = [
required: true,
},
{
field: 'groupId',
component: 'ApiSelect',
label: '职级组',
required: true,
componentProps: ({ formActionType, formModel }) => {
return {
api: getPosGroupList, // 接口
// 接口参数
params: {
site: formModel.site || '',
placeId: formModel.placeId || '',
},
resultField: 'result',
labelField: 'name',
valueField: 'id',
onChange: (e: any) => {
formModel.parentId = undefined
async function getList() {
const treeData = await getPositionsTree({groupId:e})
const { updateSchema } = formActionType;
updateSchema({
field: 'parentId',
componentProps: {
treeData,
},
});
}
getList()
}
};
field: 'orgId',
label: '所属部门',
component: 'TreeSelect',
componentProps: {
fieldNames: {
label: 'name',
key: 'id',
value: 'id',
},
getPopupContainer: () => document.body,
},
ifShow: ({ values }) => isButton(values.type),
required: true,
},
{
field: 'parentId',
@ -98,7 +78,6 @@ export const formSchema: FormSchema[] = [
},
getPopupContainer: () => document.body,
},
ifShow: ({ values }) => isButton(values.type),
},
{
field: 'remark',

View File

@ -1,5 +1,12 @@
<template>
<BasicModal v-bind="$attrs" @register="registerModal" title="查看账号">
<BasicModal
v-bind="$attrs"
@register="registerModal"
:showCancelBtn="false"
:showOkBtn="false"
width="60%"
title="查看账号"
>
<BasicTable @register="registerTable" :searchInfo="searchInfo" />
</BasicModal>
</template>
@ -12,7 +19,6 @@
defineOptions({ name: 'DeptModal' });
const emit = defineEmits(['success', 'register']);
const rowId = ref('');
const searchInfo = reactive<Recordable>({});
@ -20,28 +26,25 @@
setModalProps({ confirmLoading: false });
rowId.value = data.record.id;
searchInfo.roleId = rowId.value;
reload()
reload();
});
const [registerTable,{reload}] = useTable({
//
const [registerTable, { reload }] = useTable({
canResize: true,
resizeHeightOffset: 150,
api: loadByRole,
columns: [
{
title: '用户名',
dataIndex: 'account',
width: 120,
},
{
title: '昵称',
dataIndex: 'name',
width: 120,
},
],
useSearchForm: false,
showTableSetting: false,
tableSetting: { fullScreen: true },
showIndexColumn: false,
isCanResizeParent: true,
rowKey: 'id',
showTableSetting: false,
handleSearchInfoFn(info) {
return info;
},
@ -49,3 +52,9 @@
onMounted(() => {});
</script>
<style scoped>
.select-account {
display: flex;
height: 100%;
}
</style>