From a0c1d9021b1a65cc397a2c7a8a9d226c2d9f7539 Mon Sep 17 00:00:00 2001 From: wupengfei <834520024@qq.com> Date: 星期四, 07 八月 2025 17:17:57 +0800 Subject: [PATCH] feat: 企业 --- src/views/CPersonManage/CPersonManageList.vue | 3 src/views/CPersonManage/components/CPersonDetailDialog.vue | 3 .eslintrc-auto-import.json | 4 src/views/ProtocolManage/components/AddOrEditTemplateDialog.vue | 124 ++++++ src/views/ProtocolManage/EditTemplate.vue | 196 ++++++++++ src/views/FinanceManage/components/FinanceDetailDialog.vue | 101 +++++ src/hooks/index.ts | 1 src/views/OperationManage/OperationManageList.vue | 12 src/views/FinanceManage/FinanceManageList.vue | 149 ++++++++ src/hooks/portraitTable.ts | 50 ++ src/views/TaskManage/components/SignDetailView.vue | 100 +++++ src/views/TaskManage/components/TaskDetailView.vue | 122 ++++++ src/views/ProtocolManage/ProtocolManageList.vue | 112 ++++++ src/views/Account/AccountManageList.vue | 4 auto-imports.d.ts | 7 src/views/TaskManage/TaskManageList.vue | 38 - 16 files changed, 982 insertions(+), 44 deletions(-) diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json index d8574cc..e71035c 100644 --- a/.eslintrc-auto-import.json +++ b/.eslintrc-auto-import.json @@ -91,6 +91,8 @@ "ThemeColorName": true, "ThemeColors": true, "ThemeColorsType": true, + "UsePortraitTableColumnsItem": true, + "UsePortraitTableOptions": true, "VNode": true, "VerifyStatus": true, "VerifyStatusColor": true, @@ -181,6 +183,8 @@ "useModel": true, "useOmit": true, "useOmitProps": true, + "usePortraitTable": true, + "usePortraitTableWithAttachment": true, "useResizeHander": true, "useRoute": true, "useRouteView": true, diff --git a/auto-imports.d.ts b/auto-imports.d.ts index 2a77459..7d13730 100644 --- a/auto-imports.d.ts +++ b/auto-imports.d.ts @@ -180,6 +180,8 @@ const useModel: typeof import('vue')['useModel'] const useOmit: typeof import('./src/hooks/help')['useOmit'] const useOmitProps: typeof import('./src/hooks/help')['useOmitProps'] + const usePortraitTable: typeof import('./src/hooks/portraitTable')['usePortraitTable'] + const usePortraitTableWithAttachment: typeof import('./src/hooks/portraitTable')['usePortraitTableWithAttachment'] const useResizeHander: typeof import('./src/hooks/useResizeHander')['useResizeHander'] const useRoute: typeof import('vue-router')['useRoute'] const useRouteView: typeof import('./src/hooks/useRouteView')['useRouteView'] @@ -233,6 +235,9 @@ // @ts-ignore export type { GlobalEvent, GlobalEventListener, GlobalEventContext } from './src/hooks/useEvent' import('./src/hooks/useEvent') + // @ts-ignore + export type { UsePortraitTableColumnsItem, UsePortraitTableOptions } from './src/hooks/portraitTable' + import('./src/hooks/portraitTable') } // for vue template auto import @@ -398,6 +403,8 @@ readonly useModel: UnwrapRef<typeof import('vue')['useModel']> readonly useOmit: UnwrapRef<typeof import('./src/hooks/help')['useOmit']> readonly useOmitProps: UnwrapRef<typeof import('./src/hooks/help')['useOmitProps']> + readonly usePortraitTable: UnwrapRef<typeof import('./src/hooks/portraitTable')['usePortraitTable']> + readonly usePortraitTableWithAttachment: UnwrapRef<typeof import('./src/hooks/portraitTable')['usePortraitTableWithAttachment']> readonly useResizeHander: UnwrapRef<typeof import('./src/hooks/useResizeHander')['useResizeHander']> readonly useRoute: UnwrapRef<typeof import('vue-router')['useRoute']> readonly useRouteView: UnwrapRef<typeof import('./src/hooks/useRouteView')['useRouteView']> diff --git a/src/hooks/index.ts b/src/hooks/index.ts index 32c8db8..b4cd58c 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -8,3 +8,4 @@ export * from './help'; export * from './dic'; export * from './menu'; +export * from './portraitTable'; diff --git a/src/hooks/portraitTable.ts b/src/hooks/portraitTable.ts new file mode 100644 index 0000000..844586a --- /dev/null +++ b/src/hooks/portraitTable.ts @@ -0,0 +1,50 @@ +import { ColumnsRenderProps } from '@bole-core/components'; +import { MaybeRef } from 'vue'; + +export type UsePortraitTableColumnsItem<TData extends object = object> = ColumnsRenderProps & { + label?: string; + key?: keyof TData; +}; + +export type UsePortraitTableOptions<TData extends object> = { + data: Ref<TData>; + columns?: UsePortraitTableColumnsItem<TData>[]; +}; + +export function usePortraitTable<TData extends object>(options: UsePortraitTableOptions<TData>) { + const portraitTableProps = computed( + () => + ({ + data: options.data.value, + columns: options.columns ?? [], + } as any) + ); + + return { + portraitTableProps, + }; +} + +type UsePortraitTableWithAttachmentOptions< + TData extends object, + TAnnexItem extends object = object +> = UsePortraitTableOptions<TData> & { + annexList: Ref<TAnnexItem[]>; + columnsRenderProps?: { [key in keyof TAnnexItem]?: ColumnsRenderProps }; +}; + +export function usePortraitTableWithAttachment< + TData extends object, + TAnnexItem extends object = object +>(options: UsePortraitTableWithAttachmentOptions<TData, TAnnexItem>) { + const { annexList, columnsRenderProps } = options; + const { portraitTableProps } = usePortraitTable(options); + + const portraitTableWithAttachmentProps = computed(() => ({ + annexList: annexList.value, + portraitTableProps: portraitTableProps.value, + columnsRenderProps, + })); + + return { portraitTableWithAttachmentProps }; +} diff --git a/src/views/Account/AccountManageList.vue b/src/views/Account/AccountManageList.vue index a3d529f..c5a3c20 100644 --- a/src/views/Account/AccountManageList.vue +++ b/src/views/Account/AccountManageList.vue @@ -44,7 +44,7 @@ } from '@bole-core/components'; import { useAccess } from '@/hooks'; import { RoleClientType } from '@/constants'; -import { Message, OrderInputType } from '@bole-core/core'; +import { Message } from '@bole-core/core'; import AddOrEditAccountDialog from './components/AddOrEditAccountDialog.vue'; defineOptions({ @@ -96,7 +96,7 @@ }, { defaultExtraParams: { - orderInput: [{ property: 'id', order: OrderInputType.Desc }], + orderInput: [{ property: 'id', order: EnumPagedListOrder.Desc }], keyword: '', }, columnsRenderProps: { diff --git a/src/views/CPersonManage/CPersonManageList.vue b/src/views/CPersonManage/CPersonManageList.vue index afbed41..ac1cda8 100644 --- a/src/views/CPersonManage/CPersonManageList.vue +++ b/src/views/CPersonManage/CPersonManageList.vue @@ -80,7 +80,6 @@ import { useAccess, useGlobalEventContext } from '@/hooks'; import { Gender } from '@/constants'; import CPersonDetailDialog from './components/CPersonDetailDialog.vue'; -import { OrderInputType } from '@bole-core/core'; import { convertApi2FormUrlOnlyOne, format } from '@/utils'; import { ModelValueType } from 'element-plus'; @@ -168,7 +167,7 @@ realVerifyStatus: '' as any as boolean, nearlyHireDateTime: [] as unknown as ModelValueType, nearlySignDateTime: [] as unknown as ModelValueType, - orderInput: [{ property: 'userId', order: OrderInputType.Desc }], + orderInput: [{ property: 'userId', order: EnumPagedListOrder.Desc }], }, queryKey: ['flexEnterpriseWokerServices/getUserClientList'], columnsRenderProps: { diff --git a/src/views/CPersonManage/components/CPersonDetailDialog.vue b/src/views/CPersonManage/components/CPersonDetailDialog.vue index e1e3b09..ddc2e74 100644 --- a/src/views/CPersonManage/components/CPersonDetailDialog.vue +++ b/src/views/CPersonManage/components/CPersonDetailDialog.vue @@ -58,7 +58,6 @@ ProFormInputNumber, defineColumns, } from '@bole-core/components'; -import { OrderInputType } from '@bole-core/core'; import _ from 'lodash'; import { setOSSLink } from '@/utils'; import { @@ -165,7 +164,7 @@ }, { defaultExtraParams: { - orderInput: [{ property: 'applyTime', order: OrderInputType.Desc }], + orderInput: [{ property: 'applyTime', order: EnumPagedListOrder.Desc }], }, columnsRenderProps: { applyTime: { type: 'date' }, diff --git a/src/views/FinanceManage/FinanceManageList.vue b/src/views/FinanceManage/FinanceManageList.vue new file mode 100644 index 0000000..fc1c742 --- /dev/null +++ b/src/views/FinanceManage/FinanceManageList.vue @@ -0,0 +1,149 @@ +<template> + <LoadingLayout :loading="state.loading"> + <AppContainer> + <ProTableQueryFilterBar @on-reset="reset"> + <template #query> + <QueryFilterItem tip-content="鍙戝竷鐘舵��"> + <FieldRadio + v-model="extraParamState.status" + :value-enum="[ + { value: true, label: '鍙戝竷涓�' }, + { value: false, label: '宸插仠姝�' }, + ]" + buttonStyle + showAllBtn + @change="getList()" + /> + </QueryFilterItem> + <QueryFilterItem tip-content="鎺ㄨ崘鐘舵��"> + <FieldRadio + v-model="extraParamState.status" + :value-enum="[ + { value: true, label: '宸叉帹鑽�' }, + { value: false, label: '鏈帹鑽�' }, + ]" + buttonStyle + showAllBtn + @change="getList()" + /> + </QueryFilterItem> + <QueryFilterItem tip-content="鍙戝竷鏃堕棿"> + <FieldDatePicker + v-model="extraParamState.beginDate" + type="daterange" + range-separator="~" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + clearable + @change="getList()" + ></FieldDatePicker> + </QueryFilterItem> + <QueryFilterItem> + <SearchInput + v-model="extraParamState.keyword" + style="width: 260px" + placeholder="浠诲姟鍚嶇О" + @on-click-search="getList" + > + </SearchInput> + </QueryFilterItem> + </template> + </ProTableQueryFilterBar> + <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns"> + </ProTableV2> + </AppContainer> + <FinanceDetailDialog v-bind="dialogProps" /> + </LoadingLayout> +</template> + +<script setup lang="ts"> +import { + ProTableQueryFilterBar, + OperationBtnType, + ProTableV2, + SearchInput, + LoadingLayout, + AppContainer, + QueryFilterItem, + useTable, + FieldDatePicker, + FieldRadio, + useFormDialog, +} from '@bole-core/components'; +import { useAccess } from '@/hooks'; +import { ModelValueType } from 'element-plus'; +import * as enterpriseServices from '@/services/api/enterprise'; +import FinanceDetailDialog from './components/FinanceDetailDialog.vue'; + +defineOptions({ + name: 'FinanceManageList', +}); + +const operationBtnMap: Record<string, OperationBtnType> = { + detailBtn: { emits: { onClick: (role) => openDialog(role) } }, +}; + +const { column, operationBtns } = useAccess({ + operationBtnMap, +}); + +const router = useRouter(); +const BaseState = { + loading: true, +}; + +const state = reactive({ ...BaseState }); + +onMounted(async () => { + await getList(); + state.loading = false; +}); + +const { + getDataSource: getList, + proTableProps, + paginationState, + extraParamState, + reset, +} = useTable( + async ({ pageIndex, pageSize }, extraParamState) => { + try { + let params: API.GetEnterprisesQuery = { + pageModel: { + rows: pageSize, + page: pageIndex, + orderInput: extraParamState.orderInput, + }, + // searchKeys: extraParamState.keyword, + }; + let res = await enterpriseServices.getEnterprises(params, { + showLoading: !state.loading, + }); + return res; + } catch (error) {} + }, + { + defaultExtraParams: { + keyword: '', + pageType: '' as any as number, + status: '' as any as boolean, + beginDate: [] as unknown as ModelValueType, + endDate: [] as unknown as ModelValueType, + orderInput: [{ property: 'id', order: EnumPagedListOrder.Asc }], + }, + columnsRenderProps: {}, + } +); + +const { dialogProps, handleEdit, editForm } = useFormDialog({ + defaultFormParams: { + id: '', + }, +}); + +function openDialog(row) { + handleEdit({ + id: row.id, + }); +} +</script> diff --git a/src/views/FinanceManage/components/FinanceDetailDialog.vue b/src/views/FinanceManage/components/FinanceDetailDialog.vue new file mode 100644 index 0000000..899ce02 --- /dev/null +++ b/src/views/FinanceManage/components/FinanceDetailDialog.vue @@ -0,0 +1,101 @@ +<template> + <ProDialog title="鏄庣粏" v-model="visible" destroy-on-close draggable> + <PortraitTable v-bind="portraitTableProps" label-width="140px" :col-number="2"></PortraitTable> + <template #footer> + <span class="dialog-footer"> + <el-button @click="emit('onCancel')" type="primary">纭畾</el-button> + </span> + </template> + </ProDialog> +</template> + +<script setup lang="ts"> +import { ProDialog, toThousand } from '@bole-core/components'; +import { usePortraitTable } from '@/hooks'; + +defineOptions({ + name: 'FinanceDetailDialog', +}); + +type Form = { + name?: string; +}; + +const visible = defineModel({ type: Boolean }); +const form = defineModel<Form>('form'); + +const emit = defineEmits<{ + (e: 'update:modelValue', value: boolean): void; + (e: 'onCancel'): void; +}>(); + +const { portraitTableProps } = usePortraitTable({ + data: form, + columns: [ + { + label: '浠樻浜鸿处鎴�', + key: 'name', + type: 'text', + }, + { + label: '鏀舵浜鸿处鎴�', + key: 'name', + type: 'text', + }, + { + label: '浠樻浜哄悕绉�', + key: 'name', + type: 'text', + }, + { + label: '鏀舵浜哄悕绉�', + key: 'name', + type: 'text', + }, + { + label: '浠樻浜哄紑鎴疯', + key: 'name', + type: 'text', + }, + { + label: '鏀舵浜哄紑鎴疯', + key: 'name', + type: 'text', + }, + { + label: '甯佺', + key: 'name', + type: 'text', + }, + { + label: '浜ゆ槗閲戦', + key: 'name', + type: 'money', + }, + { + label: '鐢ㄩ��', + key: 'name', + type: 'text', + }, + { + label: '鎽樿', + key: 'name', + type: 'text', + }, + { + label: '浜ゆ槗鏃堕棿', + key: 'name', + type: 'text', + }, + { + label: '浜ゆ槗鐘舵��', + key: 'name', + type: 'text', + }, + ], +}); +</script> + +<style lang="scss" scoped> +@use '@/style/common.scss' as *; +</style> diff --git a/src/views/OperationManage/OperationManageList.vue b/src/views/OperationManage/OperationManageList.vue index d4e16c3..026deb5 100644 --- a/src/views/OperationManage/OperationManageList.vue +++ b/src/views/OperationManage/OperationManageList.vue @@ -7,7 +7,7 @@ <FieldSelect v-model="extraParamState.pageType" placeholder="骞垮憡椤甸潰" - :value-enum="FlexWorkerEleSignEnumText" + :value-enum="[]" clearable @change="getAdvertiseOnShowList()" /> @@ -15,7 +15,10 @@ <QueryFilterItem tip-content="鐘舵��"> <FieldRadio v-model="extraParamState.status" - :value-enum="FlexWorkerEleSignEnumText" + :value-enum="[ + { value: true, label: '灞曠ず涓�' }, + { value: false, label: '宸蹭笅鏋�' }, + ]" buttonStyle showAllBtn @change="getAdvertiseOnShowList()" @@ -89,7 +92,7 @@ import { FlexWorkerEleSignEnumText } from '@/constants'; import { ModelValueType } from 'element-plus'; import { format, setOSSLink, convertApi2FormUrl, convertFormUrl2Api } from '@/utils'; -import { OrderInputType, Message } from '@bole-core/core'; +import { Message } from '@bole-core/core'; defineOptions({ name: 'OperationManageList', @@ -158,10 +161,9 @@ status: '' as any as boolean, beginDate: [] as unknown as ModelValueType, endDate: [] as unknown as ModelValueType, - orderInput: [{ property: 'sort', order: OrderInputType.Asc }], + orderInput: [{ property: 'sort', order: EnumPagedListOrder.Asc }], }, columnsRenderProps: {}, - columnPropsMap: ['advertiseBeginDate', 'advertiseEndDate'], } ); diff --git a/src/views/ProtocolManage/EditTemplate.vue b/src/views/ProtocolManage/EditTemplate.vue new file mode 100644 index 0000000..1faf700 --- /dev/null +++ b/src/views/ProtocolManage/EditTemplate.vue @@ -0,0 +1,196 @@ +<template> + <LoadingLayout :loading="state.loading"> + <AppContainer> + <ProTableQueryFilterBar @on-reset="reset"> + <template #query> + <QueryFilterItem> + <FieldRadio + v-model="extraParamState.status" + :value-enum="[ + { value: 1, label: '寰呭埗鐗�' }, + { value: 2, label: '宸插畬鎴�' }, + ]" + buttonStyle + showAllBtn + @change="getList()" + /> + </QueryFilterItem> + <QueryFilterItem tip-content="瀹㈡埛涓婁紶鏃堕棿"> + <FieldDatePicker + v-model="extraParamState.beginDate" + type="daterange" + range-separator="~" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + clearable + @change="getList()" + ></FieldDatePicker> + </QueryFilterItem> + <QueryFilterItem tip-content="鍒剁増鏃堕棿"> + <FieldDatePicker + v-model="extraParamState.beginDate" + type="daterange" + range-separator="~" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + clearable + @change="getList()" + ></FieldDatePicker> + </QueryFilterItem> + <QueryFilterItem> + <SearchInput + v-model="extraParamState.keyword" + style="width: 260px" + placeholder="妯℃澘鍚嶇О/ID/涓氬姟缂栫爜" + @on-click-search="getList" + > + </SearchInput> + </QueryFilterItem> + </template> + <template #btn> + <el-button @click="openDialog()" icon="Plus" type="primary">鏂板妯℃澘</el-button> + </template> + </ProTableQueryFilterBar> + <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns"> + </ProTableV2> + </AppContainer> + <AddOrEditTemplateDialog v-bind="dialogProps" /> + </LoadingLayout> +</template> + +<script setup lang="ts"> +import { + ProTableQueryFilterBar, + OperationBtnType, + ProTableV2, + SearchInput, + LoadingLayout, + AppContainer, + QueryFilterItem, + useTable, + FieldDatePicker, + FieldRadio, + useFormDialog, + UploadUserFile, +} from '@bole-core/components'; +import { useAccess } from '@/hooks'; +import { ModelValueType } from 'element-plus'; +import * as enterpriseServices from '@/services/api/enterprise'; +import AddOrEditTemplateDialog from './components/AddOrEditTemplateDialog.vue'; +import { Message } from '@bole-core/core'; + +defineOptions({ + name: 'EditTemplate', +}); + +const operationBtnMap: Record<string, OperationBtnType> = { + editBtn: { emits: { onClick: (role) => openDialog(role) } }, + editTemplateBtn: { + emits: { onClick: (role) => openDialog(role) }, + extraProps: { + hide: (row) => false, + }, + }, + downloadBtn: { + emits: { onClick: (role) => handleDownload(role) }, + }, + delBtn: { + emits: { onClick: (role) => handleDelete(role) }, + extraProps: { + hide: (row) => false, + }, + }, + + logBtn: { + emits: { onClick: (role) => openLogDialog(role) }, + }, +}; + +const { column, operationBtns } = useAccess({ + operationBtnMap, +}); + +const router = useRouter(); +const BaseState = { + loading: true, +}; + +const state = reactive({ ...BaseState }); + +onMounted(async () => { + await getList(); + state.loading = false; +}); + +const { + getDataSource: getList, + proTableProps, + paginationState, + extraParamState, + reset, +} = useTable( + async ({ pageIndex, pageSize }, extraParamState) => { + try { + let params: API.GetEnterprisesQuery = { + pageModel: { + rows: pageSize, + page: pageIndex, + orderInput: extraParamState.orderInput, + }, + // searchKeys: extraParamState.keyword, + }; + let res = await enterpriseServices.getEnterprises(params, { + showLoading: !state.loading, + }); + return res; + } catch (error) {} + }, + { + defaultExtraParams: { + keyword: '', + status: '' as any as boolean, + beginDate: [] as unknown as ModelValueType, + endDate: [] as unknown as ModelValueType, + orderInput: [{ property: 'id', order: EnumPagedListOrder.Asc }], + }, + columnsRenderProps: {}, + } +); + +const { dialogProps, handleEdit, handleAdd, editForm } = useFormDialog({ + onConfirm: handleAddOrEdit, + defaultFormParams: { + id: '', + templateId: '', + name: '', + bussinessCode: '', + templateFileUrl: [] as UploadUserFile[], + title: '鏂板妯℃澘', + }, +}); + +function openDialog(row?) { + if (row) { + handleEdit({ + id: '', + name: '', + bussinessCode: '', + templateId: '', + templateFileUrl: [] as UploadUserFile[], + }); + } else { + handleAdd(); + } +} + +async function handleAddOrEdit() {} + +function handleDownload(row) {} +async function handleDelete(row) { + try { + await Message.deleteMessage(); + } catch (error) {} +} + +function openLogDialog(row) {} +</script> diff --git a/src/views/ProtocolManage/ProtocolManageList.vue b/src/views/ProtocolManage/ProtocolManageList.vue new file mode 100644 index 0000000..aa1c6e0 --- /dev/null +++ b/src/views/ProtocolManage/ProtocolManageList.vue @@ -0,0 +1,112 @@ +<template> + <LoadingLayout :loading="state.loading"> + <AppContainer> + <ProTableQueryFilterBar @on-reset="reset"> + <template #query> + <QueryFilterItem> + <FieldRadio + v-model="extraParamState.status" + :value-enum="[{ value: 1, label: '寰呭埗鐗�' }]" + buttonStyle + showAllBtn + @change="getList()" + /> + </QueryFilterItem> + <QueryFilterItem> + <SearchInput + v-model="extraParamState.keyword" + style="width: 260px" + placeholder="浼佷笟/鐢叉柟浼佷笟" + @on-click-search="getList" + > + </SearchInput> + </QueryFilterItem> + </template> + </ProTableQueryFilterBar> + <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns"> + </ProTableV2> + </AppContainer> + </LoadingLayout> +</template> + +<script setup lang="ts"> +import { + ProTableQueryFilterBar, + OperationBtnType, + ProTableV2, + SearchInput, + LoadingLayout, + AppContainer, + QueryFilterItem, + useTable, + FieldRadio, +} from '@bole-core/components'; +import { useAccess } from '@/hooks'; +import * as enterpriseServices from '@/services/api/enterprise'; + +defineOptions({ + name: 'ProtocolManageList', +}); + +const operationBtnMap: Record<string, OperationBtnType> = { + editTemplateBtn: { emits: { onClick: (role) => goEdit(role) } }, +}; + +const { column, operationBtns } = useAccess({ + operationBtnMap, +}); + +const router = useRouter(); +const BaseState = { + loading: true, +}; + +const state = reactive({ ...BaseState }); + +onMounted(async () => { + await getList(); + state.loading = false; +}); + +const { + getDataSource: getList, + proTableProps, + paginationState, + extraParamState, + reset, +} = useTable( + async ({ pageIndex, pageSize }, extraParamState) => { + try { + let params: API.GetEnterprisesQuery = { + pageModel: { + rows: pageSize, + page: pageIndex, + orderInput: extraParamState.orderInput, + }, + // searchKeys: extraParamState.keyword, + }; + let res = await enterpriseServices.getEnterprises(params, { + showLoading: !state.loading, + }); + return res; + } catch (error) {} + }, + { + defaultExtraParams: { + keyword: '', + status: '', + orderInput: [{ property: 'id', order: EnumPagedListOrder.Asc }], + }, + columnsRenderProps: {}, + } +); + +function goEdit(row) { + router.push({ + name: 'EditTemplate', + params: { + id: row.id, + }, + }); +} +</script> diff --git a/src/views/ProtocolManage/components/AddOrEditTemplateDialog.vue b/src/views/ProtocolManage/components/AddOrEditTemplateDialog.vue new file mode 100644 index 0000000..2bc2f6d --- /dev/null +++ b/src/views/ProtocolManage/components/AddOrEditTemplateDialog.vue @@ -0,0 +1,124 @@ +<template> + <ProDialog + :title="form.title" + v-model="visible" + destroy-on-close + draggable + @close="onDialogClose" + > + <ProForm :model="form" ref="dialogForm" label-width="120px"> + <ProFormItemV2 + label="妯℃澘ID锛�" + prop="templateId" + :check-rules="[{ message: '璇疯緭鍏ユā鏉縄D' }]" + > + <ProFormText + placeholder="璇疯緭鍏ユā鏉縄D" + v-model.trim="form.templateId" + :formatter="filterCN" + ></ProFormText> + </ProFormItemV2> + <ProFormItemV2 + label="閫氶亾锛�" + prop="templateId" + :check-rules="[{ message: '璇烽�夋嫨鐢靛瓙绛鹃�氶亾' }]" + > + <ProFormSelect + placeholder="璇烽�夋嫨鐢靛瓙绛鹃�氶亾" + v-model="form.templateId" + :value-enum="[{ label: 1, value: '鏀粯瀹�' }]" + ></ProFormSelect> + </ProFormItemV2> + <ProFormItemV2 + label="涓氬姟缂栫爜锛�" + prop="bussinessCode" + :check-rules="[{ message: '璇疯緭鍏ヤ笟鍔$紪鐮�' }]" + > + <ProFormText + placeholder="璇疯緭鍏ヤ笟鍔$紪鐮�" + v-model.trim="form.bussinessCode" + :maxlength="5" + :formatter="filterNumbersFromString" + ></ProFormText> + </ProFormItemV2> + <ProFormItemV2 label="妯℃澘鍚嶇О锛�" prop="name" :check-rules="[{ message: '璇疯緭鍏ユā鏉垮悕绉�' }]"> + <ProFormText + placeholder="璇疯緭鍏ユā鏉垮悕绉�" + v-model.trim="form.name" + :maxlength="15" + ></ProFormText> + </ProFormItemV2> + <ProFormItemV2 + label="涓婁紶妯℃澘锛�" + prop="templateFileUrl" + :check-rules="[{ message: '璇蜂笂浼犳ā鏉�', type: 'upload' }]" + > + <ProFormUpload + v-model:file-url="form.templateFileUrl" + :limit="1" + :limitFileSize="10" + accept="pdf" + ></ProFormUpload> + </ProFormItemV2> + </ProForm> + <template #footer> + <span class="dialog-footer"> + <el-button type="primary" @click="handleConfirm">纭� 瀹�</el-button> + </span> + </template> + </ProDialog> +</template> + +<script setup lang="ts"> +import { + ProDialog, + UploadUserFile, + ProForm, + ProFormItemV2, + ProFormText, + ProFormUpload, + ProFormSelect, +} from '@bole-core/components'; +import { filterCN, filterNumbersFromString } from '@/utils'; +import { FormInstance } from 'element-plus'; + +defineOptions({ + name: 'AddOrEditTemplateDialog', +}); + +const visible = defineModel({ type: Boolean }); + +type Form = { + title?: string; + id: string; + templateId: string; + name: string; + bussinessCode: string; + templateFileUrl: UploadUserFile[]; +}; + +const form = defineModel<Form>('form'); + +const emit = defineEmits<{ + (e: 'onConfirm'): void; + (e: 'onCancel'): void; +}>(); + +const dialogForm = ref<FormInstance>(); + +function onDialogClose() { + if (!dialogForm.value) return; + dialogForm.value.resetFields(); +} + +function handleConfirm() { + if (!dialogForm.value) return; + dialogForm.value.validate((valid) => { + if (valid) { + emit('onConfirm'); + } else { + return; + } + }); +} +</script> diff --git a/src/views/TaskManage/TaskManageList.vue b/src/views/TaskManage/TaskManageList.vue index 3be9206..1409251 100644 --- a/src/views/TaskManage/TaskManageList.vue +++ b/src/views/TaskManage/TaskManageList.vue @@ -3,19 +3,13 @@ <AppContainer> <ProTableQueryFilterBar @on-reset="reset"> <template #query> - <QueryFilterItem> - <FieldSelect - v-model="extraParamState.pageType" - placeholder="骞垮憡椤甸潰" - :value-enum="FlexWorkerEleSignEnumText" - clearable - @change="getList()" - /> - </QueryFilterItem> <QueryFilterItem tip-content="鍙戝竷鐘舵��"> <FieldRadio v-model="extraParamState.status" - :value-enum="FlexWorkerEleSignEnumText" + :value-enum="[ + { value: true, label: '鍙戝竷涓�' }, + { value: false, label: '宸插仠姝�' }, + ]" buttonStyle showAllBtn @change="getList()" @@ -24,7 +18,10 @@ <QueryFilterItem tip-content="鎺ㄨ崘鐘舵��"> <FieldRadio v-model="extraParamState.status" - :value-enum="FlexWorkerEleSignEnumText" + :value-enum="[ + { value: true, label: '宸叉帹鑽�' }, + { value: false, label: '鏈帹鑽�' }, + ]" buttonStyle showAllBtn @change="getList()" @@ -69,13 +66,11 @@ QueryFilterItem, useTable, FieldDatePicker, - FieldSelect, FieldRadio, } from '@bole-core/components'; import { useAccess } from '@/hooks'; -import { FlexWorkerEleSignEnumText } from '@/constants'; import { ModelValueType } from 'element-plus'; -import { OrderInputType } from '@bole-core/core'; +import * as enterpriseServices from '@/services/api/enterprise'; defineOptions({ name: 'OperationManageList', @@ -83,13 +78,13 @@ const operationBtnMap: Record<string, OperationBtnType> = { detailBtn: { emits: { onClick: (role) => goDetail(role) } }, - takeOnBtn: { + recommendBtn: { emits: { onClick: (role) => setAdvertiseOnShowStatus(role) }, extraProps: { hide: (row) => row.status, }, }, - takeDownBtn: { + cancelRecommendBtn: { emits: { onClick: (role) => setAdvertiseOnShowStatus(role) }, props: { type: 'danger' }, extraProps: { @@ -123,15 +118,15 @@ } = useTable( async ({ pageIndex, pageSize }, extraParamState) => { try { - let params: API.GetUserClientForBackInput = { + let params: API.GetEnterprisesQuery = { pageModel: { rows: pageSize, page: pageIndex, orderInput: extraParamState.orderInput, }, - searchKeys: extraParamState.keyword, + // searchKeys: extraParamState.keyword, }; - let res = await flexEnterpriseWokerServices.getUserClientList(params, { + let res = await enterpriseServices.getEnterprises(params, { showLoading: !state.loading, }); return res; @@ -144,10 +139,9 @@ status: '' as any as boolean, beginDate: [] as unknown as ModelValueType, endDate: [] as unknown as ModelValueType, - orderInput: [{ property: 'sort', order: OrderInputType.Asc }], + orderInput: [{ property: 'id', order: EnumPagedListOrder.Asc }], }, columnsRenderProps: {}, - columnPropsMap: ['advertiseBeginDate', 'advertiseEndDate'], } ); @@ -157,6 +151,6 @@ } function goDetail(row) { - router.push({ name: 'TaskDetail', params: { id: row?.id ?? '' } }); + router.push({ name: 'TaskManageDetail', params: { id: row?.id ?? '' } }); } </script> diff --git a/src/views/TaskManage/components/SignDetailView.vue b/src/views/TaskManage/components/SignDetailView.vue index ccbb659..8a59d91 100644 --- a/src/views/TaskManage/components/SignDetailView.vue +++ b/src/views/TaskManage/components/SignDetailView.vue @@ -1,13 +1,103 @@ <template> - <div>SignDetailView</div> + <LoadingLayout :loading="state.loading"> + <AppContainer> + <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns"> + </ProTableV2> + </AppContainer> + </LoadingLayout> </template> <script setup lang="ts"> +import { + OperationBtnType, + ProTableV2, + LoadingLayout, + AppContainer, + useTable, +} from '@bole-core/components'; +import { useAccess } from '@/hooks'; +import { ModelValueType } from 'element-plus'; +import * as enterpriseServices from '@/services/api/enterprise'; + defineOptions({ name: 'SignDetailView', }); -</script> -<style lang="scss" scoped> -@use '@/style/common.scss' as *; -</style> +const operationBtnMap: Record<string, OperationBtnType> = { + detailBtn: { emits: { onClick: (role) => goDetail(role) } }, + recommendBtn: { + emits: { onClick: (role) => setAdvertiseOnShowStatus(role) }, + extraProps: { + hide: (row) => row.status, + }, + }, + cancelRecommendBtn: { + emits: { onClick: (role) => setAdvertiseOnShowStatus(role) }, + props: { type: 'danger' }, + extraProps: { + hide: (row) => !row.status, + }, + }, +}; + +const { checkSubModuleItemShow, column, operationBtns } = useAccess({ + operationBtnMap, +}); + +const router = useRouter(); +const BaseState = { + loading: true, +}; + +const state = reactive({ ...BaseState }); + +onMounted(async () => { + await getList(); + state.loading = false; +}); + +const { + getDataSource: getList, + proTableProps, + paginationState, + extraParamState, + reset, +} = useTable( + async ({ pageIndex, pageSize }, extraParamState) => { + try { + let params: API.GetEnterprisesQuery = { + pageModel: { + rows: pageSize, + page: pageIndex, + orderInput: extraParamState.orderInput, + }, + // searchKeys: extraParamState.keyword, + }; + let res = await enterpriseServices.getEnterprises(params, { + showLoading: !state.loading, + }); + return res; + } catch (error) {} + }, + { + defaultExtraParams: { + keyword: '', + pageType: '' as any as number, + status: '' as any as boolean, + beginDate: [] as unknown as ModelValueType, + endDate: [] as unknown as ModelValueType, + orderInput: [{ property: 'id', order: EnumPagedListOrder.Asc }], + }, + columnsRenderProps: {}, + } +); + +async function setAdvertiseOnShowStatus(row) { + try { + } catch (error) {} +} + +function goDetail(row) { + router.push({ name: 'TaskManageDetail', params: { id: row?.id ?? '' } }); +} +</script> diff --git a/src/views/TaskManage/components/TaskDetailView.vue b/src/views/TaskManage/components/TaskDetailView.vue index 8d86b79..668e441 100644 --- a/src/views/TaskManage/components/TaskDetailView.vue +++ b/src/views/TaskManage/components/TaskDetailView.vue @@ -6,16 +6,107 @@ <ProFormCol> <ProFormColItem :span="12"> <ProFormItemV2 label="浠诲姟鍚嶇О:" prop="name"> - <ProFormText v-model.trim="detail.name" /> + <ProFormText v-model.trim="detail.enterpriseName" /> + </ProFormItemV2> + </ProFormColItem> + </ProFormCol> + <ProFormCol> + <ProFormItemV2 label="鏈嶅姟璐�:" prop="salaryType"> + <RadioWithExtra + v-model="detail.enterpriseName" + :value-enum="[ + { value: 1, text: '鎸夋湀' }, + { value: 2, text: '鎸夋棩' }, + ]" + enumLabelKey="text" + enum-value-key="value" + :showExtra="true" + > + <template #extra> + <ProFormInputNumber + :controls="false" + v-model="detail.enterpriseName" + :unit="detail.enterpriseName === '' ? '鍏�/鏈�' : '鍏�/鏃�'" + ></ProFormInputNumber> + </template> + </RadioWithExtra> + </ProFormItemV2> + </ProFormCol> + <ProFormCol> + <ProFormColItem :span="12"> + <ProFormItemV2 label="缁撶畻鏂瑰紡:" prop="salaryType"> + <ProFormRadio + v-model="detail.enterpriseName" + :value-enum="[ + { label: '鏈堢粨', value: 1 }, + { label: '鏃ョ粨', value: 2 }, + ]" + /> </ProFormItemV2> </ProFormColItem> </ProFormCol> <ProFormCol> <ProFormColItem :span="12"> - <ProFormItemV2 label="浠诲姟鍚嶇О:" prop="name"> </ProFormItemV2> + <ProFormItemV2 label="绂忓埄:" prop="salaryType"> + <ProFormRadio v-model="detail.enterpriseName" :value-enum="dictionaryDataList" /> + </ProFormItemV2> + </ProFormColItem> + </ProFormCol> + <ProFormCol> + <ProFormColItem :span="12"> + <ProFormItemV2 label="骞撮緞鑼冨洿:" prop="ageRange"> + <ProFormInputNumber v-model="detail.enterpriseName"></ProFormInputNumber> + </ProFormItemV2> + </ProFormColItem> + </ProFormCol> + <ProFormCol> + <ProFormColItem :span="12"> + <ProFormItemV2 label="鎬у埆闇�姹�:" prop="salaryType"> + <ProFormRadio + v-model="detail.enterpriseName" + :value-enum="[ + { label: '鐢�', value: 1 }, + { label: '濂�', value: 2 }, + ]" + /> + </ProFormItemV2> + </ProFormColItem> + </ProFormCol> + <ProFormCol> + <ProFormColItem :span="12"> + <ProFormItemV2 label="璧勬牸璇佷功:" prop="salaryType"> + <ProFormRadio v-model="detail.enterpriseName" :value-enum="dictionaryDataList" /> + </ProFormItemV2> + </ProFormColItem> + </ProFormCol> + <ProFormCol> + <ProFormColItem :span="12"> + <ProFormItemV2 label="浠诲姟鍦扮偣:" prop="areaList"> + <!-- <ProFromAddressSelectV2 + v-model:areaList="detail.areaList" + areaListPlaceholder="璇烽�夋嫨" + :layer="AreaType.Area" + /> --> + </ProFormItemV2> + </ProFormColItem> + </ProFormCol> + <ProFormCol> + <ProFormColItem :span="12"> + <ProFormItemV2 label="浠诲姟鏃堕棿:" prop="creationTime" mode="read"> + <ProFormDatePicker + v-model="detail.enterpriseName" + type="daterange" + range-separator="鑷�" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + ></ProFormDatePicker> + </ProFormItemV2> </ProFormColItem> </ProFormCol> </ProForm> + <template #footer> + <el-button @click="handleBack">鍏抽棴</el-button> + </template> </PageFormLayout> </AppContainer> </LoadingLayout> @@ -32,8 +123,12 @@ ProFormItemV2, ProFormText, ProFormInputNumber, + ProFormRadio, + ProFormDatePicker, } from '@bole-core/components'; import { useQuery } from '@tanstack/vue-query'; +import { AreaType } from '@/constants'; +import * as enterpriseServices from '@/services/api/enterprise'; defineOptions({ name: 'TaskDetailView', @@ -41,15 +136,30 @@ const route = useRoute(); const id = route.params?.id as string; +const { closeViewPush } = useRouteView(); +const { dictionaryDataList } = useDictionaryDataSelect({ + categoryCode: computed(() => CategoryCode.Welfare), +}); const { data: detail, isLoading } = useQuery({ - queryKey: ['customerServices/getParkCustomerManageBaseDetail', id], + queryKey: ['enterpriseServices/getEnterprise', id], queryFn: async () => { - return await customerServices.getParkCustomerManageBaseDetail({ id: id }); + return await enterpriseServices.getEnterprise( + { id: id }, + { + showLoading: false, + } + ); }, - placeholderData: () => ({} as API.GetUserClientForBackOutput), - enabled: !!id, + placeholderData: () => ({} as API.GetEnterpriseQueryResult), + enabled: computed(() => !!id), }); + +function handleBack() { + closeViewPush(route, { + name: 'TaskManageList', + }); +} </script> <style lang="scss" scoped> -- Gitblit v1.9.1