develop #2

Merged
zsq merged 2 commits from develop into main 2026-01-27 20:20:16 +08:00
9 changed files with 185 additions and 36 deletions

View File

@ -339,6 +339,43 @@ export const Selects = {
}, },
}; };
}, },
//收款账号
ProjectReceiptAccountsSelect(props?: PropsType): ReturnType {
const {
title = '收款账户',
key = 'company_project_receipt_accounts_id',
required = false,
hideInTable = true,
...rest
} = props ?? {};
return {
title: title,
key: key,
valueType: 'select',
hideInTable: hideInTable,
formItemProps: { ...(required ? rulesHelper.number : {}) },
request: async (params) =>
(
await Apis.Company.CompanyProjectReceiptAccounts.ProjectReceiptAccountsSelect(
{
keywords: params?.keyWords,
projects_id: params?.asset_projects_id,
...params,
},
)
).data,
...rest,
fieldProps: {
showSearch: true,
fieldNames: {
label: 'label',
value: 'value',
},
...rest?.fieldProps,
},
};
},
//机构收款账户 //机构收款账户
CompanyAccounts(props?: PropsType): ReturnType { CompanyAccounts(props?: PropsType): ReturnType {
const { const {

26
src/gen/ApiTypes.d.ts vendored
View File

@ -195,7 +195,7 @@ declare namespace ApiTypes {
namespace HouseRegisters { namespace HouseRegisters {
type List = { type List = {
"house_name"?: string; // 模糊搜索:房屋名称 "house_name"?: string; // 模糊搜索:房屋名称
"type"?: string; // 类型,[enum:HouseRegistersTypeEnum] "type"?: string[]; // 类型,[enum:HouseRegistersTypeEnum]
"status"?: string; // 状态,[enum:HouseRegistersStatusEnum] "status"?: string; // 状态,[enum:HouseRegistersStatusEnum]
"asset_houses_id"?: number; // 房屋ID "asset_houses_id"?: number; // 房屋ID
}; };
@ -340,6 +340,17 @@ declare namespace ApiTypes {
"asset_parking_places_id"?: number; // 所属车场id,[ref:asset_parking_places] "asset_parking_places_id"?: number; // 所属车场id,[ref:asset_parking_places]
"keywords"?: string; // 关键词 "keywords"?: string; // 关键词
}; };
type Import = {
"asset_projects_id": number; // 所属项目id,[ref:asset_projects]
"upload_file": mimes:xlsx,xls; // 上传的Excel文件
};
type Export = {
"asset_projects_id"?: number; // 所属项目id,[ref:asset_projects]
"asset_parking_places_id"?: number; // 所属车场id,[ref:asset_parking_places]
"full_name"?: string; // 模糊搜索:名称
"current"?: number; // 页码
"download_type": string; // 下载类型page 当前页(含查询条件)query 所有页(含查询条件)all所有记录
};
} }
namespace AssetHouses { namespace AssetHouses {
type List = { type List = {
@ -660,6 +671,7 @@ declare namespace ApiTypes {
"year"?: number; // 账单年份 "year"?: number; // 账单年份
"month"?: number; // 账单月份 "month"?: number; // 账单月份
"type"?: string; // 账单类型,[enum:HouseBillsTypeEnum] "type"?: string; // 账单类型,[enum:HouseBillsTypeEnum]
"has_refunding"?: boolean; // 是否有退款中:false-无,true-有
}; };
type SummaryBillList = { type SummaryBillList = {
"project_name"?: string; // 模糊搜索:项目名称 "project_name"?: string; // 模糊搜索:项目名称
@ -905,6 +917,9 @@ declare namespace ApiTypes {
type Select = { type Select = {
"projects_id"?: number; // 所属项目id,[ref:asset_projects] "projects_id"?: number; // 所属项目id,[ref:asset_projects]
}; };
type ProjectReceiptAccountsSelect = {
"projects_id"?: number; // 所属项目id,[ref:asset_projects]
};
} }
namespace CompanyPropertyBrands { namespace CompanyPropertyBrands {
type List = { type List = {
@ -1397,6 +1412,9 @@ declare namespace ApiTypes {
"ids": string[]; // 订单ID数组 "ids": string[]; // 订单ID数组
"serial_number": string; // 流水号 "serial_number": string; // 流水号
}; };
type ImportSerialNumber = {
"upload_file": mimes:xlsx,xls; // 上传文件
};
type GetPayCode = { type GetPayCode = {
"amount": number; // 金额 "amount": number; // 金额
"discount_amount"?: number; // 优惠金额 "discount_amount"?: number; // 优惠金额
@ -1531,6 +1549,9 @@ declare namespace ApiTypes {
type Delete = { type Delete = {
"id": number; // id "id": number; // id
}; };
type Import = {
"upload_file": mimes:xlsx,xls; // 上传文件
};
} }
namespace HouseMeterTaskDetails { namespace HouseMeterTaskDetails {
type List = { type List = {
@ -1760,6 +1781,9 @@ declare namespace ApiTypes {
"status": string; // 工单状态,[enum:HouseWorkOrdersStatusEnum] "status": string; // 工单状态,[enum:HouseWorkOrdersStatusEnum]
"description"?: string; // 进度描述 "description"?: string; // 进度描述
"attachments"?: string[]; // 附件 "attachments"?: string[]; // 附件
"is_fee"?: boolean; // 是否收费
"amount"?: number; // 收费金额
"company_project_receipt_accounts_id"?: number; // 收款账号id,[ref:company_project_receipt_accounts]
}; };
type Show = { type Show = {
"id": number; // id "id": number; // id

View File

@ -195,6 +195,15 @@ export const Apis = {
Select(data?: ApiTypes.Asset.AssetCarPorts.Select): Promise<MyResponseType> { Select(data?: ApiTypes.Asset.AssetCarPorts.Select): Promise<MyResponseType> {
return request('company/asset/asset_car_ports/select', { data }); return request('company/asset/asset_car_ports/select', { data });
}, },
Import(data: ApiTypes.Asset.AssetCarPorts.Import): Promise<MyResponseType> {
return request('company/asset/asset_car_ports/import', { data });
},
DownloadTemplate(): Promise<MyResponseType> {
return request('company/asset/asset_car_ports/download_template', {responseType: 'blob',});
},
Export(data: ApiTypes.Asset.AssetCarPorts.Export): Promise<MyResponseType> {
return request('company/asset/asset_car_ports/export', { responseType: 'blob',data });
},
}, },
AssetHouses: { AssetHouses: {
List(data?: ApiTypes.Asset.AssetHouses.List): Promise<MyResponseType> { List(data?: ApiTypes.Asset.AssetHouses.List): Promise<MyResponseType> {
@ -472,6 +481,9 @@ export const Apis = {
Select(data?: ApiTypes.Company.CompanyProjectReceiptAccounts.Select): Promise<MyResponseType> { Select(data?: ApiTypes.Company.CompanyProjectReceiptAccounts.Select): Promise<MyResponseType> {
return request('company/company/company_project_receipt_accounts/select', { data }); return request('company/company/company_project_receipt_accounts/select', { data });
}, },
ProjectReceiptAccountsSelect(data?: ApiTypes.Company.CompanyProjectReceiptAccounts.ProjectReceiptAccountsSelect): Promise<MyResponseType> {
return request('company/company/company_project_receipt_accounts/project_receipt_accounts_select', { data });
},
}, },
CompanyPropertyBrands: { CompanyPropertyBrands: {
List(data?: ApiTypes.Company.CompanyPropertyBrands.List): Promise<MyResponseType> { List(data?: ApiTypes.Company.CompanyPropertyBrands.List): Promise<MyResponseType> {
@ -763,6 +775,12 @@ export const Apis = {
BatchUpdateSerialNumber(data: ApiTypes.HouseOrder.HouseOrders.BatchUpdateSerialNumber): Promise<MyResponseType> { BatchUpdateSerialNumber(data: ApiTypes.HouseOrder.HouseOrders.BatchUpdateSerialNumber): Promise<MyResponseType> {
return request('company/house_order/house_orders/batch_update_serial_number', { data }); return request('company/house_order/house_orders/batch_update_serial_number', { data });
}, },
ImportSerialNumber(data: ApiTypes.HouseOrder.HouseOrders.ImportSerialNumber): Promise<MyResponseType> {
return request('company/house_order/house_orders/import_serial_number', { data });
},
DownloadSerialNumberTemplate(): Promise<MyResponseType> {
return request('company/house_order/house_orders/download_serial_number_template', {responseType: 'blob',});
},
GetPayCode(data: ApiTypes.HouseOrder.HouseOrders.GetPayCode): Promise<MyResponseType> { GetPayCode(data: ApiTypes.HouseOrder.HouseOrders.GetPayCode): Promise<MyResponseType> {
return request('company/house_order/house_orders/get_pay_code', { data }); return request('company/house_order/house_orders/get_pay_code', { data });
}, },
@ -855,6 +873,12 @@ export const Apis = {
Delete(data: ApiTypes.Meter.HouseMeterReadings.Delete): Promise<MyResponseType> { Delete(data: ApiTypes.Meter.HouseMeterReadings.Delete): Promise<MyResponseType> {
return request('company/meter/house_meter_readings/delete', { data }); return request('company/meter/house_meter_readings/delete', { data });
}, },
Import(data: ApiTypes.Meter.HouseMeterReadings.Import): Promise<MyResponseType> {
return request('company/meter/house_meter_readings/import', { data });
},
DownloadTemplate(): Promise<MyResponseType> {
return request('company/meter/house_meter_readings/download_template', {responseType: 'blob',});
},
}, },
HouseMeterTaskDetails: { HouseMeterTaskDetails: {
List(data?: ApiTypes.Meter.HouseMeterTaskDetails.List): Promise<MyResponseType> { List(data?: ApiTypes.Meter.HouseMeterTaskDetails.List): Promise<MyResponseType> {

View File

@ -251,7 +251,7 @@ export const BannersTypeEnum= {
// 缓存类型 // 缓存类型
export const CacheTypeEnum= { export const CacheTypeEnum= {
'MobilePhoneVerificationCode': {"text":"手机验证码","color":"#bba798","value":"MobilePhoneVerificationCode"}, 'MobilePhoneVerificationCode': {"text":"手机验证码","color":"#63f8de","value":"MobilePhoneVerificationCode"},
}; };
// CompaniesMerchantTypeEnum // CompaniesMerchantTypeEnum
@ -406,9 +406,10 @@ export const GoodsReleasesStatusEnum= {
// 账单状态枚举 // 账单状态枚举
export const HouseBillsBillStatusEnum= { export const HouseBillsBillStatusEnum= {
'PendingPayment': {"text":"待支付","color":"#facc15","value":"PendingPayment"}, 'PendingPayment': {"text":"待收款","color":"#facc15","value":"PendingPayment"},
'PartiallyPaid': {"text":"部分支付","color":"#60a5fa","value":"PartiallyPaid"}, 'ToBeConfirmed': {"text":"待确认","color":"#fb923c","value":"ToBeConfirmed"},
'Paid': {"text":"已支付","color":"#10b981","value":"Paid"}, 'PartiallyPaid': {"text":"部分收款","color":"#60a5fa","value":"PartiallyPaid"},
'Paid': {"text":"已收款","color":"#10b981","value":"Paid"},
'Overdue': {"text":"已逾期","color":"#ef4444","value":"Overdue"}, 'Overdue': {"text":"已逾期","color":"#ef4444","value":"Overdue"},
'Cancelled': {"text":"已取消","color":"#9ca3af","value":"Cancelled"}, 'Cancelled': {"text":"已取消","color":"#9ca3af","value":"Cancelled"},
}; };
@ -422,6 +423,7 @@ export const HouseBillsTypeEnum= {
'SharedWaterFee': {"text":"公摊水费","color":"#8b5cf6","value":"SharedWaterFee"}, 'SharedWaterFee': {"text":"公摊水费","color":"#8b5cf6","value":"SharedWaterFee"},
'SharedElectricityFee': {"text":"公摊电费","color":"#ec4899","value":"SharedElectricityFee"}, 'SharedElectricityFee': {"text":"公摊电费","color":"#ec4899","value":"SharedElectricityFee"},
'CarPortFee': {"text":"车位费","color":"#f59e0b","value":"CarPortFee"}, 'CarPortFee': {"text":"车位费","color":"#f59e0b","value":"CarPortFee"},
'WorkOrderRepairFee': {"text":"工单维修费","color":"#f97316","value":"WorkOrderRepairFee"},
}; };
// HouseChargeStandardsApportionmentMethodEnum // HouseChargeStandardsApportionmentMethodEnum
@ -593,6 +595,7 @@ export const HouseOccupantsRelationWithOwnerEnum= {
// HouseOccupantsResidentialRelationEnum // HouseOccupantsResidentialRelationEnum
export const HouseOccupantsResidentialRelationEnum= { export const HouseOccupantsResidentialRelationEnum= {
'PropertyOwner': {"text":"产权人","color":"#722ed1","value":"PropertyOwner"},
'Resident': {"text":"住户","color":"#2db7f5","value":"Resident"}, 'Resident': {"text":"住户","color":"#2db7f5","value":"Resident"},
'PrimaryTenant': {"text":"主租人","color":"#87d068","value":"PrimaryTenant"}, 'PrimaryTenant': {"text":"主租人","color":"#87d068","value":"PrimaryTenant"},
'Tenant': {"text":"租客","color":"#fa8c16","value":"Tenant"}, 'Tenant': {"text":"租客","color":"#fa8c16","value":"Tenant"},
@ -624,6 +627,7 @@ export const HouseOrdersAuditStatusEnum= {
// 订单状态枚举 // 订单状态枚举
export const HouseOrdersOrderStatusEnum= { export const HouseOrdersOrderStatusEnum= {
'Pending': {"text":"待支付","color":"#facc15","value":"Pending"}, 'Pending': {"text":"待支付","color":"#facc15","value":"Pending"},
'ToBeConfirmed': {"text":"待确认","color":"#fb923c","value":"ToBeConfirmed"},
'Paid': {"text":"已支付","color":"#10b981","value":"Paid"}, 'Paid': {"text":"已支付","color":"#10b981","value":"Paid"},
'Refunded': {"text":"已退款","color":"#60a5fa","value":"Refunded"}, 'Refunded': {"text":"已退款","color":"#60a5fa","value":"Refunded"},
'Cancelled': {"text":"已取消","color":"#9ca3af","value":"Cancelled"}, 'Cancelled': {"text":"已取消","color":"#9ca3af","value":"Cancelled"},

View File

@ -1,29 +1,30 @@
import { Apis } from '@/gen/Apis'; import { Apis } from '@/gen/Apis';
import { ProFormSelect, QueryFilter } from '@ant-design/pro-components'; import { ProFormSelect, QueryFilter } from '@ant-design/pro-components';
import { Form } from 'antd'; import { Form } from 'antd';
import { useState } from 'react';
type Props = { type Props = {
onChange?: (value: any) => void; onChange?: (value: any) => void;
}; };
export default function Search(props: Props) { export default function Search(props: Props) {
const [form] = Form.useForm(); const [form] = Form.useForm();
const [assetProjectsId, setAssetProjectsId] = useState<any>();
const [assetBuildingsId, setAssetBuildingsId] = useState<any>();
const [assetUnitsId, setAssetUnitsId] = useState<any>();
return ( return (
<QueryFilter <QueryFilter
style={{ backgroundColor: '#fff' }} style={{ backgroundColor: '#fff' }}
defaultCollapsed defaultCollapsed
split split
form={form} form={form}
span={6}
onFinish={props?.onChange} onFinish={props?.onChange}
onReset={() => { onReset={() => {
props?.onChange?.(form?.getFieldsValue() || {}); props?.onChange?.(form?.getFieldsValue() || {});
}} }}
> >
<ProFormSelect <ProFormSelect
name="asset_houses_id" name="asset_projects_id"
label="房屋" label="选择项目"
valueEnum={{
open: '未解决',
closed: '已解决',
}}
request={async (params) => { request={async (params) => {
let res = await Apis.Asset.AssetProjects.Select({ let res = await Apis.Asset.AssetProjects.Select({
keywords: params?.keyWords, keywords: params?.keyWords,
@ -31,6 +32,76 @@ export default function Search(props: Props) {
}); });
return res?.data; return res?.data;
}} }}
fieldProps={{
showSearch: true,
}}
onChange={(e: any) => {
console.log(e, 'e');
setAssetProjectsId(e);
}}
placeholder="请选择项目"
/>
<ProFormSelect
name="asset_buildings_id"
label="选择楼栋"
params={{
asset_projects_id: assetProjectsId,
}}
fieldProps={{
showSearch: true,
}}
onChange={(e: any) => {
setAssetBuildingsId(e);
}}
request={async (params) => {
let res = await Apis.Asset.AssetBuildings.Select({
keywords: params?.keyWords,
...params,
});
return res?.data;
}}
placeholder="请选择楼栋"
/>
<ProFormSelect
name="asset_units_id"
label="选择单元"
params={{
asset_projects_id: assetProjectsId,
asset_buildings_id: assetBuildingsId,
}}
fieldProps={{
showSearch: true,
}}
onChange={(e: any) => {
setAssetUnitsId(e);
}}
request={async (params) => {
let res = await Apis.Asset.AssetUnits.Select({
keywords: params?.keyWords,
...params,
});
return res?.data;
}}
placeholder="请选择单元"
/>
<ProFormSelect
name="asset_houses_id"
label="选择房屋"
params={{
asset_projects_id: assetProjectsId,
asset_buildings_id: assetBuildingsId,
asset_units_id: assetUnitsId,
}}
fieldProps={{
showSearch: true,
}}
request={async (params) => {
let res = await Apis.Asset.AssetHouses.Select({
keywords: params?.keyWords,
...params,
});
return res?.data;
}}
placeholder="请选择房屋" placeholder="请选择房屋"
/> />
</QueryFilter> </QueryFilter>

View File

@ -72,10 +72,16 @@ export default function Index({ title = '房屋账单' }) {
onChange={(values) => { onChange={(values) => {
setParams({ setParams({
asset_houses_id: values?.asset_houses_id || '', asset_houses_id: values?.asset_houses_id || '',
asset_projects_id: values?.asset_projects_id || '',
asset_buildings_id: values?.asset_buildings_id || '',
asset_units_id: values?.asset_units_id || '',
page: 1, page: 1,
}); });
getSummaryBillList({ getSummaryBillList({
asset_houses_id: values?.asset_houses_id || '', asset_houses_id: values?.asset_houses_id || '',
asset_projects_id: values?.asset_projects_id || '',
asset_buildings_id: values?.asset_buildings_id || '',
asset_units_id: values?.asset_units_id || '',
page: 1, page: 1,
}); });
}} }}

View File

@ -128,7 +128,7 @@ export default function WorkLogsCreate({
placeholder: '请输入客户需支付的金额', placeholder: '请输入客户需支付的金额',
}, },
}, },
Selects?.ProjectAccounts({ Selects?.ProjectReceiptAccountsSelect({
key: 'company_project_receipt_accounts_id', key: 'company_project_receipt_accounts_id',
title: '选择账户', title: '选择账户',
params: { params: {

View File

@ -17,7 +17,6 @@ export default function Index({ title = '未回访工单' }) {
{ {
show: ( show: (
<> <>
{' '}
{item.is_visited === 0 && ( {item.is_visited === 0 && (
<WorkOrderShow item={item} title="回访" reload={action?.reload} /> <WorkOrderShow item={item} title="回访" reload={action?.reload} />
)} )}

View File

@ -1,29 +1,27 @@
import { MyPageContainer, useCurrentPermissions } from '@/common'; import { MyPageContainer } from '@/common';
import { useNavigate, useSearchParams } from '@umijs/max'; import { useNavigate, useSearchParams } from '@umijs/max';
import type { TabsProps } from 'antd'; import type { TabsProps } from 'antd';
import { Button, Tabs } from 'antd'; import { Tabs } from 'antd';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import IsVisited from './components/IsVisited'; import IsVisited from './components/IsVisited';
import NoVisited from './components/NoVisited'; import NoVisited from './components/NoVisited';
export default function Index({ title = '工单回访' }) { export default function Index({ title = '工单回访' }) {
const getCurrentPermissions = useCurrentPermissions();
const [searchParams] = useSearchParams(); const [searchParams] = useSearchParams();
const [activeKey, setActiveKey] = useState('1'); const [activeKey, setActiveKey] = useState('1');
const navigate = useNavigate(); const navigate = useNavigate();
const items: TabsProps['items'] = getCurrentPermissions({ const items: TabsProps['items'] = [
NoVisited: { {
key: 'NoVisited', key: 'NoVisited',
label: '未回访工单', label: '未回访工单',
children: <NoVisited />, children: <NoVisited />,
}, },
IsVisited: { {
key: 'IsVisited', key: 'IsVisited',
label: '已回访工单', label: '已回访工单',
children: <IsVisited />, children: <IsVisited />,
}, },
}); ];
useEffect(() => { useEffect(() => {
if (searchParams?.get('key')) { if (searchParams?.get('key')) {
@ -38,21 +36,7 @@ export default function Index({ title = '工单回访' }) {
tabKey="visited" tabKey="visited"
tabLabel={title} tabLabel={title}
> >
<Tabs <Tabs defaultActiveKey={activeKey} items={items} type="card" />
defaultActiveKey={activeKey}
items={items}
type="card"
tabBarExtraContent={{
right: (
<Button
type="primary"
onClick={() => navigate('/work_order/work_bi')}
>
BI
</Button>
),
}}
/>
</MyPageContainer> </MyPageContainer>
); );
} }