增加组织架构

This commit is contained in:
2026-08-27 21:25:39 +08:00
parent 74ab6c4c6d
commit d6bba226d0
41 changed files with 6128 additions and 5218 deletions
@@ -0,0 +1,172 @@
<template>
<el-dialog
v-model="visible"
title="组织架构设置"
width="620px"
:close-on-click-modal="false"
>
<el-form ref="formRef" :model="form" label-width="150px" v-loading="loading">
<el-divider content-position="left">编码规则</el-divider>
<el-form-item label="自动生成编码">
<el-switch v-model="form.auto_generate_codes" />
<div class="form-tip">开启后,新建组织/员工/职位时留空编码将由系统生成</div>
</el-form-item>
<el-form-item label="组织编码前缀">
<el-input v-model="form.org_code_prefix" maxlength="10" :disabled="!form.auto_generate_codes" />
</el-form-item>
<el-form-item label="员工账号前缀">
<el-input v-model="form.employee_code_prefix" maxlength="10" :disabled="!form.auto_generate_codes" />
</el-form-item>
<el-form-item label="职位编码前缀">
<el-input v-model="form.position_code_prefix" maxlength="10" :disabled="!form.auto_generate_codes" />
</el-form-item>
<el-form-item label="编码长度">
<el-input-number
v-model="form.code_length"
:min="4"
:max="32"
:disabled="!form.auto_generate_codes"
controls-position="right"
/>
<div class="form-tip">含前缀的总长度</div>
</el-form-item>
<el-form-item label="允许编码重复">
<el-switch v-model="form.allow_duplicate_codes" />
<div class="form-tip">关闭时,同一租户内编码必须唯一</div>
</el-form-item>
<el-divider content-position="left">层级限制</el-divider>
<el-form-item label="最大层级数">
<el-input-number v-model="form.max_org_levels" :min="1" :max="32" controls-position="right" />
<div class="form-tip">新建与移动组织时都会校验</div>
</el-form-item>
<el-form-item label="单层最多子组织">
<el-input-number v-model="form.max_org_children" :min="1" :max="1000" controls-position="right" />
</el-form-item>
<el-divider content-position="left">默认值</el-divider>
<el-form-item label="默认组织类型">
<el-radio-group v-model="form.default_org_type">
<el-radio :value="1">企业单位</el-radio>
<el-radio :value="0">部门</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="默认排序">
<el-input-number v-model="form.default_sort" :min="0" :max="9999" controls-position="right" />
</el-form-item>
<el-form-item label="默认状态">
<el-radio-group v-model="form.default_status">
<el-radio :value="1">启用</el-radio>
<el-radio :value="0">禁用</el-radio>
</el-radio-group>
</el-form-item>
<el-divider content-position="left">功能开关</el-divider>
<el-form-item label="批量操作">
<el-switch v-model="form.batch_operations" />
</el-form-item>
<el-form-item label="导出功能">
<el-switch v-model="form.export_enabled" />
</el-form-item>
<el-form-item label="导入功能">
<el-switch v-model="form.import_enabled" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" :loading="saving" @click="handleSubmit">保存设置</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { computed, reactive, ref } from 'vue';
import { ElMessage } from 'element-plus';
import { unwrap, useOrganizationApi } from '../composables';
const props = defineProps({
/** 所属模块:erp(进销存)或 oa(办公自动化) */
module: { type: String, default: 'erp' },
});
const emit = defineEmits(['saved']);
const api = computed(() => useOrganizationApi(props.module));
const visible = ref(false);
const loading = ref(false);
const saving = ref(false);
const formRef = ref();
const defaults = () => ({
org_code_prefix: 'ORG',
employee_code_prefix: 'EMP',
position_code_prefix: 'POS',
auto_generate_codes: true,
code_length: 8,
default_org_type: 0,
default_sort: 0,
default_status: 1,
max_org_levels: 10,
max_org_children: 50,
allow_duplicate_codes: false,
batch_operations: true,
export_enabled: true,
import_enabled: true,
});
const form = reactive(defaults());
const open = async () => {
visible.value = true;
loading.value = true;
try {
const data = unwrap(await api.value.getOrgSettings()) || {};
Object.assign(form, defaults(), data);
} catch (error) {
ElMessage.error(error?.message || '加载设置失败');
} finally {
loading.value = false;
}
};
const handleSubmit = async () => {
saving.value = true;
try {
unwrap(await api.value.saveOrgSettings({ ...form }));
ElMessage.success('设置已保存');
visible.value = false;
emit('saved');
} catch (error) {
ElMessage.error(error?.message || '保存设置失败');
} finally {
saving.value = false;
}
};
defineExpose({ open });
</script>
<style lang="less" scoped>
.form-tip {
margin-top: 4px;
font-size: 12px;
color: #909399;
line-height: 1.4;
}
</style>