diff --git a/.umirc.ts b/.umirc.ts index 318fa17..6fdf83b 100644 --- a/.umirc.ts +++ b/.umirc.ts @@ -16,8 +16,8 @@ export default defineConfig({ '/api/': { // target: 'http://yt:8003', // target: 'http://10.39.13.78:8001/', - // target: 'https://test-admin.linyikj.com.cn/', - target: 'https://admin.linyikj.com.cn/', + target: 'https://test-admin.linyikj.com.cn/', + // target: 'https://admin.linyikj.com.cn/', // target: 'http://c789629c.natappfree.cc', changeOrigin: true, diff --git a/gencode.json b/gencode.json index cc974bb..b5fb778 100644 --- a/gencode.json +++ b/gencode.json @@ -1,4 +1,4 @@ { - "url": "http://c789629c.natappfree.cc/api/docs/openapi", + "url": "http://10.39.13.78:8001/api/docs/openapi", "module": "Admin" } diff --git a/src/components/Select.tsx b/src/components/Select.tsx index d956e28..0dcb2e3 100644 --- a/src/components/Select.tsx +++ b/src/components/Select.tsx @@ -593,7 +593,7 @@ export const Selects = { }); res?.data?.map((l: any) => { l.label = l.id + ':' + l.name; - l.value = l.house_meter_has_houses[0].asset_houses_id; + l.value = l.id; }); return res?.data; }, diff --git a/src/gen/ApiTypes.d.ts b/src/gen/ApiTypes.d.ts index 67827a0..72ac280 100644 --- a/src/gen/ApiTypes.d.ts +++ b/src/gen/ApiTypes.d.ts @@ -5,6 +5,7 @@ declare namespace ApiTypes { "title"?: string; // 模糊搜索:名称 "status"?: string; // 状态,[enum:ActivitiesStatusEnum] "publish_status"?: string; // 发布状态,[enum:ActivitiesPublishStatusEnum] + "asset_projects_id"?: number; // 项目ID,[ref:asset_projects] }; type Store = { "title": string; // 活动标题 @@ -1307,7 +1308,7 @@ declare namespace ApiTypes { namespace HouseOrder { namespace HouseOrderPayments { type List = { - "house_orders_id": number; // 订单ID + "house_orders_id"?: number; // 订单ID "payment_no"?: string; // 模糊搜索:支付单号 "transaction_id"?: string; // 模糊搜索:交易号(微信、支付宝的单号 "third_trade_no"?: string; // 第三方交易号(如通联、乐刷) @@ -1358,6 +1359,9 @@ declare namespace ApiTypes { type Delete = { "id": number; // id }; + type Import = { + "upload_file"?: mimes:xlsx,xls; // 上传的时候必填文件 + }; } namespace HouseMeterReadings { type List = { @@ -1441,6 +1445,7 @@ declare namespace ApiTypes { "asset_projects_id"?: number; // 项目id,[ref:asset_projects] "project_name"?: string; // 模糊搜索:项目名称 "charge_standards_id"?: number; // 房屋收费标准id,[ref:house_charge_standards] + "meter_type"?: string; // 仪表类型,[enum:HouseMetersMeterTypeEnum] }; type Store = { "asset_projects_id": number; // 项目id,[ref:asset_projects] diff --git a/src/gen/Apis.ts b/src/gen/Apis.ts index 3de29c3..bc405aa 100644 --- a/src/gen/Apis.ts +++ b/src/gen/Apis.ts @@ -773,7 +773,7 @@ export const Apis = { }, HouseOrder: { HouseOrderPayments: { - List(data: ApiTypes.HouseOrder.HouseOrderPayments.List): Promise { + List(data?: ApiTypes.HouseOrder.HouseOrderPayments.List): Promise { return request('admin/house_order/house_order_payments/list', { data }); }, Show(data: ApiTypes.HouseOrder.HouseOrderPayments.Show): Promise { @@ -815,6 +815,12 @@ export const Apis = { Delete(data: ApiTypes.Meter.HouseMeterHasHouses.Delete): Promise { return request('admin/meter/house_meter_has_houses/delete', { data }); }, + Import(data?: ApiTypes.Meter.HouseMeterHasHouses.Import): Promise { + return request('admin/meter/house_meter_has_houses/import', { data }); + }, + DownloadTemplate(): Promise { + return request('admin/meter/house_meter_has_houses/download_template', {responseType: 'blob',}); + }, }, HouseMeterReadings: { List(data: ApiTypes.Meter.HouseMeterReadings.List): Promise { diff --git a/src/gen/Enums.ts b/src/gen/Enums.ts index 4478ebb..10a594f 100644 --- a/src/gen/Enums.ts +++ b/src/gen/Enums.ts @@ -154,7 +154,7 @@ export const BannersTypeEnum= { // 缓存类型 export const CacheTypeEnum= { - 'MobilePhoneVerificationCode': {"text":"手机验证码","color":"#dc15e2","value":"MobilePhoneVerificationCode"}, + 'MobilePhoneVerificationCode': {"text":"手机验证码","color":"#7db989","value":"MobilePhoneVerificationCode"}, }; // CompaniesMerchantTypeEnum diff --git a/src/pages/asset/activities/index.tsx b/src/pages/asset/activities/index.tsx index 43ac5cf..6e6ad53 100644 --- a/src/pages/asset/activities/index.tsx +++ b/src/pages/asset/activities/index.tsx @@ -100,13 +100,13 @@ export default function Index({ title = '项目活动' }) { render: (_, item: any, index, action) => ( - {(!item.end_time || new Date(item.end_time) > new Date()) && ( - - )} + {/* {(!item.end_time || new Date(item.end_time) > new Date()) && ( + )} */} + {/* {(!item.end_time || new Date(item.end_time) > new Date()) && ( getShow()} node={ diff --git a/src/pages/charge/tasks/modals/TaskShow.tsx b/src/pages/charge/tasks/modals/TaskShow.tsx index 9237658..9e664dc 100644 --- a/src/pages/charge/tasks/modals/TaskShow.tsx +++ b/src/pages/charge/tasks/modals/TaskShow.tsx @@ -11,7 +11,7 @@ import { ProTable } from '@ant-design/pro-components'; import { useNavigate } from '@umijs/max'; import { Space } from 'antd'; -export default function AssetInfo(props: MyBetaModalFormProps) { +export default function TaskShow(props: MyBetaModalFormProps) { const navigate = useNavigate(); return ( ( @@ -64,6 +64,7 @@ export default function AssetInfo(props: MyBetaModalFormProps) { '0', )}`; }, + search: false, }, { title: '计费周期', diff --git a/src/pages/complaint/components/WorkLogsCreate.tsx b/src/pages/complaint/components/WorkLogsCreate.tsx new file mode 100644 index 0000000..da6119e --- /dev/null +++ b/src/pages/complaint/components/WorkLogsCreate.tsx @@ -0,0 +1,82 @@ +import { + MyButtons, + MyFormItems, + MyModalFormProps, + rulesHelper, +} from '@/common'; +import { Apis } from '@/gen/Apis'; +import { HouseWorkOrdersStatusEnum } from '@/gen/Enums'; +import { BetaSchemaForm } from '@ant-design/pro-components'; +import { Form, message } from 'antd'; + +interface WorkLogsCreateProps { + workOrderId: number; + reload?: () => void; +} + +export default function WorkLogsCreate({ + workOrderId, + reload, +}: WorkLogsCreateProps) { + const [form] = Form.useForm(); + + return ( + + {...MyModalFormProps.props} + title={`添加处理记录`} + wrapperCol={{ span: 24 }} + width="600px" + trigger={} + onOpenChange={(open: any) => { + if (open) { + form.resetFields(); // 清空表单数据 + } + }} + key={new Date().getTime()} + form={form} + onFinish={async (values) => { + try { + await Apis.WorkOrder.HouseWorkLogs.Store({ + ...values, + house_work_orders_id: workOrderId, + }); + reload?.(); + message.success('添加处理记录成功'); + return true; + } catch (error) { + message.error('添加处理记录失败'); + return false; + } + }} + columns={[ + MyFormItems.EnumRadio({ + key: 'status', + title: '工单状态', + colProps: { span: 24 }, + valueEnum: HouseWorkOrdersStatusEnum, + required: true, + formItemProps: { ...rulesHelper.text }, + }), + { + key: 'description', + title: '进度描述', + valueType: 'textarea', + colProps: { span: 24 }, + formItemProps: { ...rulesHelper.text }, + fieldProps: { + rows: 4, + placeholder: '请输入处理进度描述', + }, + }, + MyFormItems.UploadImages({ + key: 'attachments', + title: '相关图片', + uploadType: 'file', + max: 5, + colProps: { span: 24 }, + formItemProps: { required: false }, + }), + ]} + /> + ); +} diff --git a/src/pages/complaint/components/WorkLogsLIst.tsx b/src/pages/complaint/components/WorkLogsLIst.tsx new file mode 100644 index 0000000..1cdf755 --- /dev/null +++ b/src/pages/complaint/components/WorkLogsLIst.tsx @@ -0,0 +1,143 @@ +import { MyButtons, MyColumns, MyProTableProps } from '@/common'; +import { Apis } from '@/gen/Apis'; +import { HouseWorkOrdersStatusEnum } from '@/gen/Enums'; +import { ProTable } from '@ant-design/pro-components'; +import { Image, Space } from 'antd'; +import { useEffect, useRef } from 'react'; +import WorkLogsCreate from './WorkLogsCreate'; + +interface WorkLogsListProps { + workOrderId: number; + reload?: () => void; +} + +export default function WorkLogsList({ + workOrderId, + reload, +}: WorkLogsListProps) { + const actionRef = useRef(); + + useEffect(() => { + actionRef?.current?.reload(); + }, [workOrderId]); + + return ( + <> + > + {...MyProTableProps.props} + actionRef={actionRef} + request={async (params, sort) => + MyProTableProps.request( + { + ...params, + house_work_orders_id: workOrderId, + }, + sort, + Apis.WorkOrder.HouseWorkLogs.List, + ) + } + toolBarRender={(action) => [ + { + action?.reload(); + reload?.(); + }} + />, + ]} + search={false} + pagination={{ + pageSize: 10, + showSizeChanger: false, + }} + columns={[ + MyColumns.ID(), + MyColumns.EnumTag({ + title: '工单状态', + dataIndex: 'status', + valueEnum: HouseWorkOrdersStatusEnum, + search: false, + }), + { + title: '进度描述', + dataIndex: 'description', + search: false, + ellipsis: true, + }, + + { + title: '附件', + dataIndex: 'attachments', + search: false, + render: (_, record) => { + if ( + !Array.isArray(record.attachments) || + record.attachments.length === 0 + ) { + return '无附件'; + } + return ( +
+ {record.attachments.map((item: any, index: number) => { + if (item.type && item.type.includes('image')) { + return ( + + ); + } else if (item.type && item.type.includes('video')) { + return ( +
+ ); + }, + }, + { + title: '创建时间', + dataIndex: 'created_at', + valueType: 'dateTime', + search: false, + width: 160, + }, + MyColumns.UpdatedAt(), + MyColumns.Option({ + render: (_, item: any, index, action) => ( + + + Apis.WorkOrder.HouseWorkLogs.Delete({ + id: item.id, + }).then(() => action?.reload()) + } + /> + + ), + }), + ]} + /> + + ); +} diff --git a/src/pages/complaint/index.tsx b/src/pages/complaint/index.tsx new file mode 100644 index 0000000..77fb8ec --- /dev/null +++ b/src/pages/complaint/index.tsx @@ -0,0 +1,184 @@ +import { + MyButtons, + MyColumns, + MyPageContainer, + MyProTableProps, + usePageTabs, +} from '@/common'; +import { Apis } from '@/gen/Apis'; +import { + HouseWorkOrdersAssignStatusEnum, + HouseWorkOrdersLevelEnum, + HouseWorkOrdersStatusEnum, + HouseWorkOrdersTypeEnum, +} from '@/gen/Enums'; +import { ProTable } from '@ant-design/pro-components'; +import { useNavigate } from '@umijs/max'; +import { Image, Space } from 'antd'; +import ComplaintAssign from './modals/ComplaintAssign'; + +import ComplaintShow from './modals/ComplaintShow'; + +export default function Index({ title = '投诉列表' }) { + const navigate = useNavigate(); + + // 注册当前页面为标签页 + usePageTabs({ + tabKey: 'complaint', + tabLabel: title, + }); + + return ( + + + MyProTableProps.request( + { ...params, type: HouseWorkOrdersTypeEnum.Complaint.value }, + sort, + Apis.WorkOrder.HouseWorkOrders.List, + ) + } + // toolBarRender={(action) => [ + // , + // ]} + columns={[ + MyColumns.ID(), + MyColumns.EnumTag({ + title: '状态', + dataIndex: 'status', + valueEnum: HouseWorkOrdersStatusEnum, + }), + { + title: '描述', + dataIndex: 'content', + width: 120, // 关键:固定列宽(若父容器过窄,可设 minWidth: 200 优先保证列宽) + search: false, + render: (text) => ( +
+ {text} +
+ ), + }, + { + title: '附件', + dataIndex: 'attachments', + search: false, + render: (_, record) => { + if ( + !Array.isArray(record.attachments) || + record.attachments.length === 0 + ) { + return '无附件'; + } + return ( +
+ {record.attachments.map((item: any, index: number) => { + if (item.type && item.type.includes('image')) { + return ( + + ); + } else if (item.type && item.type.includes('video')) { + return ( +
+ ); + }, + }, + MyColumns.EnumTag({ + title: '分配状态', + dataIndex: 'assign_status', + valueEnum: HouseWorkOrdersAssignStatusEnum, + }), + MyColumns.EnumTag({ + title: '优先级', + dataIndex: 'level', + valueEnum: HouseWorkOrdersLevelEnum, + }), + { + title: '处理人', + dataIndex: ['assign_employee', 'name'], + search: false, + render: (_, record) => { + return `${record?.assign_employee?.name || ''}-${ + record?.assign_employee?.phone || '' + }`; + }, + }, + MyColumns.CreatedAt(), + MyColumns.Option({ + render: (_, item: any, index, action) => ( + + + + {item.assign_status === 'Unassigned' && ( + + )} + + + Apis.WorkOrder.HouseWorkOrders.SoftDelete({ + id: item.id, + }).then(() => action?.reload()) + } + /> + + ), + }), + ]} + /> +
+ ); +} diff --git a/src/pages/complaint/modals/ComplaintAssign.tsx b/src/pages/complaint/modals/ComplaintAssign.tsx new file mode 100644 index 0000000..301e096 --- /dev/null +++ b/src/pages/complaint/modals/ComplaintAssign.tsx @@ -0,0 +1,88 @@ +import { + MyBetaModalFormProps, + MyButtons, + MyFormItems, + MyModalFormProps, + rulesHelper, +} from '@/common'; +import { Selects } from '@/components/Select'; +import { Apis } from '@/gen/Apis'; +import { HouseWorkOrdersLevelEnum } from '@/gen/Enums'; +import { BetaSchemaForm } from '@ant-design/pro-components'; +import { Form, message } from 'antd'; + +export default function WorkOrderAssign( + props: MyBetaModalFormProps & { item: any }, +) { + const [form] = Form.useForm(); + return ( + + {...MyModalFormProps.props} + title={`派发工单`} + wrapperCol={{ span: 24 }} + width="500px" + trigger={} + key={new Date().getTime()} + form={form} + request={async () => { + const res = await Apis.WorkOrder.HouseWorkOrders.Show({ + id: props.item.id, + }); + return { + title: res.data.title, + assign_employee_id: res.data.assign_employee_id, + }; + }} + onFinish={async (values) => + Apis.WorkOrder.HouseWorkOrders.Assign({ + ...values, + id: props.item.id, + }) + .then(() => { + props.reload?.(); + message.success('指派工单成功'); + return true; + }) + .catch(() => false) + } + columns={[ + { + key: 'content', + title: '工单描述', + colProps: { span: 24 }, + readonly: true, + fieldProps: { + disabled: true, + }, + }, + MyFormItems.EnumRadio({ + key: 'level', + title: '优先级', + colProps: { span: 24 }, + valueEnum: HouseWorkOrdersLevelEnum, + required: true, + }), + Selects?.Employees({ + title: '选择处理人', + key: 'assign_employees_id', + colProps: { span: 24 }, + formItemProps: { ...rulesHelper.text }, + params: { + companies_id: props.item.companies_id, + }, + required: true, + }), + { + key: 'assign_remark', + title: '指派备注', + valueType: 'textarea', + colProps: { span: 24 }, + fieldProps: { + rows: 3, + placeholder: '请输入指派备注(可选)', + }, + }, + ]} + /> + ); +} diff --git a/src/pages/complaint/modals/ComplaintShow.tsx b/src/pages/complaint/modals/ComplaintShow.tsx new file mode 100644 index 0000000..2f0f936 --- /dev/null +++ b/src/pages/complaint/modals/ComplaintShow.tsx @@ -0,0 +1,251 @@ +import { MyButtons } from '@/common'; +import { Apis } from '@/gen/Apis'; +import { + HouseWorkOrdersAssignStatusEnum, + HouseWorkOrdersLevelEnum, + HouseWorkOrdersStatusEnum, +} from '@/gen/Enums'; +import { ProDescriptions } from '@ant-design/pro-components'; +import { Image, Modal, Space, Tag } from 'antd'; +import { useState } from 'react'; +import WorkLogsList from '../components/WorkLogsLIst'; +import WorkOrderAssign from './ComplaintAssign'; + +interface WorkOrderShowProps { + item: any; + title?: string; + reload?: () => void; +} + +export default function ComplaintShow({ + item, + title = '投诉详情', + reload, +}: WorkOrderShowProps) { + const [open, setOpen] = useState(false); + const [data, setData] = useState(null); + + const handleOpen = async () => { + try { + const res = await Apis.WorkOrder.HouseWorkOrders.Show({ id: item.id }); + setData(res.data); + setOpen(true); + } catch (error) { + console.error('获取投诉详情失败:', error); + } + }; + + return ( + <> + + setOpen(false)} + footer={null} + width={800} + > + {data && ( + <> + ( + // + // {HouseWorkOrdersTypeEnum[ + // record.type as keyof typeof HouseWorkOrdersTypeEnum + // ]?.text || record.type} + // + // ), + // }, + // { + // title: '报修位置', + // dataIndex: 'location', + // span: 1, + // render: (_, record) => { + // const locationConfig = + // HouseWorkOrdersLocationEnum[ + // record.location as keyof typeof HouseWorkOrdersLocationEnum + // ]; + + // return {locationConfig?.text || record.location}; + // }, + // }, + + { + title: 'ID', + dataIndex: 'id', + span: 1, + }, + + { + title: '投诉描述', + dataIndex: 'content', + span: 2, + }, + + { + title: '投诉状态', + dataIndex: 'status', + span: 1, + render: (_, record) => { + const statusConfig = + HouseWorkOrdersStatusEnum[ + record.status as keyof typeof HouseWorkOrdersStatusEnum + ]; + const color = + record.status === 'Completed' + ? 'green' + : record.status === 'InProgress' + ? 'blue' + : 'default'; + return ( + + {statusConfig?.text || record.status} + + ); + }, + }, + { + title: '分配状态', + dataIndex: 'assign_status', + span: 1, + render: (_, record) => { + const assignConfig = + HouseWorkOrdersAssignStatusEnum[ + record.assign_status as keyof typeof HouseWorkOrdersAssignStatusEnum + ]; + const color = + record.assign_status === 'Assigned' ? 'green' : 'orange'; + return ( + + {assignConfig?.text || record.assign_status} + + ); + }, + }, + { + title: '优先级', + dataIndex: 'level', + span: 1, + render: (_, record) => { + const levelConfig = + HouseWorkOrdersLevelEnum[ + record.level as keyof typeof HouseWorkOrdersLevelEnum + ]; + return {levelConfig?.text || record.level}; + }, + }, + { + title: '处理人', + dataIndex: 'assign_employee_name', + span: 1, + render: (_, record) => { + const assigneeInfo = record?.assign_employee + ? `${record.assign_employee.name || ''}-${ + record.assign_employee.phone || '' + }` + : '未分配'; + return ( + + {assigneeInfo} + + + ); + }, + }, + + { + title: '创建时间', + dataIndex: 'created_at', + span: 1, + valueType: 'dateTime', + }, + { + title: '更新时间', + dataIndex: 'updated_at', + span: 1, + valueType: 'dateTime', + }, + { + title: '相关附件', + dataIndex: 'attachments', + span: 2, + render: (_, record) => { + // 检查attachments是否为数组且有数据 + if ( + !Array.isArray(record.attachments) || + record.attachments.length === 0 + ) { + return '无附件'; + } + return ( +
+ {record.attachments.map((item: any, index: number) => { + if (item.type && item.type.includes('image')) { + return ( + + ); + } else if (item.type && item.type.includes('video')) { + return ( +
+ ); + }, + }, + ]} + /> + {/* 处理记录 */} + { + handleOpen(); + reload?.(); + }} + /> + + )} +
+ + ); +} diff --git a/src/pages/meter/list/index.tsx b/src/pages/meter/list/index.tsx index c40dd5c..9e1a94b 100644 --- a/src/pages/meter/list/index.tsx +++ b/src/pages/meter/list/index.tsx @@ -44,13 +44,22 @@ export default function Index({ title = '仪表管理' }) { toolBarRender={(action) => [ , + , , ]} columns={[ diff --git a/src/pages/meter/readings/show/$id.tsx b/src/pages/meter/readings/show/$id.tsx index cef7e4e..8178d99 100644 --- a/src/pages/meter/readings/show/$id.tsx +++ b/src/pages/meter/readings/show/$id.tsx @@ -7,6 +7,7 @@ import { useEffect, useState } from 'react'; import MeteInfo from '../components/MeteInfo'; import HasHouse from '../table/HasHouse'; import ReadingLIst from '../table/ReadingLIst'; +import Tasks from '../table/Tasks'; export default function Show({ title = '仪表详情' }) { const { id } = useParams<{ id: string }>(); @@ -58,6 +59,12 @@ export default function Show({ title = '仪表详情' }) { closable: false, children: , }, + { + label: '仪表任务', + key: '3', + closable: false, + children: , + }, ]; return ( diff --git a/src/pages/meter/readings/table/HasHouse.tsx b/src/pages/meter/readings/table/HasHouse.tsx index f8aeb0e..075229c 100644 --- a/src/pages/meter/readings/table/HasHouse.tsx +++ b/src/pages/meter/readings/table/HasHouse.tsx @@ -10,7 +10,6 @@ import { ProTable } from '@ant-design/pro-components'; import { Space } from 'antd'; import MeterHasHouse from '../../list/modals/MeterHasHouse'; import MeterHasOne from '../../list/modals/MeterHasOne'; -import NormalReading from '../modals/NormalReading'; export default function Index(props: MyBetaModalFormProps) { return ( @@ -25,12 +24,6 @@ export default function Index(props: MyBetaModalFormProps) { ) } toolBarRender={(action) => [ - , ...(props?.item?.meter_type === HouseMetersMeterTypeEnum.HouseMeter.value ? [ diff --git a/src/pages/meter/readings/table/Tasks.tsx b/src/pages/meter/readings/table/Tasks.tsx new file mode 100644 index 0000000..dd08fd6 --- /dev/null +++ b/src/pages/meter/readings/table/Tasks.tsx @@ -0,0 +1,111 @@ +import { + MyBetaModalFormProps, + MyButtons, + MyColumns, + MyProTableProps, +} from '@/common'; +import { Apis } from '@/gen/Apis'; +import { HouseChargeTaskDetailsStatusEnum } from '@/gen/Enums'; +import { ProTable } from '@ant-design/pro-components'; +import { useNavigate } from '@umijs/max'; +import { Space } from 'antd'; + +export default function Index(props: MyBetaModalFormProps) { + const navigate = useNavigate(); + return ( + <> + + MyProTableProps.request( + { ...params, id: props?.item?.id }, + sort, + Apis.Meter.HouseMeterTaskDetails.List, + ) + } + // toolBarRender={(action) => [ + // , + // , + // ]} + // search={false} + // options={false} + columns={[ + MyColumns.ID(), + { + title: '仪表名称', + dataIndex: ['meter_data', 'name'], + search: false, + }, + { + title: '关联房屋', + dataIndex: 'full_name', + search: false, + render: (_, record) => ( + { + navigate(`/bills/summary/show/${record.asset_houses_id}`); + }} + /> + ), + }, + MyColumns.EnumTag({ + title: '状态', + dataIndex: 'status', + valueEnum: HouseChargeTaskDetailsStatusEnum, + }), + + { + title: '收费标准', + dataIndex: ['charge_standard', 'name'], + render: (_, record) => { + return `【${record.charge_standard.id}】${record.charge_standard.name}`; + }, + search: false, + }, + { + title: '账单月份', + render: (_, record) => { + return `${record.year}-${String(record.month).padStart(2, '0')}`; + }, + search: false, + }, + { + title: '完成时间', + dataIndex: 'processed_time', + search: false, + }, + MyColumns.Option({ + render: (_, item: any, index, action) => ( + + + Apis.HouseCharage.HouseChargeTaskDetails.CreateHouseBill({ + id: item.id, + }).then(() => action?.reload()) + } + /> + + ), + }), + ]} + /> + + ); +} diff --git a/src/pages/meter/tasks/index.tsx b/src/pages/meter/tasks/index.tsx index 42c09d1..27ecb12 100644 --- a/src/pages/meter/tasks/index.tsx +++ b/src/pages/meter/tasks/index.tsx @@ -95,7 +95,6 @@ export default function Index({ title = '仪表账单' }) { render: (_, item: any, index, action) => ( - ( + { + navigate(`/bills/summary/show/${record.asset_houses_id}`); + }} + /> + ), }, MyColumns.EnumTag({ title: '状态', @@ -35,7 +58,10 @@ export default function AssetInfo(props: MyBetaModalFormProps) { { title: '收费标准', - dataIndex: ['house_charge_task', 'house_charge_standard', 'name'], + dataIndex: ['charge_standard', 'name'], + render: (_, record) => { + return `【${record.charge_standard.id}】${record.charge_standard.name}`; + }, search: false, }, { @@ -46,14 +72,6 @@ export default function AssetInfo(props: MyBetaModalFormProps) { '0', )}`; }, - }, - { - title: '计费周期', - render: (_, record) => { - return `${record.house_charge_task.start_date} 至 ${String( - record.house_charge_task.end_date, - ).padStart(2, '0')}`; - }, search: false, }, { @@ -61,6 +79,24 @@ export default function AssetInfo(props: MyBetaModalFormProps) { dataIndex: 'processed_time', search: false, }, + MyColumns.Option({ + render: (_, item: any, index, action) => ( + + + Apis.HouseCharage.HouseChargeTaskDetails.CreateHouseBill({ + id: item.id, + }).then(() => action?.reload()) + } + /> + + ), + }), ]} /> } diff --git a/src/pages/order/index.tsx b/src/pages/order/list/index.tsx similarity index 71% rename from src/pages/order/index.tsx rename to src/pages/order/list/index.tsx index 51cca7e..c47e1db 100644 --- a/src/pages/order/index.tsx +++ b/src/pages/order/list/index.tsx @@ -1,4 +1,5 @@ import { + MyButtons, MyColumns, MyPageContainer, MyProTableProps, @@ -10,8 +11,10 @@ import { HouseOrdersPaymentMethodEnum, } from '@/gen/Enums'; import { ProTable } from '@ant-design/pro-components'; +import { Space } from 'antd'; +import Payments from './modals/Payments'; -export default function Index({ title = '支付明细' }) { +export default function Index({ title = '支付订单' }) { // 注册当前页面为标签页 usePageTabs({ tabKey: 'house_order', @@ -44,10 +47,10 @@ export default function Index({ title = '支付明细' }) { // importApi={Apis.Bill.HouseBills.Import} // reload={action?.reload} // />, - // , // ]} columns={[ - // MyColumns.ID(), + MyColumns.ID(), + { title: '订单号', dataIndex: 'order_code', @@ -63,32 +66,22 @@ export default function Index({ title = '支付明细' }) { dataIndex: 'order_status', valueEnum: HouseOrdersOrderStatusEnum, }), - - // { - // title: '支付单号', - // dataIndex: 'payment_no', - // search: false, - // }, { title: '应收金额', + dataIndex: 'amount', + search: false, + }, + { + title: '实收金额', dataIndex: 'actual_paid_amount', search: false, }, { - title: '滞纳金', - dataIndex: 'late_fee', - search: false, - }, - { - title: '退款总金额', + title: '退款金额', dataIndex: 'refund_amount', search: false, }, - { - title: '实缴金额', - dataIndex: 'actual_paid_amount', - search: false, - }, + { title: '收款账号', dataIndex: ['house_order_items', 'receipt_account'], @@ -114,20 +107,20 @@ export default function Index({ title = '支付明细' }) { }, // MyColumns.CreatedAt(), - // MyColumns.Option({ - // render: (_, item: any, index, action) => ( - // - // - // - // Apis.Common.Admins.Delete({ id: item.id }).then(() => - // action?.reload(), - // ) - // } - // /> - // - // ), - // }), + MyColumns.Option({ + render: (_, item: any, index, action) => ( + + + + Apis.Common.Admins.Delete({ id: item.id }).then(() => + action?.reload(), + ) + } + /> + + ), + }), ]} /> diff --git a/src/pages/order/list/modals/Payments.tsx b/src/pages/order/list/modals/Payments.tsx new file mode 100644 index 0000000..7038b7e --- /dev/null +++ b/src/pages/order/list/modals/Payments.tsx @@ -0,0 +1,79 @@ +import { MyBetaModalFormProps, MyColumns, MyProTableProps } from '@/common'; +import { MyModal } from '@/components/MyModal'; +import { Apis } from '@/gen/Apis'; +import { + HouseOrdersOrderStatusEnum, + HouseOrdersPaymentMethodEnum, +} from '@/gen/Enums'; +import { ProTable } from '@ant-design/pro-components'; +import { useNavigate } from '@umijs/max'; + +export default function TaskShow(props: MyBetaModalFormProps) { + const navigate = useNavigate(); + return ( + + MyProTableProps.request( + { ...params, house_orders_id: props?.item?.id }, + sort, + Apis.HouseOrder.HouseOrderPayments.List, + ) + } + // options={false} + columns={[ + MyColumns.ID(), + MyColumns.EnumTag({ + title: '支付状态', + dataIndex: 'payment_status', + valueEnum: HouseOrdersOrderStatusEnum, + }), + MyColumns.EnumTag({ + title: '支付方式', + dataIndex: 'payment_method', + valueEnum: HouseOrdersPaymentMethodEnum, + }), + { + title: '账单金额', + dataIndex: 'amount', + render: (value: any) => `${value / 100}元`, + search: false, + }, + { + title: '实际金额', + dataIndex: 'actual_amount', + render: (value: any) => `${value / 100}元`, + search: false, + }, + + { + title: '支付人', + render: (record: any) => + `${record?.customer?.name || ''}${ + record?.customer?.phone || '' + }`, + + search: false, + }, + { + title: '备注', + dataIndex: 'remark', + search: false, + }, + { + title: '支付单号', + dataIndex: 'payment_no', + search: false, + }, + MyColumns.UpdatedAt(), + ]} + /> + } + /> + ); +} diff --git a/src/pages/order/payments/index.tsx b/src/pages/order/pay/index.tsx similarity index 55% rename from src/pages/order/payments/index.tsx rename to src/pages/order/pay/index.tsx index e29c361..606ba55 100644 --- a/src/pages/order/payments/index.tsx +++ b/src/pages/order/pay/index.tsx @@ -5,6 +5,10 @@ import { usePageTabs, } from '@/common'; import { Apis } from '@/gen/Apis'; +import { + HouseOrdersOrderStatusEnum, + HouseOrdersPaymentMethodEnum, +} from '@/gen/Enums'; import { ProTable } from '@ant-design/pro-components'; export default function Index({ title = '支付明细' }) { @@ -18,7 +22,7 @@ export default function Index({ title = '支付明细' }) { , - // , // ]} columns={[ MyColumns.ID(), { - title: '房屋', - dataIndex: ['asset_house', 'full_name'], - search: { - transform: (value) => { - return { full_name: value }; - }, - }, + title: '支付订单', + dataIndex: 'house_orders_id', + search: false, + }, + MyColumns.EnumTag({ + title: '支付状态', + dataIndex: 'payment_status', + valueEnum: HouseOrdersOrderStatusEnum, + }), + MyColumns.EnumTag({ + title: '支付方式', + dataIndex: 'payment_method', + valueEnum: HouseOrdersPaymentMethodEnum, + }), + { + title: '账单金额', + dataIndex: 'amount', + render: (value: any) => `${value / 100}元`, + search: false, + }, + { + title: '实际金额', + dataIndex: 'actual_amount', + render: (value: any) => `${value / 100}元`, + search: false, + }, + + { + title: '支付人', + render: (record: any) => + `${record?.customer?.name || ''}${record?.customer?.phone || ''}`, + + search: false, + }, + { + title: '备注', + dataIndex: 'remark', + search: false, }, { title: '支付单号', dataIndex: 'payment_no', search: false, }, - { - title: '交易单号', - dataIndex: 'transaction_id', - search: false, - }, - { - title: '第三方交易号', - dataIndex: 'hird_trade_no', - search: false, - }, - MyColumns.CreatedAt(), - // MyColumns.Option({ - // render: (_, item: any, index, action) => ( - // - // - // - // Apis.Common.Admins.Delete({ id: item.id }).then(() => - // action?.reload(), - // ) - // } - // /> - // - // ), - // }), + MyColumns.UpdatedAt(), ]} />