From 55dc8d799de193e682e97e5333b6baa9a0e26361 Mon Sep 17 00:00:00 2001 From: wupengfei <834520024@qq.com> Date: 星期四, 03 四月 2025 15:49:49 +0800 Subject: [PATCH] feat: init --- src/views/MaterialReview/MaterialReview.vue | 209 ++++++++++ src/views/EnterpriseInfo/EnterpriseInfoDetail.vue | 13 src/views/Account/components/AddOrEditAccountDialog.vue | 20 - src/store/modules/user.ts | 3 src/views/EnterpriseInfo/EnterpriseInfo.vue | 195 +++++++++ src/hooks/index.ts | 1 src/views/MaterialReview/MaterialReviewAudit.vue | 13 src/views/Reward/Reward.vue | 231 +++++++++++ /dev/null | 25 - src/store/modules/permission.ts | 2 src/views/Account/AccountManageList.vue | 148 ++++--- src/views/Reward/RewardDeclareDetail.vue | 13 src/router/index.ts | 185 +++++++- src/views/Reward/components/RewardGrantDialog.vue | 105 +++++ src/views/MaterialReview/MaterialReviewDetail.vue | 13 15 files changed, 1,039 insertions(+), 137 deletions(-) diff --git a/src/hooks/index.ts b/src/hooks/index.ts index 4e58653..cbe1cbd 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -6,4 +6,3 @@ export * from './useEvent'; export * from './useUser'; export * from './help'; -export * from './insuranceClaim'; diff --git a/src/hooks/insuranceClaim.ts b/src/hooks/insuranceClaim.ts deleted file mode 100644 index b276563..0000000 --- a/src/hooks/insuranceClaim.ts +++ /dev/null @@ -1,25 +0,0 @@ -import * as insuranceClaimServices from '@/services/api/InsuranceClaim'; -import { useQuery, useQueryClient } from '@tanstack/vue-query'; - -export function useInsuranceClaimChannelList() { - const { data: insuranceClaimChannelList } = useQuery({ - queryKey: ['insuranceClaimServices/getInsuranceClaimChannelList'], - queryFn: async () => { - let res = await insuranceClaimServices.getInsuranceClaimChannelList({ showLoading: false }); - return res; - }, - placeholderData: () => [] as string[], - }); - - const insuranceClaimChannelListForSelect = computed(() => { - return insuranceClaimChannelList.value.map((item) => ({ - label: item, - value: item, - })); - }); - - return { - insuranceClaimChannelList, - insuranceClaimChannelListForSelect, - }; -} diff --git a/src/router/index.ts b/src/router/index.ts index 7e3ec75..e61e205 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -94,33 +94,164 @@ rootMenu: true, }, }, - // { - // path: '/InsuranceClaimDetail', - // redirect: 'noRedirect', - // component: Layout, - // hidden: false, - // alwaysShow: true, - // meta: { - // rank: 10001, - // title: '鐞嗚禂', - // rootMenu: true, - // icon: 'home', - // }, - // children: [ - // { - // path: '/InsuranceClaimDetail/:id', - // name: 'InsuranceClaimDetail', - // hidden: true, - // component: () => import('@/views/InsuranceClaim/InsuranceClaimDetail.vue'), - // meta: { - // rank: 10002, - // title: '鐞嗚禂璇︽儏', - // // rootMenu: true, - // icon: 'home', - // }, - // }, - // ], - // }, + { + path: '/EnterpriseInfo', + redirect: 'noRedirect', + component: Layout, + hidden: false, + alwaysShow: true, + meta: { + rank: 10010, + title: '浼佷笟淇℃伅', + rootMenu: true, + icon: 'home', + }, + children: [ + { + path: '/EnterpriseInfoList', + name: 'EnterpriseInfoList', + hidden: false, + alwaysShow: true, + component: () => import('@/views/EnterpriseInfo/EnterpriseInfo.vue'), + meta: { + rank: 10011, + title: '浼佷笟淇℃伅', + // rootMenu: true, + icon: 'home', + }, + }, + { + path: '/EnterpriseInfoDetail/:id', + name: 'EnterpriseInfoDetail', + hidden: true, + component: () => import('@/views/EnterpriseInfo/EnterpriseInfoDetail.vue'), + meta: { + rank: 10012, + title: '浼佷笟淇℃伅璇︽儏', + // rootMenu: true, + icon: 'home', + }, + }, + ], + }, + { + path: '/MaterialReview', + redirect: 'noRedirect', + component: Layout, + hidden: false, + alwaysShow: true, + meta: { + rank: 10020, + title: '鏉愭枡瀹℃牳', + rootMenu: true, + icon: 'home', + }, + children: [ + { + path: '/MaterialReviewList', + name: 'MaterialReviewList', + hidden: false, + alwaysShow: true, + component: () => import('@/views/MaterialReview/MaterialReview.vue'), + meta: { + rank: 10021, + title: '鏉愭枡瀹℃牳', + // rootMenu: true, + icon: 'home', + }, + }, + { + path: '/MaterialReviewDetail/:id', + name: 'MaterialReviewDetail', + hidden: true, + component: () => import('@/views/MaterialReview/MaterialReviewDetail.vue'), + meta: { + rank: 10022, + title: '鏉愭枡瀹℃牳璇︽儏', + rootMenu: false, + }, + }, + { + path: '/MaterialReviewAudit/:id', + name: 'MaterialReviewAudit', + hidden: true, + component: () => import('@/views/MaterialReview/MaterialReviewAudit.vue'), + meta: { + rank: 10023, + title: '瀹℃牳', + rootMenu: false, + }, + }, + ], + }, + { + path: '/Reward', + redirect: 'noRedirect', + component: Layout, + hidden: false, + alwaysShow: true, + meta: { + rank: 10030, + title: '濂栧姳閲�', + rootMenu: true, + icon: 'home', + }, + children: [ + { + path: '/RewardList', + name: 'RewardList', + hidden: false, + alwaysShow: true, + component: () => import('@/views/Reward/Reward.vue'), + meta: { + rank: 10031, + title: '濂栧姳閲戝彂鏀�', + // rootMenu: true, + icon: 'home', + }, + }, + { + path: '/RewardDeclareDetail/:id', + name: 'RewardDeclareDetail', + hidden: true, + component: () => import('@/views/Reward/RewardDeclareDetail.vue'), + meta: { + rank: 10032, + title: '鐢虫姤璇︽儏', + rootMenu: false, + }, + }, + ], + }, + { + path: '/Syatem', + redirect: 'noRedirect', + component: Layout, + hidden: false, + alwaysShow: true, + meta: { + rank: 10030, + title: '绯荤粺閰嶇疆', + rootMenu: true, + icon: 'home', + }, + children: [ + { + path: '/Account', + name: 'Account', + hidden: false, + alwaysShow: true, + component: () => import('@/views/Account/AccountManageList.vue'), + meta: { + rank: 10031, + title: '璐﹀彿绠$悊', + // rootMenu: true, + icon: 'home', + }, + }, + ], + }, + { path: '/Login', name: 'Login', diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts index 2fc37a5..925456d 100644 --- a/src/store/modules/permission.ts +++ b/src/store/modules/permission.ts @@ -33,7 +33,7 @@ const res = await baseModuleServices.getCurrentUserModuleList({ showLoading: false, }); - const accessedRoutes = ascending(addAsyncRoutes(formatModuleList(res, null))); // createAccessedRoutes(userMenuList, userInfo) + const accessedRoutes = ascending(addAsyncRoutes(formatModuleList([], null))); // createAccessedRoutes(userMenuList, userInfo) //@ts-ignore accessedRoutes.push({ path: '/:pathMatch(.*)*', redirect: '/404', hidden: true }); diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts index 4cf1068..49bd21d 100644 --- a/src/store/modules/user.ts +++ b/src/store/modules/user.ts @@ -4,7 +4,6 @@ import { resetRouter, router } from '@/router'; import { useTagsViewStoreHook } from './tagsView'; import * as accountServices from '@/services/api/Account'; -import * as userServices from '@/services/api/User'; import { usePermissionStoreHook } from './permission'; import { getAccountInfoFromAccessToken, AccountInfo } from '@bole-core/core'; import { useClearSubModule } from '@/hooks'; @@ -64,7 +63,7 @@ // 鐢ㄦ埛鐧诲叆 loginByUsername(data: API.AccessRequestDto) { return new Promise<void>((resolve, reject) => { - userServices + accountServices .getTokenForWeb(data, { showLoading: false }) .then((res) => { if (res) { diff --git a/src/views/Account/AccountManageList.vue b/src/views/Account/AccountManageList.vue index 3633a05..c4a301b 100644 --- a/src/views/Account/AccountManageList.vue +++ b/src/views/Account/AccountManageList.vue @@ -14,13 +14,7 @@ </QueryFilterItem> </template> <template #btn> - <el-button - v-if="checkSubModuleItemShow('pageButton', 'addBtn')" - @click="openDialog()" - icon="Plus" - type="primary" - >鏂板</el-button - > + <el-button @click="openDialog()" icon="Plus" type="primary">鏂板</el-button> </template> </ProTableQueryFilterBar> <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns"> @@ -33,7 +27,6 @@ <script setup lang="ts"> import { ProTableQueryFilterBar, - OperationBtnType, ProTableV2, SearchInput, LoadingLayout, @@ -41,10 +34,9 @@ QueryFilterItem, useTable, useFormDialog, + defineOperationBtns, } from '@bole-core/components'; -import { useAccess } from '@/hooks'; -import * as userServices from '@/services/api/User'; -import { RoleClientType } from '@/constants'; +import * as accountServices from '@/services/api/Account'; import { Message, OrderInputType } from '@bole-core/core'; import AddOrEditAccountDialog from './components/AddOrEditAccountDialog.vue'; import { formatRoleName } from '@/utils'; @@ -53,13 +45,49 @@ name: 'AccountManageList', }); -const operationBtnMap: Record<string, OperationBtnType> = { - editBtn: { emits: { onClick: (role) => openDialog(role) } }, -}; +const column: API.CustomModuleColumnDto[] = [ + { + id: '1', + enCode: 'changeFlag', + name: '璐﹀彿', + }, + { + id: '2', + enCode: 'name', + name: '濮撳悕', + }, + { + id: '3', + enCode: 'idNumber', + name: '鎵嬫満鍙�', + }, + { + id: '4', + enCode: 'workType', + name: '澶囨敞', + }, +]; -const { checkSubModuleItemShow, column, operationBtns } = useAccess({ - operationBtnMap, -}); +const operationBtns = defineOperationBtns([ + { + data: { + enCode: 'editBtn', + name: '缂栬緫', + }, + emits: { + onClick: (role) => openDialog(role), + }, + }, + { + data: { + enCode: 'resetPasswordBtn', + name: '閲嶇疆瀵嗙爜', + }, + emits: { + onClick: (role) => handleResetPassword(), + }, + }, +]); const BaseState = { loading: true, @@ -80,35 +108,31 @@ reset, } = useTable( async ({ pageIndex, pageSize }, extraParamState) => { - try { - let params: API.QueryUserPageInput = { - pageModel: { - rows: pageSize, - page: pageIndex, - orderInput: extraParamState.orderInput, - }, - searchKey: extraParamState.keyword, - }; - let res = await userServices.getUserPage(params, { - showLoading: !state.loading, - }); - return res; - } catch (error) {} + // try { + // let params: API.QueryUserPageInput = { + // pageModel: { + // rows: pageSize, + // page: pageIndex, + // orderInput: extraParamState.orderInput, + // }, + // searchKey: extraParamState.keyword, + // }; + // let res = await userServices.getUserPage(params, { + // showLoading: !state.loading, + // }); + // return res; + // } catch (error) {} }, { defaultExtraParams: { orderInput: [{ property: 'id', order: OrderInputType.Desc }], keyword: '', }, - columnsRenderProps: { - roleNames: { - formatter: (row: API.UserListOutput) => row.roleNames.map(formatRoleName).join(','), - }, - }, + columnsRenderProps: {}, } ); -function openDialog(row?: API.UserListOutput) { +function openDialog(row?: any) { if (row) { handleEdit({ id: row.id, @@ -148,29 +172,31 @@ }); async function handleAddOrEdit() { - try { - let isEdit = !!editForm.id; - let params: API.CreateAccountInput = { - name: editForm.name, - userName: editForm.userName, - remark: editForm.remark, - password: editForm.password, - phoneNumber: editForm.phoneNumber, - channel: editForm.channel, - // clientId: RoleClientType.RoleBackendClientId, - roleNames: [editForm.roleName], - }; - let res; - if (isEdit) { - (params as API.UpdateAccountInput).id = editForm.id; - res = await userServices.updateAccount(params); - } else { - res = await userServices.createAccount(params); - } - if (res) { - Message.successMessage('鎿嶄綔鎴愬姛'); - getList(isEdit ? paginationState.pageIndex : 1); - } - } catch (error) {} + // try { + // let isEdit = !!editForm.id; + // let params: API.CreateAccountInput = { + // name: editForm.name, + // userName: editForm.userName, + // remark: editForm.remark, + // password: editForm.password, + // phoneNumber: editForm.phoneNumber, + // channel: editForm.channel, + // // clientId: RoleClientType.RoleBackendClientId, + // roleNames: [editForm.roleName], + // }; + // let res; + // if (isEdit) { + // (params as API.UpdateAccountInput).id = editForm.id; + // res = await accountServices.updateAccount(params); + // } else { + // res = await accountServices.createAccount(params); + // } + // if (res) { + // Message.successMessage('鎿嶄綔鎴愬姛'); + // getList(isEdit ? paginationState.pageIndex : 1); + // } + // } catch (error) {} } + +function handleResetPassword() {} </script> diff --git a/src/views/Account/components/AddOrEditAccountDialog.vue b/src/views/Account/components/AddOrEditAccountDialog.vue index c0d3ffa..97a542a 100644 --- a/src/views/Account/components/AddOrEditAccountDialog.vue +++ b/src/views/Account/components/AddOrEditAccountDialog.vue @@ -29,13 +29,6 @@ > <ProFormText placeholder="璇疯緭鍏ユ墜鏈哄彿" v-model.trim="form.phoneNumber"></ProFormText> </ProFormItemV2> - <ProFormItemV2 label="娓犻亾:" prop="channel" :check-rules="[{ message: '璇疯緭鍏ユ笭閬�' }]"> - <ProFormText - placeholder="璇疯緭鍏ユ笭閬�" - v-model.trim="form.channel" - :maxlength="30" - ></ProFormText> - </ProFormItemV2> <ProFormItemV2 label="瀵嗙爜:" prop="password" @@ -46,16 +39,6 @@ v-model.trim="form.password" :maxlength="30" ></ProFormText> - </ProFormItemV2> - <ProFormItemV2 label="瑙掕壊:" prop="roleName" :check-rules="[{ message: '璇烽�夋嫨瑙掕壊' }]"> - <ProFormRadio - v-model.trim="form.roleName" - :value-enum="allRoleList" - :button-style="false" - enum-label-key="name" - enum-value-key="realName" - :disabled="!!form.id" - /> </ProFormItemV2> <ProFormItemV2 label="澶囨敞:" prop="remark"> @@ -87,7 +70,6 @@ ProFormCheckbox, } from '@bole-core/components'; import { BooleanOptions } from '@/constants'; -import { useAllRoleList } from '@/hooks'; defineOptions({ name: 'AddOrEditAccountDialog', @@ -122,8 +104,6 @@ }>(); const dialogForm = ref<FormInstance>(); - -const { allRoleList } = useAllRoleList(); function onDialogClose() { if (!dialogForm.value) return; diff --git a/src/views/EnterpriseInfo/EnterpriseInfo.vue b/src/views/EnterpriseInfo/EnterpriseInfo.vue new file mode 100644 index 0000000..304f063 --- /dev/null +++ b/src/views/EnterpriseInfo/EnterpriseInfo.vue @@ -0,0 +1,195 @@ +<template> + <LoadingLayout :loading="state.loading"> + <AppContainer> + <ProTableQueryFilterBar @on-reset="reset"> + <template #query> + <QueryFilterItem tip-content="鏈�杩戠敵鎶ユ棩鏈�"> + <FieldDatePicker + v-model="extraParamState.date" + type="daterange" + range-separator="~" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + clearable + @change="getList()" + ></FieldDatePicker> + </QueryFilterItem> + <QueryFilterItem tip-content="鏈�杩戝彂鏀炬棩鏈�"> + <FieldDatePicker + v-model="extraParamState.date" + type="daterange" + range-separator="~" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + clearable + @change="getList()" + ></FieldDatePicker> + </QueryFilterItem> + <QueryFilterItem> + <SearchInput + v-model="extraParamState.keyword" + style="width: 300px" + placeholder="浼佷笟鍚�/缁熶竴淇$敤浠g爜" + @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 { + LoadingLayout, + AppContainer, + useTable, + ProTableQueryFilterBar, + ProTableV2, + defineOperationBtns, + SearchInput, + QueryFilterItem, + FieldDatePicker, +} from '@bole-core/components'; +import { OrderInputType } from '@bole-core/core'; +import { format } from '@/utils'; +import * as informationServices from '@/services/api/Information'; +import _ from 'lodash'; +import { ModelValueType } from 'element-plus'; + +defineOptions({ + name: 'EnterpriseInfo', +}); + +const column: API.CustomModuleColumnDto[] = [ + { + id: '1', + enCode: 'changeFlag', + name: '浼佷笟鍚�', + }, + { + id: '2', + enCode: 'name', + name: '缁熶竴绀句細淇$敤浠g爜', + }, + { + id: '3', + enCode: 'idNumber', + name: '浼佷笟绫诲瀷', + }, + { + id: '4', + enCode: 'workType', + name: '鎵�灞炲洯鍖�', + }, + { + id: '5', + enCode: 'gender', + name: '鍥尯绫诲瀷', + }, + { + id: '6', + enCode: 'age', + name: '濂栧姳閲戠敵鎶ユ鏁�', + }, + { + id: '7', + enCode: 'birthDay', + name: '鏈�杩戠敵鎶ユ棩鏈�', + }, + { + id: '8', + enCode: 'phoneNumber', + name: '濂栧姳閲戝彂鏀炬鏁�', + }, + { + id: '9', + enCode: 'phoneNumber', + name: '鏈�杩戝彂鏀炬棩鏈�', + }, + { + id: '10', + enCode: 'phoneNumber', + name: '濂栧姳閲戝彂鏀炬�婚', + }, + { + id: '11', + enCode: 'phoneNumber', + name: '濂栧姳閲戜綑棰�', + }, +]; + +const operationBtns = defineOperationBtns([ + { + data: { + enCode: 'detailBtn', + name: '璇︽儏', + }, + emits: { + onClick: (role) => goDetail(role), + }, + }, +]); + +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.GetInformationForManageInput = { + pageModel: { + rows: pageSize, + page: pageIndex, + orderInput: extraParamState.orderInput, + }, + publishStartDate: format(extraParamState.date?.[0] ?? '', 'YYYY-MM-DD 00:00:00'), + publishEndDate: format(extraParamState.date?.[1] ?? '', 'YYYY-MM-DD 23:59:59'), + }; + let res = await informationServices.getInformationForManage(params, { + showLoading: !state.loading, + }); + return res; + } catch (error) {} + }, + { + defaultExtraParams: { + keyword: '', + date: [] as unknown as ModelValueType, + orderInput: [{ property: 'creationTime', order: OrderInputType.Desc }], + }, + } +); + +function goDetail(row: any) { + router.push({ + name: 'EnterpriseInfoDetail', + params: { + id: row.id, + }, + }); +} +</script> + +<style lang="scss" scoped> +@use '@/style/common.scss' as *; +</style> diff --git a/src/views/EnterpriseInfo/EnterpriseInfoDetail.vue b/src/views/EnterpriseInfo/EnterpriseInfoDetail.vue new file mode 100644 index 0000000..f6983da --- /dev/null +++ b/src/views/EnterpriseInfo/EnterpriseInfoDetail.vue @@ -0,0 +1,13 @@ +<template> + <div>EnterpriseInfoDetail</div> +</template> + +<script setup lang="ts"> +defineOptions({ + name: 'EnterpriseInfoDetail', +}); +</script> + +<style lang="scss" scoped> +@use '@/style/common.scss' as *; +</style> diff --git a/src/views/MaterialReview/MaterialReview.vue b/src/views/MaterialReview/MaterialReview.vue new file mode 100644 index 0000000..eae7f02 --- /dev/null +++ b/src/views/MaterialReview/MaterialReview.vue @@ -0,0 +1,209 @@ +<template> + <LoadingLayout :loading="state.loading"> + <AppContainer> + <ProTableQueryFilterBar @on-reset="reset"> + <template #query> + <QueryFilterItem tip-content="鏈�杩戠敵鎶ユ棩鏈�"> + <FieldDatePicker + v-model="extraParamState.date" + type="daterange" + range-separator="~" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + clearable + @change="getList()" + ></FieldDatePicker> + </QueryFilterItem> + <QueryFilterItem tip-content="鏈�杩戝彂鏀炬棩鏈�"> + <FieldDatePicker + v-model="extraParamState.date" + type="daterange" + range-separator="~" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + clearable + @change="getList()" + ></FieldDatePicker> + </QueryFilterItem> + <QueryFilterItem> + <FieldRadio + v-model="extraParamState.showStatus" + :value-enum="DataRangeEnumText" + buttonStyle + showAllBtn + @change="getList()" + /> + </QueryFilterItem> + <QueryFilterItem> + <SearchInput + v-model="extraParamState.keyword" + style="width: 200px" + 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 { + LoadingLayout, + AppContainer, + useTable, + ProTableQueryFilterBar, + ProTableV2, + defineOperationBtns, + SearchInput, + FieldRadio, + QueryFilterItem, + FieldDatePicker, +} from '@bole-core/components'; +import { OrderInputType } from '@bole-core/core'; +import { format } from '@/utils'; +import { DataRangeEnum, DataRangeEnumText } from '@/constants'; +import * as informationServices from '@/services/api/Information'; +import _ from 'lodash'; +import { ModelValueType } from 'element-plus'; + +defineOptions({ + name: 'MaterialReview', +}); + +const column: API.CustomModuleColumnDto[] = [ + { + id: '1', + enCode: 'changeFlag', + name: '鐢宠鎵规鍙�', + }, + { + id: '2', + enCode: 'name', + name: '鐢宠鍥尯', + }, + { + id: '3', + enCode: 'idNumber', + name: '鍥尯绫诲瀷', + }, + { + id: '4', + enCode: 'workType', + name: '鐢宠濂栧姳閲戞湀浠�', + }, + { + id: '5', + enCode: 'gender', + name: '濂栧姳閲戞眹鎬婚噾棰濓紙鍏冿級', + }, + { + id: '6', + enCode: 'age', + name: '鐢虫姤鏃ユ湡', + }, + { + id: '7', + enCode: 'birthDay', + name: '瀹℃牳鏃ユ湡', + }, + { + id: '8', + enCode: 'phoneNumber', + name: '瀹℃牳鐘舵��', + }, +]; + +const operationBtns = defineOperationBtns([ + { + data: { + enCode: 'detailBtn', + name: '璇︽儏', + }, + emits: { + onClick: (role) => goDetail(role), + }, + }, + { + data: { + enCode: 'auditBtn', + name: '瀹℃牳', + }, + emits: { + onClick: (role) => goAudit(role), + }, + }, +]); + +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.GetInformationForManageInput = { + pageModel: { + rows: pageSize, + page: pageIndex, + orderInput: extraParamState.orderInput, + }, + publishStartDate: format(extraParamState.date?.[0] ?? '', 'YYYY-MM-DD 00:00:00'), + publishEndDate: format(extraParamState.date?.[1] ?? '', 'YYYY-MM-DD 23:59:59'), + }; + let res = await informationServices.getInformationForManage(params, { + showLoading: !state.loading, + }); + return res; + } catch (error) {} + }, + { + defaultExtraParams: { + keyword: '', + showStatus: '' as any as DataRangeEnum, + date: [] as unknown as ModelValueType, + orderInput: [{ property: 'creationTime', order: OrderInputType.Desc }], + }, + } +); + +function goDetail(row: any) { + router.push({ + name: 'MaterialReviewDetail', + params: { + id: row.id, + }, + }); +} +function goAudit(row: any) { + router.push({ + name: 'MaterialReviewAudit', + params: { + id: row.id, + }, + }); +} +</script> + +<style lang="scss" scoped> +@use '@/style/common.scss' as *; +</style> diff --git a/src/views/MaterialReview/MaterialReviewAudit.vue b/src/views/MaterialReview/MaterialReviewAudit.vue new file mode 100644 index 0000000..5812f49 --- /dev/null +++ b/src/views/MaterialReview/MaterialReviewAudit.vue @@ -0,0 +1,13 @@ +<template> + <div>MaterialReviewAudit</div> +</template> + +<script setup lang="ts"> +defineOptions({ + name: 'MaterialReviewAudit', +}); +</script> + +<style lang="scss" scoped> +@use '@/style/common.scss' as *; +</style> diff --git a/src/views/MaterialReview/MaterialReviewDetail.vue b/src/views/MaterialReview/MaterialReviewDetail.vue new file mode 100644 index 0000000..62c93d0 --- /dev/null +++ b/src/views/MaterialReview/MaterialReviewDetail.vue @@ -0,0 +1,13 @@ +<template> + <div>MaterialReviewDetail</div> +</template> + +<script setup lang="ts"> +defineOptions({ + name: 'MaterialReviewDetail', +}); +</script> + +<style lang="scss" scoped> +@use '@/style/common.scss' as *; +</style> diff --git a/src/views/Reward/Reward.vue b/src/views/Reward/Reward.vue new file mode 100644 index 0000000..94e7c5c --- /dev/null +++ b/src/views/Reward/Reward.vue @@ -0,0 +1,231 @@ +<template> + <LoadingLayout :loading="state.loading"> + <AppContainer> + <ProTableQueryFilterBar @on-reset="reset"> + <template #query> + <QueryFilterItem tip-content="鏈�杩戠敵鎶ユ棩鏈�"> + <FieldDatePicker + v-model="extraParamState.date" + type="daterange" + range-separator="~" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + clearable + @change="getList()" + ></FieldDatePicker> + </QueryFilterItem> + <QueryFilterItem tip-content="鏈�杩戝彂鏀炬棩鏈�"> + <FieldDatePicker + v-model="extraParamState.date" + type="daterange" + range-separator="~" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + clearable + @change="getList()" + ></FieldDatePicker> + </QueryFilterItem> + <QueryFilterItem> + <FieldRadio + v-model="extraParamState.showStatus" + :value-enum="DataRangeEnumText" + buttonStyle + showAllBtn + @change="getList()" + /> + </QueryFilterItem> + <QueryFilterItem> + <SearchInput + v-model="extraParamState.keyword" + style="width: 200px" + placeholder="鎵规鍙�" + @on-click-search="getList" + > + </SearchInput> + </QueryFilterItem> + </template> + </ProTableQueryFilterBar> + + <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns"> + </ProTableV2> + + <RewardGrantDialog v-bind="dialogProps"></RewardGrantDialog> + </AppContainer> + </LoadingLayout> +</template> + +<script setup lang="ts"> +import { + LoadingLayout, + AppContainer, + useTable, + ProTableQueryFilterBar, + ProTableV2, + defineOperationBtns, + SearchInput, + FieldRadio, + QueryFilterItem, + FieldDatePicker, + useFormDialog, + UploadUserFile, +} from '@bole-core/components'; +import { OrderInputType } from '@bole-core/core'; +import { convertApi2FormUrlOnlyOne, format } from '@/utils'; +import { DataRangeEnum, DataRangeEnumText } from '@/constants'; +import * as informationServices from '@/services/api/Information'; +import RewardGrantDialog from './components/RewardGrantDialog.vue'; +import _ from 'lodash'; +import { ModelValueType } from 'element-plus'; + +defineOptions({ + name: 'Reward', +}); + +const column: API.CustomModuleColumnDto[] = [ + { + id: '1', + enCode: 'changeFlag', + name: '鐢宠鎵规鍙�', + }, + { + id: '2', + enCode: 'name', + name: '鐢宠鍥尯', + }, + { + id: '3', + enCode: 'idNumber', + name: '鍥尯绫诲瀷', + }, + { + id: '4', + enCode: 'workType', + name: '鐢宠濂栧姳閲戞湀浠�', + }, + { + id: '5', + enCode: 'gender', + name: '濂栧姳閲戞眹鎬婚噾棰濓紙鍏冿級', + }, + { + id: '6', + enCode: 'age', + name: '鐢虫姤鏃ユ湡', + }, + { + id: '7', + enCode: 'phoneNumber', + name: '鍙戞斁鐘舵��', + }, + { + id: '8', + enCode: 'phoneNumber', + name: '鍙戞斁鏃ユ湡', + }, +]; + +const operationBtns = defineOperationBtns([ + { + data: { + enCode: 'detailBtn', + name: '鐢虫姤璇︽儏', + }, + emits: { + onClick: (role) => goDetail(role), + }, + }, + { + data: { + enCode: 'grantBtn', + name: '鍙戞斁', + }, + emits: { + onClick: (role) => openDialog(role), + }, + }, + { + data: { + enCode: 'previewBtn', + name: '鏌ョ湅鍑瘉', + }, + emits: { + onClick: (role) => handlePreview(role), + }, + }, +]); + +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.GetInformationForManageInput = { + pageModel: { + rows: pageSize, + page: pageIndex, + orderInput: extraParamState.orderInput, + }, + publishStartDate: format(extraParamState.date?.[0] ?? '', 'YYYY-MM-DD 00:00:00'), + publishEndDate: format(extraParamState.date?.[1] ?? '', 'YYYY-MM-DD 23:59:59'), + }; + let res = await informationServices.getInformationForManage(params, { + showLoading: !state.loading, + }); + return res; + } catch (error) {} + }, + { + defaultExtraParams: { + keyword: '', + showStatus: '' as any as DataRangeEnum, + date: [] as unknown as ModelValueType, + orderInput: [{ property: 'creationTime', order: OrderInputType.Desc }], + }, + } +); + +function goDetail(row: any) { + router.push({ + name: 'RewardDeclareDetail', + params: { + id: row.id, + }, + }); +} + +const { dialogProps, handleAdd, handleEdit, editForm } = useFormDialog({ + defaultFormParams: { + id: '', + url: [] as UploadUserFile[], + }, +}); + +function openDialog(row?: API.IncentivePaymentsManageListOutput) { + handleEdit({ + id: row.enterpriseName, + url: convertApi2FormUrlOnlyOne(row.issueVouchersUrl), + }); +} + +function handlePreview(row?: API.IncentivePaymentsManageListOutput) {} +</script> + +<style lang="scss" scoped> +@use '@/style/common.scss' as *; +</style> diff --git a/src/views/Reward/RewardDeclareDetail.vue b/src/views/Reward/RewardDeclareDetail.vue new file mode 100644 index 0000000..6510a7c --- /dev/null +++ b/src/views/Reward/RewardDeclareDetail.vue @@ -0,0 +1,13 @@ +<template> + <div>RewardDeclareDetail</div> +</template> + +<script setup lang="ts"> +defineOptions({ + name: 'RewardDeclareDetail', +}); +</script> + +<style lang="scss" scoped> +@use '@/style/common.scss' as *; +</style> diff --git a/src/views/Reward/components/RewardGrantDialog.vue b/src/views/Reward/components/RewardGrantDialog.vue new file mode 100644 index 0000000..a6b4b2c --- /dev/null +++ b/src/views/Reward/components/RewardGrantDialog.vue @@ -0,0 +1,105 @@ +<template> + <ProDialog + title="濂栧姳閲戝彂鏀�" + v-model="innerVisible" + destroy-on-close + draggable + bodyNoPaddingBottom + @close="onDialogClose" + width="600px" + > + <ProForm :model="innerForm" ref="dialogForm" label-width="120px"> + <ProFormItemV2 + label="涓婁紶鍙戞斁鍑瘉:" + prop="url" + :check-rules="[{ message: '璇蜂笂浼犲彂鏀惧嚟璇�', type: 'upload' }]" + > + <ProFormUpload + v-model:file-url="innerForm.url" + :limit="1" + :limitFileSize="10" + accept="doc,docx,pdf" + > + </ProFormUpload> + </ProFormItemV2> + </ProForm> + <template #footer> + <span class="dialog-footer"> + <el-button @click="emit('onCancel')"> 鍙栨秷 </el-button> + <el-button type="primary" @click="handleConfirm">纭畾</el-button> + </span> + </template> + </ProDialog> +</template> + +<script setup lang="ts"> +import { + ProDialog, + UploadUserFile, + ProForm, + ProFormItemV2, + ProFormSelect, + ProFormInputNumber, + ProFormUpload, +} from '@bole-core/components'; +import { FormInstance } from 'element-plus'; + +defineOptions({ + name: 'RewardGrantDialog', +}); + +type Props = { + modelValue: boolean; + form?: { + id: string; + url: UploadUserFile[]; + }; +}; + +const props = withDefaults(defineProps<Props>(), { + modelValue: false, +}); + +const emit = defineEmits<{ + (e: 'update:modelValue', value: boolean): void; + (e: 'update:form', value: Props['form']): void; + (e: 'onConfirm'): void; + (e: 'onCancel'): void; +}>(); + +const innerVisible = computed({ + get() { + return props.modelValue; + }, + set(val) { + emit('update:modelValue', val); + }, +}); + +const innerForm = computed({ + get() { + return props.form; + }, + set(val) { + emit('update:form', val); + }, +}); + +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> -- Gitblit v1.9.1