|
|
@@ -3,6 +3,7 @@ import type { TablePaginationConfig } from 'antdv-next';
|
|
|
|
|
|
import { computed, ref, watch } from 'vue';
|
|
|
|
|
|
+import { $t } from '@/locales';
|
|
|
import {
|
|
|
Button,
|
|
|
DatePicker,
|
|
|
@@ -10,10 +11,11 @@ import {
|
|
|
Menu,
|
|
|
message,
|
|
|
Modal,
|
|
|
+ Select,
|
|
|
Switch,
|
|
|
Table,
|
|
|
} from 'antdv-next';
|
|
|
-import MD5 from 'crypto-js/md5';
|
|
|
+import { MD5 } from 'crypto-js/md5';
|
|
|
import dayjs, { Dayjs } from 'dayjs';
|
|
|
import localeData from 'dayjs/plugin/localeData';
|
|
|
import weekday from 'dayjs/plugin/weekday';
|
|
|
@@ -65,13 +67,13 @@ const selectedProjects = ref<any[]>([]);
|
|
|
const menuItems = computed(() => [
|
|
|
{
|
|
|
key: 'basic',
|
|
|
- label: '基本',
|
|
|
- title: '基本',
|
|
|
+ label: $t('deliveryPartners.modal.basic'),
|
|
|
+ title: $t('deliveryPartners.modal.basic'),
|
|
|
},
|
|
|
{
|
|
|
key: 'projects',
|
|
|
- label: '关联项目',
|
|
|
- title: '关联项目',
|
|
|
+ label: $t('deliveryPartners.modal.projects'),
|
|
|
+ title: $t('deliveryPartners.modal.projects'),
|
|
|
},
|
|
|
]);
|
|
|
|
|
|
@@ -82,6 +84,13 @@ const projectPagination = ref({
|
|
|
total: 0,
|
|
|
});
|
|
|
|
|
|
+const roleOptions = [
|
|
|
+ { value: '普通人员', label: '普通人员' },
|
|
|
+ { value: '兼职人员', label: '兼职人员' },
|
|
|
+ { value: '内部人员', label: '内部人员' },
|
|
|
+ { value: '管理员', label: '管理员' },
|
|
|
+];
|
|
|
+
|
|
|
async function fetchAssociatedProjects() {
|
|
|
try {
|
|
|
const result = await getAssociatedProjectsApi(formData.value.id);
|
|
|
@@ -106,6 +115,9 @@ async function fetchAvailableProjects() {
|
|
|
],
|
|
|
});
|
|
|
if (result?.result?.model) {
|
|
|
+ result.result.model.forEach((item: any) => {
|
|
|
+ item.roleTypes = '普通人员';
|
|
|
+ });
|
|
|
allProjects.value = result.result.model;
|
|
|
projectPagination.value.total = result.result.totalCount;
|
|
|
}
|
|
|
@@ -192,7 +204,7 @@ async function handleSave() {
|
|
|
if (result?.isSuccess) {
|
|
|
emit('save', data);
|
|
|
isOpen.value = false;
|
|
|
- message.success('保存成功');
|
|
|
+ message.success($t('deliveryPartners.saveSuccess'));
|
|
|
}
|
|
|
} catch {}
|
|
|
}
|
|
|
@@ -222,10 +234,19 @@ function handleProjectPageChange(pagination: TablePaginationConfig) {
|
|
|
}
|
|
|
|
|
|
async function handleProjectSelect(project: any) {
|
|
|
+ if (!project.expiredTime) {
|
|
|
+ message.error($t('deliveryPartners.enterExpiredTime'));
|
|
|
+ return;
|
|
|
+ }
|
|
|
try {
|
|
|
- const result = await addProjectToUserApi(project.id, formData.value.id);
|
|
|
+ const result = await addProjectToUserApi(
|
|
|
+ [project.id],
|
|
|
+ formData.value.id,
|
|
|
+ project.roleTypes,
|
|
|
+ project.expiredTime ? project.expiredTime.format('YYYY-MM-DD') : '',
|
|
|
+ );
|
|
|
if (result?.isSuccess) {
|
|
|
- message.success('添加项目成功');
|
|
|
+ message.success($t('deliveryPartners.addProjectSuccess'));
|
|
|
fetchAssociatedProjects();
|
|
|
projectModalOpen.value = false;
|
|
|
}
|
|
|
@@ -234,11 +255,11 @@ async function handleProjectSelect(project: any) {
|
|
|
|
|
|
async function handleProjectDelete(project: any) {
|
|
|
Modal.confirm({
|
|
|
- title: '删除确认',
|
|
|
- content: '确定要删除此关联项目吗?',
|
|
|
- okText: '是',
|
|
|
+ title: $t('btn.delete'),
|
|
|
+ content: $t('deliveryPartners.modal.deleteProjectConfirm'),
|
|
|
+ okText: $t('btn.yes'),
|
|
|
okType: 'danger',
|
|
|
- cancelText: '否',
|
|
|
+ cancelText: $t('btn.no'),
|
|
|
type: 'warning',
|
|
|
onOk: async () => {
|
|
|
try {
|
|
|
@@ -246,7 +267,7 @@ async function handleProjectDelete(project: any) {
|
|
|
project.id,
|
|
|
]);
|
|
|
if (result?.isSuccess) {
|
|
|
- message.success('删除项目成功');
|
|
|
+ message.success($t('deliveryPartners.deleteProjectSuccess'));
|
|
|
fetchAssociatedProjects();
|
|
|
}
|
|
|
} catch {}
|
|
|
@@ -277,7 +298,11 @@ function resetFormData() {
|
|
|
<Modal
|
|
|
v-model:open="isOpen"
|
|
|
:footer="null"
|
|
|
- :title="props.mode === 'add' ? '添加用户' : '编辑用户'"
|
|
|
+ :title="
|
|
|
+ props.mode === 'add'
|
|
|
+ ? $t('deliveryPartners.modal.addTitle')
|
|
|
+ : $t('deliveryPartners.modal.editTitle')
|
|
|
+ "
|
|
|
width="1200px"
|
|
|
>
|
|
|
<div class="flex h-[600px]">
|
|
|
@@ -298,66 +323,84 @@ function resetFormData() {
|
|
|
<div v-show="activeMenu === 'basic'" class="space-y-4">
|
|
|
<div class="grid grid-cols-2 gap-4">
|
|
|
<div class="flex flex-col gap-2">
|
|
|
- <label class="text-sm font-medium">中文姓名</label>
|
|
|
+ <label class="text-sm font-medium">{{
|
|
|
+ $t('deliveryPartners.modal.chineseName')
|
|
|
+ }}</label>
|
|
|
<Input
|
|
|
v-model:value="formData.chineseName"
|
|
|
- placeholder="请输入中文姓名"
|
|
|
+ :placeholder="$t('deliveryPartners.modal.enterChineseName')"
|
|
|
/>
|
|
|
</div>
|
|
|
<div class="flex flex-col gap-2">
|
|
|
- <label class="text-sm font-medium">英文姓名</label>
|
|
|
+ <label class="text-sm font-medium">{{
|
|
|
+ $t('deliveryPartners.modal.englishName')
|
|
|
+ }}</label>
|
|
|
<Input
|
|
|
v-model:value="formData.englishName"
|
|
|
- placeholder="请输入英文姓名"
|
|
|
+ :placeholder="$t('deliveryPartners.modal.enterEnglishName')"
|
|
|
/>
|
|
|
</div>
|
|
|
<div class="flex flex-col gap-2">
|
|
|
- <label class="text-sm font-medium">账号</label>
|
|
|
+ <label class="text-sm font-medium">{{
|
|
|
+ $t('deliveryPartners.modal.account')
|
|
|
+ }}</label>
|
|
|
<Input
|
|
|
v-model:value="formData.account"
|
|
|
:disabled="props.mode === 'edit'"
|
|
|
- placeholder="请输入账号"
|
|
|
+ :placeholder="$t('deliveryPartners.modal.enterAccount')"
|
|
|
/>
|
|
|
</div>
|
|
|
<div class="flex flex-col gap-2">
|
|
|
- <label class="text-sm font-medium">绑定手机</label>
|
|
|
+ <label class="text-sm font-medium">{{
|
|
|
+ $t('deliveryPartners.modal.cellPhone')
|
|
|
+ }}</label>
|
|
|
<Input
|
|
|
v-model:value="formData.cellPhone"
|
|
|
- placeholder="请输入绑定手机"
|
|
|
+ :placeholder="$t('deliveryPartners.modal.enterCellPhone')"
|
|
|
/>
|
|
|
</div>
|
|
|
<div class="flex flex-col gap-2">
|
|
|
- <label class="text-sm font-medium">邮箱</label>
|
|
|
+ <label class="text-sm font-medium">{{
|
|
|
+ $t('deliveryPartners.modal.emailAddress')
|
|
|
+ }}</label>
|
|
|
<Input
|
|
|
v-model:value="formData.emailAddress"
|
|
|
- placeholder="请输入邮箱"
|
|
|
+ :placeholder="$t('deliveryPartners.modal.enterEmailAddress')"
|
|
|
/>
|
|
|
</div>
|
|
|
<div class="flex flex-col gap-2">
|
|
|
- <label class="text-sm font-medium">Git账户/邮箱</label>
|
|
|
+ <label class="text-sm font-medium">{{
|
|
|
+ $t('deliveryPartners.modal.gogsEmail')
|
|
|
+ }}</label>
|
|
|
<Input
|
|
|
v-model:value="formData.gogs_email"
|
|
|
- placeholder="请输入Git账户/邮箱"
|
|
|
+ :placeholder="$t('deliveryPartners.modal.enterGogsEmail')"
|
|
|
/>
|
|
|
</div>
|
|
|
<div class="flex flex-col gap-2">
|
|
|
- <label class="text-sm font-medium">有效期</label>
|
|
|
+ <label class="text-sm font-medium">{{
|
|
|
+ $t('deliveryPartners.modal.expiredTime')
|
|
|
+ }}</label>
|
|
|
<DatePicker
|
|
|
v-model:value="formData.expiredTime"
|
|
|
+ :placeholder="$t('deliveryPartners.modal.selectExpiredTime')"
|
|
|
format="YYYY-MM-DD"
|
|
|
- placeholder="请选择有效期"
|
|
|
style="width: 100%"
|
|
|
/>
|
|
|
</div>
|
|
|
<div class="flex flex-col gap-2">
|
|
|
- <label class="text-sm font-medium">是否启用</label>
|
|
|
+ <label class="text-sm font-medium">{{
|
|
|
+ $t('deliveryPartners.modal.isActive')
|
|
|
+ }}</label>
|
|
|
<Switch v-model:checked="formData.isActive" class="w-[40px]" />
|
|
|
</div>
|
|
|
<div v-if="props.mode === 'add'" class="flex flex-col gap-2">
|
|
|
- <label class="text-sm font-medium">密码</label>
|
|
|
+ <label class="text-sm font-medium">{{
|
|
|
+ $t('deliveryPartners.modal.password')
|
|
|
+ }}</label>
|
|
|
<Input
|
|
|
v-model:value="formData.password"
|
|
|
- placeholder="请输入密码"
|
|
|
+ :placeholder="$t('deliveryPartners.modal.enterPassword')"
|
|
|
type="password"
|
|
|
/>
|
|
|
</div>
|
|
|
@@ -366,23 +409,36 @@ function resetFormData() {
|
|
|
|
|
|
<div v-show="activeMenu === 'projects'" class="space-y-4">
|
|
|
<div class="mb-4 flex items-center justify-between">
|
|
|
- <Button type="primary" @click="handleAddProject"> 添加项目 </Button>
|
|
|
+ <Button type="primary" @click="handleAddProject">
|
|
|
+ {{ $t('deliveryPartners.modal.add') }}
|
|
|
+ {{ $t('deliveryPartners.modal.projects') }}
|
|
|
+ </Button>
|
|
|
</div>
|
|
|
|
|
|
<Table
|
|
|
:columns="[
|
|
|
{
|
|
|
- title: '项目名称',
|
|
|
+ title: $t('deliveryPartners.modal.projectName'),
|
|
|
dataIndex: 'name',
|
|
|
key: 'name',
|
|
|
},
|
|
|
{
|
|
|
- title: '项目代码',
|
|
|
+ title: $t('deliveryPartners.modal.projectCode'),
|
|
|
dataIndex: 'code',
|
|
|
key: 'code',
|
|
|
},
|
|
|
{
|
|
|
- title: '操作',
|
|
|
+ title: $t('deliveryPartners.modal.role'),
|
|
|
+ dataIndex: 'roleTypes',
|
|
|
+ key: 'roleTypes',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: $t('deliveryPartners.modal.expiredTime'),
|
|
|
+ dataIndex: 'expiredTime',
|
|
|
+ key: 'expiredTime',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: $t('deliveryPartners.modal.action'),
|
|
|
key: 'action',
|
|
|
width: 100,
|
|
|
},
|
|
|
@@ -398,7 +454,7 @@ function resetFormData() {
|
|
|
size="small"
|
|
|
@click="handleProjectDelete(record)"
|
|
|
>
|
|
|
- 删除
|
|
|
+ {{ $t('deliveryPartners.modal.delete') }}
|
|
|
</Button>
|
|
|
</template>
|
|
|
</template>
|
|
|
@@ -411,40 +467,54 @@ function resetFormData() {
|
|
|
v-if="activeMenu === 'basic'"
|
|
|
class="flex justify-end gap-2 border-t pt-4"
|
|
|
>
|
|
|
- <Button @click="handleCancel"> 取消 </Button>
|
|
|
- <Button type="primary" @click="handleSave"> 保存 </Button>
|
|
|
+ <Button @click="handleCancel">
|
|
|
+ {{ $t('deliveryPartners.modal.cancel') }}
|
|
|
+ </Button>
|
|
|
+ <Button type="primary" @click="handleSave">
|
|
|
+ {{ $t('deliveryPartners.modal.save') }}
|
|
|
+ </Button>
|
|
|
</div>
|
|
|
|
|
|
<Modal
|
|
|
v-model:open="projectModalOpen"
|
|
|
:footer="null"
|
|
|
- title="添加项目"
|
|
|
- width="700"
|
|
|
+ :title="$t('deliveryPartners.modal.addProjectTitle')"
|
|
|
+ width="760"
|
|
|
>
|
|
|
<div class="space-y-4">
|
|
|
<Input
|
|
|
v-model:value="projectSearchKeyword"
|
|
|
- placeholder="搜索项目"
|
|
|
+ :placeholder="$t('deliveryPartners.modal.searchProject')"
|
|
|
@change="handleProjectSearch"
|
|
|
/>
|
|
|
<Table
|
|
|
:columns="[
|
|
|
{
|
|
|
- title: '项目名称',
|
|
|
+ title: $t('deliveryPartners.modal.projectName'),
|
|
|
dataIndex: 'name',
|
|
|
key: 'name',
|
|
|
ellipsis: true,
|
|
|
width: 120,
|
|
|
},
|
|
|
{
|
|
|
- title: '项目代码',
|
|
|
+ title: $t('deliveryPartners.modal.projectCode'),
|
|
|
dataIndex: 'code',
|
|
|
key: 'code',
|
|
|
ellipsis: true,
|
|
|
width: 120,
|
|
|
},
|
|
|
{
|
|
|
- title: '操作',
|
|
|
+ title: $t('deliveryPartners.modal.role'),
|
|
|
+ key: 'roleTypes',
|
|
|
+ width: 150,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: $t('deliveryPartners.modal.expiredTime'),
|
|
|
+ key: 'expiredTime',
|
|
|
+ width: 150,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: $t('deliveryPartners.modal.action'),
|
|
|
key: 'action',
|
|
|
},
|
|
|
]"
|
|
|
@@ -454,20 +524,35 @@ function resetFormData() {
|
|
|
pageSize: projectPagination.pageSize,
|
|
|
total: projectPagination.total,
|
|
|
showSizeChanger: true,
|
|
|
- showTotal: (total: number) => `共 ${total} 个项目`,
|
|
|
+ showTotal: (total: number) =>
|
|
|
+ $t('deliveryPartners.modal.totalProjects', { total }),
|
|
|
}"
|
|
|
:scroll="{ y: 460 }"
|
|
|
class="project-table"
|
|
|
@change="handleProjectPageChange"
|
|
|
>
|
|
|
<template #bodyCell="{ column, record }">
|
|
|
+ <template v-if="column.key === 'roleTypes'">
|
|
|
+ <Select
|
|
|
+ v-model:value="record.roleTypes"
|
|
|
+ :options="roleOptions"
|
|
|
+ style="width: 120px"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ <template v-if="column.key === 'expiredTime'">
|
|
|
+ <DatePicker
|
|
|
+ v-model:value="record.expiredTime"
|
|
|
+ format="YYYY-MM-DD"
|
|
|
+ style="width: 120px"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
<template v-if="column.key === 'action'">
|
|
|
<Button
|
|
|
size="small"
|
|
|
type="primary"
|
|
|
@click="handleProjectSelect(record)"
|
|
|
>
|
|
|
- 添加
|
|
|
+ {{ $t('deliveryPartners.modal.add') }}
|
|
|
</Button>
|
|
|
</template>
|
|
|
</template>
|