diff --git a/src/gen/ApiTypes.d.ts b/src/gen/ApiTypes.d.ts index af8cde7..969daac 100644 --- a/src/gen/ApiTypes.d.ts +++ b/src/gen/ApiTypes.d.ts @@ -18,7 +18,8 @@ declare namespace ApiTypes { "ownership_info"?: string[]; // 产权信息 "house_relation"?: string; // 房客关系,[enum:HouseOccupantsHouseRelationEnum] "relation_with_owner"?: string; // 与产权人关系,[enum:HouseOccupantsRelationWithOwnerEnum] - "is_live_in"?: number; // 是否在居住中 + "is_contact"?: boolean; // 是否是常用联系人 + "is_live_in"?: boolean; // 是否在居住中 "move_in_date"?: Date; // 入住时间 "status"?: string; // 状态,[enum:HouseOccupantsStatusEnum] "unbound_time"?: Date; // 解绑时间 @@ -29,6 +30,10 @@ declare namespace ApiTypes { type Delete = { "id": number; // id }; + type ChangeIsContact = { + "id": number; // id + "is_contact": boolean; // 是否是常用联系人 + }; } namespace HouseRegisters { type List = { @@ -408,6 +413,40 @@ declare namespace ApiTypes { }; } } + namespace Collcetion { + namespace HouseCollectionRecords { + type List = { + "collection_tasks_id"?: number; // 房屋崔缴任务id,[ref:house_collection_tasks] + "asset_houses_id"?: number; // 房屋id,[ref:asset_houses] + "channel"?: string; // 通知渠道,[enum:HouseCollectionTasksChannelEnum] + "status"?: string; // 通知状态,[enum:HouseCollectionRecordsStatusEnum] + }; + type Show = { + "id": number; // id + }; + type Delete = { + "id": number; // id + }; + } + namespace HouseCollectionTasks { + type List = { + "task_name"?: string; // 模糊搜索:名称 + "status"?: string; // 状态,[enum:HouseCollectionTasksStatusEnum] + }; + type Show = { + "id": number; // id + }; + type SoftDelete = { + "id": number; // id + }; + type Restore = { + "id": number; // id + }; + type Delete = { + "id": number; // id + }; + } + } namespace Common { namespace Admins { type List = { diff --git a/src/gen/Apis.ts b/src/gen/Apis.ts index c7b01ab..3b32f20 100644 --- a/src/gen/Apis.ts +++ b/src/gen/Apis.ts @@ -16,6 +16,9 @@ export const Apis = { Delete(data: ApiTypes.Archive.HouseOccupants.Delete): Promise { return request('admin/archive/house_occupants/delete', { data }); }, + ChangeIsContact(data: ApiTypes.Archive.HouseOccupants.ChangeIsContact): Promise { + return request('admin/archive/house_occupants/change_is_contact', { data }); + }, }, HouseRegisters: { List(data?: ApiTypes.Archive.HouseRegisters.List): Promise { @@ -211,6 +214,36 @@ export const Apis = { }, }, }, + Collcetion: { + HouseCollectionRecords: { + List(data?: ApiTypes.Collcetion.HouseCollectionRecords.List): Promise { + return request('admin/collcetion/house_collection_records/list', { data }); + }, + Show(data: ApiTypes.Collcetion.HouseCollectionRecords.Show): Promise { + return request('admin/collcetion/house_collection_records/show', { data }); + }, + Delete(data: ApiTypes.Collcetion.HouseCollectionRecords.Delete): Promise { + return request('admin/collcetion/house_collection_records/delete', { data }); + }, + }, + HouseCollectionTasks: { + List(data?: ApiTypes.Collcetion.HouseCollectionTasks.List): Promise { + return request('admin/collcetion/house_collection_tasks/list', { data }); + }, + Show(data: ApiTypes.Collcetion.HouseCollectionTasks.Show): Promise { + return request('admin/collcetion/house_collection_tasks/show', { data }); + }, + SoftDelete(data: ApiTypes.Collcetion.HouseCollectionTasks.SoftDelete): Promise { + return request('admin/collcetion/house_collection_tasks/soft_delete', { data }); + }, + Restore(data: ApiTypes.Collcetion.HouseCollectionTasks.Restore): Promise { + return request('admin/collcetion/house_collection_tasks/restore', { data }); + }, + Delete(data: ApiTypes.Collcetion.HouseCollectionTasks.Delete): Promise { + return request('admin/collcetion/house_collection_tasks/delete', { data }); + }, + }, + }, Common: { Admins: { List(data?: ApiTypes.Common.Admins.List): Promise { diff --git a/src/gen/Enums.ts b/src/gen/Enums.ts index d3a425c..ccd2165 100644 --- a/src/gen/Enums.ts +++ b/src/gen/Enums.ts @@ -126,7 +126,7 @@ export const BannersTypeEnum= { // 缓存类型 export const CacheTypeEnum= { - 'MobilePhoneVerificationCode': {"text":"手机验证码","color":"#a6e8bc","value":"MobilePhoneVerificationCode"}, + 'MobilePhoneVerificationCode': {"text":"手机验证码","color":"#f8c2db","value":"MobilePhoneVerificationCode"}, }; // CompaniesMerchantTypeEnum @@ -188,6 +188,39 @@ export const HouseBillsTypeEnum= { 'SharedElectricityFee': {"text":"公摊电费","color":"#ec4899","value":"SharedElectricityFee"}, }; +// HouseCollectionRecordsCollectionResultEnum +export const HouseCollectionRecordsCollectionResultEnum= { + 'PromiseToPay': {"text":"承诺缴费","color":"#4caf50","value":"PromiseToPay"}, + 'RefuseToPay': {"text":"拒绝缴费","color":"#f44336","value":"RefuseToPay"}, + 'NotReached': {"text":"未联系到","color":"#9e9e9e","value":"NotReached"}, + 'NeedFollowUp': {"text":"需要跟进","color":"#ff9800","value":"NeedFollowUp"}, +}; + +// HouseCollectionRecordsSmsStatusEnum +export const HouseCollectionRecordsStatusEnum= { + 'NotNotified': {"text":"未通知","color":"#808080","value":"NotNotified"}, + 'Notified': {"text":"已通知","color":"#00cc00","value":"Notified"}, + 'Failed': {"text":"失败","color":"#ff0000","value":"Failed"}, +}; + +// HouseCollectionTasksChannelEnum +export const HouseCollectionTasksChannelEnum= { + 'SMS': {"text":"短信","color":"#1E90FF","value":"SMS"}, + 'MiniProgram': {"text":"小程序","color":"#00BFFF","value":"MiniProgram"}, + 'OfficialAccount': {"text":"公众号","color":"#32CD32","value":"OfficialAccount"}, + 'PhoneCall': {"text":"电话催缴","color":"#FF8C00","value":"PhoneCall"}, + 'Visit': {"text":"上门催缴","color":"#8B4513","value":"Visit"}, + 'WeChat': {"text":"微信联系","color":"#20B2AA","value":"WeChat"}, + 'WrittenNotice': {"text":"书面通知","color":"#708090","value":"WrittenNotice"}, +}; + +// HouseCollectionTasksStatusEnum +export const HouseCollectionTasksStatusEnum= { + 'Processing': {"text":"进行中","color":"#ffcc00","value":"Processing"}, + 'Completed': {"text":"已完成","color":"#00cc00","value":"Completed"}, + 'Failed': {"text":"失败","color":"#ff0000","value":"Failed"}, +}; + // HouseOccupantsCardTypeEnum export const HouseOccupantsCardTypeEnum= { 'MainlandID': {"text":"中国大陆居民身份证","color":"#2db7f5","value":"MainlandID"}, @@ -295,7 +328,7 @@ export const HouseWorkOrdersAssignStatusEnum= { export const HouseWorkOrdersLevelEnum= { 'Urgent': {"text":"紧急","color":"#ff0000","value":"Urgent"}, 'High': {"text":"高","color":"#ff7f00","value":"High"}, - 'Normal': {"text":"普通","color":"#00cc00","value":"Normal"}, + 'Medium': {"text":"中","color":"#00cc00","value":"Medium"}, 'Low': {"text":"低","color":"#999999","value":"Low"}, }; diff --git a/src/pages/archive/$id.tsx b/src/pages/archive/$id.tsx index b380fb3..40bb179 100644 --- a/src/pages/archive/$id.tsx +++ b/src/pages/archive/$id.tsx @@ -57,7 +57,10 @@ export default function Show({ title = '房屋档案' }) { children: ( loadShow()} + reload={() => { + loadShow(); + loadPendingCount(); + }} /> ), }, diff --git a/src/pages/archive/components/OccupantsNow.tsx b/src/pages/archive/components/OccupantsNow.tsx index 6d32d0a..2f93e0e 100644 --- a/src/pages/archive/components/OccupantsNow.tsx +++ b/src/pages/archive/components/OccupantsNow.tsx @@ -6,7 +6,7 @@ import { HouseOccupantsStatusEnum, } from '@/gen/Enums'; import { ProTable } from '@ant-design/pro-components'; -import { Space } from 'antd'; +import { Popconfirm, Space, Tag } from 'antd'; import { useEffect, useRef } from 'react'; import AddOccupant from './modals/AddOccupant'; import AddRent from './modals/AddRent'; @@ -23,6 +23,11 @@ export default function Index({ ...rest }) { actionLooks?.current.reloadAndRest(); }, [rest.loadmore]); + const handleReload = () => { + actionLooks?.current.reload(); + rest.reload?.(); // 调用父组件的reload函数更新Pending计数 + }; + return ( <> > @@ -68,8 +73,9 @@ export default function Index({ ...rest }) { search: false, }), MyColumns.EnumTag({ - title: - rest?.item?.status === 'Rented' ? '与租客关系' : '与业主关系', + // title: + // rest?.item?.status === 'Rented' ? '与租客关系' : '与业主关系', + title: '关系说明', dataIndex: 'relation_with_owner', valueEnum: HouseOccupantsRelationWithOwnerEnum, search: false, @@ -82,13 +88,6 @@ export default function Index({ ...rest }) { title: '电话', dataIndex: 'phone', }, - // { - // title: '是否入住', - // dataIndex: 'is_live_in', - // render(_, record) { - // return `${record?.is_live_in ? '是' : '-'} `; - // }, - // }, { title: '入住日期', dataIndex: 'is_live_in', @@ -96,6 +95,46 @@ export default function Index({ ...rest }) { return `${record?.move_in_date || '未入住'}`; }, }, + { + title: '常用联系人', + render: (_, item, index, action) => + item?.is_contact ? ( + { + Apis.Archive.HouseOccupants.ChangeIsContact({ + id: item.id, + is_contact: false, + }).then(() => action?.reload()); + }} + okText="是" + cancelText="否" + > + + 是 + + + ) : ( + { + Apis.Archive.HouseOccupants.ChangeIsContact({ + id: item.id, + is_contact: true, + }).then(() => action?.reload()); + }} + okText="是" + cancelText="否" + > + + 否 + + + ), + search: false, + }, MyColumns.EnumTag({ title: '状态', dataIndex: 'status', @@ -114,7 +153,7 @@ export default function Index({ ...rest }) { {item?.move_in_date && ( )} - + ), }), diff --git a/src/pages/archive/components/modals/OccupantsUpdate.tsx b/src/pages/archive/components/modals/OccupantsUpdate.tsx index 4d0bfda..d9b5984 100644 --- a/src/pages/archive/components/modals/OccupantsUpdate.tsx +++ b/src/pages/archive/components/modals/OccupantsUpdate.tsx @@ -138,6 +138,12 @@ export default function Update(props: MyBetaModalFormProps) { : [,]; }, }, + { + title: '是否联系', + dataIndex: 'is_contact', + colProps: { span: 12 }, + valueType: 'switch', + }, ], }, ]} diff --git a/src/pages/archive/components/modals/RemoveOwner.tsx b/src/pages/archive/components/modals/RemoveOwner.tsx index b48b272..ee520b8 100644 --- a/src/pages/archive/components/modals/RemoveOwner.tsx +++ b/src/pages/archive/components/modals/RemoveOwner.tsx @@ -5,8 +5,8 @@ import { message, Modal } from 'antd'; export default function MoveOut(props: MyBetaModalFormProps) { const handleRemoveClick = () => { Modal.confirm({ - title: '确认移除', - content: '确定要提交移除申请吗?', + title: '解除申请', + content: '确定要解除人房关系吗?', okText: '确定', cancelText: '取消', // centered: true, @@ -16,7 +16,7 @@ export default function MoveOut(props: MyBetaModalFormProps) { house_occupants_id: props?.item?.id, }); props.reload?.(); - message.success(props.title + '成功'); + message.success('申请成功,等待审核'); } catch (error) { message.error('操作失败'); } diff --git a/src/pages/collection_task/$id.tsx b/src/pages/collection_task/$id.tsx new file mode 100644 index 0000000..ca167fc --- /dev/null +++ b/src/pages/collection_task/$id.tsx @@ -0,0 +1,52 @@ +import { MyPageContainer, usePageTabs } from '@/common'; +import { Apis } from '@/gen/Apis'; +import { ProCard } from '@ant-design/pro-components'; +import { useParams } from '@umijs/max'; +import { Tabs } from 'antd'; +import { useEffect, useState } from 'react'; +import CollectionList from './components/CollectionList'; +import CollectionTaskInfo from './components/CollectionTaskInfo'; + +export default function Show({ title }: { title?: string } = {}) { + const { id } = useParams<{ id: string }>(); + const [data, setShow] = useState({}); + + // 注册当前页面为标签页 + const { addTab } = usePageTabs({ + tabKey: `collection-task-${id}`, + tabLabel: `${data?.task_name} ${data?.id}` || title || '任务详情', + }); + + const loadShow = () => { + let paramsId: any = { id: id ?? 0 }; + Apis.Collcetion.HouseCollectionTasks.Show(paramsId).then((res) => { + setShow(res?.data); + }); + }; + + useEffect(() => { + loadShow(); + }, [id]); + + let items = [ + { + label: '通知记录', + key: '1', + closable: false, + children: ( + loadShow()} + /> + ), + }, + ]; + return ( + + + + + + + ); +} diff --git a/src/pages/collection_task/components/CollectionList.tsx b/src/pages/collection_task/components/CollectionList.tsx new file mode 100644 index 0000000..6a1f805 --- /dev/null +++ b/src/pages/collection_task/components/CollectionList.tsx @@ -0,0 +1,95 @@ +import { MyColumns, MyProTableProps } from '@/common'; +import { Apis } from '@/gen/Apis'; +import { + HouseCollectionRecordsStatusEnum, + HouseCollectionTasksChannelEnum, +} from '@/gen/Enums'; +import BannerShow from '@/pages/banner/modals/BannerShow'; +import BannerUpdate from '@/pages/banner/modals/BannerUpdate'; +import { ProTable } from '@ant-design/pro-components'; +import { Space } from 'antd'; +import { useEffect, useRef } from 'react'; + +export default function Index({ ...rest }) { + const actionLooks = useRef(); + useEffect(() => { + actionLooks?.current.reloadAndRest(); + }, [rest.loadmore]); + + return ( + <> + > + {...MyProTableProps.props} + actionRef={actionLooks} + request={async (params, sort) => + MyProTableProps.request( + { + ...params, + collection_tasks_id: rest.item?.collection_tasks_id, + }, + sort, + Apis.Collcetion.HouseCollectionRecords.List, + ) + } + // toolBarRender={(action) => [ + // , + // ]} + // search={false} + options={false} + columns={[ + MyColumns.ID(), + { + title: '房屋名称', + dataIndex: ['asset_house', 'full_name'], + search: { + transform: (value) => { + return { full_name: value }; + }, + }, + }, + MyColumns.EnumTag({ + title: '通知方式', + dataIndex: 'channel', + valueEnum: HouseCollectionTasksChannelEnum, + search: false, + }), + { + title: '未缴金额', + dataIndex: 'total_unpaid_amount', + search: false, + }, + { + title: '通知时间', + dataIndex: 'notified_time', + valueType: 'dateTime', + search: false, + }, + MyColumns.EnumTag({ + title: '状态', + dataIndex: 'status', + valueEnum: HouseCollectionRecordsStatusEnum, + search: false, + }), + { + title: '失败原因', + dataIndex: 'failed_reason', + search: false, + }, + MyColumns.Option({ + render: (_, item: any, index, action) => ( + + + + + ), + }), + ]} + /> + + ); +} diff --git a/src/pages/collection_task/components/CollectionTaskInfo.tsx b/src/pages/collection_task/components/CollectionTaskInfo.tsx new file mode 100644 index 0000000..dd30ad6 --- /dev/null +++ b/src/pages/collection_task/components/CollectionTaskInfo.tsx @@ -0,0 +1,67 @@ +import { MyBetaModalFormProps, renderTextHelper } from '@/common'; +import { + HouseCollectionTasksChannelEnum, + HouseCollectionTasksStatusEnum, +} from '@/gen/Enums'; +import { ProCard, ProDescriptions } from '@ant-design/pro-components'; +import { Space, Tag } from 'antd'; + +export default function info(props: MyBetaModalFormProps) { + const { item } = props; + + return ( + + + + {item?.id} + + {item?.task_name} + + + + {!item?.channel || !Array.isArray(item?.channel) ? ( + '-' + ) : ( + + {item.channel.map((channelValue: string) => { + const channelInfo = + HouseCollectionTasksChannelEnum[ + channelValue as keyof typeof HouseCollectionTasksChannelEnum + ]; + return ( + + {channelInfo?.text || channelValue} + + ); + })} + + )} + + + + + + {item?.total_houses || '-'} + + + {item?.total_notified || '-'} + + + {item?.company_employee?.name || '-'}- + {item?.company_employee?.phone || '-'} + + + {item?.created_at || '-'} + + + {item?.completed_time || '-'} + + + + + ); +} diff --git a/src/pages/collection_task/index.tsx b/src/pages/collection_task/index.tsx new file mode 100644 index 0000000..d8d3fec --- /dev/null +++ b/src/pages/collection_task/index.tsx @@ -0,0 +1,117 @@ +import { + MyButtons, + MyColumns, + MyPageContainer, + MyProTableProps, + usePageTabs, +} from '@/common'; +import { Apis } from '@/gen/Apis'; +import { + HouseCollectionTasksChannelEnum, + HouseCollectionTasksStatusEnum, +} from '@/gen/Enums'; +import { ProTable } from '@ant-design/pro-components'; +import { useNavigate } from '@umijs/max'; +import { Space, Tag } from 'antd'; + +export default function CollectionTaskList({ title = '通知任务' }) { + const navigate = useNavigate(); + + // 注册当前页面为标签页 + usePageTabs({ + tabKey: 'collection-tasks', + tabLabel: title, + }); + + return ( + + + MyProTableProps.request( + params, + sort, + Apis.Collcetion.HouseCollectionTasks.List, + ) + } + columns={[ + MyColumns.ID(), + { + title: '任务名称', + dataIndex: 'task_name', + search: false, + }, + { + title: '催缴渠道', + dataIndex: 'channel', + search: false, + render: (_, record: any) => { + if (!record.channel || !Array.isArray(record.channel)) { + return '-'; + } + return record.channel.map((channelValue: string) => { + const channelInfo = + HouseCollectionTasksChannelEnum[ + channelValue as keyof typeof HouseCollectionTasksChannelEnum + ]; + return ( + + {channelInfo?.text || channelValue} + + ); + }); + }, + }, + MyColumns.EnumTag({ + title: '状态', + dataIndex: 'status', + valueEnum: HouseCollectionTasksStatusEnum, + }), + + { + title: '房屋数', + dataIndex: 'total_houses', + search: false, + }, + { + title: '住户数', + dataIndex: 'total_notified', + search: false, + }, + { + title: '发起人', + dataIndex: 'CompanyEmployee', + search: false, + render: (_, record: any) => + `${record?.company_employee?.name}-${record?.company_employee?.phone}`, + }, + { + title: '完成时间', + dataIndex: 'completed_time', + valueType: 'dateTime', + search: false, + }, + MyColumns.CreatedAt(), + + MyColumns.Option({ + render: (_, item: any, index) => ( + + { + navigate(`/collection_task/${item.id}`); + }} + /> + + ), + }), + ]} + /> + + ); +}