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 {
const {

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

@ -195,7 +195,7 @@ declare namespace ApiTypes {
namespace HouseRegisters {
type List = {
"house_name"?: string; // 模糊搜索:房屋名称
"type"?: string; // 类型,[enum:HouseRegistersTypeEnum]
"type"?: string[]; // 类型,[enum:HouseRegistersTypeEnum]
"status"?: string; // 状态,[enum:HouseRegistersStatusEnum]
"asset_houses_id"?: number; // 房屋ID
};
@ -340,6 +340,17 @@ declare namespace ApiTypes {
"asset_parking_places_id"?: number; // 所属车场id,[ref:asset_parking_places]
"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 {
type List = {
@ -660,6 +671,7 @@ declare namespace ApiTypes {
"year"?: number; // 账单年份
"month"?: number; // 账单月份
"type"?: string; // 账单类型,[enum:HouseBillsTypeEnum]
"has_refunding"?: boolean; // 是否有退款中:false-无,true-有
};
type SummaryBillList = {
"project_name"?: string; // 模糊搜索:项目名称
@ -905,6 +917,9 @@ declare namespace ApiTypes {
type Select = {
"projects_id"?: number; // 所属项目id,[ref:asset_projects]
};
type ProjectReceiptAccountsSelect = {
"projects_id"?: number; // 所属项目id,[ref:asset_projects]
};
}
namespace CompanyPropertyBrands {
type List = {
@ -1397,6 +1412,9 @@ declare namespace ApiTypes {
"ids": string[]; // 订单ID数组
"serial_number": string; // 流水号
};
type ImportSerialNumber = {
"upload_file": mimes:xlsx,xls; // 上传文件
};
type GetPayCode = {
"amount": number; // 金额
"discount_amount"?: number; // 优惠金额
@ -1531,6 +1549,9 @@ declare namespace ApiTypes {
type Delete = {
"id": number; // id
};
type Import = {
"upload_file": mimes:xlsx,xls; // 上传文件
};
}
namespace HouseMeterTaskDetails {
type List = {
@ -1760,6 +1781,9 @@ declare namespace ApiTypes {
"status": string; // 工单状态,[enum:HouseWorkOrdersStatusEnum]
"description"?: string; // 进度描述
"attachments"?: string[]; // 附件
"is_fee"?: boolean; // 是否收费
"amount"?: number; // 收费金额
"company_project_receipt_accounts_id"?: number; // 收款账号id,[ref:company_project_receipt_accounts]
};
type Show = {
"id": number; // id

View File

@ -195,6 +195,15 @@ export const Apis = {
Select(data?: ApiTypes.Asset.AssetCarPorts.Select): Promise<MyResponseType> {
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: {
List(data?: ApiTypes.Asset.AssetHouses.List): Promise<MyResponseType> {
@ -472,6 +481,9 @@ export const Apis = {
Select(data?: ApiTypes.Company.CompanyProjectReceiptAccounts.Select): Promise<MyResponseType> {
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: {
List(data?: ApiTypes.Company.CompanyPropertyBrands.List): Promise<MyResponseType> {
@ -763,6 +775,12 @@ export const Apis = {
BatchUpdateSerialNumber(data: ApiTypes.HouseOrder.HouseOrders.BatchUpdateSerialNumber): Promise<MyResponseType> {
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> {
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> {
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: {
List(data?: ApiTypes.Meter.HouseMeterTaskDetails.List): Promise<MyResponseType> {

View File

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

View File

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

View File

@ -72,10 +72,16 @@ export default function Index({ title = '房屋账单' }) {
onChange={(values) => {
setParams({
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,
});
getSummaryBillList({
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,
});
}}

View File

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

View File

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