Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions frontend/packages/lib-shared/api/modules/system/process.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import type { CordysAxios } from '@lib/shared/api/http/Axios';
import {
ApprovalPermissionsUrl,
AddApprovalProcessUrl,
UpdateApprovalProcessUrl,
DeleteApprovalProcessUrl,
ApprovalProcessDetailUrl,
ToggleApprovalProcessUrl,
ApprovalProcessPageUrl,
} from '@lib/shared/api/requrls/system/process';
import {
AddApprovalProcessParams,
ApprovalPermissionsDetail,
ApprovalProcessDetail,
ApprovalProcessItem,
UpdateApprovalProcessParams,
} from '@lib/shared/models/system/process';
import type { CommonList } from '@lib/shared/models/common';
import type { TableQueryParams } from '@lib/shared/models/common';

export default function useProcessApi(CDR: CordysAxios) {

// 审批流数据权限
function getApprovalPermissions(type: string) {
return CDR.get<ApprovalPermissionsDetail>({ url:`${ApprovalPermissionsUrl}/${type}` });
}
// 审批流数据权限
function getApprovalProcessList(data: TableQueryParams) {
return CDR.post<CommonList<ApprovalProcessItem>>({ url:ApprovalProcessPageUrl, data});
}
// 添加审批流
function addApprovalProcess(data: AddApprovalProcessParams) {
return CDR.post({ url:AddApprovalProcessUrl, data });
}
// 更新审批流
function updateApprovalProcess(data: UpdateApprovalProcessParams) {
return CDR.post({ url:UpdateApprovalProcessUrl,data });
}
// 审批流详情
function approvalProcessDetail(id: string) {
return CDR.get<ApprovalProcessDetail>({ url:`${ApprovalProcessDetailUrl}/${id}` });
}
// 删除审批流
function deleteApprovalProcess(id: string) {
return CDR.get({ url:`${DeleteApprovalProcessUrl}/${id}` });
}
// 切换审批流
function toggleApprovalProcess(id: string, enable: boolean) {
return CDR.get({ url:`${ToggleApprovalProcessUrl}/${id}`,params: { enable } });
}

return {
getApprovalProcessList,
getApprovalPermissions,
addApprovalProcess,
updateApprovalProcess,
approvalProcessDetail,
deleteApprovalProcess,
toggleApprovalProcess
};
}
7 changes: 7 additions & 0 deletions frontend/packages/lib-shared/api/requrls/system/process.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export const ApprovalPermissionsUrl = '/approval-flow/status-permission/setting'; // 审批流数据权限
export const ApprovalProcessPageUrl = '/approval-flow/page'; // 审批流列表
export const AddApprovalProcessUrl = '/approval-flow/add'; // 新增审批流
export const UpdateApprovalProcessUrl = '/approval-flow/update'; // 修改审批流
export const DeleteApprovalProcessUrl = '/approval-flow/delete'; // 删除审批流
export const ApprovalProcessDetailUrl = '/approval-flow/get'; // 审批流详情
export const ToggleApprovalProcessUrl = '/approval-flow/enable'; // 启用|禁用审批流
101 changes: 101 additions & 0 deletions frontend/packages/lib-shared/models/system/process.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,104 @@ import { ProcessStatusEnum } from "@lib/shared/enums/process";


export type ProcessStatusType = Exclude<ProcessStatusEnum, ProcessStatusEnum.VOIDED>;

export interface BaseItem {
id: string;
name: string;
}

// 权限项
export interface PermissionItem {
id: string;
name: string;
enabled: boolean;
}

// 状态权限
export interface ApprovalPermission {
approvalStatus: ProcessStatusType;
permission: string[];
enabled: boolean;
}

// 审批流程基本信息接口
export interface ApprovalProcessItem extends BaseItem {
number: string;
formType: string;
executeTiming: string;
enable: boolean;
submitterCanRevoke: boolean;
allowBatchProcess: boolean;
allowWithdraw: boolean;
allowAddSign: boolean;
duplicateApproverRule: string;
requireComment: boolean;
organizationId: string;
createUserName: string;
createUser: string;
updateUser: string;
updateUserName: string;
createTime: number;
updateTime: number;
}

