Compare commits
2 Commits
31ed649a27
...
28d9bd28a4
| Author | SHA1 | Date | |
|---|---|---|---|
| 28d9bd28a4 | |||
|
|
6ffc7bb71f |
@ -18,6 +18,7 @@ export default defineConfig({
|
|||||||
target: 'http://10.39.13.78:8001/',
|
target: 'http://10.39.13.78:8001/',
|
||||||
// target: 'https://test-admin.linyikj.com.cn/',
|
// target: 'https://test-admin.linyikj.com.cn/',
|
||||||
// target: 'https://admin.linyikj.com.cn/',
|
// target: 'https://admin.linyikj.com.cn/',
|
||||||
|
// target: 'http://cd69cef8.natappfree.cc/',
|
||||||
|
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
pathRewrite: { '^': '' },
|
pathRewrite: { '^': '' },
|
||||||
|
|||||||
132
src/gen/ApiTypes.d.ts
vendored
132
src/gen/ApiTypes.d.ts
vendored
@ -15,6 +15,7 @@ declare namespace ApiTypes {
|
|||||||
"is_enroll"?: boolean; // 是否报名:1 是、0 否
|
"is_enroll"?: boolean; // 是否报名:1 是、0 否
|
||||||
"project_ids"?: string[]; // 项目ID
|
"project_ids"?: string[]; // 项目ID
|
||||||
"content": string; // 内容
|
"content": string; // 内容
|
||||||
|
"cover_image"?: string[]; // 封面图片
|
||||||
};
|
};
|
||||||
type Update = {
|
type Update = {
|
||||||
"id": number; // id
|
"id": number; // id
|
||||||
@ -26,6 +27,7 @@ declare namespace ApiTypes {
|
|||||||
"is_enroll"?: boolean; // 是否报名:1 是、0 否
|
"is_enroll"?: boolean; // 是否报名:1 是、0 否
|
||||||
"project_ids"?: string[]; // 项目ID
|
"project_ids"?: string[]; // 项目ID
|
||||||
"content": string; // 内容
|
"content": string; // 内容
|
||||||
|
"cover_image"?: string[]; // 封面图片
|
||||||
};
|
};
|
||||||
type ChangePublishStatus = {
|
type ChangePublishStatus = {
|
||||||
"id": number; // id
|
"id": number; // id
|
||||||
@ -470,9 +472,14 @@ declare namespace ApiTypes {
|
|||||||
namespace Bill {
|
namespace Bill {
|
||||||
namespace HouseBills {
|
namespace HouseBills {
|
||||||
type List = {
|
type List = {
|
||||||
|
"asset_houses_id"?: number; // 资产房屋id,[ref:asset_houses]
|
||||||
"full_name"?: string; // 模糊搜索:房屋名称
|
"full_name"?: string; // 模糊搜索:房屋名称
|
||||||
"company_name"?: string; // 模糊搜索:公司名称
|
"company_name"?: string; // 模糊搜索:公司名称
|
||||||
};
|
};
|
||||||
|
type SummaryBillList = {
|
||||||
|
"full_name"?: string; // 模糊搜索:房屋名称
|
||||||
|
"asset_houses_id"?: number; // 资产房屋id,[ref:asset_houses]
|
||||||
|
};
|
||||||
type Store = {
|
type Store = {
|
||||||
"asset_houses_id": number; // 资产房屋id,[ref:asset_houses]
|
"asset_houses_id": number; // 资产房屋id,[ref:asset_houses]
|
||||||
"company_receipt_accounts_id": number; // 公司收款账户id,[ref:company_receipt_accounts]
|
"company_receipt_accounts_id": number; // 公司收款账户id,[ref:company_receipt_accounts]
|
||||||
@ -1278,6 +1285,131 @@ declare namespace ApiTypes {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
namespace Meter {
|
||||||
|
namespace HouseMeterHasHouses {
|
||||||
|
type List = {
|
||||||
|
"house_meters_id"?: number; // 房屋仪表id,[ref:house_meters]
|
||||||
|
"name"?: string; // 模糊搜索:名称
|
||||||
|
"full_name"?: string; // 模糊搜索:房屋全称
|
||||||
|
};
|
||||||
|
type StoreOrUpdate = {
|
||||||
|
"house_meters_id": number; // 房屋仪表id,[ref:house_meters]
|
||||||
|
"asset_houses_ids": string[]; // 房屋id,[ref:asset_houses]
|
||||||
|
};
|
||||||
|
type Show = {
|
||||||
|
"id": number; // id
|
||||||
|
};
|
||||||
|
type Delete = {
|
||||||
|
"id": number; // id
|
||||||
|
};
|
||||||
|
}
|
||||||
|
namespace HouseMeterReadings {
|
||||||
|
type List = {
|
||||||
|
"name"?: string; // 模糊搜索:名称
|
||||||
|
};
|
||||||
|
type Store = {
|
||||||
|
"house_meters_id": number; // 仪表id,[ref:house_meters]
|
||||||
|
"operation_type": string; // 操作类型,[enum:HouseMeterReadingsOperationTypeEnum]
|
||||||
|
"current_reading": number; // 本次读数
|
||||||
|
"reading_time": Date; // 抄表时间
|
||||||
|
"company_employees_id": number; // 抄表人id,[ref:company_employees]
|
||||||
|
"remark": string; // 备注
|
||||||
|
};
|
||||||
|
type Update = {
|
||||||
|
"id": number; // id
|
||||||
|
"house_meters_id": number; // 仪表id,[ref:house_meters]
|
||||||
|
"operation_type": string; // 操作类型,[enum:HouseMeterReadingsOperationTypeEnum]
|
||||||
|
"previous_reading": number; // 上次读数
|
||||||
|
"current_reading": number; // 本次读数
|
||||||
|
"usage_amount": number; // 用量
|
||||||
|
"loss_amount"?: number; // 损耗
|
||||||
|
"reading_time": Date; // 抄表时间
|
||||||
|
"company_employees_id": number; // 抄表人id,[ref:company_employees]
|
||||||
|
"remark": string; // 备注
|
||||||
|
};
|
||||||
|
type Show = {
|
||||||
|
"id": number; // id
|
||||||
|
};
|
||||||
|
type Delete = {
|
||||||
|
"id": number; // id
|
||||||
|
};
|
||||||
|
}
|
||||||
|
namespace HouseMeterTasks {
|
||||||
|
type List = {
|
||||||
|
"name"?: string; // 模糊搜索:名称
|
||||||
|
};
|
||||||
|
type Store = {
|
||||||
|
"asset_projects_id": number; // 资产项目id,[ref:asset_projects]
|
||||||
|
"generation_method": string; // 生成方式,[enum:HouseMeterTasksGenerationMethodEnum]
|
||||||
|
"month": string; // 月份
|
||||||
|
"start_date": Date; // 收费开始日期
|
||||||
|
"end_date": Date; // 收费截止日期
|
||||||
|
"data": string[]; // 任务数据(如果是楼栋则是楼栋ID,如果是单元则是单元ID,如果是仪表则是仪表ID)
|
||||||
|
};
|
||||||
|
type Show = {
|
||||||
|
"id": number; // id
|
||||||
|
};
|
||||||
|
type SoftDelete = {
|
||||||
|
"id": number; // id
|
||||||
|
};
|
||||||
|
type Restore = {
|
||||||
|
"id": number; // id
|
||||||
|
};
|
||||||
|
type Delete = {
|
||||||
|
"id": number; // id
|
||||||
|
};
|
||||||
|
}
|
||||||
|
namespace HouseMeters {
|
||||||
|
type List = {
|
||||||
|
"name"?: string; // 模糊搜索:名称
|
||||||
|
"asset_projects_id"?: number; // 项目id,[ref:asset_projects]
|
||||||
|
"project_name"?: string; // 模糊搜索:项目名称
|
||||||
|
};
|
||||||
|
type Store = {
|
||||||
|
"asset_projects_id": number; // 项目id,[ref:asset_projects]
|
||||||
|
"charge_standards_id"?: number; // 房屋收费标准id,[ref:house_charge_standards]
|
||||||
|
"companies_id": number; // 机构id,[ref:companies]
|
||||||
|
"name": string; // 名称
|
||||||
|
"meter_type": string; // 仪表类型,[enum:HouseMetersMeterTypeEnum]
|
||||||
|
"usage_type": string; // 使用类型,[enum:HouseMetersUsageTypeEnum]
|
||||||
|
"multiple"?: number; // 倍率
|
||||||
|
"status"?: number; // 是否启用:0:禁用,1:启用
|
||||||
|
"initial_value"?: number; // 初始抄表读数
|
||||||
|
"initial_time"?: Date; // 初始抄表时间
|
||||||
|
"latest_value"?: number; // 最新抄表读数
|
||||||
|
"latest_time"?: Date; // 最新抄表时间
|
||||||
|
"remark"?: string; // 备注
|
||||||
|
};
|
||||||
|
type Update = {
|
||||||
|
"id": number; // id
|
||||||
|
"asset_projects_id": number; // 项目id,[ref:asset_projects]
|
||||||
|
"charge_standards_id"?: number; // 房屋收费标准id,[ref:house_charge_standards]
|
||||||
|
"companies_id": number; // 机构id,[ref:companies]
|
||||||
|
"name": string; // 名称
|
||||||
|
"meter_type": string; // 仪表类型,[enum:HouseMetersMeterTypeEnum]
|
||||||
|
"usage_type": string; // 使用类型,[enum:HouseMetersUsageTypeEnum]
|
||||||
|
"multiple"?: number; // 倍率
|
||||||
|
"status"?: number; // 是否启用:0:禁用,1:启用
|
||||||
|
"initial_value"?: number; // 初始抄表读数
|
||||||
|
"initial_time"?: Date; // 初始抄表时间
|
||||||
|
"latest_value"?: number; // 最新抄表读数
|
||||||
|
"latest_time"?: Date; // 最新抄表时间
|
||||||
|
"remark"?: string; // 备注
|
||||||
|
};
|
||||||
|
type Show = {
|
||||||
|
"id": number; // id
|
||||||
|
};
|
||||||
|
type SoftDelete = {
|
||||||
|
"id": number; // id
|
||||||
|
};
|
||||||
|
type Restore = {
|
||||||
|
"id": number; // id
|
||||||
|
};
|
||||||
|
type Delete = {
|
||||||
|
"id": number; // id
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
namespace Msg {
|
namespace Msg {
|
||||||
namespace MsgPropertyAnnouncements {
|
namespace MsgPropertyAnnouncements {
|
||||||
type List = {
|
type List = {
|
||||||
|
|||||||
@ -254,6 +254,9 @@ export const Apis = {
|
|||||||
List(data?: ApiTypes.Bill.HouseBills.List): Promise<MyResponseType> {
|
List(data?: ApiTypes.Bill.HouseBills.List): Promise<MyResponseType> {
|
||||||
return request('admin/bill/house_bills/list', { data });
|
return request('admin/bill/house_bills/list', { data });
|
||||||
},
|
},
|
||||||
|
SummaryBillList(data?: ApiTypes.Bill.HouseBills.SummaryBillList): Promise<MyResponseType> {
|
||||||
|
return request('admin/bill/house_bills/summary_bill_list', { data });
|
||||||
|
},
|
||||||
Store(data: ApiTypes.Bill.HouseBills.Store): Promise<MyResponseType> {
|
Store(data: ApiTypes.Bill.HouseBills.Store): Promise<MyResponseType> {
|
||||||
return request('admin/bill/house_bills/store', { data });
|
return request('admin/bill/house_bills/store', { data });
|
||||||
},
|
},
|
||||||
@ -754,6 +757,82 @@ export const Apis = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
Meter: {
|
||||||
|
HouseMeterHasHouses: {
|
||||||
|
List(data?: ApiTypes.Meter.HouseMeterHasHouses.List): Promise<MyResponseType> {
|
||||||
|
return request('admin/meter/house_meter_has_houses/list', { data });
|
||||||
|
},
|
||||||
|
StoreOrUpdate(data: ApiTypes.Meter.HouseMeterHasHouses.StoreOrUpdate): Promise<MyResponseType> {
|
||||||
|
return request('admin/meter/house_meter_has_houses/store_or_update', { data });
|
||||||
|
},
|
||||||
|
Show(data: ApiTypes.Meter.HouseMeterHasHouses.Show): Promise<MyResponseType> {
|
||||||
|
return request('admin/meter/house_meter_has_houses/show', { data });
|
||||||
|
},
|
||||||
|
Delete(data: ApiTypes.Meter.HouseMeterHasHouses.Delete): Promise<MyResponseType> {
|
||||||
|
return request('admin/meter/house_meter_has_houses/delete', { data });
|
||||||
|
},
|
||||||
|
},
|
||||||
|
HouseMeterReadings: {
|
||||||
|
List(data?: ApiTypes.Meter.HouseMeterReadings.List): Promise<MyResponseType> {
|
||||||
|
return request('admin/meter/house_meter_readings/list', { data });
|
||||||
|
},
|
||||||
|
Store(data: ApiTypes.Meter.HouseMeterReadings.Store): Promise<MyResponseType> {
|
||||||
|
return request('admin/meter/house_meter_readings/store', { data });
|
||||||
|
},
|
||||||
|
Update(data: ApiTypes.Meter.HouseMeterReadings.Update): Promise<MyResponseType> {
|
||||||
|
return request('admin/meter/house_meter_readings/update', { data });
|
||||||
|
},
|
||||||
|
Show(data: ApiTypes.Meter.HouseMeterReadings.Show): Promise<MyResponseType> {
|
||||||
|
return request('admin/meter/house_meter_readings/show', { data });
|
||||||
|
},
|
||||||
|
Delete(data: ApiTypes.Meter.HouseMeterReadings.Delete): Promise<MyResponseType> {
|
||||||
|
return request('admin/meter/house_meter_readings/delete', { data });
|
||||||
|
},
|
||||||
|
},
|
||||||
|
HouseMeterTasks: {
|
||||||
|
List(data?: ApiTypes.Meter.HouseMeterTasks.List): Promise<MyResponseType> {
|
||||||
|
return request('admin/meter/house_meter_tasks/list', { data });
|
||||||
|
},
|
||||||
|
Store(data: ApiTypes.Meter.HouseMeterTasks.Store): Promise<MyResponseType> {
|
||||||
|
return request('admin/meter/house_meter_tasks/store', { data });
|
||||||
|
},
|
||||||
|
Show(data: ApiTypes.Meter.HouseMeterTasks.Show): Promise<MyResponseType> {
|
||||||
|
return request('admin/meter/house_meter_tasks/show', { data });
|
||||||
|
},
|
||||||
|
SoftDelete(data: ApiTypes.Meter.HouseMeterTasks.SoftDelete): Promise<MyResponseType> {
|
||||||
|
return request('admin/meter/house_meter_tasks/soft_delete', { data });
|
||||||
|
},
|
||||||
|
Restore(data: ApiTypes.Meter.HouseMeterTasks.Restore): Promise<MyResponseType> {
|
||||||
|
return request('admin/meter/house_meter_tasks/restore', { data });
|
||||||
|
},
|
||||||
|
Delete(data: ApiTypes.Meter.HouseMeterTasks.Delete): Promise<MyResponseType> {
|
||||||
|
return request('admin/meter/house_meter_tasks/delete', { data });
|
||||||
|
},
|
||||||
|
},
|
||||||
|
HouseMeters: {
|
||||||
|
List(data?: ApiTypes.Meter.HouseMeters.List): Promise<MyResponseType> {
|
||||||
|
return request('admin/meter/house_meters/list', { data });
|
||||||
|
},
|
||||||
|
Store(data: ApiTypes.Meter.HouseMeters.Store): Promise<MyResponseType> {
|
||||||
|
return request('admin/meter/house_meters/store', { data });
|
||||||
|
},
|
||||||
|
Update(data: ApiTypes.Meter.HouseMeters.Update): Promise<MyResponseType> {
|
||||||
|
return request('admin/meter/house_meters/update', { data });
|
||||||
|
},
|
||||||
|
Show(data: ApiTypes.Meter.HouseMeters.Show): Promise<MyResponseType> {
|
||||||
|
return request('admin/meter/house_meters/show', { data });
|
||||||
|
},
|
||||||
|
SoftDelete(data: ApiTypes.Meter.HouseMeters.SoftDelete): Promise<MyResponseType> {
|
||||||
|
return request('admin/meter/house_meters/soft_delete', { data });
|
||||||
|
},
|
||||||
|
Restore(data: ApiTypes.Meter.HouseMeters.Restore): Promise<MyResponseType> {
|
||||||
|
return request('admin/meter/house_meters/restore', { data });
|
||||||
|
},
|
||||||
|
Delete(data: ApiTypes.Meter.HouseMeters.Delete): Promise<MyResponseType> {
|
||||||
|
return request('admin/meter/house_meters/delete', { data });
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
Msg: {
|
Msg: {
|
||||||
MsgPropertyAnnouncements: {
|
MsgPropertyAnnouncements: {
|
||||||
List(data?: ApiTypes.Msg.MsgPropertyAnnouncements.List): Promise<MyResponseType> {
|
List(data?: ApiTypes.Msg.MsgPropertyAnnouncements.List): Promise<MyResponseType> {
|
||||||
|
|||||||
@ -154,7 +154,7 @@ export const BannersTypeEnum= {
|
|||||||
|
|
||||||
// 缓存类型
|
// 缓存类型
|
||||||
export const CacheTypeEnum= {
|
export const CacheTypeEnum= {
|
||||||
'MobilePhoneVerificationCode': {"text":"手机验证码","color":"#5acfb3","value":"MobilePhoneVerificationCode"},
|
'MobilePhoneVerificationCode': {"text":"手机验证码","color":"#0a9319","value":"MobilePhoneVerificationCode"},
|
||||||
};
|
};
|
||||||
|
|
||||||
// CompaniesMerchantTypeEnum
|
// CompaniesMerchantTypeEnum
|
||||||
@ -226,7 +226,6 @@ export const CustomerMomentTasksStatusEnum= {
|
|||||||
// CustomerMomentsChannelEnum
|
// CustomerMomentsChannelEnum
|
||||||
export const CustomerMomentsChannelEnum= {
|
export const CustomerMomentsChannelEnum= {
|
||||||
'MomentCorp': {"text":"朋友圈(企业)","color":"#1E90FF","value":"MomentCorp"},
|
'MomentCorp': {"text":"朋友圈(企业)","color":"#1E90FF","value":"MomentCorp"},
|
||||||
'MomentPersonal': {"text":"朋友圈(个人)","color":"#32CD32","value":"MomentPersonal"},
|
|
||||||
'CustomerDirectCorp': {"text":"客户1对1消息群发(企业)","color":"#FFA500","value":"CustomerDirectCorp"},
|
'CustomerDirectCorp': {"text":"客户1对1消息群发(企业)","color":"#FFA500","value":"CustomerDirectCorp"},
|
||||||
'CustomerGroupCorp': {"text":"客户群群发(企业)","color":"#FF69B4","value":"CustomerGroupCorp"},
|
'CustomerGroupCorp': {"text":"客户群群发(企业)","color":"#FF69B4","value":"CustomerGroupCorp"},
|
||||||
};
|
};
|
||||||
@ -396,6 +395,34 @@ export const HouseCollectionTasksStatusEnum= {
|
|||||||
'Failed': {"text":"失败","color":"#ff0000","value":"Failed"},
|
'Failed': {"text":"失败","color":"#ff0000","value":"Failed"},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// HouseMeterReadingsOperationTypeEnum
|
||||||
|
export const HouseMeterReadingsOperationTypeEnum= {
|
||||||
|
'NormalReading': {"text":"正常抄表","color":"#4caf50","value":"NormalReading"},
|
||||||
|
'ResetReading': {"text":"重置读数","color":"#f44336","value":"ResetReading"},
|
||||||
|
'CorrectReading': {"text":"修正读数","color":"#ff9800","value":"CorrectReading"},
|
||||||
|
};
|
||||||
|
|
||||||
|
// HouseMeterTasksGenerationMethodEnum
|
||||||
|
export const HouseMeterTasksGenerationMethodEnum= {
|
||||||
|
'Building': {"text":"按楼栋","color":"#4caf50","value":"Building"},
|
||||||
|
'Unit': {"text":"按单元","color":"#2196f3","value":"Unit"},
|
||||||
|
'Meter': {"text":"按仪表","color":"#ff9800","value":"Meter"},
|
||||||
|
};
|
||||||
|
|
||||||
|
// HouseMetersMeterTypeEnum
|
||||||
|
export const HouseMetersMeterTypeEnum= {
|
||||||
|
'HouseMeter': {"text":"房屋表","color":"#4caf50","value":"HouseMeter"},
|
||||||
|
'CommonMeter': {"text":"公摊表","color":"#2196f3","value":"CommonMeter"},
|
||||||
|
};
|
||||||
|
|
||||||
|
// HouseMetersUsageTypeEnum
|
||||||
|
export const HouseMetersUsageTypeEnum= {
|
||||||
|
'WaterMeter': {"text":"水表","color":"#2196f3","value":"WaterMeter"},
|
||||||
|
'ElectricMeter': {"text":"电表","color":"#ff9800","value":"ElectricMeter"},
|
||||||
|
'GasMeter': {"text":"燃气表","color":"#f44336","value":"GasMeter"},
|
||||||
|
'HeatingMeter': {"text":"暖气表","color":"#9c27b0","value":"HeatingMeter"},
|
||||||
|
};
|
||||||
|
|
||||||
// HouseOccupantsCardTypeEnum
|
// HouseOccupantsCardTypeEnum
|
||||||
export const HouseOccupantsCardTypeEnum= {
|
export const HouseOccupantsCardTypeEnum= {
|
||||||
'MainlandID': {"text":"中国大陆居民身份证","color":"#2db7f5","value":"MainlandID"},
|
'MainlandID': {"text":"中国大陆居民身份证","color":"#2db7f5","value":"MainlandID"},
|
||||||
|
|||||||
@ -7,7 +7,7 @@ import {
|
|||||||
} from '@/gen/Enums';
|
} from '@/gen/Enums';
|
||||||
import { ProCard, ProDescriptions } from '@ant-design/pro-components';
|
import { ProCard, ProDescriptions } from '@ant-design/pro-components';
|
||||||
import { Space } from 'antd';
|
import { Space } from 'antd';
|
||||||
import ChangeStatus from './modals/ChangeStatus';
|
import ChangeStatus from '../table/modals/ChangeStatus';
|
||||||
|
|
||||||
export default function info(props: MyBetaModalFormProps) {
|
export default function info(props: MyBetaModalFormProps) {
|
||||||
const { item } = props;
|
const { item } = props;
|
||||||
|
|||||||
49
src/pages/archive/components/SummaryInfo.tsx
Normal file
49
src/pages/archive/components/SummaryInfo.tsx
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
import { MyBetaModalFormProps, MyProTableProps } from '@/common';
|
||||||
|
import { Apis } from '@/gen/Apis';
|
||||||
|
import { ProCard, ProTable } from '@ant-design/pro-components';
|
||||||
|
|
||||||
|
export default function info(props: MyBetaModalFormProps) {
|
||||||
|
const { item } = props;
|
||||||
|
return (
|
||||||
|
<ProCard>
|
||||||
|
<ProTable
|
||||||
|
{...MyProTableProps.props}
|
||||||
|
request={async (params, sort) =>
|
||||||
|
MyProTableProps.request(
|
||||||
|
{
|
||||||
|
...params,
|
||||||
|
asset_houses_id: item?.asset_houses_id,
|
||||||
|
},
|
||||||
|
sort,
|
||||||
|
Apis.Bill.HouseBills.SummaryBillList,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
search={false}
|
||||||
|
options={false}
|
||||||
|
pagination={false}
|
||||||
|
columns={[
|
||||||
|
{
|
||||||
|
title: '账单金额合计',
|
||||||
|
dataIndex: 'payable_amount_sum',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '滞纳金合计',
|
||||||
|
dataIndex: 'late_fee_sum',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '优惠金额合计',
|
||||||
|
dataIndex: 'discount_amount_sum',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '应付合计',
|
||||||
|
dataIndex: 'total_payable_sum',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</ProCard>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -5,9 +5,11 @@ import { useParams } from '@umijs/max';
|
|||||||
import { Badge, Tabs } from 'antd';
|
import { Badge, Tabs } from 'antd';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import HouseInfo from '../components/HouseInfo';
|
import HouseInfo from '../components/HouseInfo';
|
||||||
import OccupantsHistory from '../components/OccupantsHistory';
|
import SummaryInfo from '../components/SummaryInfo';
|
||||||
import OccupantsNow from '../components/OccupantsNow';
|
import OccupantsHistory from '../table/OccupantsHistory';
|
||||||
import RegistersList from '../components/RegistersList';
|
import OccupantsNow from '../table/OccupantsNow';
|
||||||
|
import RegistersList from '../table/RegistersList';
|
||||||
|
import UnpaidBill from '../table/UnpaidBill';
|
||||||
|
|
||||||
export default function Show({ title = '房屋档案' }) {
|
export default function Show({ title = '房屋档案' }) {
|
||||||
const { id } = useParams<{ id: string }>();
|
const { id } = useParams<{ id: string }>();
|
||||||
@ -88,11 +90,18 @@ export default function Show({ title = '房屋档案' }) {
|
|||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: '欠费账单',
|
||||||
|
key: '4',
|
||||||
|
closable: false,
|
||||||
|
children: <UnpaidBill item={{ ...data, asset_houses_id: id }} />,
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<MyPageContainer title={title}>
|
<MyPageContainer title={title}>
|
||||||
<HouseInfo item={data} reload={loadShow} />
|
<HouseInfo item={data} reload={loadShow} />
|
||||||
|
<SummaryInfo item={{ ...data, asset_houses_id: id }} reload={loadShow} />
|
||||||
<ProCard style={{ marginTop: 16 }}>
|
<ProCard style={{ marginTop: 16 }}>
|
||||||
<Tabs type="card" items={items} defaultActiveKey="1" size="small" />
|
<Tabs type="card" items={items} defaultActiveKey="1" size="small" />
|
||||||
</ProCard>
|
</ProCard>
|
||||||
|
|||||||
71
src/pages/archive/table/UnpaidBill.tsx
Normal file
71
src/pages/archive/table/UnpaidBill.tsx
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
import { MyColumns, MyProTableProps } from '@/common';
|
||||||
|
import { Apis } from '@/gen/Apis';
|
||||||
|
import { HouseBillsTypeEnum } from '@/gen/Enums';
|
||||||
|
import BillUpdate from '@/pages/bills/list/modals/BillUpdate';
|
||||||
|
import { ProTable } from '@ant-design/pro-components';
|
||||||
|
import { Space } from 'antd';
|
||||||
|
import { useEffect, useRef } from 'react';
|
||||||
|
|
||||||
|
export default function Index({ ...rest }) {
|
||||||
|
const actionLooks = useRef<any>();
|
||||||
|
useEffect(() => {
|
||||||
|
actionLooks?.current.reloadAndRest();
|
||||||
|
}, [rest.loadmore]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<ProTable<Record<any, any>>
|
||||||
|
{...MyProTableProps.props}
|
||||||
|
actionRef={actionLooks}
|
||||||
|
request={async (params, sort) =>
|
||||||
|
MyProTableProps.request(
|
||||||
|
{
|
||||||
|
...params,
|
||||||
|
asset_houses_id: rest.item?.asset_houses_id,
|
||||||
|
status: 'Normal',
|
||||||
|
},
|
||||||
|
sort,
|
||||||
|
Apis.Bill.HouseBills.List,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
search={false}
|
||||||
|
columns={[
|
||||||
|
MyColumns.ID(),
|
||||||
|
MyColumns.EnumTag({
|
||||||
|
title: '类型',
|
||||||
|
dataIndex: 'type',
|
||||||
|
valueEnum: HouseBillsTypeEnum,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
title: '账单月份',
|
||||||
|
render: (_, record) => {
|
||||||
|
return `${record.year}-${String(record.month).padStart(2, '0')}`;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '应付金额',
|
||||||
|
dataIndex: 'total_payable_amount',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '计费开始日期',
|
||||||
|
dataIndex: 'start_date',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '计费结束日期',
|
||||||
|
dataIndex: 'end_date',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
MyColumns.Option({
|
||||||
|
render: (_, item: any, index, action) => (
|
||||||
|
<Space key={index}>
|
||||||
|
<BillUpdate item={item} reload={action?.reload} title="编辑" />
|
||||||
|
</Space>
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -153,6 +153,18 @@ export default function Create(props: MyBetaModalFormProps) {
|
|||||||
},
|
},
|
||||||
renderFormItem: () => <MyEditor />,
|
renderFormItem: () => <MyEditor />,
|
||||||
},
|
},
|
||||||
|
MyFormItems.UploadImages({
|
||||||
|
key: 'cover_image',
|
||||||
|
title: '活动封面',
|
||||||
|
tooltip: '建议图片比例 16:9',
|
||||||
|
fieldProps: {
|
||||||
|
style: {
|
||||||
|
width: 160,
|
||||||
|
height: 90,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
max: 1,
|
||||||
|
}),
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -80,7 +80,21 @@ export default function Show(props: MyBetaModalFormProps) {
|
|||||||
{show?.publish_time || '-'}
|
{show?.publish_time || '-'}
|
||||||
</Space>
|
</Space>
|
||||||
</ProDescriptions.Item>
|
</ProDescriptions.Item>
|
||||||
|
<ProDescriptions.Item label="活动封面">
|
||||||
|
{show?.cover_image?.[0]?.url ? (
|
||||||
|
<img
|
||||||
|
src={show?.cover_image?.[0]?.url}
|
||||||
|
alt={show?.title || '-'}
|
||||||
|
style={{
|
||||||
|
width: 160,
|
||||||
|
height: 90,
|
||||||
|
objectFit: 'cover',
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
|
'-'
|
||||||
|
)}
|
||||||
|
</ProDescriptions.Item>
|
||||||
<ProDescriptions.Item label="活动内容">
|
<ProDescriptions.Item label="活动内容">
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
|
|||||||
@ -153,6 +153,18 @@ export default function Update(props: MyBetaModalFormProps) {
|
|||||||
renderFormItem: () => <MyEditor />,
|
renderFormItem: () => <MyEditor />,
|
||||||
initialValue: props.item?.content,
|
initialValue: props.item?.content,
|
||||||
},
|
},
|
||||||
|
MyFormItems.UploadImages({
|
||||||
|
key: 'cover_image',
|
||||||
|
title: '活动封面',
|
||||||
|
tooltip: '建议图片比例 16:9',
|
||||||
|
fieldProps: {
|
||||||
|
style: {
|
||||||
|
width: 160,
|
||||||
|
height: 90,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
max: 1,
|
||||||
|
}),
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|||||||
539
src/pages/asset/dictionary/index.tsx
Normal file
539
src/pages/asset/dictionary/index.tsx
Normal file
@ -0,0 +1,539 @@
|
|||||||
|
import {
|
||||||
|
MyButtons,
|
||||||
|
MyColumns,
|
||||||
|
MyPageContainer,
|
||||||
|
MyProTableProps,
|
||||||
|
usePageTabs,
|
||||||
|
} from '@/common';
|
||||||
|
import { Apis } from '@/gen/Apis';
|
||||||
|
import {
|
||||||
|
AssetHousesOwnershipTypeEnum,
|
||||||
|
AssetHousesUsageEnum,
|
||||||
|
} from '@/gen/Enums';
|
||||||
|
import { ProCard, ProTable } from '@ant-design/pro-components';
|
||||||
|
import { useNavigate } from '@umijs/max';
|
||||||
|
import { Alert, message, Space, Typography } from 'antd';
|
||||||
|
import { useCallback, useMemo, useRef, useState } from 'react';
|
||||||
|
import BuildingsCreate from './modals/BuildingsCreate';
|
||||||
|
import AssetBuildingsUpdate from './modals/BuildingsUpdate';
|
||||||
|
import HousesCreate from './modals/HousesCreate';
|
||||||
|
import HousesUpdate from './modals/HousesUpdate';
|
||||||
|
import UnitsCreate from './modals/UnitsCreate';
|
||||||
|
import AssetUnitsUpdate from './modals/UnitsUpdate';
|
||||||
|
|
||||||
|
const { Title } = Typography;
|
||||||
|
interface SelectedAsset {
|
||||||
|
id: number;
|
||||||
|
name: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface SelectedBuilding {
|
||||||
|
id: number;
|
||||||
|
name: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface SelectedUnit {
|
||||||
|
id: number;
|
||||||
|
name: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function Index({ title = '项目列表' }) {
|
||||||
|
usePageTabs({
|
||||||
|
tabKey: 'asset-buildings',
|
||||||
|
tabLabel: title,
|
||||||
|
});
|
||||||
|
|
||||||
|
const actionAssetRef: any = useRef();
|
||||||
|
const actionBuildingsRef: any = useRef();
|
||||||
|
const actionUnitsRef: any = useRef();
|
||||||
|
const actionHousesRef: any = useRef();
|
||||||
|
const navigate = useNavigate();
|
||||||
|
|
||||||
|
const [selectedAsset, setSelectedAsset] = useState<SelectedAsset | null>(
|
||||||
|
null,
|
||||||
|
);
|
||||||
|
const [selectedBuilding, setSelectedBuilding] =
|
||||||
|
useState<SelectedBuilding | null>(null);
|
||||||
|
const [selectedUnit, setSelectedUnit] = useState<SelectedUnit | null>(null);
|
||||||
|
const [loading, setLoading] = useState({
|
||||||
|
buildings: false,
|
||||||
|
units: false,
|
||||||
|
houses: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
// 选择项目的回调函数
|
||||||
|
const handleAssetSelect = useCallback(
|
||||||
|
(asset: SelectedAsset) => {
|
||||||
|
if (selectedAsset?.id === asset.id) return; // 避免重复选择
|
||||||
|
|
||||||
|
setSelectedAsset(asset);
|
||||||
|
setSelectedBuilding(null); // 重置楼栋选择
|
||||||
|
setSelectedUnit(null); // 重置单元选择
|
||||||
|
|
||||||
|
// 刷新楼栋和单元列表
|
||||||
|
actionBuildingsRef?.current?.reload();
|
||||||
|
actionUnitsRef?.current?.reload();
|
||||||
|
actionHousesRef?.current?.reload();
|
||||||
|
},
|
||||||
|
[selectedAsset?.id],
|
||||||
|
);
|
||||||
|
|
||||||
|
// 选择楼栋的回调函数
|
||||||
|
const handleBuildingSelect = useCallback(
|
||||||
|
(building: SelectedBuilding) => {
|
||||||
|
if (selectedBuilding?.id === building.id) return; // 避免重复选择
|
||||||
|
|
||||||
|
setSelectedBuilding(building);
|
||||||
|
setSelectedUnit(null); // 重置单元选择
|
||||||
|
|
||||||
|
// 刷新单元和房屋列表
|
||||||
|
actionUnitsRef?.current?.reload();
|
||||||
|
actionHousesRef?.current?.reload();
|
||||||
|
},
|
||||||
|
[selectedBuilding?.id],
|
||||||
|
);
|
||||||
|
|
||||||
|
// 选择单元的回调函数
|
||||||
|
const handleUnitSelect = useCallback(
|
||||||
|
(unit: SelectedUnit) => {
|
||||||
|
if (selectedUnit?.id === unit.id) return; // 避免重复选择
|
||||||
|
|
||||||
|
setSelectedUnit(unit);
|
||||||
|
// 刷新房屋列表
|
||||||
|
actionHousesRef?.current?.reload();
|
||||||
|
},
|
||||||
|
[selectedUnit?.id],
|
||||||
|
);
|
||||||
|
|
||||||
|
// 删除操作的通用处理
|
||||||
|
const handleDelete = useCallback(
|
||||||
|
async (deleteApi: any, id: number, reloadAction: any, itemName: string) => {
|
||||||
|
try {
|
||||||
|
await deleteApi({ id });
|
||||||
|
message.success(`${itemName}删除成功`);
|
||||||
|
reloadAction();
|
||||||
|
|
||||||
|
// 如果删除的是当前选中项,清空选择
|
||||||
|
if (itemName === '项目' && selectedAsset?.id === id) {
|
||||||
|
setSelectedAsset(null);
|
||||||
|
setSelectedBuilding(null);
|
||||||
|
setSelectedUnit(null);
|
||||||
|
} else if (itemName === '楼栋' && selectedBuilding?.id === id) {
|
||||||
|
setSelectedBuilding(null);
|
||||||
|
setSelectedUnit(null);
|
||||||
|
} else if (itemName === '单元' && selectedUnit?.id === id) {
|
||||||
|
setSelectedUnit(null);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
message.error(`${itemName}删除失败`);
|
||||||
|
console.error(`删除${itemName}失败:`, error);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[selectedAsset?.id, selectedBuilding?.id, selectedUnit?.id],
|
||||||
|
);
|
||||||
|
|
||||||
|
// 通用表格配置
|
||||||
|
const getTableConfig = useMemo(
|
||||||
|
() => ({
|
||||||
|
...MyProTableProps.props,
|
||||||
|
search: false as const,
|
||||||
|
size: 'middle' as const,
|
||||||
|
options: false as const,
|
||||||
|
pagination: {
|
||||||
|
pageSize: 10,
|
||||||
|
showSizeChanger: false,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
[],
|
||||||
|
);
|
||||||
|
|
||||||
|
// 项目表格列配置
|
||||||
|
const projectColumns = useMemo(
|
||||||
|
() => [
|
||||||
|
{
|
||||||
|
title: '项目',
|
||||||
|
dataIndex: 'name',
|
||||||
|
ellipsis: true,
|
||||||
|
search: {
|
||||||
|
transform: (value: string) => ({ name: value }),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
MyColumns.Option({
|
||||||
|
width: 120,
|
||||||
|
render: (_, item: any, index, action) => (
|
||||||
|
<Space key={index} size="small">
|
||||||
|
<MyButtons.View
|
||||||
|
title="配置"
|
||||||
|
onClick={() => {
|
||||||
|
navigate(`/asset/list/show/${item.id}`);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Space>
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
[handleDelete],
|
||||||
|
);
|
||||||
|
|
||||||
|
// 楼栋表格列配置
|
||||||
|
const buildingColumns = useMemo(
|
||||||
|
() => [
|
||||||
|
{
|
||||||
|
title: '楼栋',
|
||||||
|
dataIndex: 'name',
|
||||||
|
ellipsis: true,
|
||||||
|
},
|
||||||
|
MyColumns.Option({
|
||||||
|
width: 120,
|
||||||
|
render: (_, item: any, index, action) => (
|
||||||
|
<Space key={index} size="small">
|
||||||
|
<AssetBuildingsUpdate item={item} reload={action?.reload} />
|
||||||
|
{/* <MyButtons.Delete
|
||||||
|
size="small"
|
||||||
|
onConfirm={() =>
|
||||||
|
handleDelete(
|
||||||
|
Apis.Asset.AssetBuildings.Delete,
|
||||||
|
item.id,
|
||||||
|
action?.reload,
|
||||||
|
'楼栋',
|
||||||
|
)
|
||||||
|
}
|
||||||
|
/> */}
|
||||||
|
</Space>
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
[handleDelete],
|
||||||
|
);
|
||||||
|
|
||||||
|
// 单元表格列配置
|
||||||
|
const unitColumns = useMemo(
|
||||||
|
() => [
|
||||||
|
{
|
||||||
|
title: '单元',
|
||||||
|
dataIndex: 'name',
|
||||||
|
ellipsis: true,
|
||||||
|
},
|
||||||
|
MyColumns.Option({
|
||||||
|
width: 120,
|
||||||
|
render: (_, item: any, index, action) => (
|
||||||
|
<Space key={index} size="small">
|
||||||
|
<AssetUnitsUpdate item={item} reload={action?.reload} />
|
||||||
|
{/* <MyButtons.Delete
|
||||||
|
size="small"
|
||||||
|
onConfirm={() =>
|
||||||
|
handleDelete(
|
||||||
|
Apis.Asset.AssetUnits.Delete,
|
||||||
|
item.id,
|
||||||
|
action?.reload,
|
||||||
|
'单元',
|
||||||
|
)
|
||||||
|
}
|
||||||
|
/> */}
|
||||||
|
</Space>
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
[handleDelete],
|
||||||
|
);
|
||||||
|
|
||||||
|
// 房屋表格列配置
|
||||||
|
const houseColumns = useMemo(
|
||||||
|
() => [
|
||||||
|
MyColumns.EnumTag({
|
||||||
|
title: '用途',
|
||||||
|
dataIndex: 'usage',
|
||||||
|
valueEnum: AssetHousesUsageEnum,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
title: '房屋名称',
|
||||||
|
dataIndex: 'full_name',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '楼层',
|
||||||
|
dataIndex: 'floor',
|
||||||
|
render(_, record) {
|
||||||
|
return `${record?.floor}层`;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '房号',
|
||||||
|
dataIndex: 'name',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '计费面积',
|
||||||
|
dataIndex: 'chargeable_area',
|
||||||
|
render(_, record) {
|
||||||
|
return `${
|
||||||
|
record?.chargeable_area ? record?.chargeable_area + ' m²' : '-'
|
||||||
|
} `;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
MyColumns.EnumTag({
|
||||||
|
title: '房屋属性',
|
||||||
|
dataIndex: 'ownership_type',
|
||||||
|
valueEnum: AssetHousesOwnershipTypeEnum,
|
||||||
|
}),
|
||||||
|
MyColumns.Option({
|
||||||
|
width: 120,
|
||||||
|
render: (_, item: any, index, action) => (
|
||||||
|
<Space key={index} size="small">
|
||||||
|
<HousesUpdate item={item} reload={action?.reload} title="编辑" />
|
||||||
|
{/* <MyButtons.Delete
|
||||||
|
size="small"
|
||||||
|
onConfirm={() =>
|
||||||
|
handleDelete(
|
||||||
|
Apis.Asset.AssetHouses.Delete,
|
||||||
|
item.id,
|
||||||
|
action?.reload,
|
||||||
|
'房屋',
|
||||||
|
)
|
||||||
|
}
|
||||||
|
/> */}
|
||||||
|
</Space>
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
[handleDelete],
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<MyPageContainer title={title}>
|
||||||
|
<ProCard
|
||||||
|
title={
|
||||||
|
<Alert
|
||||||
|
message="操作提示:可在项目中添加楼栋,在楼栋中添加单元,在单元中添加房屋!"
|
||||||
|
type="info"
|
||||||
|
showIcon
|
||||||
|
style={{ margin: 0 }}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
>
|
||||||
|
<Space align="start" size="large" style={{ width: '100%' }}>
|
||||||
|
<div style={{ flex: 1 }}>
|
||||||
|
<Title level={5} style={{ marginBottom: 16 }}>
|
||||||
|
<Space
|
||||||
|
style={{ display: 'flex', justifyContent: 'space-between' }}
|
||||||
|
>
|
||||||
|
项目信息
|
||||||
|
</Space>
|
||||||
|
</Title>
|
||||||
|
<ProTable
|
||||||
|
{...getTableConfig}
|
||||||
|
// search={{
|
||||||
|
// labelWidth: 'auto',
|
||||||
|
// collapsed: false,
|
||||||
|
// collapseRender: false,
|
||||||
|
// }}
|
||||||
|
actionRef={actionAssetRef}
|
||||||
|
rowClassName={(record: any) => {
|
||||||
|
return selectedAsset?.id === record?.id
|
||||||
|
? 'ant-table-row-selected'
|
||||||
|
: '';
|
||||||
|
}}
|
||||||
|
onRow={(record: any) => {
|
||||||
|
return {
|
||||||
|
onClick: () => {
|
||||||
|
handleAssetSelect(record);
|
||||||
|
},
|
||||||
|
style: {
|
||||||
|
cursor: 'pointer',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
request={async (params, sort) =>
|
||||||
|
MyProTableProps.request(
|
||||||
|
{ ...params },
|
||||||
|
sort,
|
||||||
|
Apis.Asset.AssetProjects.List,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
columns={projectColumns}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 楼栋列表 */}
|
||||||
|
{selectedAsset ? (
|
||||||
|
<div style={{ flex: 1 }}>
|
||||||
|
<Title level={5} style={{ marginBottom: 16 }}>
|
||||||
|
<Space
|
||||||
|
style={{ display: 'flex', justifyContent: 'space-between' }}
|
||||||
|
>
|
||||||
|
<span>{selectedAsset?.name}</span>
|
||||||
|
<BuildingsCreate
|
||||||
|
key="BuildingsCreate"
|
||||||
|
item={{ ...selectedAsset, size: 'small' }}
|
||||||
|
reload={() => actionBuildingsRef?.current?.reload()}
|
||||||
|
title="楼栋"
|
||||||
|
/>
|
||||||
|
</Space>
|
||||||
|
</Title>
|
||||||
|
<ProTable
|
||||||
|
{...getTableConfig}
|
||||||
|
actionRef={actionBuildingsRef}
|
||||||
|
rowClassName={(record: any) => {
|
||||||
|
return selectedBuilding?.id === record?.id
|
||||||
|
? 'ant-table-row-selected'
|
||||||
|
: '';
|
||||||
|
}}
|
||||||
|
onRow={(record: any) => {
|
||||||
|
return {
|
||||||
|
onClick: () => {
|
||||||
|
handleBuildingSelect(record);
|
||||||
|
},
|
||||||
|
style: {
|
||||||
|
cursor: 'pointer',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
request={async (params, sort) =>
|
||||||
|
MyProTableProps.request(
|
||||||
|
{ ...params, asset_projects_id: selectedAsset?.id },
|
||||||
|
sort,
|
||||||
|
Apis.Asset.AssetBuildings.List,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
columns={buildingColumns}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
flex: 1,
|
||||||
|
// minWidth: 300,
|
||||||
|
display: 'flex',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
color: '#999',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
请先选择项目
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{/* 单元列表 */}
|
||||||
|
{selectedBuilding ? (
|
||||||
|
<div style={{ flex: 1 }}>
|
||||||
|
<Title level={5} style={{ marginBottom: 16 }}>
|
||||||
|
<Space
|
||||||
|
style={{ display: 'flex', justifyContent: 'space-between' }}
|
||||||
|
>
|
||||||
|
<span>{selectedBuilding.name}</span>
|
||||||
|
<UnitsCreate
|
||||||
|
key="UnitsCreate"
|
||||||
|
item={{
|
||||||
|
...selectedBuilding,
|
||||||
|
asset_buildings_id: selectedBuilding?.id,
|
||||||
|
size: 'small',
|
||||||
|
}}
|
||||||
|
reload={() => actionUnitsRef?.current?.reload()}
|
||||||
|
title="单元"
|
||||||
|
/>
|
||||||
|
</Space>
|
||||||
|
</Title>
|
||||||
|
<ProTable
|
||||||
|
{...getTableConfig}
|
||||||
|
actionRef={actionUnitsRef}
|
||||||
|
request={async (params, sort) =>
|
||||||
|
MyProTableProps.request(
|
||||||
|
{
|
||||||
|
...params,
|
||||||
|
asset_projects_id: selectedAsset?.id,
|
||||||
|
asset_buildings_id: selectedBuilding?.id,
|
||||||
|
},
|
||||||
|
sort,
|
||||||
|
Apis.Asset.AssetUnits.List,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
rowClassName={(record: any) => {
|
||||||
|
return selectedUnit?.id === record?.id
|
||||||
|
? 'ant-table-row-selected'
|
||||||
|
: '';
|
||||||
|
}}
|
||||||
|
onRow={(record: any) => {
|
||||||
|
return {
|
||||||
|
onClick: () => {
|
||||||
|
handleUnitSelect(record);
|
||||||
|
},
|
||||||
|
style: {
|
||||||
|
cursor: 'pointer',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
columns={unitColumns}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
flex: 1,
|
||||||
|
// minWidth: 300,
|
||||||
|
display: 'flex',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
color: '#999',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
请先选择楼栋
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{/* 房屋列表 */}
|
||||||
|
{selectedUnit ? (
|
||||||
|
<div style={{ flex: 1 }}>
|
||||||
|
<Title level={5} style={{ marginBottom: 16 }}>
|
||||||
|
<Space
|
||||||
|
style={{ display: 'flex', justifyContent: 'space-between' }}
|
||||||
|
>
|
||||||
|
<span>{selectedUnit.name}</span>
|
||||||
|
<HousesCreate
|
||||||
|
key="HousesCreate"
|
||||||
|
item={{
|
||||||
|
...selectedUnit,
|
||||||
|
asset_projects_id: selectedAsset?.id,
|
||||||
|
asset_buildings_id: selectedBuilding?.id,
|
||||||
|
asset_units_id: selectedUnit?.id,
|
||||||
|
size: 'small',
|
||||||
|
}}
|
||||||
|
reload={() => actionHousesRef?.current?.reload()}
|
||||||
|
title="房屋"
|
||||||
|
/>
|
||||||
|
</Space>
|
||||||
|
</Title>
|
||||||
|
<ProTable
|
||||||
|
{...getTableConfig}
|
||||||
|
actionRef={actionHousesRef}
|
||||||
|
request={async (params, sort) =>
|
||||||
|
MyProTableProps.request(
|
||||||
|
{
|
||||||
|
...params,
|
||||||
|
asset_projects_id: selectedAsset?.id,
|
||||||
|
asset_buildings_id: selectedBuilding?.id,
|
||||||
|
asset_units_id: selectedUnit?.id,
|
||||||
|
},
|
||||||
|
sort,
|
||||||
|
Apis.Asset.AssetHouses.List,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
columns={houseColumns}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
flex: 1,
|
||||||
|
// minWidth: 400,
|
||||||
|
display: 'flex',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
color: '#999',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{selectedBuilding ? '请先选择单元' : '请先选择楼栋'}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</Space>
|
||||||
|
</ProCard>
|
||||||
|
</MyPageContainer>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -5,260 +5,96 @@ import {
|
|||||||
MyProTableProps,
|
MyProTableProps,
|
||||||
usePageTabs,
|
usePageTabs,
|
||||||
} from '@/common';
|
} from '@/common';
|
||||||
|
import { MyExport } from '@/components/MyExport';
|
||||||
import { Apis } from '@/gen/Apis';
|
import { Apis } from '@/gen/Apis';
|
||||||
import {
|
import {
|
||||||
AssetHousesOwnershipTypeEnum,
|
AssetHousesOwnershipTypeEnum,
|
||||||
AssetHousesUsageEnum,
|
AssetHousesUsageEnum,
|
||||||
} from '@/gen/Enums';
|
} from '@/gen/Enums';
|
||||||
import { ProCard, ProTable } from '@ant-design/pro-components';
|
import { ProTable } from '@ant-design/pro-components';
|
||||||
import { useNavigate } from '@umijs/max';
|
import { useNavigate } from '@umijs/max';
|
||||||
import { Alert, message, Space, Typography } from 'antd';
|
import { Space } from 'antd';
|
||||||
import { useCallback, useMemo, useRef, useState } from 'react';
|
import { useState } from 'react';
|
||||||
import BuildingsCreate from './modals/BuildingsCreate';
|
import HousesShow from '../dictionary/modals/HousesShow';
|
||||||
import AssetBuildingsUpdate from './modals/BuildingsUpdate';
|
import HousesUpdate from '../dictionary/modals/HousesUpdate';
|
||||||
import HousesCreate from './modals/HousesCreate';
|
|
||||||
import HousesUpdate from './modals/HousesUpdate';
|
|
||||||
import UnitsCreate from './modals/UnitsCreate';
|
|
||||||
import AssetUnitsUpdate from './modals/UnitsUpdate';
|
|
||||||
|
|
||||||
const { Title } = Typography;
|
export default function Index({ title = '房屋列表' }) {
|
||||||
interface SelectedAsset {
|
const [getParams, setParams] = useState({});
|
||||||
id: number;
|
|
||||||
name: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface SelectedBuilding {
|
const navigate = useNavigate();
|
||||||
id: number;
|
// 注册当前页面为标签页
|
||||||
name: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface SelectedUnit {
|
|
||||||
id: number;
|
|
||||||
name: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function Index({ title = '项目列表' }) {
|
|
||||||
usePageTabs({
|
usePageTabs({
|
||||||
tabKey: 'asset-buildings',
|
tabKey: 'asset-houses',
|
||||||
tabLabel: title,
|
tabLabel: title,
|
||||||
});
|
});
|
||||||
|
return (
|
||||||
const actionAssetRef: any = useRef();
|
<MyPageContainer title={title}>
|
||||||
const actionBuildingsRef: any = useRef();
|
<ProTable
|
||||||
const actionUnitsRef: any = useRef();
|
{...MyProTableProps.props}
|
||||||
const actionHousesRef: any = useRef();
|
request={async (params, sort) => {
|
||||||
const navigate = useNavigate();
|
setParams(params);
|
||||||
|
return MyProTableProps.request(
|
||||||
const [selectedAsset, setSelectedAsset] = useState<SelectedAsset | null>(
|
params,
|
||||||
null,
|
sort,
|
||||||
|
Apis.Asset.AssetHouses.List,
|
||||||
);
|
);
|
||||||
const [selectedBuilding, setSelectedBuilding] =
|
|
||||||
useState<SelectedBuilding | null>(null);
|
|
||||||
const [selectedUnit, setSelectedUnit] = useState<SelectedUnit | null>(null);
|
|
||||||
const [loading, setLoading] = useState({
|
|
||||||
buildings: false,
|
|
||||||
units: false,
|
|
||||||
houses: false,
|
|
||||||
});
|
|
||||||
|
|
||||||
// 选择项目的回调函数
|
|
||||||
const handleAssetSelect = useCallback(
|
|
||||||
(asset: SelectedAsset) => {
|
|
||||||
if (selectedAsset?.id === asset.id) return; // 避免重复选择
|
|
||||||
|
|
||||||
setSelectedAsset(asset);
|
|
||||||
setSelectedBuilding(null); // 重置楼栋选择
|
|
||||||
setSelectedUnit(null); // 重置单元选择
|
|
||||||
|
|
||||||
// 刷新楼栋和单元列表
|
|
||||||
actionBuildingsRef?.current?.reload();
|
|
||||||
actionUnitsRef?.current?.reload();
|
|
||||||
actionHousesRef?.current?.reload();
|
|
||||||
},
|
|
||||||
[selectedAsset?.id],
|
|
||||||
);
|
|
||||||
|
|
||||||
// 选择楼栋的回调函数
|
|
||||||
const handleBuildingSelect = useCallback(
|
|
||||||
(building: SelectedBuilding) => {
|
|
||||||
if (selectedBuilding?.id === building.id) return; // 避免重复选择
|
|
||||||
|
|
||||||
setSelectedBuilding(building);
|
|
||||||
setSelectedUnit(null); // 重置单元选择
|
|
||||||
|
|
||||||
// 刷新单元和房屋列表
|
|
||||||
actionUnitsRef?.current?.reload();
|
|
||||||
actionHousesRef?.current?.reload();
|
|
||||||
},
|
|
||||||
[selectedBuilding?.id],
|
|
||||||
);
|
|
||||||
|
|
||||||
// 选择单元的回调函数
|
|
||||||
const handleUnitSelect = useCallback(
|
|
||||||
(unit: SelectedUnit) => {
|
|
||||||
if (selectedUnit?.id === unit.id) return; // 避免重复选择
|
|
||||||
|
|
||||||
setSelectedUnit(unit);
|
|
||||||
// 刷新房屋列表
|
|
||||||
actionHousesRef?.current?.reload();
|
|
||||||
},
|
|
||||||
[selectedUnit?.id],
|
|
||||||
);
|
|
||||||
|
|
||||||
// 删除操作的通用处理
|
|
||||||
const handleDelete = useCallback(
|
|
||||||
async (deleteApi: any, id: number, reloadAction: any, itemName: string) => {
|
|
||||||
try {
|
|
||||||
await deleteApi({ id });
|
|
||||||
message.success(`${itemName}删除成功`);
|
|
||||||
reloadAction();
|
|
||||||
|
|
||||||
// 如果删除的是当前选中项,清空选择
|
|
||||||
if (itemName === '项目' && selectedAsset?.id === id) {
|
|
||||||
setSelectedAsset(null);
|
|
||||||
setSelectedBuilding(null);
|
|
||||||
setSelectedUnit(null);
|
|
||||||
} else if (itemName === '楼栋' && selectedBuilding?.id === id) {
|
|
||||||
setSelectedBuilding(null);
|
|
||||||
setSelectedUnit(null);
|
|
||||||
} else if (itemName === '单元' && selectedUnit?.id === id) {
|
|
||||||
setSelectedUnit(null);
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
message.error(`${itemName}删除失败`);
|
|
||||||
console.error(`删除${itemName}失败:`, error);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
[selectedAsset?.id, selectedBuilding?.id, selectedUnit?.id],
|
|
||||||
);
|
|
||||||
|
|
||||||
// 通用表格配置
|
|
||||||
const getTableConfig = useMemo(
|
|
||||||
() => ({
|
|
||||||
...MyProTableProps.props,
|
|
||||||
search: false as const,
|
|
||||||
size: 'middle' as const,
|
|
||||||
options: false as const,
|
|
||||||
pagination: {
|
|
||||||
pageSize: 10,
|
|
||||||
showSizeChanger: false,
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
[],
|
|
||||||
);
|
|
||||||
|
|
||||||
// 项目表格列配置
|
|
||||||
const projectColumns = useMemo(
|
|
||||||
() => [
|
|
||||||
{
|
|
||||||
title: '项目',
|
|
||||||
dataIndex: 'name',
|
|
||||||
ellipsis: true,
|
|
||||||
search: {
|
|
||||||
transform: (value: string) => ({ name: value }),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
MyColumns.Option({
|
|
||||||
width: 120,
|
|
||||||
render: (_, item: any, index, action) => (
|
|
||||||
<Space key={index} size="small">
|
|
||||||
<MyButtons.View
|
|
||||||
title="配置"
|
|
||||||
onClick={() => {
|
|
||||||
navigate(`/asset/list/show/${item.id}`);
|
|
||||||
}}
|
}}
|
||||||
/>
|
toolBarRender={() => [
|
||||||
</Space>
|
<MyExport
|
||||||
),
|
key="export"
|
||||||
}),
|
item={getParams}
|
||||||
],
|
download={Apis.Asset.AssetHouses}
|
||||||
[handleDelete],
|
/>,
|
||||||
);
|
]}
|
||||||
|
columns={[
|
||||||
// 楼栋表格列配置
|
MyColumns.ID(),
|
||||||
const buildingColumns = useMemo(
|
|
||||||
() => [
|
|
||||||
{
|
{
|
||||||
title: '楼栋',
|
title: '项目名称',
|
||||||
dataIndex: 'name',
|
dataIndex: ['asset_project', 'name'],
|
||||||
ellipsis: true,
|
search: {
|
||||||
|
transform: (value) => {
|
||||||
|
return { project_name: value };
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
MyColumns.Option({
|
|
||||||
width: 120,
|
|
||||||
render: (_, item: any, index, action) => (
|
|
||||||
<Space key={index} size="small">
|
|
||||||
<AssetBuildingsUpdate item={item} reload={action?.reload} />
|
|
||||||
{/* <MyButtons.Delete
|
|
||||||
size="small"
|
|
||||||
onConfirm={() =>
|
|
||||||
handleDelete(
|
|
||||||
Apis.Asset.AssetBuildings.Delete,
|
|
||||||
item.id,
|
|
||||||
action?.reload,
|
|
||||||
'楼栋',
|
|
||||||
)
|
|
||||||
}
|
|
||||||
/> */}
|
|
||||||
</Space>
|
|
||||||
),
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
[handleDelete],
|
|
||||||
);
|
|
||||||
|
|
||||||
// 单元表格列配置
|
|
||||||
const unitColumns = useMemo(
|
|
||||||
() => [
|
|
||||||
{
|
{
|
||||||
title: '单元',
|
title: '房屋名称',
|
||||||
dataIndex: 'name',
|
dataIndex: 'full_name',
|
||||||
ellipsis: true,
|
|
||||||
},
|
},
|
||||||
MyColumns.Option({
|
|
||||||
width: 120,
|
|
||||||
render: (_, item: any, index, action) => (
|
|
||||||
<Space key={index} size="small">
|
|
||||||
<AssetUnitsUpdate item={item} reload={action?.reload} />
|
|
||||||
{/* <MyButtons.Delete
|
|
||||||
size="small"
|
|
||||||
onConfirm={() =>
|
|
||||||
handleDelete(
|
|
||||||
Apis.Asset.AssetUnits.Delete,
|
|
||||||
item.id,
|
|
||||||
action?.reload,
|
|
||||||
'单元',
|
|
||||||
)
|
|
||||||
}
|
|
||||||
/> */}
|
|
||||||
</Space>
|
|
||||||
),
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
[handleDelete],
|
|
||||||
);
|
|
||||||
|
|
||||||
// 房屋表格列配置
|
|
||||||
const houseColumns = useMemo(
|
|
||||||
() => [
|
|
||||||
MyColumns.EnumTag({
|
MyColumns.EnumTag({
|
||||||
title: '用途',
|
title: '用途',
|
||||||
dataIndex: 'usage',
|
dataIndex: 'usage',
|
||||||
valueEnum: AssetHousesUsageEnum,
|
valueEnum: AssetHousesUsageEnum,
|
||||||
}),
|
}),
|
||||||
{
|
|
||||||
title: '房屋名称',
|
|
||||||
dataIndex: 'full_name',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
title: '楼层',
|
title: '楼层',
|
||||||
dataIndex: 'floor',
|
dataIndex: 'floor',
|
||||||
render(_, record) {
|
render(_, record) {
|
||||||
return `${record?.floor}层`;
|
return `${record?.floor}层`;
|
||||||
},
|
},
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
title: '建筑面积',
|
||||||
|
dataIndex: 'built_area',
|
||||||
|
render(_, record) {
|
||||||
|
return `${
|
||||||
|
record?.built_area ? record?.built_area + ' m²' : '-'
|
||||||
|
} `;
|
||||||
|
},
|
||||||
|
search: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '房号',
|
title: '套内面积',
|
||||||
dataIndex: 'name',
|
dataIndex: 'inside_area',
|
||||||
|
render(_, record) {
|
||||||
|
return `${
|
||||||
|
record?.inside_area ? record?.inside_area + ' m²' : '-'
|
||||||
|
} `;
|
||||||
|
},
|
||||||
|
search: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '计费面积',
|
title: '计费面积',
|
||||||
@ -268,272 +104,65 @@ export default function Index({ title = '项目列表' }) {
|
|||||||
record?.chargeable_area ? record?.chargeable_area + ' m²' : '-'
|
record?.chargeable_area ? record?.chargeable_area + ' m²' : '-'
|
||||||
} `;
|
} `;
|
||||||
},
|
},
|
||||||
|
search: false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: '户型',
|
||||||
|
render(_, record) {
|
||||||
|
return `${record?.room || 'x'}室${record?.hall || 'x'}厅${
|
||||||
|
record?.bathroom || 'x'
|
||||||
|
}卫${record?.kitchen || 'x'}厨${record?.balcony || 'x'}阳台`;
|
||||||
|
},
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
// MyColumns.EnumTag({
|
||||||
|
// title: '朝向',
|
||||||
|
// dataIndex: 'orientation',
|
||||||
|
// valueEnum: AssetHousesOrientationEnum,
|
||||||
|
// search: false,
|
||||||
|
// }),
|
||||||
|
// MyColumns.EnumTag({
|
||||||
|
// title: '房屋状态',
|
||||||
|
// dataIndex: 'status',
|
||||||
|
// valueEnum: AssetHousesStatusEnum,
|
||||||
|
// search: false,
|
||||||
|
// }),
|
||||||
MyColumns.EnumTag({
|
MyColumns.EnumTag({
|
||||||
title: '房屋属性',
|
title: '房屋属性',
|
||||||
dataIndex: 'ownership_type',
|
dataIndex: 'ownership_type',
|
||||||
valueEnum: AssetHousesOwnershipTypeEnum,
|
valueEnum: AssetHousesOwnershipTypeEnum,
|
||||||
|
search: false,
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
// {
|
||||||
|
// title: '产权年限',
|
||||||
|
// dataIndex: 'ownership_term',
|
||||||
|
// render(_, record) {
|
||||||
|
// return `${record?.ownership_term || '-'} 年`;
|
||||||
|
// },
|
||||||
|
// search: false,
|
||||||
|
// },
|
||||||
MyColumns.Option({
|
MyColumns.Option({
|
||||||
width: 120,
|
|
||||||
render: (_, item: any, index, action) => (
|
render: (_, item: any, index, action) => (
|
||||||
<Space key={index} size="small">
|
<Space key={index}>
|
||||||
<HousesUpdate item={item} reload={action?.reload} title="编辑" />
|
<HousesShow item={item} reload={action?.reload} />
|
||||||
{/* <MyButtons.Delete
|
<HousesUpdate
|
||||||
size="small"
|
item={item}
|
||||||
|
reload={action?.reload}
|
||||||
|
title="编辑"
|
||||||
|
/>
|
||||||
|
<MyButtons.Delete
|
||||||
onConfirm={() =>
|
onConfirm={() =>
|
||||||
handleDelete(
|
Apis.Asset.AssetHouses.Delete({
|
||||||
Apis.Asset.AssetHouses.Delete,
|
id: item.id,
|
||||||
item.id,
|
}).then(() => action?.reload())
|
||||||
action?.reload,
|
|
||||||
'房屋',
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
/> */}
|
/>
|
||||||
</Space>
|
</Space>
|
||||||
),
|
),
|
||||||
}),
|
}),
|
||||||
],
|
]}
|
||||||
[handleDelete],
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<MyPageContainer title={title}>
|
|
||||||
<ProCard
|
|
||||||
title={
|
|
||||||
<Alert
|
|
||||||
message="操作提示:可在项目中添加楼栋,在楼栋中添加单元,在单元中添加房屋!"
|
|
||||||
type="info"
|
|
||||||
showIcon
|
|
||||||
style={{ margin: 0 }}
|
|
||||||
/>
|
/>
|
||||||
}
|
|
||||||
>
|
|
||||||
<Space align="start" size="large" style={{ width: '100%' }}>
|
|
||||||
<div style={{ flex: 1 }}>
|
|
||||||
<Title level={5} style={{ marginBottom: 16 }}>
|
|
||||||
<Space
|
|
||||||
style={{ display: 'flex', justifyContent: 'space-between' }}
|
|
||||||
>
|
|
||||||
项目信息
|
|
||||||
</Space>
|
|
||||||
</Title>
|
|
||||||
<ProTable
|
|
||||||
{...getTableConfig}
|
|
||||||
// search={{
|
|
||||||
// labelWidth: 'auto',
|
|
||||||
// collapsed: false,
|
|
||||||
// collapseRender: false,
|
|
||||||
// }}
|
|
||||||
actionRef={actionAssetRef}
|
|
||||||
rowClassName={(record: any) => {
|
|
||||||
return selectedAsset?.id === record?.id
|
|
||||||
? 'ant-table-row-selected'
|
|
||||||
: '';
|
|
||||||
}}
|
|
||||||
onRow={(record: any) => {
|
|
||||||
return {
|
|
||||||
onClick: () => {
|
|
||||||
handleAssetSelect(record);
|
|
||||||
},
|
|
||||||
style: {
|
|
||||||
cursor: 'pointer',
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}}
|
|
||||||
request={async (params, sort) =>
|
|
||||||
MyProTableProps.request(
|
|
||||||
{ ...params },
|
|
||||||
sort,
|
|
||||||
Apis.Asset.AssetProjects.List,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
columns={projectColumns}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* 楼栋列表 */}
|
|
||||||
{selectedAsset ? (
|
|
||||||
<div style={{ flex: 1 }}>
|
|
||||||
<Title level={5} style={{ marginBottom: 16 }}>
|
|
||||||
<Space
|
|
||||||
style={{ display: 'flex', justifyContent: 'space-between' }}
|
|
||||||
>
|
|
||||||
<span>{selectedAsset?.name}</span>
|
|
||||||
<BuildingsCreate
|
|
||||||
key="BuildingsCreate"
|
|
||||||
item={{ ...selectedAsset, size: 'small' }}
|
|
||||||
reload={() => actionBuildingsRef?.current?.reload()}
|
|
||||||
title="楼栋"
|
|
||||||
/>
|
|
||||||
</Space>
|
|
||||||
</Title>
|
|
||||||
<ProTable
|
|
||||||
{...getTableConfig}
|
|
||||||
actionRef={actionBuildingsRef}
|
|
||||||
rowClassName={(record: any) => {
|
|
||||||
return selectedBuilding?.id === record?.id
|
|
||||||
? 'ant-table-row-selected'
|
|
||||||
: '';
|
|
||||||
}}
|
|
||||||
onRow={(record: any) => {
|
|
||||||
return {
|
|
||||||
onClick: () => {
|
|
||||||
handleBuildingSelect(record);
|
|
||||||
},
|
|
||||||
style: {
|
|
||||||
cursor: 'pointer',
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}}
|
|
||||||
request={async (params, sort) =>
|
|
||||||
MyProTableProps.request(
|
|
||||||
{ ...params, asset_projects_id: selectedAsset?.id },
|
|
||||||
sort,
|
|
||||||
Apis.Asset.AssetBuildings.List,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
columns={buildingColumns}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
) : (
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
flex: 1,
|
|
||||||
// minWidth: 300,
|
|
||||||
display: 'flex',
|
|
||||||
alignItems: 'center',
|
|
||||||
justifyContent: 'center',
|
|
||||||
color: '#999',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
请先选择项目
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{/* 单元列表 */}
|
|
||||||
{selectedBuilding ? (
|
|
||||||
<div style={{ flex: 1 }}>
|
|
||||||
<Title level={5} style={{ marginBottom: 16 }}>
|
|
||||||
<Space
|
|
||||||
style={{ display: 'flex', justifyContent: 'space-between' }}
|
|
||||||
>
|
|
||||||
<span>{selectedBuilding.name}</span>
|
|
||||||
<UnitsCreate
|
|
||||||
key="UnitsCreate"
|
|
||||||
item={{
|
|
||||||
...selectedBuilding,
|
|
||||||
asset_buildings_id: selectedBuilding?.id,
|
|
||||||
size: 'small',
|
|
||||||
}}
|
|
||||||
reload={() => actionUnitsRef?.current?.reload()}
|
|
||||||
title="单元"
|
|
||||||
/>
|
|
||||||
</Space>
|
|
||||||
</Title>
|
|
||||||
<ProTable
|
|
||||||
{...getTableConfig}
|
|
||||||
actionRef={actionUnitsRef}
|
|
||||||
request={async (params, sort) =>
|
|
||||||
MyProTableProps.request(
|
|
||||||
{
|
|
||||||
...params,
|
|
||||||
asset_projects_id: selectedAsset?.id,
|
|
||||||
asset_buildings_id: selectedBuilding?.id,
|
|
||||||
},
|
|
||||||
sort,
|
|
||||||
Apis.Asset.AssetUnits.List,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
rowClassName={(record: any) => {
|
|
||||||
return selectedUnit?.id === record?.id
|
|
||||||
? 'ant-table-row-selected'
|
|
||||||
: '';
|
|
||||||
}}
|
|
||||||
onRow={(record: any) => {
|
|
||||||
return {
|
|
||||||
onClick: () => {
|
|
||||||
handleUnitSelect(record);
|
|
||||||
},
|
|
||||||
style: {
|
|
||||||
cursor: 'pointer',
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}}
|
|
||||||
columns={unitColumns}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
) : (
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
flex: 1,
|
|
||||||
// minWidth: 300,
|
|
||||||
display: 'flex',
|
|
||||||
alignItems: 'center',
|
|
||||||
justifyContent: 'center',
|
|
||||||
color: '#999',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
请先选择楼栋
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{/* 房屋列表 */}
|
|
||||||
{selectedUnit ? (
|
|
||||||
<div style={{ flex: 1 }}>
|
|
||||||
<Title level={5} style={{ marginBottom: 16 }}>
|
|
||||||
<Space
|
|
||||||
style={{ display: 'flex', justifyContent: 'space-between' }}
|
|
||||||
>
|
|
||||||
<span>{selectedUnit.name}</span>
|
|
||||||
<HousesCreate
|
|
||||||
key="HousesCreate"
|
|
||||||
item={{
|
|
||||||
...selectedUnit,
|
|
||||||
asset_projects_id: selectedAsset?.id,
|
|
||||||
asset_buildings_id: selectedBuilding?.id,
|
|
||||||
asset_units_id: selectedUnit?.id,
|
|
||||||
size: 'small',
|
|
||||||
}}
|
|
||||||
reload={() => actionHousesRef?.current?.reload()}
|
|
||||||
title="房屋"
|
|
||||||
/>
|
|
||||||
</Space>
|
|
||||||
</Title>
|
|
||||||
<ProTable
|
|
||||||
{...getTableConfig}
|
|
||||||
actionRef={actionHousesRef}
|
|
||||||
request={async (params, sort) =>
|
|
||||||
MyProTableProps.request(
|
|
||||||
{
|
|
||||||
...params,
|
|
||||||
asset_projects_id: selectedAsset?.id,
|
|
||||||
asset_buildings_id: selectedBuilding?.id,
|
|
||||||
asset_units_id: selectedUnit?.id,
|
|
||||||
},
|
|
||||||
sort,
|
|
||||||
Apis.Asset.AssetHouses.List,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
columns={houseColumns}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
) : (
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
flex: 1,
|
|
||||||
// minWidth: 400,
|
|
||||||
display: 'flex',
|
|
||||||
alignItems: 'center',
|
|
||||||
justifyContent: 'center',
|
|
||||||
color: '#999',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{selectedBuilding ? '请先选择单元' : '请先选择楼栋'}
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</Space>
|
|
||||||
</ProCard>
|
|
||||||
</MyPageContainer>
|
</MyPageContainer>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,12 +13,12 @@ import {
|
|||||||
import { ProCard, ProTable } from '@ant-design/pro-components';
|
import { ProCard, ProTable } from '@ant-design/pro-components';
|
||||||
import { Alert, message, Space, Typography } from 'antd';
|
import { Alert, message, Space, Typography } from 'antd';
|
||||||
import { useCallback, useRef, useState } from 'react';
|
import { useCallback, useRef, useState } from 'react';
|
||||||
import BuildingsCreate from '../../houses/modals/BuildingsCreate';
|
import BuildingsCreate from '../../dictionary/modals/BuildingsCreate';
|
||||||
import AssetBuildingsUpdate from '../../houses/modals/BuildingsUpdate';
|
import AssetBuildingsUpdate from '../../dictionary/modals/BuildingsUpdate';
|
||||||
import HousesCreate from '../../houses/modals/HousesCreate';
|
import HousesCreate from '../../dictionary/modals/HousesCreate';
|
||||||
import HousesUpdate from '../../houses/modals/HousesUpdate';
|
import HousesUpdate from '../../dictionary/modals/HousesUpdate';
|
||||||
import AssetUnitsCreate from '../../houses/modals/UnitsCreate';
|
import AssetUnitsCreate from '../../dictionary/modals/UnitsCreate';
|
||||||
import AssetUnitsUpdate from '../../houses/modals/UnitsUpdate';
|
import AssetUnitsUpdate from '../../dictionary/modals/UnitsUpdate';
|
||||||
|
|
||||||
const { Title } = Typography;
|
const { Title } = Typography;
|
||||||
|
|
||||||
|
|||||||
@ -1,168 +0,0 @@
|
|||||||
import {
|
|
||||||
MyButtons,
|
|
||||||
MyColumns,
|
|
||||||
MyPageContainer,
|
|
||||||
MyProTableProps,
|
|
||||||
usePageTabs,
|
|
||||||
} from '@/common';
|
|
||||||
import { MyExport } from '@/components/MyExport';
|
|
||||||
import { Apis } from '@/gen/Apis';
|
|
||||||
import {
|
|
||||||
AssetHousesOwnershipTypeEnum,
|
|
||||||
AssetHousesUsageEnum,
|
|
||||||
} from '@/gen/Enums';
|
|
||||||
import { ProTable } from '@ant-design/pro-components';
|
|
||||||
import { useNavigate } from '@umijs/max';
|
|
||||||
import { Space } from 'antd';
|
|
||||||
import { useState } from 'react';
|
|
||||||
import HousesShow from '../asset/houses/modals/HousesShow';
|
|
||||||
import HousesUpdate from '../asset/houses/modals/HousesUpdate';
|
|
||||||
|
|
||||||
export default function Index({ title = '房屋列表' }) {
|
|
||||||
const [getParams, setParams] = useState({});
|
|
||||||
|
|
||||||
const navigate = useNavigate();
|
|
||||||
// 注册当前页面为标签页
|
|
||||||
usePageTabs({
|
|
||||||
tabKey: 'asset-houses',
|
|
||||||
tabLabel: title,
|
|
||||||
});
|
|
||||||
return (
|
|
||||||
<MyPageContainer title={title}>
|
|
||||||
<ProTable
|
|
||||||
{...MyProTableProps.props}
|
|
||||||
request={async (params, sort) => {
|
|
||||||
setParams(params);
|
|
||||||
return MyProTableProps.request(
|
|
||||||
params,
|
|
||||||
sort,
|
|
||||||
Apis.Asset.AssetHouses.List,
|
|
||||||
);
|
|
||||||
}}
|
|
||||||
toolBarRender={() => [
|
|
||||||
<MyExport
|
|
||||||
key="export"
|
|
||||||
item={getParams}
|
|
||||||
download={Apis.Asset.AssetHouses}
|
|
||||||
/>,
|
|
||||||
]}
|
|
||||||
columns={[
|
|
||||||
MyColumns.ID(),
|
|
||||||
{
|
|
||||||
title: '项目名称',
|
|
||||||
dataIndex: ['asset_project', 'name'],
|
|
||||||
search: {
|
|
||||||
transform: (value) => {
|
|
||||||
return { project_name: value };
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '房屋名称',
|
|
||||||
dataIndex: 'full_name',
|
|
||||||
},
|
|
||||||
|
|
||||||
MyColumns.EnumTag({
|
|
||||||
title: '用途',
|
|
||||||
dataIndex: 'usage',
|
|
||||||
valueEnum: AssetHousesUsageEnum,
|
|
||||||
}),
|
|
||||||
{
|
|
||||||
title: '楼层',
|
|
||||||
dataIndex: 'floor',
|
|
||||||
render(_, record) {
|
|
||||||
return `${record?.floor}层`;
|
|
||||||
},
|
|
||||||
search: false,
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
title: '建筑面积',
|
|
||||||
dataIndex: 'built_area',
|
|
||||||
render(_, record) {
|
|
||||||
return `${
|
|
||||||
record?.built_area ? record?.built_area + ' m²' : '-'
|
|
||||||
} `;
|
|
||||||
},
|
|
||||||
search: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '套内面积',
|
|
||||||
dataIndex: 'inside_area',
|
|
||||||
render(_, record) {
|
|
||||||
return `${
|
|
||||||
record?.inside_area ? record?.inside_area + ' m²' : '-'
|
|
||||||
} `;
|
|
||||||
},
|
|
||||||
search: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '计费面积',
|
|
||||||
dataIndex: 'chargeable_area',
|
|
||||||
render(_, record) {
|
|
||||||
return `${
|
|
||||||
record?.chargeable_area ? record?.chargeable_area + ' m²' : '-'
|
|
||||||
} `;
|
|
||||||
},
|
|
||||||
search: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '户型',
|
|
||||||
render(_, record) {
|
|
||||||
return `${record?.room || 'x'}室${record?.hall || 'x'}厅${
|
|
||||||
record?.bathroom || 'x'
|
|
||||||
}卫${record?.kitchen || 'x'}厨${record?.balcony || 'x'}阳台`;
|
|
||||||
},
|
|
||||||
search: false,
|
|
||||||
},
|
|
||||||
// MyColumns.EnumTag({
|
|
||||||
// title: '朝向',
|
|
||||||
// dataIndex: 'orientation',
|
|
||||||
// valueEnum: AssetHousesOrientationEnum,
|
|
||||||
// search: false,
|
|
||||||
// }),
|
|
||||||
// MyColumns.EnumTag({
|
|
||||||
// title: '房屋状态',
|
|
||||||
// dataIndex: 'status',
|
|
||||||
// valueEnum: AssetHousesStatusEnum,
|
|
||||||
// search: false,
|
|
||||||
// }),
|
|
||||||
MyColumns.EnumTag({
|
|
||||||
title: '房屋属性',
|
|
||||||
dataIndex: 'ownership_type',
|
|
||||||
valueEnum: AssetHousesOwnershipTypeEnum,
|
|
||||||
search: false,
|
|
||||||
}),
|
|
||||||
|
|
||||||
// {
|
|
||||||
// title: '产权年限',
|
|
||||||
// dataIndex: 'ownership_term',
|
|
||||||
// render(_, record) {
|
|
||||||
// return `${record?.ownership_term || '-'} 年`;
|
|
||||||
// },
|
|
||||||
// search: false,
|
|
||||||
// },
|
|
||||||
MyColumns.Option({
|
|
||||||
render: (_, item: any, index, action) => (
|
|
||||||
<Space key={index}>
|
|
||||||
<HousesShow item={item} reload={action?.reload} />
|
|
||||||
<HousesUpdate
|
|
||||||
item={item}
|
|
||||||
reload={action?.reload}
|
|
||||||
title="编辑"
|
|
||||||
/>
|
|
||||||
<MyButtons.Delete
|
|
||||||
onConfirm={() =>
|
|
||||||
Apis.Asset.AssetHouses.Delete({
|
|
||||||
id: item.id,
|
|
||||||
}).then(() => action?.reload())
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
</Space>
|
|
||||||
),
|
|
||||||
}),
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
</MyPageContainer>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@ -12,8 +12,8 @@ import { ProTable } from '@ant-design/pro-components';
|
|||||||
import { useNavigate } from '@umijs/max';
|
import { useNavigate } from '@umijs/max';
|
||||||
import { Space } from 'antd';
|
import { Space } from 'antd';
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import HousesShow from '../asset/houses/modals/HousesShow';
|
import HousesShow from '../asset/dictionary/modals/HousesShow';
|
||||||
import HousesUpdate from '../asset/houses/modals/HousesUpdate';
|
import HousesUpdate from '../asset/dictionary/modals/HousesUpdate';
|
||||||
|
|
||||||
export default function Index({ title = '房屋列表' }) {
|
export default function Index({ title = '房屋列表' }) {
|
||||||
const [getParams, setParams] = useState({});
|
const [getParams, setParams] = useState({});
|
||||||
|
|||||||
@ -13,10 +13,10 @@ import { Space } from 'antd';
|
|||||||
import BillCreate from './modals/BillCreate';
|
import BillCreate from './modals/BillCreate';
|
||||||
import BillUpdate from './modals/BillUpdate';
|
import BillUpdate from './modals/BillUpdate';
|
||||||
|
|
||||||
export default function Index({ title = '房屋账单' }) {
|
export default function Index({ title = '账单明细' }) {
|
||||||
// 注册当前页面为标签页
|
// 注册当前页面为标签页
|
||||||
usePageTabs({
|
usePageTabs({
|
||||||
tabKey: 'bills',
|
tabKey: 'housebills',
|
||||||
tabLabel: title,
|
tabLabel: title,
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -24,7 +24,7 @@ export default function Index({ title = '房屋账单' }) {
|
|||||||
<MyPageContainer
|
<MyPageContainer
|
||||||
title={title}
|
title={title}
|
||||||
enableTabs={true}
|
enableTabs={true}
|
||||||
tabKey="bills"
|
tabKey="housebills"
|
||||||
tabLabel={title}
|
tabLabel={title}
|
||||||
>
|
>
|
||||||
<ProTable
|
<ProTable
|
||||||
92
src/pages/bills/summary/index.tsx
Normal file
92
src/pages/bills/summary/index.tsx
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
import {
|
||||||
|
MyColumns,
|
||||||
|
MyPageContainer,
|
||||||
|
MyProTableProps,
|
||||||
|
usePageTabs,
|
||||||
|
} from '@/common';
|
||||||
|
import { Apis } from '@/gen/Apis';
|
||||||
|
import { ProTable } from '@ant-design/pro-components';
|
||||||
|
import { Space } from 'antd';
|
||||||
|
import SummaryShow from './modals/SummaryShow';
|
||||||
|
|
||||||
|
export default function Index({ title = '房屋账单' }) {
|
||||||
|
// 注册当前页面为标签页
|
||||||
|
usePageTabs({
|
||||||
|
tabKey: 'summary',
|
||||||
|
tabLabel: title,
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<MyPageContainer
|
||||||
|
title={title}
|
||||||
|
enableTabs={true}
|
||||||
|
tabKey="summary"
|
||||||
|
tabLabel={title}
|
||||||
|
>
|
||||||
|
<ProTable
|
||||||
|
{...MyProTableProps.props}
|
||||||
|
request={async (params, sort) =>
|
||||||
|
MyProTableProps.request(
|
||||||
|
params,
|
||||||
|
sort,
|
||||||
|
Apis.Bill.HouseBills.SummaryBillList,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
// toolBarRender={(action) => [
|
||||||
|
// <MyImportModal
|
||||||
|
// key="ImportHouse"
|
||||||
|
// title="批量导入"
|
||||||
|
// type="danger"
|
||||||
|
// size="middle"
|
||||||
|
// templateApi={Apis.Bill.HouseBills.DownloadTemplate}
|
||||||
|
// importApi={Apis.Bill.HouseBills.Import}
|
||||||
|
// reload={action?.reload}
|
||||||
|
// />,
|
||||||
|
// <BillCreate key="Create" reload={action?.reload} title={title} />,
|
||||||
|
// ]}
|
||||||
|
columns={[
|
||||||
|
{
|
||||||
|
title: '房屋ID',
|
||||||
|
dataIndex: 'asset_houses_id',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '房屋',
|
||||||
|
dataIndex: ['asset_house', 'full_name'],
|
||||||
|
search: {
|
||||||
|
transform: (value) => {
|
||||||
|
return { full_name: value };
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '账单金额合计',
|
||||||
|
dataIndex: 'payable_amount_sum',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '滞纳金合计',
|
||||||
|
dataIndex: 'late_fee_sum',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '优惠金额合计',
|
||||||
|
dataIndex: 'discount_amount_sum',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '应付合计',
|
||||||
|
dataIndex: 'total_payable_sum',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
MyColumns.Option({
|
||||||
|
render: (_, item: any, index, action) => (
|
||||||
|
<Space key={index}>
|
||||||
|
<SummaryShow item={item} title="查看" reload={action?.reload} />
|
||||||
|
</Space>
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</MyPageContainer>
|
||||||
|
);
|
||||||
|
}
|
||||||
100
src/pages/bills/summary/modals/SummaryShow.tsx
Normal file
100
src/pages/bills/summary/modals/SummaryShow.tsx
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
import { MyBetaModalFormProps, MyColumns, MyProTableProps } from '@/common';
|
||||||
|
import { MyModal } from '@/components/MyModal';
|
||||||
|
import { Apis } from '@/gen/Apis';
|
||||||
|
import { HouseBillsTypeEnum } from '@/gen/Enums';
|
||||||
|
import { ProTable } from '@ant-design/pro-components';
|
||||||
|
import { Space } from 'antd';
|
||||||
|
import BillUpdate from '../../list/modals/BillUpdate';
|
||||||
|
|
||||||
|
export default function SummaryShow(props: MyBetaModalFormProps) {
|
||||||
|
return (
|
||||||
|
<MyModal
|
||||||
|
title={props.title || '查看'}
|
||||||
|
type={props.item?.type || 'primary'}
|
||||||
|
width="1000px"
|
||||||
|
node={
|
||||||
|
<ProTable
|
||||||
|
{...MyProTableProps.props}
|
||||||
|
request={async (params, sort) =>
|
||||||
|
MyProTableProps.request(
|
||||||
|
{ ...params, asset_houses_id: props?.item?.asset_houses_id },
|
||||||
|
sort,
|
||||||
|
Apis.Bill.HouseBills.List,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
columns={[
|
||||||
|
MyColumns.ID(),
|
||||||
|
MyColumns.EnumTag({
|
||||||
|
title: '类型',
|
||||||
|
dataIndex: 'type',
|
||||||
|
valueEnum: HouseBillsTypeEnum,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
title: '房屋',
|
||||||
|
dataIndex: ['asset_house', 'full_name'],
|
||||||
|
search: {
|
||||||
|
transform: (value) => {
|
||||||
|
return { full_name: value };
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '账单月份',
|
||||||
|
render: (_, record) => {
|
||||||
|
return `${record.year}-${String(record.month).padStart(
|
||||||
|
2,
|
||||||
|
'0',
|
||||||
|
)}`;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '账单金额',
|
||||||
|
dataIndex: 'amount',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '优惠金额',
|
||||||
|
dataIndex: 'discount_amount',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '滞纳金',
|
||||||
|
dataIndex: 'late_fee',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
title: '计费开始日期',
|
||||||
|
dataIndex: 'start_date',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '计费结束日期',
|
||||||
|
dataIndex: 'end_date',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
MyColumns.CreatedAt(),
|
||||||
|
MyColumns.Option({
|
||||||
|
render: (_, item: any, index, action) => (
|
||||||
|
<Space key={index}>
|
||||||
|
<BillUpdate
|
||||||
|
item={item}
|
||||||
|
reload={action?.reload}
|
||||||
|
title="编辑"
|
||||||
|
/>
|
||||||
|
{/* <MyButtons.Delete
|
||||||
|
onConfirm={() =>
|
||||||
|
Apis.Bill.HouseBills.Delete({ id: item.id }).then(() =>
|
||||||
|
action?.reload(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
/> */}
|
||||||
|
</Space>
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -5,7 +5,6 @@ import {
|
|||||||
MyModalFormProps,
|
MyModalFormProps,
|
||||||
rulesHelper,
|
rulesHelper,
|
||||||
} from '@/common';
|
} from '@/common';
|
||||||
|
|
||||||
import { Apis } from '@/gen/Apis';
|
import { Apis } from '@/gen/Apis';
|
||||||
import { CompanyReceiptAccountsPayChannelEnum } from '@/gen/Enums';
|
import { CompanyReceiptAccountsPayChannelEnum } from '@/gen/Enums';
|
||||||
import { BetaSchemaForm } from '@ant-design/pro-components';
|
import { BetaSchemaForm } from '@ant-design/pro-components';
|
||||||
|
|||||||
@ -1,100 +0,0 @@
|
|||||||
import {
|
|
||||||
MyButtons,
|
|
||||||
MyColumns,
|
|
||||||
MyPageContainer,
|
|
||||||
MyProTableProps,
|
|
||||||
usePageTabs,
|
|
||||||
} from '@/common';
|
|
||||||
import { Apis } from '@/gen/Apis';
|
|
||||||
import { HouseChargeTaskDetailsStatusEnum } from '@/gen/Enums';
|
|
||||||
import { ProTable } from '@ant-design/pro-components';
|
|
||||||
import { Space } from 'antd';
|
|
||||||
import ChargeTasksCreate from './modals/ChargeTasksCreate';
|
|
||||||
|
|
||||||
export default function Index({ title = '账单任务' }) {
|
|
||||||
// 注册当前页面为标签页
|
|
||||||
usePageTabs({
|
|
||||||
tabKey: 'house_charge_tasks',
|
|
||||||
tabLabel: title,
|
|
||||||
});
|
|
||||||
|
|
||||||
return (
|
|
||||||
<MyPageContainer
|
|
||||||
title={title}
|
|
||||||
enableTabs={true}
|
|
||||||
tabKey="bills"
|
|
||||||
tabLabel={title}
|
|
||||||
>
|
|
||||||
<ProTable
|
|
||||||
{...MyProTableProps.props}
|
|
||||||
request={async (params, sort) =>
|
|
||||||
MyProTableProps.request(
|
|
||||||
params,
|
|
||||||
sort,
|
|
||||||
Apis.HouseCharage.HouseChargeTasks.List,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
toolBarRender={(action) => [
|
|
||||||
<ChargeTasksCreate
|
|
||||||
key="Create"
|
|
||||||
reload={action?.reload}
|
|
||||||
title="账单任务"
|
|
||||||
/>,
|
|
||||||
]}
|
|
||||||
columns={[
|
|
||||||
{
|
|
||||||
title: '任务ID',
|
|
||||||
dataIndex: 'house_charge_tasks_id',
|
|
||||||
search: false,
|
|
||||||
},
|
|
||||||
MyColumns.EnumTag({
|
|
||||||
title: '任务状态',
|
|
||||||
dataIndex: 'status',
|
|
||||||
valueEnum: HouseChargeTaskDetailsStatusEnum,
|
|
||||||
}),
|
|
||||||
{
|
|
||||||
title: '账单ID',
|
|
||||||
dataIndex: 'id',
|
|
||||||
search: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '关联对象',
|
|
||||||
dataIndex: 'full_name',
|
|
||||||
search: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '账单月份',
|
|
||||||
render: (_, record) => {
|
|
||||||
return `${record.year}-${String(record.month).padStart(2, '0')}`;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '计费开始日期',
|
|
||||||
dataIndex: ['house_charge_task', 'start_date'],
|
|
||||||
search: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '计费结束日期',
|
|
||||||
dataIndex: ['house_charge_task', 'end_date'],
|
|
||||||
search: false,
|
|
||||||
},
|
|
||||||
// MyColumns.UpdatedAt(),
|
|
||||||
MyColumns.CreatedAt(),
|
|
||||||
MyColumns.Option({
|
|
||||||
render: (_, item: any, index, action) => (
|
|
||||||
<Space key={index}>
|
|
||||||
<MyButtons.Delete
|
|
||||||
onConfirm={() =>
|
|
||||||
Apis.HouseCharage.HouseChargeTaskDetails.Delete({
|
|
||||||
id: item.id,
|
|
||||||
}).then(() => action?.reload())
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
</Space>
|
|
||||||
),
|
|
||||||
}),
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
</MyPageContainer>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@ -1,116 +0,0 @@
|
|||||||
import {
|
|
||||||
MyBetaModalFormProps,
|
|
||||||
MyButtons,
|
|
||||||
MyModalFormProps,
|
|
||||||
rulesHelper,
|
|
||||||
} from '@/common';
|
|
||||||
import { Selects } from '@/components/Select';
|
|
||||||
import { Apis } from '@/gen/Apis';
|
|
||||||
import { BetaSchemaForm } from '@ant-design/pro-components';
|
|
||||||
import { Form, message } from 'antd';
|
|
||||||
|
|
||||||
export default function Create(props: MyBetaModalFormProps) {
|
|
||||||
const [form] = Form.useForm();
|
|
||||||
return (
|
|
||||||
<BetaSchemaForm<ApiTypes.HouseCharage.HouseChargeTasks.Store>
|
|
||||||
{...MyModalFormProps.props}
|
|
||||||
title={`创建${props.title}`}
|
|
||||||
width="480px"
|
|
||||||
layout="horizontal"
|
|
||||||
labelCol={{ span: 8 }}
|
|
||||||
wrapperCol={{ span: 16 }}
|
|
||||||
labelAlign="left"
|
|
||||||
trigger={<MyButtons.Create title={`创建${props.title}`} />}
|
|
||||||
key={new Date().getTime()}
|
|
||||||
form={form}
|
|
||||||
onOpenChange={(open: any) => {
|
|
||||||
if (open) {
|
|
||||||
form.resetFields(); // 清空表单数据
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
onFinish={async (values) =>
|
|
||||||
Apis.HouseCharage.HouseChargeTasks.Store(values)
|
|
||||||
.then(() => {
|
|
||||||
props.reload?.();
|
|
||||||
message.success(props.title + '账单任务创建成功');
|
|
||||||
return true;
|
|
||||||
})
|
|
||||||
.catch(() => false)
|
|
||||||
}
|
|
||||||
columns={[
|
|
||||||
Selects?.AssetProjects({
|
|
||||||
title: '选择项目',
|
|
||||||
key: 'asset_projects_id',
|
|
||||||
colProps: { span: 24 },
|
|
||||||
formItemProps: { ...rulesHelper.text },
|
|
||||||
fieldProps: {
|
|
||||||
onChange: (val: any) => {
|
|
||||||
form.setFieldsValue({
|
|
||||||
house_charge_standards_id: undefined,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
{
|
|
||||||
valueType: 'dependency',
|
|
||||||
name: ['asset_projects_id'],
|
|
||||||
columns: ({ asset_projects_id }) => {
|
|
||||||
return [
|
|
||||||
Selects?.ChargeStandard({
|
|
||||||
title: '选择收费标准',
|
|
||||||
key: 'house_charge_standards_id',
|
|
||||||
params: {
|
|
||||||
asset_projects_id: asset_projects_id,
|
|
||||||
},
|
|
||||||
colProps: { span: 24 },
|
|
||||||
formItemProps: { ...rulesHelper.text },
|
|
||||||
fieldProps: {
|
|
||||||
showSearch: true,
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
];
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: 'month',
|
|
||||||
title: '选择生成月份',
|
|
||||||
valueType: 'date',
|
|
||||||
colProps: { span: 24 },
|
|
||||||
fieldProps: {
|
|
||||||
picker: 'month',
|
|
||||||
format: 'YYYY-MM',
|
|
||||||
valueFormat: 'YYYY-MM',
|
|
||||||
style: {
|
|
||||||
width: '100%',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
formItemProps: { ...rulesHelper.text },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: 'start_date',
|
|
||||||
title: '计费开始日期',
|
|
||||||
valueType: 'date',
|
|
||||||
colProps: { span: 24 },
|
|
||||||
fieldProps: {
|
|
||||||
style: {
|
|
||||||
width: '100%',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
formItemProps: { ...rulesHelper.text },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: 'end_date',
|
|
||||||
title: '计费结束日期',
|
|
||||||
valueType: 'date',
|
|
||||||
colProps: { span: 24 },
|
|
||||||
fieldProps: {
|
|
||||||
style: {
|
|
||||||
width: '100%',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
formItemProps: { ...rulesHelper.text },
|
|
||||||
},
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
140
src/pages/mete/list/index.tsx
Normal file
140
src/pages/mete/list/index.tsx
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
import {
|
||||||
|
MyButtons,
|
||||||
|
MyColumns,
|
||||||
|
MyPageContainer,
|
||||||
|
MyProTableProps,
|
||||||
|
usePageTabs,
|
||||||
|
} from '@/common';
|
||||||
|
import { Apis } from '@/gen/Apis';
|
||||||
|
import { ProTable } from '@ant-design/pro-components';
|
||||||
|
import { useNavigate } from '@umijs/max';
|
||||||
|
import { Space } from 'antd';
|
||||||
|
|
||||||
|
import {
|
||||||
|
HouseMetersMeterTypeEnum,
|
||||||
|
HouseMetersUsageTypeEnum,
|
||||||
|
} from '@/gen/Enums';
|
||||||
|
import CompanyCreate from './modals/MeterCreate';
|
||||||
|
import MeterHasHouse from './modals/MeterHasHouse';
|
||||||
|
import MeterHasOne from './modals/MeterHasOne';
|
||||||
|
import CompanyUpdate from './modals/MeterUpdate';
|
||||||
|
|
||||||
|
export default function Index({ title = '仪表管理' }) {
|
||||||
|
const navigate = useNavigate();
|
||||||
|
|
||||||
|
// 注册当前页面为标签页
|
||||||
|
usePageTabs({
|
||||||
|
tabKey: 'house_meters',
|
||||||
|
tabLabel: title,
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<MyPageContainer
|
||||||
|
title={title}
|
||||||
|
enableTabs={true}
|
||||||
|
tabKey="house_meters"
|
||||||
|
tabLabel={title}
|
||||||
|
>
|
||||||
|
<ProTable
|
||||||
|
{...MyProTableProps.props}
|
||||||
|
request={async (params, sort) =>
|
||||||
|
MyProTableProps.request(params, sort, Apis.Meter.HouseMeters.List)
|
||||||
|
}
|
||||||
|
toolBarRender={(action) => [
|
||||||
|
<CompanyCreate key="Create" reload={action?.reload} title={title} />,
|
||||||
|
]}
|
||||||
|
columns={[
|
||||||
|
MyColumns.ID(),
|
||||||
|
MyColumns.EnumTag({
|
||||||
|
title: '类型',
|
||||||
|
dataIndex: 'meter_type',
|
||||||
|
valueEnum: HouseMetersMeterTypeEnum,
|
||||||
|
search: false,
|
||||||
|
}),
|
||||||
|
MyColumns.EnumTag({
|
||||||
|
title: '使用类型',
|
||||||
|
dataIndex: 'usage_type',
|
||||||
|
valueEnum: HouseMetersUsageTypeEnum,
|
||||||
|
search: false,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
title: '仪表名称',
|
||||||
|
dataIndex: 'name',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '收费标准',
|
||||||
|
dataIndex: ['charge_standard', 'name'],
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '初始抄表读数',
|
||||||
|
dataIndex: 'initial_value',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '最新抄表读数',
|
||||||
|
dataIndex: 'latest_value',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '初始抄表时间',
|
||||||
|
dataIndex: 'initial_time',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '最新抄表时间',
|
||||||
|
dataIndex: 'latest_time',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '备注',
|
||||||
|
dataIndex: 'remark',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
|
||||||
|
MyColumns.SoftDelete({
|
||||||
|
onRestore: Apis.Company.Companies.Restore,
|
||||||
|
onSoftDelete: Apis.Company.Companies.SoftDelete,
|
||||||
|
search: false,
|
||||||
|
}),
|
||||||
|
MyColumns.CreatedAt(),
|
||||||
|
MyColumns.Option({
|
||||||
|
render: (_, item: any, index, action) => (
|
||||||
|
<Space key={index}>
|
||||||
|
{/* <CompanyShow item={item} title="查看" reload={action?.reload} /> */}
|
||||||
|
<CompanyUpdate
|
||||||
|
item={{ ...item, type: 'link' }}
|
||||||
|
title="机构"
|
||||||
|
reload={action?.reload}
|
||||||
|
/>
|
||||||
|
{item.meter_type ===
|
||||||
|
HouseMetersMeterTypeEnum.HouseMeter.value && (
|
||||||
|
<MeterHasOne
|
||||||
|
item={item}
|
||||||
|
reload={action?.reload}
|
||||||
|
title={'绑房'}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
{item.meter_type ===
|
||||||
|
HouseMetersMeterTypeEnum.CommonMeter.value && (
|
||||||
|
<MeterHasHouse
|
||||||
|
item={item}
|
||||||
|
reload={action?.reload}
|
||||||
|
title={'绑房'}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
<MyButtons.Delete
|
||||||
|
onConfirm={() =>
|
||||||
|
Apis.Company.Companies.Delete({ id: item.id }).then(() =>
|
||||||
|
action?.reload(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</Space>
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</MyPageContainer>
|
||||||
|
);
|
||||||
|
}
|
||||||
127
src/pages/mete/list/modals/MeterCreate.tsx
Normal file
127
src/pages/mete/list/modals/MeterCreate.tsx
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
import {
|
||||||
|
MyBetaModalFormProps,
|
||||||
|
MyButtons,
|
||||||
|
MyFormItems,
|
||||||
|
MyModalFormProps,
|
||||||
|
rulesHelper,
|
||||||
|
} from '@/common';
|
||||||
|
import { Selects } from '@/components/Select';
|
||||||
|
import { Apis } from '@/gen/Apis';
|
||||||
|
import {
|
||||||
|
HouseMetersMeterTypeEnum,
|
||||||
|
HouseMetersUsageTypeEnum,
|
||||||
|
} from '@/gen/Enums';
|
||||||
|
import { BetaSchemaForm } from '@ant-design/pro-components';
|
||||||
|
import { Form, message } from 'antd';
|
||||||
|
|
||||||
|
export default function Create(props: MyBetaModalFormProps) {
|
||||||
|
const [form] = Form.useForm();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<BetaSchemaForm<ApiTypes.Meter.HouseMeters.Store>
|
||||||
|
{...MyModalFormProps.props}
|
||||||
|
title={`添加仪表`}
|
||||||
|
layout="horizontal"
|
||||||
|
labelCol={{ span: 6 }}
|
||||||
|
wrapperCol={{ span: 18 }}
|
||||||
|
labelAlign="left"
|
||||||
|
width="600px"
|
||||||
|
key={new Date().getTime()}
|
||||||
|
trigger={<MyButtons.Create title={`添加仪表`} />}
|
||||||
|
form={form}
|
||||||
|
onOpenChange={(open: any) => {
|
||||||
|
if (open) {
|
||||||
|
form.resetFields(); // 清空表单数据
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
onFinish={async (values) =>
|
||||||
|
Apis.Meter.HouseMeters.Store({
|
||||||
|
...values,
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
props.reload?.();
|
||||||
|
message.success(props.title + '成功');
|
||||||
|
return true;
|
||||||
|
})
|
||||||
|
.catch(() => false)
|
||||||
|
}
|
||||||
|
columns={[
|
||||||
|
...(props?.item?.id
|
||||||
|
? []
|
||||||
|
: [
|
||||||
|
Selects?.AssetProjects({
|
||||||
|
key: 'asset_projects_id',
|
||||||
|
title: '选择项目',
|
||||||
|
colProps: { span: 24 },
|
||||||
|
required: true,
|
||||||
|
}),
|
||||||
|
]),
|
||||||
|
|
||||||
|
MyFormItems.EnumRadio({
|
||||||
|
key: 'meter_type',
|
||||||
|
title: '仪表类型',
|
||||||
|
colProps: { span: 24 },
|
||||||
|
valueEnum: HouseMetersMeterTypeEnum,
|
||||||
|
required: true,
|
||||||
|
}),
|
||||||
|
MyFormItems.EnumRadio({
|
||||||
|
key: 'usage_type',
|
||||||
|
title: '使用类型',
|
||||||
|
colProps: { span: 24 },
|
||||||
|
valueEnum: HouseMetersUsageTypeEnum,
|
||||||
|
required: true,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
key: 'name',
|
||||||
|
title: '仪表名称',
|
||||||
|
colProps: { span: 24 },
|
||||||
|
formItemProps: { ...rulesHelper.text },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'multiple',
|
||||||
|
title: '倍率',
|
||||||
|
colProps: { span: 24 },
|
||||||
|
formItemProps: { ...rulesHelper.text },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'initial_value',
|
||||||
|
title: '初始抄表读数',
|
||||||
|
valueType: 'number',
|
||||||
|
colProps: { span: 24 },
|
||||||
|
formItemProps: { ...rulesHelper.number },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'initial_time',
|
||||||
|
title: '初始抄表时间',
|
||||||
|
valueType: 'date',
|
||||||
|
colProps: { span: 24 },
|
||||||
|
formItemProps: { ...rulesHelper.text },
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
valueType: 'dependency',
|
||||||
|
name: ['asset_projects_id'],
|
||||||
|
columns: ({ asset_projects_id }) => {
|
||||||
|
return [
|
||||||
|
Selects?.ChargeStandard({
|
||||||
|
title: '选择收费标准',
|
||||||
|
key: 'charge_standards_id',
|
||||||
|
params: {
|
||||||
|
asset_projects_id: asset_projects_id || props?.item?.id || 0,
|
||||||
|
},
|
||||||
|
colProps: { span: 24 },
|
||||||
|
formItemProps: { ...rulesHelper.text },
|
||||||
|
}),
|
||||||
|
];
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'remark',
|
||||||
|
title: '备注',
|
||||||
|
valueType: 'textarea',
|
||||||
|
colProps: { span: 24 },
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
215
src/pages/mete/list/modals/MeterHasHouse.tsx
Normal file
215
src/pages/mete/list/modals/MeterHasHouse.tsx
Normal file
@ -0,0 +1,215 @@
|
|||||||
|
import {
|
||||||
|
MyBetaModalFormProps,
|
||||||
|
MyButtons,
|
||||||
|
MyColumns,
|
||||||
|
MyProTableProps,
|
||||||
|
} from '@/common';
|
||||||
|
import { MyModal } from '@/components/MyModal';
|
||||||
|
|
||||||
|
import { Apis } from '@/gen/Apis';
|
||||||
|
import {
|
||||||
|
AssetHousesOwnershipTypeEnum,
|
||||||
|
AssetHousesUsageEnum,
|
||||||
|
} from '@/gen/Enums';
|
||||||
|
import { ProTable } from '@ant-design/pro-components';
|
||||||
|
import { message, Space } from 'antd';
|
||||||
|
import { useRef, useState } from 'react';
|
||||||
|
|
||||||
|
export default function ChargeStandardHasHouse(props: MyBetaModalFormProps) {
|
||||||
|
// 使用 useState 保存选中的房屋 ID 和行数据,确保跨页选中状态保持
|
||||||
|
const [selectedHousesIds, setSelectedHousesIds] = useState<number[]>([]);
|
||||||
|
const [selectedRows, setSelectedRows] = useState<any[]>([]);
|
||||||
|
|
||||||
|
// 添加 tableRef 用于操作表格
|
||||||
|
const tableRef = useRef<any>();
|
||||||
|
|
||||||
|
const onShowContactPhone = () => {
|
||||||
|
if (selectedHousesIds.length === 0) {
|
||||||
|
message.warning('请至少选择一个房屋');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 确保 houses_ids 是字符串数组
|
||||||
|
const housesIds = selectedHousesIds.map((id) => String(id));
|
||||||
|
|
||||||
|
Apis.Meter.HouseMeterHasHouses.StoreOrUpdate({
|
||||||
|
house_meters_id: props?.item?.id ?? 0,
|
||||||
|
asset_houses_ids: housesIds,
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
// 成功后重置选中状态
|
||||||
|
setSelectedHousesIds([]);
|
||||||
|
setSelectedRows([]);
|
||||||
|
props.reload?.();
|
||||||
|
message.success('添加成功!');
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
console.error('添加失败:', error);
|
||||||
|
message.error('添加失败: ' + (error.message || '未知错误'));
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<MyModal
|
||||||
|
title={props.title || '查看'}
|
||||||
|
type="primary"
|
||||||
|
width="920px"
|
||||||
|
node={
|
||||||
|
<ProTable
|
||||||
|
actionRef={tableRef}
|
||||||
|
{...MyProTableProps.props}
|
||||||
|
request={async (params, sort) =>
|
||||||
|
MyProTableProps.request(
|
||||||
|
{
|
||||||
|
...params,
|
||||||
|
asset_projects_id: props?.item?.asset_projects_id,
|
||||||
|
},
|
||||||
|
sort,
|
||||||
|
Apis.Asset.AssetHouses.List,
|
||||||
|
undefined,
|
||||||
|
(res) => {
|
||||||
|
// 确保响应数据正确处理
|
||||||
|
console.log('加载房屋数据:', res);
|
||||||
|
return res;
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
style={{ height: '800px', overflowY: 'auto', overflowX: 'hidden' }}
|
||||||
|
pagination={{
|
||||||
|
showQuickJumper: true,
|
||||||
|
pageSizeOptions: [10, 20, 50, 100, 200, 500, 1000, 2000],
|
||||||
|
}}
|
||||||
|
rowSelection={{
|
||||||
|
type: 'checkbox',
|
||||||
|
preserveSelectedRowKeys: true, // 启用跨页选择
|
||||||
|
selectedRowKeys: selectedHousesIds,
|
||||||
|
onChange: (selectedRowKeys, selectedRows) => {
|
||||||
|
// 确保 selectedRowKeys 是数字类型
|
||||||
|
const numericKeys = selectedRowKeys.map((key) =>
|
||||||
|
typeof key === 'string' ? parseInt(key, 10) : key,
|
||||||
|
) as number[];
|
||||||
|
|
||||||
|
// 更新选中状态
|
||||||
|
setSelectedHousesIds(numericKeys);
|
||||||
|
|
||||||
|
// 合并当前页面选中的行和之前选中的行
|
||||||
|
const newSelectedRows = [...selectedRows];
|
||||||
|
|
||||||
|
// 设置选中行数据
|
||||||
|
setSelectedRows(newSelectedRows);
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
tableAlertOptionRender={({ selectedRowKeys, onCleanSelected }) => {
|
||||||
|
return (
|
||||||
|
<Space>
|
||||||
|
<span>已选 {selectedRowKeys.length} 项</span>
|
||||||
|
<a onClick={onCleanSelected}>清空</a>
|
||||||
|
<MyButtons.Create
|
||||||
|
title="批量添加"
|
||||||
|
type="primary"
|
||||||
|
key="create2"
|
||||||
|
onClick={() => onShowContactPhone()}
|
||||||
|
/>
|
||||||
|
</Space>
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
options={false}
|
||||||
|
columns={[
|
||||||
|
MyColumns.ID(),
|
||||||
|
MyColumns.EnumTag({
|
||||||
|
title: '用途',
|
||||||
|
dataIndex: 'usage',
|
||||||
|
valueEnum: AssetHousesUsageEnum,
|
||||||
|
search: false,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
title: '项目名称',
|
||||||
|
dataIndex: ['asset_project', 'name'],
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '楼栋名称',
|
||||||
|
dataIndex: ['asset_building', 'name'],
|
||||||
|
search: {
|
||||||
|
transform: (value) => {
|
||||||
|
return { building_name: value };
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '单元名称',
|
||||||
|
dataIndex: ['asset_unit', 'name'],
|
||||||
|
search: {
|
||||||
|
transform: (value) => {
|
||||||
|
return { unit_name: value };
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '房号',
|
||||||
|
dataIndex: 'name',
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
title: '楼层',
|
||||||
|
dataIndex: 'floor',
|
||||||
|
render(_, record) {
|
||||||
|
return `${record?.floor}层`;
|
||||||
|
},
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
title: '建筑面积',
|
||||||
|
dataIndex: 'built_area',
|
||||||
|
render(_, record) {
|
||||||
|
return `${
|
||||||
|
record?.built_area ? record?.built_area + ' m²' : '-'
|
||||||
|
} `;
|
||||||
|
},
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '套内面积',
|
||||||
|
dataIndex: 'inside_area',
|
||||||
|
render(_, record) {
|
||||||
|
return `${
|
||||||
|
record?.inside_area ? record?.inside_area + ' m²' : '-'
|
||||||
|
} `;
|
||||||
|
},
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '计费面积',
|
||||||
|
dataIndex: 'chargeable_area',
|
||||||
|
render(_, record) {
|
||||||
|
return `${
|
||||||
|
record?.chargeable_area
|
||||||
|
? record?.chargeable_area + ' m²'
|
||||||
|
: '-'
|
||||||
|
} `;
|
||||||
|
},
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
// {
|
||||||
|
// title: '户型',
|
||||||
|
// render(_, record) {
|
||||||
|
// return `${record?.room || 'x'}室${record?.hall || 'x'}厅${
|
||||||
|
// record?.bathroom || 'x'
|
||||||
|
// }卫${record?.kitchen || 'x'}厨${record?.balcony || 'x'}阳台`;
|
||||||
|
// },
|
||||||
|
// search: false,
|
||||||
|
// },
|
||||||
|
MyColumns.EnumTag({
|
||||||
|
title: '产权性质',
|
||||||
|
dataIndex: 'ownership_type',
|
||||||
|
valueEnum: AssetHousesOwnershipTypeEnum,
|
||||||
|
search: false,
|
||||||
|
}),
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
213
src/pages/mete/list/modals/MeterHasOne.tsx
Normal file
213
src/pages/mete/list/modals/MeterHasOne.tsx
Normal file
@ -0,0 +1,213 @@
|
|||||||
|
import {
|
||||||
|
MyBetaModalFormProps,
|
||||||
|
MyButtons,
|
||||||
|
MyColumns,
|
||||||
|
MyProTableProps,
|
||||||
|
} from '@/common';
|
||||||
|
import { MyModal } from '@/components/MyModal';
|
||||||
|
|
||||||
|
import { Apis } from '@/gen/Apis';
|
||||||
|
import {
|
||||||
|
AssetHousesOwnershipTypeEnum,
|
||||||
|
AssetHousesUsageEnum,
|
||||||
|
} from '@/gen/Enums';
|
||||||
|
import { ProTable } from '@ant-design/pro-components';
|
||||||
|
import { message, Space } from 'antd';
|
||||||
|
import { useRef, useState } from 'react';
|
||||||
|
|
||||||
|
export default function ChargeStandardHasHouse(props: MyBetaModalFormProps) {
|
||||||
|
// 使用 useState 保存选中的房屋 ID 和行数据,只选择一行
|
||||||
|
const [selectedHouseId, setSelectedHouseId] = useState<number | null>(null);
|
||||||
|
const [selectedRow, setSelectedRow] = useState<any>(null);
|
||||||
|
|
||||||
|
// 添加 tableRef 用于操作表格
|
||||||
|
const tableRef = useRef<any>();
|
||||||
|
|
||||||
|
const onShowContactPhone = () => {
|
||||||
|
if (!selectedHouseId) {
|
||||||
|
message.warning('请选择一个房屋');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 确保 houses_ids 是字符串数组
|
||||||
|
const housesIds = [String(selectedHouseId)];
|
||||||
|
|
||||||
|
Apis.Meter.HouseMeterHasHouses.StoreOrUpdate({
|
||||||
|
house_meters_id: props?.item?.id ?? 0,
|
||||||
|
asset_houses_ids: housesIds,
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
// 成功后重置选中状态
|
||||||
|
setSelectedHouseId(null);
|
||||||
|
setSelectedRow(null);
|
||||||
|
props.reload?.();
|
||||||
|
message.success('添加成功!');
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
console.error('添加失败:', error);
|
||||||
|
message.error('添加失败: ' + (error.message || '未知错误'));
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<MyModal
|
||||||
|
title={props.title || '查看'}
|
||||||
|
type="primary"
|
||||||
|
width="920px"
|
||||||
|
node={
|
||||||
|
<ProTable
|
||||||
|
actionRef={tableRef}
|
||||||
|
{...MyProTableProps.props}
|
||||||
|
request={async (params, sort) =>
|
||||||
|
MyProTableProps.request(
|
||||||
|
{
|
||||||
|
...params,
|
||||||
|
asset_projects_id: props?.item?.asset_projects_id,
|
||||||
|
},
|
||||||
|
sort,
|
||||||
|
Apis.Asset.AssetHouses.List,
|
||||||
|
undefined,
|
||||||
|
(res) => {
|
||||||
|
// 确保响应数据正确处理
|
||||||
|
console.log('加载房屋数据:', res);
|
||||||
|
return res;
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
style={{ height: '800px', overflowY: 'auto', overflowX: 'hidden' }}
|
||||||
|
pagination={{
|
||||||
|
showQuickJumper: true,
|
||||||
|
pageSizeOptions: [10, 20, 50, 100, 200, 500, 1000, 2000],
|
||||||
|
}}
|
||||||
|
rowSelection={{
|
||||||
|
type: 'radio', // 改为单选
|
||||||
|
selectedRowKeys: selectedHouseId ? [selectedHouseId] : [],
|
||||||
|
onChange: (selectedRowKeys, selectedRows) => {
|
||||||
|
// 单选模式下,只取第一个选中的项
|
||||||
|
if (selectedRowKeys.length > 0) {
|
||||||
|
const selectedKey =
|
||||||
|
typeof selectedRowKeys[0] === 'string'
|
||||||
|
? parseInt(selectedRowKeys[0], 10)
|
||||||
|
: (selectedRowKeys[0] as number);
|
||||||
|
|
||||||
|
setSelectedHouseId(selectedKey);
|
||||||
|
setSelectedRow(selectedRows[0]);
|
||||||
|
} else {
|
||||||
|
setSelectedHouseId(null);
|
||||||
|
setSelectedRow(null);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
tableAlertOptionRender={({ selectedRowKeys, onCleanSelected }) => {
|
||||||
|
return (
|
||||||
|
<Space>
|
||||||
|
<span>已选 {selectedRowKeys.length} 项</span>
|
||||||
|
<a
|
||||||
|
onClick={() => {
|
||||||
|
onCleanSelected();
|
||||||
|
setSelectedHouseId(null);
|
||||||
|
setSelectedRow(null);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
清空
|
||||||
|
</a>
|
||||||
|
<MyButtons.Create
|
||||||
|
title="添加"
|
||||||
|
type="primary"
|
||||||
|
key="create2"
|
||||||
|
onClick={() => onShowContactPhone()}
|
||||||
|
/>
|
||||||
|
</Space>
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
options={false}
|
||||||
|
columns={[
|
||||||
|
MyColumns.ID(),
|
||||||
|
MyColumns.EnumTag({
|
||||||
|
title: '用途',
|
||||||
|
dataIndex: 'usage',
|
||||||
|
valueEnum: AssetHousesUsageEnum,
|
||||||
|
search: false,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
title: '项目名称',
|
||||||
|
dataIndex: ['asset_project', 'name'],
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '楼栋名称',
|
||||||
|
dataIndex: ['asset_building', 'name'],
|
||||||
|
search: {
|
||||||
|
transform: (value) => {
|
||||||
|
return { building_name: value };
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '单元名称',
|
||||||
|
dataIndex: ['asset_unit', 'name'],
|
||||||
|
search: {
|
||||||
|
transform: (value) => {
|
||||||
|
return { unit_name: value };
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '房号',
|
||||||
|
dataIndex: 'name',
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
title: '楼层',
|
||||||
|
dataIndex: 'floor',
|
||||||
|
render(_, record) {
|
||||||
|
return `${record?.floor}层`;
|
||||||
|
},
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
title: '建筑面积',
|
||||||
|
dataIndex: 'built_area',
|
||||||
|
render(_, record) {
|
||||||
|
return `${
|
||||||
|
record?.built_area ? record?.built_area + ' m²' : '-'
|
||||||
|
} `;
|
||||||
|
},
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '套内面积',
|
||||||
|
dataIndex: 'inside_area',
|
||||||
|
render(_, record) {
|
||||||
|
return `${
|
||||||
|
record?.inside_area ? record?.inside_area + ' m²' : '-'
|
||||||
|
} `;
|
||||||
|
},
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '计费面积',
|
||||||
|
dataIndex: 'chargeable_area',
|
||||||
|
render(_, record) {
|
||||||
|
return `${
|
||||||
|
record?.chargeable_area
|
||||||
|
? record?.chargeable_area + ' m²'
|
||||||
|
: '-'
|
||||||
|
} `;
|
||||||
|
},
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
MyColumns.EnumTag({
|
||||||
|
title: '产权性质',
|
||||||
|
dataIndex: 'ownership_type',
|
||||||
|
valueEnum: AssetHousesOwnershipTypeEnum,
|
||||||
|
search: false,
|
||||||
|
}),
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
111
src/pages/mete/list/modals/MeterUpdate.tsx
Normal file
111
src/pages/mete/list/modals/MeterUpdate.tsx
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
import {
|
||||||
|
MyBetaModalFormProps,
|
||||||
|
MyButtons,
|
||||||
|
MyFormItems,
|
||||||
|
MyModalFormProps,
|
||||||
|
rulesHelper,
|
||||||
|
} from '@/common';
|
||||||
|
import { Selects } from '@/components/Select';
|
||||||
|
import { Apis } from '@/gen/Apis';
|
||||||
|
import {
|
||||||
|
HouseMetersMeterTypeEnum,
|
||||||
|
HouseMetersUsageTypeEnum,
|
||||||
|
} from '@/gen/Enums';
|
||||||
|
import { BetaSchemaForm } from '@ant-design/pro-components';
|
||||||
|
import { Form, message } from 'antd';
|
||||||
|
|
||||||
|
export default function Update(props: MyBetaModalFormProps) {
|
||||||
|
const [form] = Form.useForm();
|
||||||
|
return (
|
||||||
|
<BetaSchemaForm<ApiTypes.Meter.HouseMeters.Update>
|
||||||
|
{...MyModalFormProps.props}
|
||||||
|
title={`编辑${props.title}`}
|
||||||
|
trigger={<MyButtons.Default title="编辑" type="primary" size="small" />}
|
||||||
|
layout="horizontal"
|
||||||
|
labelCol={{ span: 6 }}
|
||||||
|
wrapperCol={{ span: 18 }}
|
||||||
|
labelAlign="left"
|
||||||
|
width="600px"
|
||||||
|
key={new Date().getTime()}
|
||||||
|
form={form}
|
||||||
|
onOpenChange={(open: any) => {
|
||||||
|
if (open && props.item) {
|
||||||
|
form.setFieldsValue({
|
||||||
|
...props.item,
|
||||||
|
asset_projects_id: props.item?.asset_projects_id,
|
||||||
|
house_charge_standards_id: props.item?.house_charge_standards_id,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
onFinish={async (values) =>
|
||||||
|
Apis.Meter.HouseMeters.Update({
|
||||||
|
...values,
|
||||||
|
id: props.item?.id ?? 0,
|
||||||
|
asset_projects_id: props.item?.asset_projects_id,
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
props.reload?.();
|
||||||
|
message.success(props.title + '成功');
|
||||||
|
return true;
|
||||||
|
})
|
||||||
|
.catch(() => false)
|
||||||
|
}
|
||||||
|
columns={[
|
||||||
|
MyFormItems.EnumRadio({
|
||||||
|
key: 'meter_type',
|
||||||
|
title: '仪表类型',
|
||||||
|
colProps: { span: 24 },
|
||||||
|
valueEnum: HouseMetersMeterTypeEnum,
|
||||||
|
required: true,
|
||||||
|
}),
|
||||||
|
MyFormItems.EnumRadio({
|
||||||
|
key: 'usage_type',
|
||||||
|
title: '使用类型',
|
||||||
|
colProps: { span: 24 },
|
||||||
|
valueEnum: HouseMetersUsageTypeEnum,
|
||||||
|
required: true,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
key: 'name',
|
||||||
|
title: '仪表名称',
|
||||||
|
colProps: { span: 24 },
|
||||||
|
formItemProps: { ...rulesHelper.text },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'multiple',
|
||||||
|
title: '倍率',
|
||||||
|
colProps: { span: 24 },
|
||||||
|
formItemProps: { ...rulesHelper.text },
|
||||||
|
},
|
||||||
|
// {
|
||||||
|
// key: 'initial_value',
|
||||||
|
// title: '初始抄表读数',
|
||||||
|
// colProps: { span: 24 },
|
||||||
|
// formItemProps: { ...rulesHelper.text },
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// key: 'initial_time',
|
||||||
|
// title: '初始抄表时间',
|
||||||
|
// valueType: 'date',
|
||||||
|
// colProps: { span: 24 },
|
||||||
|
// formItemProps: { ...rulesHelper.text },
|
||||||
|
// },
|
||||||
|
Selects?.ChargeStandard({
|
||||||
|
title: '选择收费标准',
|
||||||
|
key: 'charge_standards_id',
|
||||||
|
params: {
|
||||||
|
asset_projects_id: props?.item?.asset_projects_id,
|
||||||
|
},
|
||||||
|
colProps: { span: 24 },
|
||||||
|
formItemProps: { ...rulesHelper.text },
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
key: 'remark',
|
||||||
|
title: '备注',
|
||||||
|
valueType: 'textarea',
|
||||||
|
colProps: { span: 24 },
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
122
src/pages/mete/readings/index.tsx
Normal file
122
src/pages/mete/readings/index.tsx
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
import {
|
||||||
|
MyButtons,
|
||||||
|
MyColumns,
|
||||||
|
MyPageContainer,
|
||||||
|
MyProTableProps,
|
||||||
|
usePageTabs,
|
||||||
|
} from '@/common';
|
||||||
|
import { Apis } from '@/gen/Apis';
|
||||||
|
import { ProTable } from '@ant-design/pro-components';
|
||||||
|
import { useNavigate } from '@umijs/max';
|
||||||
|
import { Space } from 'antd';
|
||||||
|
|
||||||
|
import {
|
||||||
|
HouseMetersMeterTypeEnum,
|
||||||
|
HouseMetersUsageTypeEnum,
|
||||||
|
} from '@/gen/Enums';
|
||||||
|
import NormalReading from './modals/NormalReading';
|
||||||
|
|
||||||
|
export default function Index({ title = '抄表数据' }) {
|
||||||
|
const navigate = useNavigate();
|
||||||
|
|
||||||
|
// 注册当前页面为标签页
|
||||||
|
usePageTabs({
|
||||||
|
tabKey: 'house_meter_readings',
|
||||||
|
tabLabel: title,
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<MyPageContainer
|
||||||
|
title={title}
|
||||||
|
enableTabs={true}
|
||||||
|
tabKey="house_meter_readings"
|
||||||
|
tabLabel={title}
|
||||||
|
>
|
||||||
|
<ProTable
|
||||||
|
{...MyProTableProps.props}
|
||||||
|
request={async (params, sort) =>
|
||||||
|
MyProTableProps.request(params, sort, Apis.Meter.HouseMeters.List)
|
||||||
|
}
|
||||||
|
toolBarRender={(action) => [
|
||||||
|
// <ReadingCreate key="Create" reload={action?.reload} title={title} />,
|
||||||
|
]}
|
||||||
|
columns={[
|
||||||
|
MyColumns.ID(),
|
||||||
|
MyColumns.EnumTag({
|
||||||
|
title: '类型',
|
||||||
|
dataIndex: 'meter_type',
|
||||||
|
valueEnum: HouseMetersMeterTypeEnum,
|
||||||
|
search: false,
|
||||||
|
}),
|
||||||
|
MyColumns.EnumTag({
|
||||||
|
title: '使用类型',
|
||||||
|
dataIndex: 'usage_type',
|
||||||
|
valueEnum: HouseMetersUsageTypeEnum,
|
||||||
|
search: false,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
title: '仪表名称',
|
||||||
|
dataIndex: 'name',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '收费标准',
|
||||||
|
dataIndex: ['charge_standard', 'name'],
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '初始抄表读数',
|
||||||
|
dataIndex: 'initial_value',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '最新抄表读数',
|
||||||
|
dataIndex: 'latest_value',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '初始抄表时间',
|
||||||
|
dataIndex: 'initial_time',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '最新抄表时间',
|
||||||
|
dataIndex: 'latest_time',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '备注',
|
||||||
|
dataIndex: 'remark',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
|
||||||
|
MyColumns.SoftDelete({
|
||||||
|
onRestore: Apis.Company.Companies.Restore,
|
||||||
|
onSoftDelete: Apis.Company.Companies.SoftDelete,
|
||||||
|
search: false,
|
||||||
|
}),
|
||||||
|
MyColumns.CreatedAt(),
|
||||||
|
MyColumns.Option({
|
||||||
|
render: (_, item: any, index, action) => (
|
||||||
|
<Space key={index}>
|
||||||
|
{/* <CompanyShow item={item} title="查看" reload={action?.reload} /> */}
|
||||||
|
<NormalReading
|
||||||
|
item={{ ...item, type: 'link' }}
|
||||||
|
title="抄表"
|
||||||
|
reload={action?.reload}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<MyButtons.Delete
|
||||||
|
onConfirm={() =>
|
||||||
|
Apis.Company.Companies.Delete({ id: item.id }).then(() =>
|
||||||
|
action?.reload(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</Space>
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</MyPageContainer>
|
||||||
|
);
|
||||||
|
}
|
||||||
149
src/pages/mete/readings/modals/NormalReading.tsx
Normal file
149
src/pages/mete/readings/modals/NormalReading.tsx
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
import {
|
||||||
|
MyBetaModalFormProps,
|
||||||
|
MyButtons,
|
||||||
|
MyModalFormProps,
|
||||||
|
rulesHelper,
|
||||||
|
} from '@/common';
|
||||||
|
import { Selects } from '@/components/Select';
|
||||||
|
import { Apis } from '@/gen/Apis';
|
||||||
|
import { HouseMeterReadingsOperationTypeEnum } from '@/gen/Enums';
|
||||||
|
import { BetaSchemaForm } from '@ant-design/pro-components';
|
||||||
|
import { Form, message } from 'antd';
|
||||||
|
|
||||||
|
export default function Create(props: MyBetaModalFormProps) {
|
||||||
|
const [form] = Form.useForm();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<BetaSchemaForm<ApiTypes.Meter.HouseMeterReadings.Store>
|
||||||
|
{...MyModalFormProps.props}
|
||||||
|
title={`添加抄表数据`}
|
||||||
|
layout="horizontal"
|
||||||
|
labelCol={{ span: 6 }}
|
||||||
|
wrapperCol={{ span: 18 }}
|
||||||
|
labelAlign="left"
|
||||||
|
width="600px"
|
||||||
|
key={new Date().getTime()}
|
||||||
|
trigger={<MyButtons.Default title={`抄表`} type="primary" />}
|
||||||
|
form={form}
|
||||||
|
onOpenChange={(open: any) => {
|
||||||
|
if (open && props.item) {
|
||||||
|
form.resetFields(); // 清空表单数据
|
||||||
|
form.setFieldsValue({
|
||||||
|
...props.item,
|
||||||
|
latest_value:
|
||||||
|
props.item?.latest_value === '0.00'
|
||||||
|
? props.item?.initial_value
|
||||||
|
: props.item?.latest_value,
|
||||||
|
latest_time: props.item?.latest_time || props.item?.initial_time,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
onFinish={async (values) =>
|
||||||
|
Apis.Meter.HouseMeterReadings.Store({
|
||||||
|
...values,
|
||||||
|
operation_type:
|
||||||
|
HouseMeterReadingsOperationTypeEnum.NormalReading.value,
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
props.reload?.();
|
||||||
|
message.success(props.title + '成功');
|
||||||
|
return true;
|
||||||
|
})
|
||||||
|
.catch(() => false)
|
||||||
|
}
|
||||||
|
columns={[
|
||||||
|
{
|
||||||
|
key: 'latest_value',
|
||||||
|
title: '上次抄表读数',
|
||||||
|
colProps: { span: 24 },
|
||||||
|
fieldProps: { disabled: true },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'latest_time',
|
||||||
|
title: '上次抄表时间',
|
||||||
|
valueType: 'date',
|
||||||
|
colProps: { span: 24 },
|
||||||
|
fieldProps: { disabled: true },
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
key: 'current_reading',
|
||||||
|
title: '本次抄表读数',
|
||||||
|
valueType: 'number',
|
||||||
|
colProps: { span: 24 },
|
||||||
|
formItemProps: {
|
||||||
|
...rulesHelper.number,
|
||||||
|
rules: [
|
||||||
|
...rulesHelper.number.rules,
|
||||||
|
{
|
||||||
|
validator: (_, value) => {
|
||||||
|
const latestValue = form.getFieldValue('latest_value');
|
||||||
|
if (
|
||||||
|
value &&
|
||||||
|
latestValue &&
|
||||||
|
Number(value) <= Number(latestValue)
|
||||||
|
) {
|
||||||
|
return Promise.reject(
|
||||||
|
new Error('本次读数必须大于上次抄表读数'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Promise.resolve();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'reading_time',
|
||||||
|
title: '本次抄表时间',
|
||||||
|
valueType: 'date',
|
||||||
|
colProps: { span: 24 },
|
||||||
|
formItemProps: {
|
||||||
|
...rulesHelper.text,
|
||||||
|
rules: [
|
||||||
|
...rulesHelper.text.rules,
|
||||||
|
{
|
||||||
|
validator: (_, value) => {
|
||||||
|
const latestTime = form.getFieldValue('latest_time');
|
||||||
|
if (value && latestTime) {
|
||||||
|
const currentTime = new Date(value);
|
||||||
|
const lastTime = new Date(latestTime);
|
||||||
|
if (currentTime <= lastTime) {
|
||||||
|
return Promise.reject(
|
||||||
|
new Error('本次抄表时间必须大于上次抄表时间'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Promise.resolve();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Selects?.Employees({
|
||||||
|
key: 'company_employees_id',
|
||||||
|
title: '抄表人',
|
||||||
|
params: {
|
||||||
|
companies_id: props.item?.companies_id,
|
||||||
|
},
|
||||||
|
colProps: { span: 24 },
|
||||||
|
required: true,
|
||||||
|
fieldProps: {
|
||||||
|
showSearch: true,
|
||||||
|
fieldNames: {
|
||||||
|
label: 'label',
|
||||||
|
value: 'value',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
|
||||||
|
{
|
||||||
|
key: 'remark',
|
||||||
|
title: '备注',
|
||||||
|
valueType: 'textarea',
|
||||||
|
colProps: { span: 24 },
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -47,32 +47,31 @@ export default function Index({ title = '支付明细' }) {
|
|||||||
// <BillCreate key="Create" reload={action?.reload} title={title} />,
|
// <BillCreate key="Create" reload={action?.reload} title={title} />,
|
||||||
// ]}
|
// ]}
|
||||||
columns={[
|
columns={[
|
||||||
MyColumns.ID(),
|
// MyColumns.ID(),
|
||||||
|
{
|
||||||
|
title: '订单号',
|
||||||
|
dataIndex: 'order_code',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
MyColumns.EnumTag({
|
||||||
|
title: '支付方式',
|
||||||
|
dataIndex: 'payment_method',
|
||||||
|
valueEnum: HouseOrdersPaymentMethodEnum,
|
||||||
|
}),
|
||||||
MyColumns.EnumTag({
|
MyColumns.EnumTag({
|
||||||
title: '支付状态',
|
title: '支付状态',
|
||||||
dataIndex: 'order_status',
|
dataIndex: 'order_status',
|
||||||
valueEnum: HouseOrdersOrderStatusEnum,
|
valueEnum: HouseOrdersOrderStatusEnum,
|
||||||
}),
|
}),
|
||||||
MyColumns.EnumTag({
|
|
||||||
title: '支付渠道',
|
|
||||||
dataIndex: 'payment_method',
|
|
||||||
valueEnum: HouseOrdersPaymentMethodEnum,
|
|
||||||
}),
|
|
||||||
|
|
||||||
|
// {
|
||||||
|
// title: '支付单号',
|
||||||
|
// dataIndex: 'payment_no',
|
||||||
|
// search: false,
|
||||||
|
// },
|
||||||
{
|
{
|
||||||
title: '收款单号',
|
title: '应收金额',
|
||||||
dataIndex: 'order_code',
|
dataIndex: 'actual_paid_amount',
|
||||||
search: false,
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
title: '账单金额',
|
|
||||||
dataIndex: 'amount',
|
|
||||||
search: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '优惠金额',
|
|
||||||
dataIndex: 'discount_amount',
|
|
||||||
search: false,
|
search: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -81,13 +80,26 @@ export default function Index({ title = '支付明细' }) {
|
|||||||
search: false,
|
search: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '应付金额',
|
title: '退款总金额',
|
||||||
dataIndex: 'total_payable_amount',
|
dataIndex: 'refund_amount',
|
||||||
search: false,
|
search: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '关联项目',
|
title: '实缴金额',
|
||||||
dataIndex: ['asset_project', 'name'],
|
dataIndex: 'actual_paid_amount',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '收款账号',
|
||||||
|
dataIndex: ['house_order_items', 'receipt_account'],
|
||||||
|
render: (text, item) =>
|
||||||
|
`${
|
||||||
|
item?.receipt_account?.company_bank
|
||||||
|
} ${item?.receipt_account?.company_account?.slice(-4)}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '支付时间',
|
||||||
|
dataIndex: 'paid_time',
|
||||||
search: false,
|
search: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -95,7 +107,13 @@ export default function Index({ title = '支付明细' }) {
|
|||||||
dataIndex: ['company', 'name'],
|
dataIndex: ['company', 'name'],
|
||||||
search: false,
|
search: false,
|
||||||
},
|
},
|
||||||
MyColumns.CreatedAt(),
|
{
|
||||||
|
title: '关联项目',
|
||||||
|
dataIndex: ['asset_project', 'name'],
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
|
||||||
|
// MyColumns.CreatedAt(),
|
||||||
// MyColumns.Option({
|
// MyColumns.Option({
|
||||||
// render: (_, item: any, index, action) => (
|
// render: (_, item: any, index, action) => (
|
||||||
// <Space key={index}>
|
// <Space key={index}>
|
||||||
Loading…
x
Reference in New Issue
Block a user