From 65c7175a1d7d448f91ee61a8a9aa935263939d37 Mon Sep 17 00:00:00 2001 From: wupengfei <834520024@qq.com> Date: 星期四, 17 四月 2025 10:10:22 +0800 Subject: [PATCH] feat: 接口对接 --- src/views/EnterpriseManage/components/AddOrEditEnterpriseView.vue | 45 + src/views/CPersonManage/CPersonManageList.vue | 228 ++++++++++ src/views/CPersonManage/components/CPersonDetailDialog.vue | 197 +++++++++ src/views/EnterpriseManage/components/ConfigureDialog.vue | 15 src/views/OperationManage/components/AddOrEditAdvertisementDialog.vue | 181 ++++++++ src/constants/enum.ts | 16 src/constants/cPerson.ts | 51 ++ src/views/OperationManage/OperationManageList.vue | 209 +++++++++ src/views/TaskManage/components/TaskDetailView.vue | 75 +++ src/constants/index.ts | 1 src/views/TaskManage/TaskManageDetail.vue | 32 + src/views/EnterpriseManage/EnterpriseManageList.vue | 30 src/views/TaskManage/TaskManageList.vue | 163 +++++++ 13 files changed, 1,204 insertions(+), 39 deletions(-) diff --git a/src/constants/cPerson.ts b/src/constants/cPerson.ts new file mode 100644 index 0000000..f2ebe7e --- /dev/null +++ b/src/constants/cPerson.ts @@ -0,0 +1,51 @@ +export enum FlexWorkerEleSignEnum { + /** + * 鏈绾� + */ + WaitSign = 10, + /** + * 宸茬绾� + */ + HasSign = 20, + /** + * 宸茶В绾� + */ + CancelSign = 30, +} + +export const FlexWorkerEleSignEnumText = { + [FlexWorkerEleSignEnum.WaitSign]: '鏈绾�', + [FlexWorkerEleSignEnum.HasSign]: '宸茬绾�', + [FlexWorkerEleSignEnum.CancelSign]: '宸茶В绾�', +}; + +export enum FlexTaskWorkerHireEnum { + /** + * 寰呯绾� + */ + WaitForSign = 1, + /** + * 寰呭鐞� + */ + Wait = 10, + /** + * 宸插綍鐢� + */ + Hired = 20, + /** + * 宸茶阿缁� + */ + Refused = 30, + /** + * 宸茶В绾� + */ + CancelSign = 40, +} + +export const FlexTaskWorkerHireEnumText = { + [FlexTaskWorkerHireEnum.WaitForSign]: '寰呯绾�', + [FlexTaskWorkerHireEnum.Wait]: '寰呭鐞�', + [FlexTaskWorkerHireEnum.Hired]: '宸插綍鐢�', + [FlexTaskWorkerHireEnum.Refused]: '宸茶阿缁�', + [FlexTaskWorkerHireEnum.CancelSign]: '宸茶В绾�', +}; diff --git a/src/constants/enum.ts b/src/constants/enum.ts index e403f0e..6cc4c11 100644 --- a/src/constants/enum.ts +++ b/src/constants/enum.ts @@ -43,3 +43,19 @@ { label: '鏄�', value: true }, { label: '鍚�', value: false }, ]; + +export enum Gender { + /** + * 鐢� + */ + Male = 1, + /** + * 濂� + */ + Female = 2, +} + +export const GenderText = { + [Gender.Male]: '鐢�', + [Gender.Female]: '濂�', +}; diff --git a/src/constants/index.ts b/src/constants/index.ts index 8f98d65..5dd6368 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -11,3 +11,4 @@ export * from './app'; export * from './dic'; export * from './enterprise'; +export * from './cPerson'; diff --git a/src/views/CPersonManage/CPersonManageList.vue b/src/views/CPersonManage/CPersonManageList.vue new file mode 100644 index 0000000..6a801c6 --- /dev/null +++ b/src/views/CPersonManage/CPersonManageList.vue @@ -0,0 +1,228 @@ +<template> + <LoadingLayout :loading="state.loading"> + <AppContainer> + <ProTableQueryFilterBar @on-reset="reset"> + <template #query> + <QueryFilterItem tip-content="瀹炲悕鐘舵��"> + <FieldRadio + v-model="extraParamState.realVerifyStatus" + :value-enum="[ + { + value: false, + label: '鏈疄鍚�', + }, + { + value: true, + label: '宸插疄鍚�', + }, + ]" + buttonStyle + showAllBtn + @change="getList()" + /> + </QueryFilterItem> + <QueryFilterItem tip-content="鏈�杩戝綍鐢ㄦ椂闂�"> + <FieldDatePicker + v-model="extraParamState.nearlyHireDateTime" + type="daterange" + range-separator="~" + start-placeholder="寮�濮嬫椂闂�" + end-placeholder="缁撴潫鏃堕棿" + clearable + @change="getList()" + ></FieldDatePicker> + </QueryFilterItem> + <QueryFilterItem tip-content="鏈�杩戠绾︽椂闂�"> + <FieldDatePicker + v-model="extraParamState.nearlySignDateTime" + type="daterange" + range-separator="~" + start-placeholder="寮�濮嬫椂闂�" + end-placeholder="缁撴潫鏃堕棿" + clearable + @change="getList()" + ></FieldDatePicker> + </QueryFilterItem> + <QueryFilterItem> + <SearchInput + v-model="extraParamState.searchKeys" + style="width: 300px" + placeholder="濮撳悕/鎵嬫満/韬唤璇佸彿/瀹㈡埛" + @on-click-search="getList" + @keyup.enter="getList()" + > + </SearchInput> + </QueryFilterItem> + </template> + </ProTableQueryFilterBar> + <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns"> + </ProTableV2> + </AppContainer> + <CPersonDetailDialog v-bind="dialogProps"></CPersonDetailDialog> + </LoadingLayout> +</template> + +<script setup lang="ts"> +import { + ProTableQueryFilterBar, + OperationBtnType, + ProTableV2, + SearchInput, + LoadingLayout, + AppContainer, + QueryFilterItem, + useTable, + useFormDialog, + FieldRadio, + FieldDatePicker, + UploadUserFile, +} from '@bole-core/components'; +import { useAccess, useGlobalEventContext } from '@/hooks'; +import * as flexEnterpriseWokerServices from '@/services/api/FlexEnterpriseWoker'; +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'; + +defineOptions({ + name: 'CPersonManageList', +}); + +const operationBtnMap: Record<string, OperationBtnType> = { + detailBtn: { emits: { onClick: (role) => openDialog(role) } }, +}; + +const { checkSubModuleItemShow, column, operationBtns } = useAccess({ + operationBtnMap, +}); + +const eventContext = useGlobalEventContext(); + +eventContext.addEvent('enterprise:add', () => { + getList(); +}); + +eventContext.addEvent('enterprise:edit', () => { + getList(paginationState.pageIndex); +}); + +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.GetUserClientForBackInput = { + pageModel: { + rows: pageSize, + page: pageIndex, + orderInput: extraParamState.orderInput, + }, + searchKeys: extraParamState.searchKeys, + nearlyHireDateTimeBegin: format( + extraParamState.nearlyHireDateTime?.[0] ?? '', + 'YYYY-MM-DD 00:00:00' + ), + nearlyHireDateTimeEnd: format( + extraParamState.nearlyHireDateTime?.[1] ?? '', + 'YYYY-MM-DD 23:59:59' + ), + nearlySignDateTimeBegin: format( + extraParamState.nearlySignDateTime?.[0] ?? '', + 'YYYY-MM-DD 00:00:00' + ), + nearlySignDateTimeEnd: format( + extraParamState.nearlySignDateTime?.[1] ?? '', + 'YYYY-MM-DD 23:59:59' + ), + realVerifyStatus: extraParamState.realVerifyStatus, + }; + + let res = await flexEnterpriseWokerServices.getUserClientList(params, { + showLoading: !state.loading, + }); + return res; + } catch (error) { + console.log('error: ', error); + } + }, + { + defaultExtraParams: { + searchKeys: '', + realVerifyStatus: '' as any as boolean, + nearlyHireDateTime: [] as unknown as ModelValueType, + nearlySignDateTime: [] as unknown as ModelValueType, + orderInput: [{ property: 'userId', order: OrderInputType.Desc }], + }, + queryKey: ['flexEnterpriseWokerServices/getUserClientList'], + columnsRenderProps: { + realVerifyStatus: { + type: 'enum', + valueEnum: [ + { label: '宸插疄鍚�', value: true }, + { label: '鏈疄鍚�', value: false }, + ], + }, + realVerifyTime: { type: 'date' }, + }, + } +); + +async function openDialog(row?: API.GetUserClientForBackOutput) { + const res = await getUserDetailForBack('98ac4c01-3598-ebf3-fa7d-3a189bb6b587'); + handleEdit({ + userId: row.userId ?? '98ac4c01-3598-ebf3-fa7d-3a189bb6b587', + name: res.name, + idNumber: res.idNumber, + contactPhone: res.contactPhone, + age: res.age, + certificateFrontImgUrl: res.certificateFrontImgUrl + ? convertApi2FormUrlOnlyOne(res.certificateFrontImgUrl) + : [], + certificateBackImgUrl: res.certificateBackImgUrl + ? convertApi2FormUrlOnlyOne(res.certificateBackImgUrl) + : [], + + genderType: Gender.Female, + tabType: 'user', + }); +} + +const { dialogProps, handleEdit } = useFormDialog({ + defaultFormParams: { + userId: '', + name: '', + idNumber: '', + contactPhone: '', + age: 0, + genderType: '' as any as Gender, + certificateFrontImgUrl: [] as UploadUserFile[], + certificateBackImgUrl: [] as UploadUserFile[], + + tabType: '', + }, +}); + +async function getUserDetailForBack(userId: string) { + try { + return await flexEnterpriseWokerServices.getUserDetailForBack({ userId: userId }); + } catch (error) {} +} +</script> diff --git a/src/views/CPersonManage/components/CPersonDetailDialog.vue b/src/views/CPersonManage/components/CPersonDetailDialog.vue new file mode 100644 index 0000000..e6d9e99 --- /dev/null +++ b/src/views/CPersonManage/components/CPersonDetailDialog.vue @@ -0,0 +1,197 @@ +<template> + <ProDialog title="鐢宠璇︽儏" v-model="innerVisible" width="1200px" destroy-on-close> + <ProTabs v-model="innerForm.tabType" hasBorder> + <ProTabPane lazy label="浜哄憳璇︽儏" name="user"> + <ProForm :model="form" ref="dialogForm" label-width="120px" is-read> + <ProFormItemV2 label="濮撳悕:" prop="name"> + <ProFormText v-model.trim="innerForm.name" /> + </ProFormItemV2> + <ProFormItemV2 label="韬唤璇佸彿:" prop="idNumber"> + <ProFormText v-model.trim="innerForm.idNumber" /> + </ProFormItemV2> + <ProFormItemV2 label="鎵嬫満鍙�:" prop="contactPhone"> + <ProFormText v-model.trim="innerForm.contactPhone" /> + </ProFormItemV2> + <ProFormItemV2 label="鎬у埆:" prop="age"> + <ProFormRadio v-model="innerForm.genderType" :value-enum="GenderText"></ProFormRadio> + </ProFormItemV2> + <ProFormItemV2 label="骞撮緞:" prop="age"> + <ProFormInputNumber v-model="innerForm.age" unit="宀�"></ProFormInputNumber> + </ProFormItemV2> + <ProFormItemV2 label="韬唤璇佹闈�:" prop="certificateFrontImgUrl"> + <ProFormImageUpload v-model:file-url="innerForm.certificateFrontImgUrl" /> + </ProFormItemV2> + <ProFormItemV2 label="韬唤璇佸弽闈�:" prop="certificateBackImgUrl"> + <ProFormImageUpload v-model:file-url="innerForm.certificateBackImgUrl" /> + </ProFormItemV2> + </ProForm> + </ProTabPane> + <ProTabPane lazy label="绛剧害璇︽儏" name="sign"> + <ProDialogTableWrapper :height="400"> + <ProTableV2 v-bind="proTableProps" :columns="column" :show-operation-column="false"> + </ProTableV2> + </ProDialogTableWrapper> + </ProTabPane> + </ProTabs> + </ProDialog> +</template> + +<script setup lang="ts"> +import { + ProDialog, + ProTableV2, + ProDialogTableWrapper, + ProTabs, + ProTabPane, + useTable, + ProForm, + ProFormItemV2, + ProFormText, + UploadUserFile, + ProFormImageUpload, + ProFormRadio, + ProFormInputNumber, +} from '@bole-core/components'; +import { OrderInputType } from '@bole-core/core'; +import _ from 'lodash'; +import * as flexEnterpriseWokerServices from '@/services/api/FlexEnterpriseWoker'; +import { setOSSLink } from '@/utils'; +import { FlexTaskWorkerHireEnumText, FlexWorkerEleSignEnumText, Gender, GenderText } from '@/constants'; + +defineOptions({ + name: 'CPersonDetailDialog', +}); + +type Props = { + modelValue: boolean; + form: { + tabType: string; + userId: string; + name: string; + idNumber: string; + contactPhone: string; + age: number; + genderType:Gender; + certificateFrontImgUrl: UploadUserFile[]; + certificateBackImgUrl: 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: 'onCancel'): void; +}>(); + +const column: API.CustomModuleColumnDto[] = [ + { + id: '1', + enCode: 'enterpirseName', + name: '鎵�灞炲鎴�', + }, + { + id: '2', + enCode: 'applyTime', + name: '鎶ュ悕鏃堕棿', + }, + { + id: '3', + enCode: 'hireStatus', + name: '褰曠敤鐘舵��', + }, + { + id: '4', + enCode: 'hireDateTime', + name: '褰曠敤鏃堕棿', + }, + { + id: '5', + enCode: 'userSignStatus', + name: '绛剧害鐘舵��', + }, + { + id: '6', + enCode: 'enterSignStatus', + name: '浼佷笟绛剧害鐘舵��', + }, + { + id: '7', + enCode: 'enterSignTime', + name: '浼佷笟绛剧害鏃堕棿', + }, + { + id: '8', + enCode: 'contractUrl', + name: '鐢靛瓙鍚堝悓', + }, +]; + +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); + }, +}); + +watch( + () => innerVisible.value, + (val) => { + if (val) { + getList(); + } + } +); + +const { + getDataSource: getList, + proTableProps, + paginationState, + extraParamState, +} = useTable( + async ({ pageIndex, pageSize }, extraParamState) => { + try { + let params: API.GetUserClientSignListInput = { + pageModel: { + rows: pageSize, + page: pageIndex, + orderInput: extraParamState.orderInput, + }, + userId: props.form.userId, + }; + let res = await flexEnterpriseWokerServices.getUserClientSignList(params); + return res; + } catch (error) {} + }, + { + defaultExtraParams: { + orderInput: [{ property: 'applyTime', order: OrderInputType.Desc }], + }, + columnsRenderProps: { + applyTime: { type: 'date' }, + hireDateTime: { type: 'date' }, + userSignTime: { type: 'date' }, + hireStatus: { type: 'enum', valueEnum: FlexTaskWorkerHireEnumText }, + userSignStatus: { type: 'enum', valueEnum: FlexWorkerEleSignEnumText }, + enterSignStatus: { type: 'enum', valueEnum: FlexWorkerEleSignEnumText }, + }, + } +); +</script> + +<style lang="scss" scoped> +@use '@/style/common.scss' as *; +</style> diff --git a/src/views/EnterpriseManage/EnterpriseManageList.vue b/src/views/EnterpriseManage/EnterpriseManageList.vue index 28e00da..2df6ee6 100644 --- a/src/views/EnterpriseManage/EnterpriseManageList.vue +++ b/src/views/EnterpriseManage/EnterpriseManageList.vue @@ -144,7 +144,7 @@ { defaultExtraParams: { searchWord: '', - orderInput: [{ property: 'id', order: OrderInputType.Asc }], + orderInput: [{ property: 'id', order: OrderInputType.Desc }], flexEnterpriseSettingStatus: '' as any as FlexEnterpriseSettingStatus, }, queryKey: ['flexEnterpriseServices/getFlexEnterpriseList'], @@ -159,21 +159,24 @@ if (row) { handleEdit({ id: row.id, + enterpriseConfigureType: EnterpriseConfigureType.Bank, flexEnterpirseId: row.id, - openBank: row.cityName, - openBranchBank: row.cityName, - bankAccount: row.cityName, - verifyStatus: VerifyStatus.NotVerify, - signChannel: SignChannelEnum.Alipay, - chargeType: ChargeTypeEnum.Group, - realVerifyCost: 0, - signCost: 0, - mergeSignCost: 0, - messageCost: 0, - messageChannel: MessageChannelEnum.Alipay, + openBank: row.flexEnterpriseBankDto?.openBank, + openBranchBank: row.flexEnterpriseBankDto?.openBranchBank, + bankAccount: row.flexEnterpriseBankDto?.bankAccount, + verifyStatus: row.flexEnterpriseBankDto?.verifyStatus, + signChannel: row.enterpriseSignSettingDto?.signChannel, + chargeType: row.enterpriseSignSettingDto?.chargeType, + realVerifyCost: row.enterpriseSignSettingDto?.realVerifyCost ?? 0, + signCost: row.enterpriseSignSettingDto?.signCost ?? 0, + mergeSignCost: row.enterpriseSignSettingDto?.mergeSignCost ?? 0, + messageCost: row.flexEnterpriseMessageSettingDto?.messageCost ?? 0, + messageChannel: row.flexEnterpriseMessageSettingDto?.messageChannel, }); } else { - handleAdd({}); + handleAdd({ + enterpriseConfigureType: EnterpriseConfigureType.Bank, + }); } } @@ -182,6 +185,7 @@ defaultFormParams: { id: '', flexEnterpirseId: '', + enterpriseConfigureType: '' as any as EnterpriseConfigureType, openBank: '', openBranchBank: '', bankAccount: '', diff --git a/src/views/EnterpriseManage/components/AddOrEditEnterpriseView.vue b/src/views/EnterpriseManage/components/AddOrEditEnterpriseView.vue index bdc92b9..b5a01b5 100644 --- a/src/views/EnterpriseManage/components/AddOrEditEnterpriseView.vue +++ b/src/views/EnterpriseManage/components/AddOrEditEnterpriseView.vue @@ -2,14 +2,18 @@ <LoadingLayout :loading="isEdit && isLoading"> <AppScrollContainer> <ChunkCell title="浼佷笟鍩烘湰淇℃伅"> - <ProForm :model="form" :rules="rules" ref="formRef" label-width="120px" :is-read="isDetail"> + <ProForm :model="form" ref="formRef" label-width="140px" :is-read="isDetail"> <ProFormCol> <ProFormColItem :span="12"> - <ProFormItemV2 label="浼佷笟鍚嶇О:" prop="enterpriseName"> + <ProFormItemV2 + label="浼佷笟鍚嶇О:" + prop="enterpriseName" + :check-rules="[{ message: '璇疯緭鍏ヤ紒涓氬悕绉�' }]" + > <ProFormText v-model.trim="form.enterpriseName" :maxlength="30" - placeholder="璇疯緭鍏ヤ緵搴斿晢鍚嶇О" + placeholder="璇疯緭鍏ヤ紒涓氬悕绉�" /> </ProFormItemV2> </ProFormColItem> @@ -38,7 +42,11 @@ </ProFormCol> <ProFormCol> <ProFormColItem :span="12"> - <ProFormItemV2 label="缁熶竴绀句細淇$敤浠g爜:" prop="societyCreditCode"> + <ProFormItemV2 + label="缁熶竴绀句細淇$敤浠g爜:" + prop="societyCreditCode" + :check-rules="[{ message: '璇疯緭鍏ョ粺涓�绀句細淇$敤浠g爜', type: 'societyCreditCode' }]" + > <ProFormText v-model.trim="form.societyCreditCode" placeholder="璇疯緭鍏ョ粺涓�绀句細淇$敤浠g爜" @@ -100,7 +108,6 @@ <ChunkCell title="鑱旂郴淇℃伅"> <ProForm :model="form" - :rules="rules" ref="settingFormRef" label-width="140px" :scroll-to-error="false" @@ -108,7 +115,11 @@ > <ProFormCol> <ProFormColItem :span="12"> - <ProFormItemV2 label="鑱旂郴浜�:" prop="contact"> + <ProFormItemV2 + label="鑱旂郴浜�:" + prop="contact" + :check-rules="[{ message: '璇疯緭鍏ヨ仈绯讳汉' }]" + > <ProFormText v-model.trim="form.contact" :maxlength="30" @@ -119,7 +130,11 @@ </ProFormCol> <ProFormCol> <ProFormColItem :span="12"> - <ProFormItemV2 label="鑱旂郴鐢佃瘽:" prop="contactPhone"> + <ProFormItemV2 + label="鑱旂郴鐢佃瘽:" + prop="contactPhone" + :check-rules="[{ message: '璇疯緭鍏ヨ仈绯荤數璇�', type: 'phone' }]" + > <ProFormText v-model.trim="form.contactPhone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�" /> </ProFormItemV2> </ProFormColItem> @@ -141,7 +156,6 @@ <ChunkCell title="璐﹀彿淇℃伅"> <ProForm :model="form" - :rules="rules" ref="accountFormRef" label-width="140px" :scroll-to-error="false" @@ -149,7 +163,11 @@ > <ProFormCol> <ProFormColItem :span="12"> - <ProFormItemV2 label="璐﹀彿:" prop="contact"> + <ProFormItemV2 + label="璐﹀彿:" + prop="contact" + :check-rules="[{ message: '璇疯緭鍏ヨ处鍙�' }]" + > <ProFormText v-model.trim="form.contact" :maxlength="30" placeholder="璇疯緭鍏ヨ处鍙�" /> </ProFormItemV2> </ProFormColItem> @@ -244,15 +262,6 @@ const formRef = ref<FormInstance>(); const settingFormRef = ref<FormInstance>(); const accountFormRef = ref<FormInstance>(); - -const rules = reactive<FormRules>({ - enterpriseName: [{ required: true, message: '璇疯緭鍏ヤ紒涓氬悕绉�', trigger: 'blur' }], - contact: [{ required: true, message: '璇疯緭鍏ヨ仈绯讳汉', trigger: 'blur' }], - contactPhone: [ - { required: true, message: '璇疯緭鍏ヨ仈绯荤數璇�', trigger: 'blur' }, - { message: '璇疯緭鍏ユ纭殑鑱旂郴鐢佃瘽', trigger: 'blur', pattern: BoleRegExp.RegPhoneNumber }, - ], -}); async function handleSubmit() { try { diff --git a/src/views/EnterpriseManage/components/ConfigureDialog.vue b/src/views/EnterpriseManage/components/ConfigureDialog.vue index c91035b..0224cb3 100644 --- a/src/views/EnterpriseManage/components/ConfigureDialog.vue +++ b/src/views/EnterpriseManage/components/ConfigureDialog.vue @@ -3,12 +3,12 @@ <ProForm :model="innerForm" ref="dialogForm" label-width="100px"> <ProFormItemV2 label="" prop="enterpriseConfigureType" label-width="0"> <ProFormRadio - v-model="enterpriseConfigureType" + v-model="innerForm.enterpriseConfigureType" :value-enum="EnterpriseConfigureTypeText" buttonStyle /> </ProFormItemV2> - <template v-if="enterpriseConfigureType === EnterpriseConfigureType.Bank"> + <template v-if="innerForm.enterpriseConfigureType === EnterpriseConfigureType.Bank"> <ProFormItemV2 label="寮�鎴锋�昏:" prop="openBank"> <ProFormText v-model.trim="innerForm.openBank" @@ -40,7 +40,7 @@ > </ProFormItemV2> </template> - <template v-if="enterpriseConfigureType === EnterpriseConfigureType.Electronic"> + <template v-if="innerForm.enterpriseConfigureType === EnterpriseConfigureType.Electronic"> <div class="configure-dialog-form-title">閫氶亾閰嶇疆</div> <ProFormItemV2 label="鍚嶇О:" @@ -95,7 +95,7 @@ </ProFormItemV2> </template> </template> - <template v-if="enterpriseConfigureType === EnterpriseConfigureType.ShortMessage"> + <template v-if="innerForm.enterpriseConfigureType === EnterpriseConfigureType.ShortMessage"> <div class="configure-dialog-form-title">閫氶亾閰嶇疆</div> <ProFormItemV2 label="鍚嶇О:" @@ -162,6 +162,7 @@ type Props = { modelValue: boolean; form?: { + enterpriseConfigureType: EnterpriseConfigureType; openBank: string; openBranchBank: string; bankAccount: string; @@ -180,12 +181,10 @@ modelValue: false, }); -const enterpriseConfigureType = ref<EnterpriseConfigureType>(EnterpriseConfigureType.Bank); - const emit = defineEmits<{ (e: 'update:modelValue', value: boolean): void; (e: 'update:form', value: Props['form']): void; - (e: 'onConfirm', value: EnterpriseConfigureType): void; + (e: 'onConfirm'): void; (e: 'onCancel'): void; }>(); @@ -220,7 +219,7 @@ if (!dialogForm.value) return; dialogForm.value.validate((valid) => { if (valid) { - emit('onConfirm', enterpriseConfigureType.value); + emit('onConfirm'); } else { return; } diff --git a/src/views/OperationManage/OperationManageList.vue b/src/views/OperationManage/OperationManageList.vue new file mode 100644 index 0000000..4771789 --- /dev/null +++ b/src/views/OperationManage/OperationManageList.vue @@ -0,0 +1,209 @@ +<template> + <LoadingLayout :loading="state.loading"> + <AppContainer> + <ProTableQueryFilterBar @on-reset="reset"> + <template #query> + <QueryFilterItem> + <FieldSelect + v-model="extraParamState.pageType" + placeholder="骞垮憡椤甸潰" + :value-enum="FlexWorkerEleSignEnumText" + clearable + @change="getAdvertiseOnShowList()" + /> + </QueryFilterItem> + <QueryFilterItem tip-content="鐘舵��"> + <FieldRadio + v-model="extraParamState.status" + :value-enum="FlexWorkerEleSignEnumText" + buttonStyle + showAllBtn + @change="getAdvertiseOnShowList()" + /> + </QueryFilterItem> + <QueryFilterItem tip-content="骞垮憡寮�濮嬫椂闂�"> + <FieldDatePicker + v-model="extraParamState.beginDate" + type="daterange" + range-separator="~" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + clearable + @change="getAdvertiseOnShowList()" + ></FieldDatePicker> + </QueryFilterItem> + <QueryFilterItem tip-content="骞垮憡缁撴潫鏃堕棿"> + <FieldDatePicker + v-model="extraParamState.endDate" + type="daterange" + range-separator="~" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + clearable + @change="getAdvertiseOnShowList()" + ></FieldDatePicker> + </QueryFilterItem> + <QueryFilterItem> + <SearchInput + v-model="extraParamState.keyword" + style="width: 260px" + placeholder="骞垮憡鍚嶇О" + @on-click-search="getAdvertiseOnShowList" + > + </SearchInput> + </QueryFilterItem> + </template> + <template #btn> + <el-button + v-if="checkSubModuleItemShow('pageButton', 'addBtn')" + @click="openDialog()" + icon="Plus" + type="primary" + >鏂板</el-button + > + </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, + useFormDialog, + FieldDatePicker, + FieldSelect, + FieldRadio, + UploadUserFile, +} from '@bole-core/components'; +import { useAccess } from '@/hooks'; +import { FlexWorkerEleSignEnumText } from '@/constants'; +import { ModelValueType } from 'element-plus'; +import * as flexEnterpriseWokerServices from '@/services/api/FlexEnterpriseWoker'; +import { format, setOSSLink, convertApi2FormUrl, convertFormUrl2Api } from '@/utils'; +import { OrderInputType, Message } from '@bole-core/core'; + +defineOptions({ + name: 'OperationManageList', +}); + +const operationBtnMap: Record<string, OperationBtnType> = { + editBtn: { emits: { onClick: (role) => openDialog(role) } }, + takeOnBtn: { + emits: { onClick: (role) => setAdvertiseOnShowStatus(role) }, + extraProps: { + hide: (row) => row.status, + }, + }, + takeDownBtn: { + emits: { onClick: (role) => setAdvertiseOnShowStatus(role) }, + props: { type: 'danger' }, + extraProps: { + hide: (row) => !row.status, + }, + }, + logBtn: { emits: { onClick: (role) => openDialog(role) } }, +}; + +const { checkSubModuleItemShow, column, operationBtns } = useAccess({ + operationBtnMap, +}); + +const BaseState = { + loading: true, +}; + +const state = reactive({ ...BaseState }); + +onMounted(async () => { + await getAdvertiseOnShowList(); + state.loading = false; +}); + +const { + getDataSource: getAdvertiseOnShowList, + proTableProps, + paginationState, + extraParamState, + reset, +} = useTable( + async ({ pageIndex, pageSize }, extraParamState) => { + try { + let params: API.GetUserClientForBackInput = { + pageModel: { + rows: pageSize, + page: pageIndex, + orderInput: extraParamState.orderInput, + }, + searchKeys: extraParamState.keyword, + }; + let res = await flexEnterpriseWokerServices.getUserClientList(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: 'sort', order: OrderInputType.Asc }], + }, + columnsRenderProps: {}, + columnPropsMap: ['advertiseBeginDate', 'advertiseEndDate'], + } +); + +function openDialog(row?) { + if (row) { + handleEdit({ + id: row.id, + pageType: row.pageType, + advertiseName: row.advertiseName, + advertiseLink: row.advertiseLink, + imgInfo: row.imgInfo.map((x) => convertApi2FormUrl(x.imgUrl)), + date: [format(row.advertiseBeginDate), format(row.advertiseEndDate)], + sort: row.sort, + }); + } else { + handleAdd(); + } +} + +const { dialogProps, handleAdd, handleEdit, editForm, dialogState } = useFormDialog({ + onConfirm: handleAddOrEdit, + defaultFormParams: { + title: '鏂板骞垮憡', + id: '', + pageType: '' as any as number, + advertiseName: '', + advertiseLink: '', + imgInfo: [] as UploadUserFile[], + date: [] as unknown as ModelValueType, + sort: 0, + }, + editTitle: '缂栬緫骞垮憡', +}); + +async function handleAddOrEdit() { + try { + } catch (error) {} +} + +async function setAdvertiseOnShowStatus(row) { + try { + } catch (error) {} +} +</script> diff --git a/src/views/OperationManage/components/AddOrEditAdvertisementDialog.vue b/src/views/OperationManage/components/AddOrEditAdvertisementDialog.vue new file mode 100644 index 0000000..8983528 --- /dev/null +++ b/src/views/OperationManage/components/AddOrEditAdvertisementDialog.vue @@ -0,0 +1,181 @@ +<template> + <ProDialog + :title="innerForm.title" + v-model="innerVisible" + @close="onDialogClose" + destroy-on-close + > + <ProForm :rules="rules" :model="innerForm" ref="dialogForm" label-width="120px"> + <ProFormItemV2 + label="骞垮憡椤甸潰:" + prop="pageType" + :check-rules="[{ message: '璇烽�夋嫨骞垮憡椤甸潰' }]" + > + <ProFormSelect + placeholder="璇烽�夋嫨骞垮憡椤甸潰" + :value-enum="FlexWorkerEleSignEnumText" + clearable + v-model="innerForm.pageType" + ></ProFormSelect> + </ProFormItemV2> + <ProFormItemV2 + label="骞垮憡鍚嶇О:" + prop="advertiseName" + :check-rules="[{ message: '璇疯緭鍏ュ箍鍛婂悕绉�' }, { max: 20, message: '涓嶈兘瓒呰繃20涓瓧绗�' }]" + > + <ProFormText + placeholder="璇疯緭鍏ュ箍鍛婂悕绉�" + v-model.trim="innerForm.advertiseName" + :maxlength="20" + ></ProFormText> + </ProFormItemV2> + <ProFormItemV2 + label="骞垮憡浜у搧閾炬帴:" + prop="advertiseLink" + :check-rules="[ + { type: 'urlWithParams', message: '璇疯緭鍏ュ箍鍛婁骇鍝侀摼鎺�' }, + { message: '璇疯緭鍏ユ纭殑骞垮憡浜у搧閾炬帴' }, + ]" + > + <ProFormText + placeholder="璇疯緭鍏ュ箍鍛婁骇鍝侀摼鎺�" + v-model.trim="innerForm.advertiseLink" + :maxlength="150" + ></ProFormText> + </ProFormItemV2> + <ProFormItemV2 + label="骞垮憡鍥剧墖:" + prop="imgInfo" + :check-rules="[{ type: 'array', message: '璇烽�夋嫨骞垮憡鍥剧墖' }]" + > + <ProFormImageUpload + :fileDirectory="OssAdvertise" + v-model:file-url="innerForm.imgInfo" + :limitFileCount="1" + ></ProFormImageUpload> + </ProFormItemV2> + <ProFormItemV2 + label="骞垮憡鏃ユ湡:" + prop="date" + :check-rules="[{ type: 'array', message: '璇烽�夋嫨骞垮憡鏃ユ湡' }]" + > + <ProFormDatePicker + v-model="innerForm.date" + type="daterange" + range-separator="~" + start-placeholder="骞垮憡璧峰鏃ユ湡" + end-placeholder="骞垮憡鍒版湡鏃ユ湡" + clearable + ></ProFormDatePicker> + </ProFormItemV2> + <ProFormItemV2 + label="骞垮憡浣嶆帓搴�:" + prop="sort" + required + :check-rules="[{ message: '璇疯緭鍏ユ帓搴�' }]" + > + <ProFormInputNumber + v-model="innerForm.sort" + :controls="false" + :min="0" + :max="99" + ></ProFormInputNumber> + </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 { FormRules, FormInstance } from 'element-plus'; +import { + ProDialog, + ProForm, + ProFormItemV2, + UploadUserFile, + ProFormText, + ProFormDatePicker, + ProFormInputNumber, + ProFormSelect, + ProFormImageUpload, +} from '@bole-core/components'; +import { ModelValueType } from 'element-plus'; +import { OssAdvertise, FlexWorkerEleSignEnumText } from '@/constants'; +import { BoleRegExp } from '@bole-core/core'; + +defineOptions({ + name: 'AddOrEditAdvertisementDialog', +}); + +type Props = { + modelValue: boolean; + form?: { + title?: string; + id: string; + pageType: number; + advertiseName: string; + advertiseLink: string; + imgInfo: UploadUserFile[]; + date: ModelValueType; + sort: number; + }; +}; + +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 dialogForm = ref<FormInstance>(); + +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 rules = reactive<FormRules>({ + contacterPhone: [ + { message: '璇疯緭鍏ユ纭殑鑱旂郴鐢佃瘽', trigger: 'blur', pattern: BoleRegExp.RegTelNumber }, + ], +}); + +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/TaskManageDetail.vue b/src/views/TaskManage/TaskManageDetail.vue new file mode 100644 index 0000000..f664309 --- /dev/null +++ b/src/views/TaskManage/TaskManageDetail.vue @@ -0,0 +1,32 @@ +<template> + <LoadingLayout> + <AppContainer> + <ProTabs v-model="state.tabType" hasBorder> + <ProTabPane lazy label="浠诲姟璇︽儏" name="task"> + <TaskDetailView></TaskDetailView> + </ProTabPane> + <ProTabPane lazy label="鎶ュ悕璇︽儏" name="sign"> + <SignDetailView></SignDetailView> + </ProTabPane> + </ProTabs> + </AppContainer> + </LoadingLayout> +</template> + +<script setup lang="ts"> +import { AppContainer, ProTabs, ProTabPane } from '@bole-core/components'; +import TaskDetailView from './components/TaskDetailView.vue'; +import SignDetailView from './components/SignDetailView.vue'; + +defineOptions({ + name: 'TaskManageDetail', +}); + +const state = reactive({ + tabType: 'task', +}); +</script> + +<style lang="scss" scoped> +@use '@/style/common.scss' as *; +</style> diff --git a/src/views/TaskManage/TaskManageList.vue b/src/views/TaskManage/TaskManageList.vue new file mode 100644 index 0000000..c0ee5aa --- /dev/null +++ b/src/views/TaskManage/TaskManageList.vue @@ -0,0 +1,163 @@ +<template> + <LoadingLayout :loading="state.loading"> + <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" + buttonStyle + showAllBtn + @change="getList()" + /> + </QueryFilterItem> + <QueryFilterItem tip-content="鎺ㄨ崘鐘舵��"> + <FieldRadio + v-model="extraParamState.status" + :value-enum="FlexWorkerEleSignEnumText" + 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> + </LoadingLayout> +</template> + +<script setup lang="ts"> +import { + ProTableQueryFilterBar, + OperationBtnType, + ProTableV2, + SearchInput, + LoadingLayout, + AppContainer, + QueryFilterItem, + useTable, + FieldDatePicker, + FieldSelect, + FieldRadio, +} from '@bole-core/components'; +import { useAccess } from '@/hooks'; +import { FlexWorkerEleSignEnumText } from '@/constants'; +import { ModelValueType } from 'element-plus'; +import * as flexEnterpriseWokerServices from '@/services/api/FlexEnterpriseWoker'; +import { OrderInputType } from '@bole-core/core'; + +defineOptions({ + name: 'OperationManageList', +}); + +const operationBtnMap: Record<string, OperationBtnType> = { + detailBtn: { emits: { onClick: (role) => goDetail(role) } }, + takeOnBtn: { + emits: { onClick: (role) => setAdvertiseOnShowStatus(role) }, + extraProps: { + hide: (row) => row.status, + }, + }, + takeDownBtn: { + 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.GetUserClientForBackInput = { + pageModel: { + rows: pageSize, + page: pageIndex, + orderInput: extraParamState.orderInput, + }, + searchKeys: extraParamState.keyword, + }; + let res = await flexEnterpriseWokerServices.getUserClientList(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: 'sort', order: OrderInputType.Asc }], + }, + columnsRenderProps: {}, + columnPropsMap: ['advertiseBeginDate', 'advertiseEndDate'], + } +); + +async function setAdvertiseOnShowStatus(row) { + try { + } catch (error) {} +} + +function goDetail(row) { + router.push({ name: 'TaskDetail', params: { id: row?.id ?? '' } }); +} +</script> diff --git a/src/views/TaskManage/components/TaskDetailView.vue b/src/views/TaskManage/components/TaskDetailView.vue new file mode 100644 index 0000000..fe82639 --- /dev/null +++ b/src/views/TaskManage/components/TaskDetailView.vue @@ -0,0 +1,75 @@ +<template> + <LoadingLayout :loading="isLoading"> + <AppContainer> + <PageFormLayout> + <ProForm :model="detail" ref="formRef" label-width="140px" is-read> + <ProFormCol> + <ProFormColItem :span="12"> + <ProFormItemV2 label="浠诲姟鍚嶇О:" prop="name"> + <ProFormText v-model.trim="detail.name" /> + </ProFormItemV2> + </ProFormColItem> + </ProFormCol> + <ProFormCol> + <ProFormColItem :span="12"> + <ProFormItemV2 label="浠诲姟鍚嶇О:" prop="name"> + <RadioWithExtra + v-model="detail" + :value-enum="TrainSalaryTypeTextList" + enumLabelKey="text" + enum-value-key="value" + :showExtra="state.consultForm.salaryType === ConsultSalaryType.Input" + > + <template #extra> + <ProFormInputNumber + :controls="false" + :min="0" + :max="999" + v-model="state.consultForm.startMonthlySalary" + placeholder="璇疯緭鍏�" + ></ProFormInputNumber> + </template> + </RadioWithExtra> + </ProFormItemV2> + </ProFormColItem> + </ProFormCol> + </ProForm> + </PageFormLayout> + </AppContainer> + </LoadingLayout> +</template> + +<script setup lang="ts"> +import { + LoadingLayout, + AppContainer, + PageFormLayout, + ProForm, + ProFormCol, + ProFormColItem, + ProFormItemV2, + ProFormText, + ProFormInputNumber, +} from '@bole-core/components'; +import { useQuery } from '@tanstack/vue-query'; + +defineOptions({ + name: 'TaskDetailView', +}); + +const route = useRoute(); +const id = route.params?.id as string; + +const { data: detail, isLoading } = useQuery({ + // queryKey: ['customerServices/getParkCustomerManageBaseDetail', id], + // queryFn: async () => { + // return await customerServices.getParkCustomerManageBaseDetail({ id: id }); + // }, + placeholderData: () => ({} as API.GetUserClientForBackOutput), + // enabled: !!id, +}); +</script> + +<style lang="scss" scoped> +@use '@/style/common.scss' as *; +</style> -- Gitblit v1.9.1