// 审批权限详情
export interface ApprovalPermissionsDetail {
permissions: PermissionItem[];
statusPermissions: ApprovalPermission[];
}

// 审批流程节点
export interface ApprovalProcessNode extends BaseItem {
nodeType: string;
sort: number;
children: ApprovalProcessNode[];
}

// 状态权限配置
export interface ApprovalPermission {
status: ProcessStatusEnum;
statusLabel: string;
permissions: PermissionItem[];
}

// 状态权限
export interface StatusPermissions {
approvalStatus: ProcessStatusType;
permission: string;
enabled: boolean;
}

// 基本表单参数
export interface BasicFormParams {
name: string;
formType: string;
description: string;
executeTiming: string[];
}

// 更多设置参数
export interface MoreSettingsParams {
submitterCanRevoke: boolean;
allowBatchProcess: boolean;
allowWithdraw: boolean;
allowAddSign: boolean;
duplicateApproverRule: string;
requireComment: boolean;
statusPermissions: StatusPermissions[];
}

export interface AddApprovalProcessParams extends BasicFormParams, MoreSettingsParams {
enable: boolean;
nodes: ApprovalProcessNode[];
}

export interface UpdateApprovalProcessParams extends AddApprovalProcessParams {
id: string;
}

export interface ApprovalProcessDetail extends UpdateApprovalProcessParams {
permissions: PermissionItem[];
id: string;
number: string;
}
2 changes: 1 addition & 1 deletion frontend/packages/mobile/src/store/modules/app/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ const useAppStore = defineStore('app', {
// const licenseStore = useLicenseStore();
// if (!licenseStore.hasLicense()) return;
const res = await getThirdConfigByType(CompanyTypeEnum.SQLBot);
if (res.config.sqlBotChatEnable) {
if (res.config?.sqlBotChatEnable) {
await loadScript(res.config?.appSecret as string, { identifier: CompanyTypeEnum.SQLBot });
}
},
Expand Down
12 changes: 12 additions & 0 deletions frontend/packages/web/src/api/modules/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import useLoginApi from '@lib/shared/api/modules/system/login';
import useMessageApi from '@lib/shared/api/modules/system/message';
import useModuleApi from '@lib/shared/api/modules/system/module';
import useOrgApi from '@lib/shared/api/modules/system/org';
import useProcessApi from '@lib/shared/api/modules/system/process';
import useRoleApi from '@lib/shared/api/modules/system/role';

import useDiscreteApi from '@/hooks/useDiscreteApi';
Expand Down Expand Up @@ -47,6 +48,7 @@ const dashboardApi = useDashboard(CDR);
const opportunityApi = useOpportunityApi(CDR);
const contractApi = useContractApi(CDR);
const orderApi = useOrderApi(CDR);
const processApi = useProcessApi(CDR);

export const {
getOrderFormConfig,
Expand Down Expand Up @@ -759,3 +761,13 @@ export const {
agentApplicationOptions,
getMkApplication,
} = agentApi;

export const {
getApprovalProcessList,
getApprovalPermissions,
addApprovalProcess,
updateApprovalProcess,
approvalProcessDetail,
deleteApprovalProcess,
toggleApprovalProcess,
} = processApi;
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
<CrmDrawer
v-model:show="visible"
width="75%"
:min-width="800"
:footer="false"
:closable="false"
:close-on-esc="false"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@
const handleMouseMove = (_event: MouseEvent) => {
if (resizing.value) {
const newWidth = initialWidth + (startX - _event.clientX); // 新的宽度等于当前抽屉宽度+鼠标移动的距离
if (newWidth >= 480 && newWidth <= window.innerWidth * 0.9) {
if (newWidth >= (props.minWidth || 480) && newWidth <= window.innerWidth * 0.9) {
// 最大最小宽度限制,最小宽度为480,最大宽度为视图窗口宽度的90%
drawerWidth.value = newWidth;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import { FormDesignKeyEnum } from '@lib/shared/enums/formDesignEnum';
import { ProcessStatusEnum } from '@lib/shared/enums/process';
import { ProcessStatusType } from '@lib/shared/models/system/process';

export type PermissionSuffix = 'READ' | 'UPDATE' | 'DELETE' | 'DOWNLOAD' | 'EXPORT' | 'VOIDED' | 'STAGE' | 'PAYMENT';

type PartialModuleDefaultPermissionConfig = Partial<Record<ProcessStatusType, PermissionSuffix[]>>;

export const processDefaultStatusPermissionMap: Partial<
Record<FormDesignKeyEnum | string, PartialModuleDefaultPermissionConfig>
> = {
[FormDesignKeyEnum.OPPORTUNITY_QUOTATION]: {
[ProcessStatusEnum.APPROVED]: ['READ', 'DOWNLOAD', 'VOIDED'],
[ProcessStatusEnum.APPROVING]: ['READ', 'VOIDED'],
[ProcessStatusEnum.UNAPPROVED]: ['READ', 'UPDATE', 'DELETE', 'VOIDED'],
[ProcessStatusEnum.REVOKED]: ['READ', 'UPDATE', 'DELETE', 'VOIDED'],
[ProcessStatusEnum.PENDING]: ['READ', 'UPDATE', 'DELETE', 'VOIDED'],
},
[FormDesignKeyEnum.CONTRACT]: {
[ProcessStatusEnum.APPROVED]: ['READ', 'EXPORT', 'STAGE', 'PAYMENT'],
[ProcessStatusEnum.APPROVING]: ['READ', 'PAYMENT'],
[ProcessStatusEnum.UNAPPROVED]: ['READ', 'UPDATE', 'DELETE', 'STAGE', 'PAYMENT'],
[ProcessStatusEnum.REVOKED]: ['READ', 'UPDATE', 'DELETE', 'STAGE', 'PAYMENT'],
[ProcessStatusEnum.PENDING]: ['READ', 'UPDATE', 'DELETE', 'STAGE', 'PAYMENT'],
},
[FormDesignKeyEnum.ORDER]: {
[ProcessStatusEnum.APPROVED]: ['READ', 'DOWNLOAD'],
[ProcessStatusEnum.APPROVING]: ['READ'],
[ProcessStatusEnum.UNAPPROVED]: ['READ', 'UPDATE', 'DELETE'],
[ProcessStatusEnum.REVOKED]: ['READ', 'UPDATE', 'DELETE'],
[ProcessStatusEnum.PENDING]: ['READ', 'UPDATE', 'DELETE'],
},
[FormDesignKeyEnum.INVOICE]: {
[ProcessStatusEnum.APPROVED]: ['READ', 'EXPORT'],
[ProcessStatusEnum.APPROVING]: ['READ'],
[ProcessStatusEnum.UNAPPROVED]: ['READ', 'UPDATE', 'DELETE'],
[ProcessStatusEnum.REVOKED]: ['READ', 'UPDATE', 'DELETE'],
[ProcessStatusEnum.PENDING]: ['READ', 'UPDATE', 'DELETE'],
},
};

export function matchPermissionBySuffix(permissionId: string, suffix: PermissionSuffix) {
return permissionId === suffix || permissionId.endsWith(`:${suffix}`);
}
67 changes: 45 additions & 22 deletions frontend/packages/web/src/config/process.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { FormDesignKeyEnum } from '@lib/shared/enums/formDesignEnum';
import { ProcessStatusEnum } from '@lib/shared/enums/process';
import { useI18n } from '@lib/shared/hooks/useI18n';
import { ProcessStatusType } from '@lib/shared/models/system/process';
import { BasicFormParams, MoreSettingsParams, ProcessStatusType } from '@lib/shared/models/system/process';

import { StatusInfo } from '@/components/business/crm-approval-status/index.vue';

Expand All @@ -15,26 +15,19 @@ export const processStatusMap: Record<ProcessStatusType, StatusInfo> = {
tagBgColor: 'var(--success-5)',
tagColor: 'var(--success-green)',
},
[ProcessStatusEnum.UNAPPROVED]: {
label: t('common.rejected'),
icon: 'iconicon_close_circle_filled',
color: 'var(--error-red)',
tagBgColor: 'var(--error-5)',
tagColor: 'var(--error-red)',
},
[ProcessStatusEnum.APPROVING]: {
label: t('common.reviewing'),
icon: 'iconicon_wait',
color: 'var(--info-blue)',
tagBgColor: 'var(--warning-5)',
tagColor: 'var(--warning-yellow)',
},
[ProcessStatusEnum.PENDING]: {
label: t('common.pending'),
icon: 'iconicon_minus_circle_filled1',
color: 'var(--text-n4)',
tagBgColor: '',
tagColor: '',
[ProcessStatusEnum.UNAPPROVED]: {
label: t('common.rejected'),
icon: 'iconicon_close_circle_filled',
color: 'var(--error-red)',
tagBgColor: 'var(--error-5)',
tagColor: 'var(--error-red)',
},
[ProcessStatusEnum.REVOKED]: {
label: t('common.revoked'),
Expand All @@ -43,6 +36,14 @@ export const processStatusMap: Record<ProcessStatusType, StatusInfo> = {
tagBgColor: '',
tagColor: '',
},
[ProcessStatusEnum.PENDING]: {
label: t('common.pending'),
icon: 'iconicon_minus_circle_filled1',
color: 'var(--text-n4)',
tagBgColor: '',
tagColor: '',
},

[ProcessStatusEnum.NONE]: {
label: '-',
icon: '',
Expand All @@ -57,16 +58,38 @@ export const processStatusOptions = Object.entries(processStatusMap).map(([key,
value: key,
}));

export const defaultBasicForm = {
businessType: FormDesignKeyEnum.OPPORTUNITY_QUOTATION,
export const defaultBasicForm: BasicFormParams = {
formType: FormDesignKeyEnum.OPPORTUNITY_QUOTATION,
name: '',
executionTiming: ['CREATE'],
executeTiming: ['CREATE'],
description: '',
};

export const defaultMoreConfig = {
submitterAuthority: true,
approverAuthority: [],
autoApproval: 'firstNodeApproval',
approvalOpinion: false,
export const defaultMoreConfig: MoreSettingsParams = {
submitterCanRevoke: true,
allowBatchProcess: false,
allowWithdraw: false,
allowAddSign: false,
duplicateApproverRule: 'FIRST_ONLY',
requireComment: false,
statusPermissions: [],
};

export const businessTypeOptions = [
{
label: t('crmFormCreate.drawer.quotation'),
value: FormDesignKeyEnum.OPPORTUNITY_QUOTATION,
},
{
label: t('module.contract'),
value: FormDesignKeyEnum.CONTRACT,
},
{
label: t('module.invoiceApproval'),
value: FormDesignKeyEnum.INVOICE,
},
{
label: t('module.order'),
value: FormDesignKeyEnum.ORDER,
},
];
2 changes: 1 addition & 1 deletion frontend/packages/web/src/store/modules/app/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -355,7 +355,7 @@ const useAppStore = defineStore('app', {
// const licenseStore = useLicenseStore();
// if (!licenseStore.hasLicense()) return;
const res = await getThirdConfigByType(CompanyTypeEnum.SQLBot);
if (res.config.sqlBotChatEnable) {
if (res.config?.sqlBotChatEnable) {
await loadScript(res.config?.appSecret as string, { identifier: CompanyTypeEnum.SQLBot });
}
},
Expand Down
Loading
Loading