Merge branch 'develop' of ssh://code.juyouwu.cn:2222/pay/pay-admin into develop

# Conflicts:
#	.umirc.ts
#	gencode.json
This commit is contained in:
uiujun 2025-06-29 23:57:51 +08:00
commit 0fcdf6e00f
22 changed files with 224840 additions and 15 deletions

View File

@ -16,6 +16,7 @@ export default defineConfig({
'/api/': { '/api/': {
// target: 'http://yt:8003', // target: 'http://yt:8003',
target: 'http://10.39.13.80:8003', target: 'http://10.39.13.80:8003',
// target: 'http://we6f9c65.natappfree.cc',
// target: 'https://loanos-test.nchl.net/', // target: 'https://loanos-test.nchl.net/',
changeOrigin: true, changeOrigin: true,
pathRewrite: { '^': '' }, pathRewrite: { '^': '' },

View File

@ -1,4 +1,5 @@
{ {
"url": "http://10.39.13.80:8003/api/docs/openapi", "url": "http://10.39.13.80:8003/api/docs/openapi",
// "url": "http://we6f9c65.natappfree.cc/api/docs/openapi",
"module": "Admin" "module": "Admin"
} }

View File

@ -1,8 +1,6 @@
import { MyButtons } from '@/common';
import { Apis } from '@/gen/Apis'; import { Apis } from '@/gen/Apis';
import { import {
LogoutOutlined, LogoutOutlined,
MenuFoldOutlined,
UnlockOutlined, UnlockOutlined,
UserOutlined, UserOutlined,
} from '@ant-design/icons'; } from '@ant-design/icons';
@ -56,15 +54,6 @@ export default function AvatarProps({ user }: { user: any }) {
return ( return (
<> <>
<Space> <Space>
<MyButtons.Default
type="link"
icon={<MenuFoldOutlined />}
size="middle"
onClick={() => {
showDrawer();
}}
title="任务"
/>
<Dropdown menu={{ items }} placement="bottomRight"> <Dropdown menu={{ items }} placement="bottomRight">
<Space> <Space>
<Avatar <Avatar

View File

@ -58,6 +58,7 @@ export type MyBetaModalFormProps = {
// action: ActionType | undefined; // action: ActionType | undefined;
reload?: () => void; reload?: () => void;
item?: Record<string, any>; item?: Record<string, any>;
extra?: React.ReactNode;
}; };
export type MyProEnumItemProps = { export type MyProEnumItemProps = {

127
src/components/Address.tsx Normal file
View File

@ -0,0 +1,127 @@
import { rulesHelper } from '@/common';
import {
ProColumns,
ProFormCascader,
ProFormColumnsType,
ProFormText,
} from '@ant-design/pro-components';
import { DefaultOptionType } from 'antd/es/cascader';
import data from './city.json';
const request = async () => Promise.resolve(data as Record<string, any>[]);
type ReturnAddressType = ProColumns<Record<string, any>, 'text'>;
type ReturnType = ProFormColumnsType<any, 'text'>;
type PropsType = { required?: boolean } & ReturnType;
const filter = (inputValue: string, path: DefaultOptionType[]) =>
path.some(
(option) =>
(option.label as string).toLowerCase().indexOf(inputValue.toLowerCase()) >
-1,
);
export const Address = {
Cascader: (
props: { keys: string[]; max?: number } & PropsType,
): PropsType => {
const { required, ...rest } = props;
return {
valueType: 'cascader',
request,
transform: (value: string[]) => {
// console.log('transform', value);
let root = data as Record<string, any> | undefined;
return props.keys.reduce((accumulator, currentKey, index) => {
if (root) {
const node = root.find(
(item: { value: number | string }) =>
item.value === value?.[index],
);
if (node) {
accumulator[currentKey] = node.label;
root = node.children;
} else {
root = undefined;
}
}
accumulator[currentKey + '_id'] = value?.[index];
return accumulator;
}, {} as Record<string, string>);
},
formItemProps: {
...(required ? rulesHelper.array : {}),
},
fieldProps: {
showSearch: true,
changeOnSelect: true,
placeholder: '请选择 / 输入名称搜索',
fieldNames: {
label: 'label',
value: 'value',
children: 'children',
},
},
...rest,
};
},
};
export function FormAddress(props: any) {
let root = data as any;
return (
<>
<div
style={{
position: 'relative',
zIndex: 10,
}}
>
<ProFormCascader
name="city_ids"
fieldProps={{
options: root,
changeOnSelect: true,
showSearch: { filter },
onChange: (value: string, selectedOptions: { label: string }[]) => {
props?.form?.setFieldsValue({
province: selectedOptions?.[0]?.label || '',
city: selectedOptions?.[1]?.label || '',
area: selectedOptions?.[2]?.label || '',
});
},
}}
label="所在城市"
/>
</div>
<div
style={{
display: 'flex',
position: 'absolute',
top: 0,
left: 0,
zIndex: 1,
opacity: 0,
}}
>
<ProFormText name="province" />
<ProFormText name="city" />
<ProFormText name="area" />
</div>
</>
);
}
export const MyAddressColumns = {
Address({ ...rest }: ReturnAddressType): ReturnAddressType {
let root = data as any;
return {
title: '所在城市',
valueType: 'cascader',
...rest,
fieldProps: {
options: root,
changeOnSelect: true,
showSearch: { filter },
...rest?.fieldProps,
},
};
},
};

41
src/components/Select.tsx Normal file
View File

@ -0,0 +1,41 @@
import { rulesHelper } from '@/common';
import { Apis } from '@/gen/Apis';
import { ProColumns, ProFormColumnsType } from '@ant-design/pro-components';
type ReturnType = ProColumns<any, 'text'> & ProFormColumnsType<any, 'text'>;
type PropsType = { required?: boolean } & ReturnType;
export const SysSelects = {
Companies(props?: PropsType): ReturnType {
const {
title = '机构',
key = 'parent_id',
required = false,
hideInTable = true,
...rest
} = props ?? {};
return {
title: title,
key: key,
valueType: 'select',
hideInTable: hideInTable,
formItemProps: { ...(required ? rulesHelper.number : {}) },
fieldProps: {
showSearch: true,
fieldNames: {
label: 'label',
value: 'value',
},
},
request: async (params) =>
(
await Apis.Company.Companies.Select({
keywords: params?.KeyWords,
...params,
})
).data,
...rest,
};
},
};

222935
src/components/city.json Normal file

File diff suppressed because it is too large Load Diff

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

@ -1,4 +1,185 @@
declare namespace ApiTypes { declare namespace ApiTypes {
namespace Asset {
namespace AssetBuildings {
type List = {
"asset_projects_id"?: number; // 所属项目id,[ref:asset_projects]
"name"?: string; // 模糊搜索:名称
};
type Store = {
"asset_projects_id": number; // 所属项目id,[ref:asset_projects]
"name": string; // 楼栋名称
"alias_name"?: string; // 楼栋别名
};
type Update = {
"id": number; // id
"asset_projects_id": number; // 所属项目id,[ref:asset_projects]
"name": string; // 楼栋名称
"alias_name"?: string; // 楼栋别名
};
type Show = {
"id": number; // id
};
type Delete = {
"id": number; // id
};
}
namespace AssetHouses {
type List = {
"asset_projects_id"?: number; // 所属项目id,[ref:asset_projects]
"asset_buildings_id"?: number; // 所属楼栋id,[ref:asset_buildings]
"asset_units_id"?: number; // 所属单元id,[ref:asset_units]
"name"?: string; // 模糊搜索:名称
};
type Store = {
"asset_projects_id": number; // 所属项目id,[ref:asset_projects]
"asset_buildings_id": number; // 所属楼栋id,[ref:asset_buildings]
"asset_units_id": number; // 所属单元id,[ref:asset_units]
"name": string; // 房屋名称
"full_name": string; // 房屋全称
"floor"?: number; // 楼层
"built_area"?: number; // 建筑面积
"inside_area"?: number; // 套内面积
"chargeable_area"?: number; // 计费面积
"ownership_type"?: string; // 产权性质,[enum:AssetHousesOwnershipTypeEnum]
"ownership_term"?: string; // 产权年限
"orientation"?: string; // 朝向,[enum:AssetHousesOrientationEnum]
"usage"?: string; // 用途,[enum:AssetHousesUsageEnum]
"status"?: string; // 房屋状态,[enum:AssetHousesStatusEnum]
"room"?: number; // 房
"hall"?: number; // 厅
"kitchen"?: number; // 厨
"bathroom"?: number; // 卫
"balcony"?: number; // 阳台
};
type Update = {
"id": number; // id
"asset_projects_id": number; // 所属项目id,[ref:asset_projects]
"asset_buildings_id": number; // 所属楼栋id,[ref:asset_buildings]
"asset_units_id": number; // 所属单元id,[ref:asset_units]
"name": string; // 房屋名称
"floor"?: number; // 楼层
"built_area"?: number; // 建筑面积
"inside_area"?: number; // 套内面积
"chargeable_area"?: number; // 计费面积
"ownership_type"?: string; // 产权性质,[enum:AssetHousesOwnershipTypeEnum]
"ownership_term"?: string; // 产权年限
"orientation"?: string; // 朝向,[enum:AssetHousesOrientationEnum]
"usage"?: string; // 用途,[enum:AssetHousesUsageEnum]
"status"?: string; // 房屋状态,[enum:AssetHousesStatusEnum]
"room"?: number; // 房
"hall"?: number; // 厅
"kitchen"?: number; // 厨
"bathroom"?: number; // 卫
"balcony"?: number; // 阳台
};
type Show = {
"id": number; // id
};
type Delete = {
"id": number; // id
};
}
namespace AssetProjects {
type List = {
"name"?: string; // 模糊搜索:名称
};
type Store = {
"name": string; // 项目名称
"alias_name"?: string; // 项目别名
"code"?: string; // 项目编码
"companies_id": number; // 所属机构id,[ref:companies]
"province"?: string; // 省
"city"?: string; // 市
"area"?: string; // 区
"street"?: string; // 街道
"province_id"?: number; // 省ID[ref:cities]
"city_id"?: number; // 市ID[ref:cities]
"area_id"?: number; // 区ID[ref:cities]
"street_id"?: number; // 街道ID[ref:cities]
"address"?: string; // 地址
"longitude"?: string; // 经度
"latitude"?: string; // 纬度
"property_type"?: string; // 物业类型,[enum:AssetProjectsPropertyTypeEnum]
"status"?: string; // 状态,[enum:AssetProjectsStatusEnum]
"entrust_type"?: string; // 委托类型,[enum:AssetProjectsEntrustTypeEnum]
"charge"?: string; // 收费方式,[enum:AssetProjectsChargeEnum]
"takeover_date"?: Date; // 接管日期
"closure_date"?: Date; // 封园日期
};
type Update = {
"id": number; // id
"name": string; // 项目名称
"alias_name"?: string; // 项目别名
"code"?: string; // 项目编码
"companies_id": number; // 所属机构id,[ref:companies]
"province"?: string; // 省
"city"?: string; // 市
"area"?: string; // 区
"street"?: string; // 街道
"province_id"?: number; // 省ID[ref:cities]
"city_id"?: number; // 市ID[ref:cities]
"area_id"?: number; // 区ID[ref:cities]
"street_id"?: number; // 街道ID[ref:cities]
"address"?: string; // 地址
"longitude"?: string; // 经度
"latitude"?: string; // 纬度
"property_type"?: string; // 物业类型,[enum:AssetProjectsPropertyTypeEnum]
"status"?: string; // 状态,[enum:AssetProjectsStatusEnum]
"entrust_type"?: string; // 委托类型,[enum:AssetProjectsEntrustTypeEnum]
"charge"?: string; // 收费方式,[enum:AssetProjectsChargeEnum]
"takeover_date"?: Date; // 接管日期
"closure_date"?: Date; // 封园日期
};
type Show = {
"id": number; // id
};
type SoftDelete = {
"id": number; // id
};
type Restore = {
"id": number; // id
};
type Delete = {
"id": number; // id
};
}
namespace AssetUnits {
type List = {
"asset_projects_id"?: number; // 所属项目id,[ref:asset_projects]
"asset_buildings_id"?: number; // 所属楼栋id,[ref:asset_buildings]
"name"?: string; // 模糊搜索:名称
};
type Store = {
"asset_projects_id": number; // 所属项目id,[ref:asset_projects]
"asset_buildings_id": number; // 所属楼栋id,[ref:asset_buildings]
"name": string; // 单元名称
"alias_name"?: string; // 单元别名
"building_structure"?: string; // 建筑结构,[enum:AssetUnitsBuildingStructureEnum]
"building_type"?: string; // 建筑类型,[enum:AssetUnitsBuildingTypeEnum]
"elevator_count"?: number; // 电梯数量
"units_per_building"?: number; // 单元户数
"highest_floor"?: number; // 最高楼层
};
type Update = {
"id": number; // id
"asset_projects_id": number; // 所属项目id,[ref:asset_projects]
"asset_buildings_id": number; // 所属楼栋id,[ref:asset_buildings]
"name": string; // 单元名称
"alias_name"?: string; // 单元别名
"building_structure"?: string; // 建筑结构,[enum:AssetUnitsBuildingStructureEnum]
"building_type"?: string; // 建筑类型,[enum:AssetUnitsBuildingTypeEnum]
"elevator_count"?: number; // 电梯数量
"units_per_building"?: number; // 单元户数
"highest_floor"?: number; // 最高楼层
};
type Show = {
"id": number; // id
};
type Delete = {
"id": number; // id
};
}
}
namespace Common { namespace Common {
namespace Admins { namespace Admins {
type List = { type List = {
@ -41,6 +222,84 @@ declare namespace ApiTypes {
}; };
} }
} }
namespace Company {
namespace Companies {
type List = {
"name"?: string; // 模糊搜索:名称
"parent_id"?: number; // 父级ID
};
type Store = {
"name": string; // 组织名称
"short_name"?: string; // 组织简称
"business_license_number": string; // 营业执照号
"merchant_type"?: string; // 商户类型,[enum:CompaniesMerchantTypeEnum]
"contact_name": string; // 联系人姓名
"contact_phone": string; // 联系人手机
"contact_email"?: string; // 联系人邮箱
"contact_address"?: string; // 联系人地址
"province"?: string; // 省
"city"?: string; // 市
"area"?: string; // 区
"street"?: string; // 街道
"province_id"?: number; // 省ID[ref:cities]
"city_id"?: number; // 市ID[ref:cities]
"area_id"?: number; // 区ID[ref:cities]
"street_id"?: number; // 街道ID[ref:cities]
"address"?: string; // 地址
"business_license_image"?: string[]; // 营业执照图片
"_lft"?: number; //
"_rgt"?: number; //
"parent_id"?: number; //
};
type Update = {
"id": number; // id
"name": string; // 组织名称
"short_name"?: string; // 组织简称
"business_license_number": string; // 营业执照号
"merchant_type"?: string; // 商户类型,[enum:CompaniesMerchantTypeEnum]
"contact_name": string; // 联系人姓名
"contact_phone": string; // 联系人手机
"contact_email"?: string; // 联系人邮箱
"contact_address"?: string; // 联系人地址
"province"?: string; // 省
"city"?: string; // 市
"area"?: string; // 区
"street"?: string; // 街道
"province_id"?: number; // 省ID[ref:cities]
"city_id"?: number; // 市ID[ref:cities]
"area_id"?: number; // 区ID[ref:cities]
"street_id"?: number; // 街道ID[ref:cities]
"address"?: string; // 地址
"business_license_image"?: string[]; // 营业执照图片
"_lft"?: number; //
"_rgt"?: number; //
"parent_id"?: number; //
};
type Move = {
"id": number; // ID
"type": string; // 类型up 升级down 降级
};
type Show = {
"id": number; // id
};
type SoftDelete = {
"id": number; // id
};
type Restore = {
"id": number; // id
};
type Delete = {
"id": number; // id
};
type Select = {
"keywords"?: string; // 关键词
};
type SelectTree = {
"keywords"?: string; // -
"parent_id"?: number; // -
};
}
}
namespace Permission { namespace Permission {
namespace SysPermissions { namespace SysPermissions {
type List = { type List = {

View File

@ -2,6 +2,82 @@ import { MyResponseType } from '@/common';
import { request } from '@umijs/max'; import { request } from '@umijs/max';
export const Apis = { export const Apis = {
Asset: {
AssetBuildings: {
List(data?: ApiTypes.Asset.AssetBuildings.List): Promise<MyResponseType> {
return request('admin/asset/asset_buildings/list', { data });
},
Store(data: ApiTypes.Asset.AssetBuildings.Store): Promise<MyResponseType> {
return request('admin/asset/asset_buildings/store', { data });
},
Update(data: ApiTypes.Asset.AssetBuildings.Update): Promise<MyResponseType> {
return request('admin/asset/asset_buildings/update', { data });
},
Show(data: ApiTypes.Asset.AssetBuildings.Show): Promise<MyResponseType> {
return request('admin/asset/asset_buildings/show', { data });
},
Delete(data: ApiTypes.Asset.AssetBuildings.Delete): Promise<MyResponseType> {
return request('admin/asset/asset_buildings/delete', { data });
},
},
AssetHouses: {
List(data?: ApiTypes.Asset.AssetHouses.List): Promise<MyResponseType> {
return request('admin/asset/asset_houses/list', { data });
},
Store(data: ApiTypes.Asset.AssetHouses.Store): Promise<MyResponseType> {
return request('admin/asset/asset_houses/store', { data });
},
Update(data: ApiTypes.Asset.AssetHouses.Update): Promise<MyResponseType> {
return request('admin/asset/asset_houses/update', { data });
},
Show(data: ApiTypes.Asset.AssetHouses.Show): Promise<MyResponseType> {
return request('admin/asset/asset_houses/show', { data });
},
Delete(data: ApiTypes.Asset.AssetHouses.Delete): Promise<MyResponseType> {
return request('admin/asset/asset_houses/delete', { data });
},
},
AssetProjects: {
List(data?: ApiTypes.Asset.AssetProjects.List): Promise<MyResponseType> {
return request('admin/asset/asset_projects/list', { data });
},
Store(data: ApiTypes.Asset.AssetProjects.Store): Promise<MyResponseType> {
return request('admin/asset/asset_projects/store', { data });
},
Update(data: ApiTypes.Asset.AssetProjects.Update): Promise<MyResponseType> {
return request('admin/asset/asset_projects/update', { data });
},
Show(data: ApiTypes.Asset.AssetProjects.Show): Promise<MyResponseType> {
return request('admin/asset/asset_projects/show', { data });
},
SoftDelete(data: ApiTypes.Asset.AssetProjects.SoftDelete): Promise<MyResponseType> {
return request('admin/asset/asset_projects/soft_delete', { data });
},
Restore(data: ApiTypes.Asset.AssetProjects.Restore): Promise<MyResponseType> {
return request('admin/asset/asset_projects/restore', { data });
},
Delete(data: ApiTypes.Asset.AssetProjects.Delete): Promise<MyResponseType> {
return request('admin/asset/asset_projects/delete', { data });
},
},
AssetUnits: {
List(data?: ApiTypes.Asset.AssetUnits.List): Promise<MyResponseType> {
return request('admin/asset/asset_units/list', { data });
},
Store(data: ApiTypes.Asset.AssetUnits.Store): Promise<MyResponseType> {
return request('admin/asset/asset_units/store', { data });
},
Update(data: ApiTypes.Asset.AssetUnits.Update): Promise<MyResponseType> {
return request('admin/asset/asset_units/update', { data });
},
Show(data: ApiTypes.Asset.AssetUnits.Show): Promise<MyResponseType> {
return request('admin/asset/asset_units/show', { data });
},
Delete(data: ApiTypes.Asset.AssetUnits.Delete): Promise<MyResponseType> {
return request('admin/asset/asset_units/delete', { data });
},
},
},
Common: { Common: {
Admins: { Admins: {
List(data?: ApiTypes.Common.Admins.List): Promise<MyResponseType> { List(data?: ApiTypes.Common.Admins.List): Promise<MyResponseType> {
@ -44,6 +120,40 @@ export const Apis = {
}, },
}, },
}, },
Company: {
Companies: {
List(data?: ApiTypes.Company.Companies.List): Promise<MyResponseType> {
return request('admin/company/companies/list', { data });
},
Store(data: ApiTypes.Company.Companies.Store): Promise<MyResponseType> {
return request('admin/company/companies/store', { data });
},
Update(data: ApiTypes.Company.Companies.Update): Promise<MyResponseType> {
return request('admin/company/companies/update', { data });
},
Move(data: ApiTypes.Company.Companies.Move): Promise<MyResponseType> {
return request('admin/company/companies/move', { data });
},
Show(data: ApiTypes.Company.Companies.Show): Promise<MyResponseType> {
return request('admin/company/companies/show', { data });
},
SoftDelete(data: ApiTypes.Company.Companies.SoftDelete): Promise<MyResponseType> {
return request('admin/company/companies/soft_delete', { data });
},
Restore(data: ApiTypes.Company.Companies.Restore): Promise<MyResponseType> {
return request('admin/company/companies/restore', { data });
},
Delete(data: ApiTypes.Company.Companies.Delete): Promise<MyResponseType> {
return request('admin/company/companies/delete', { data });
},
Select(data?: ApiTypes.Company.Companies.Select): Promise<MyResponseType> {
return request('admin/company/companies/select', { data });
},
SelectTree(data?: ApiTypes.Company.Companies.SelectTree): Promise<MyResponseType> {
return request('admin/company/companies/select_tree', { data });
},
},
},
Permission: { Permission: {
SysPermissions: { SysPermissions: {
List(data: ApiTypes.Permission.SysPermissions.List): Promise<MyResponseType> { List(data: ApiTypes.Permission.SysPermissions.List): Promise<MyResponseType> {

View File

@ -1,21 +1,48 @@
// AssetHousesOrientationEnum // AssetHousesOrientationEnum
export const AssetHousesOrientationEnum= { export const AssetHousesOrientationEnum= {
'Value': {"text":"Label","color":"#ff0000","value":"Value"}, 'East': {"text":"东","color":"#007bff","value":"East"},
'South': {"text":"南","color":"#28a745","value":"South"},
'West': {"text":"西","color":"#ffc107","value":"West"},
'North': {"text":"北","color":"#dc3545","value":"North"},
'Southeast': {"text":"东南","color":"#20c997","value":"Southeast"},
'Northeast': {"text":"东北","color":"#6f42c1","value":"Northeast"},
'Southwest': {"text":"西南","color":"#fd7e14","value":"Southwest"},
'Northwest': {"text":"西北","color":"#17a2b8","value":"Northwest"},
'EastWest': {"text":"东西","color":"#6610f2","value":"EastWest"},
'SouthNorth': {"text":"南北","color":"#e83e8c","value":"SouthNorth"},
}; };
// AssetHousesOwnershipTypeEnum // AssetHousesOwnershipTypeEnum
export const AssetHousesOwnershipTypeEnum= { export const AssetHousesOwnershipTypeEnum= {
'Value': {"text":"Label","color":"#ff0000","value":"Value"}, 'CommodityHousing': {"text":"商品房","color":"#007bff","value":"CommodityHousing"},
'FundedHousing': {"text":"集资房","color":"#28a745","value":"FundedHousing"},
'MilitaryHousing': {"text":"军产房","color":"#17a2b8","value":"MilitaryHousing"},
'AffordableHousing': {"text":"保障房","color":"#ffc107","value":"AffordableHousing"},
'RuralHousing': {"text":"农民房","color":"#6f42c1","value":"RuralHousing"},
'CommercialOffice': {"text":"商业写字楼","color":"#fd7e14","value":"CommercialOffice"},
'CommercialComplex': {"text":"商业综合体","color":"#dc3545","value":"CommercialComplex"},
'ResettlementHousing': {"text":"回迁房","color":"#20c997","value":"ResettlementHousing"},
}; };
// AssetHousesStatusEnum // AssetHousesStatusEnum
export const AssetHousesStatusEnum= { export const AssetHousesStatusEnum= {
'Value': {"text":"Label","color":"#ff0000","value":"Value"}, 'Unsold': {"text":"未售","color":"#6c757d","value":"Unsold"},
'SoldNotDelivered': {"text":"已售未交房","color":"#ffc107","value":"SoldNotDelivered"},
'SelfOccupied': {"text":"自住","color":"#28a745","value":"SelfOccupied"},
'Rented': {"text":"出租","color":"#007bff","value":"Rented"},
'Vacant': {"text":"空置","color":"#dc3545","value":"Vacant"},
}; };
// AssetHousesUsageEnum // AssetHousesUsageEnum
export const AssetHousesUsageEnum= { export const AssetHousesUsageEnum= {
'Value': {"text":"Label","color":"#ff0000","value":"Value"}, 'Residence': {"text":"住宅","color":"#007bff","value":"Residence"},
'Apartment': {"text":"公寓","color":"#28a745","value":"Apartment"},
'Villa': {"text":"别墅","color":"#17a2b8","value":"Villa"},
'Shop': {"text":"商铺","color":"#ffc107","value":"Shop"},
'ParkingSpace': {"text":"车位","color":"#6c757d","value":"ParkingSpace"},
'Office': {"text":"写字楼","color":"#6610f2","value":"Office"},
'Clubhouse': {"text":"会所","color":"#fd7e14","value":"Clubhouse"},
'PropertyRoom': {"text":"物业用房","color":"#dc3545","value":"PropertyRoom"},
}; };
// AssetProjectsChargeEnum // AssetProjectsChargeEnum
@ -67,6 +94,12 @@ export const AssetUnitsBuildingTypeEnum= {
'Tower': {"text":"塔楼","color":"#ffc107","value":"Tower"}, 'Tower': {"text":"塔楼","color":"#ffc107","value":"Tower"},
}; };
// CompaniesMerchantTypeEnum
export const CompaniesMerchantTypeEnum= {
'PropertyManagement': {"text":"物业公司","color":"#007bff","value":"PropertyManagement"},
'ServiceProvider': {"text":"服务商","color":"#28a745","value":"ServiceProvider"},
};
// SysModuleEnum // SysModuleEnum
export const SysModuleEnum= { export const SysModuleEnum= {
'Admin': {"text":"管理员","color":"#cf1322","value":"Admin"}, 'Admin': {"text":"管理员","color":"#cf1322","value":"Admin"},

View File

@ -0,0 +1,43 @@
import { MyPageContainer } from '@/common';
import { Apis } from '@/gen/Apis';
import { ProCard } from '@ant-design/pro-components';
import { useParams } from '@umijs/max';
import { Tabs } from 'antd';
import { useEffect, useState } from 'react';
import MyAssetBuildings from './components/AssetBuildings';
import MyInfo from './components/info';
import Update from './modals/Update';
export default function Show({ title = '项目详情' }) {
const { id } = useParams<{ id: string }>();
const [data, setShow] = useState<any>({});
const loadShow = () => {
let paramsId: any = { id: id ?? 0 };
Apis.Asset.AssetProjects.Show(paramsId).then((res) => {
setShow(res?.data);
});
};
useEffect(() => {
loadShow();
}, [id]);
let items = [
{
label: '楼栋管理',
key: 'asset_buildings',
closable: false,
children: <MyAssetBuildings item={data} />,
},
];
return (
<MyPageContainer title={title}>
<MyInfo
item={data}
extra={<Update item={data} reload={() => loadShow()} title="项目" />}
/>
<ProCard>
<Tabs type="card" items={data?.id ? items : []} />
</ProCard>
</MyPageContainer>
);
}

View File

@ -0,0 +1,220 @@
import { MyBetaModalFormProps, MyColumns, MyProTableProps } from '@/common';
import { Apis } from '@/gen/Apis';
import {
AssetHousesOrientationEnum,
AssetHousesOwnershipTypeEnum,
AssetHousesStatusEnum,
AssetHousesUsageEnum,
} from '@/gen/Enums';
import { ProCard, ProTable } from '@ant-design/pro-components';
import { Space } from 'antd';
import { useRef, useState } from 'react';
import BuildingsCreate from '../modals/AssetBuildingsCreate';
import AssetHousesCreate from '../modals/AssetHousesCreate';
import AssetUnitsCreate from '../modals/AssetUnitsCreate';
export default function AssetBuildings(props: MyBetaModalFormProps) {
const actionBuildingsRef: any = useRef();
const actionUnitsRef: any = useRef();
const actionHousesRef: any = useRef();
const [selectKey, setSelectkey] = useState<any>({});
const [selectKeyUnits, setSelectKeyUnits] = useState<any>({});
return (
<ProCard
extra={
<Space>
<BuildingsCreate
key="BuildingsCreate"
item={props?.item}
reload={() => actionBuildingsRef?.current?.reload()}
title="楼栋"
/>
<AssetUnitsCreate
key="UnitsCreate"
item={{
...props?.item,
asset_buildings_id: selectKey?.id || undefined,
}}
reload={() => actionUnitsRef?.current?.reload()}
title="单元"
/>
<AssetHousesCreate
key="HousesCreate"
item={{
...props?.item,
asset_buildings_id: selectKey?.id || undefined,
asset_units_id: selectKeyUnits?.id || undefined,
}}
reload={() => actionHousesRef?.current?.reload()}
title="房源"
/>
</Space>
}
>
<Space align="start" size="large">
<ProTable
{...MyProTableProps.props}
search={false}
actionRef={actionBuildingsRef}
rowClassName={(record: any) => {
console.log(selectKey?.id, 'key', record?.id);
return selectKey?.id === record?.id ? 'ant-table-row-selected' : '';
}}
onRow={(record: any) => {
return {
onClick: () => {
setSelectkey(record);
setSelectKeyUnits({});
actionUnitsRef?.current?.reload();
actionHousesRef?.current?.reload();
},
style: {
cursor: 'pointer',
},
};
}}
request={async (params, sort) =>
MyProTableProps.request(
{ ...params, asset_projects_id: props?.item?.id },
sort,
Apis.Asset.AssetBuildings.List,
)
}
options={false}
columns={[
MyColumns.ID(),
{
title: '楼栋',
width: '250px',
dataIndex: 'name',
},
]}
/>
<ProTable
{...MyProTableProps.props}
search={false}
actionRef={actionUnitsRef}
request={async (params, sort) =>
MyProTableProps.request(
{
...params,
asset_projects_id: props?.item?.id,
asset_buildings_id: selectKey?.id,
},
sort,
Apis.Asset.AssetUnits.List,
)
}
rowClassName={(record: any) => {
return selectKeyUnits?.id === record?.id
? 'ant-table-row-selected'
: '';
}}
onRow={(record: any) => {
return {
onClick: () => {
setSelectKeyUnits(record);
actionHousesRef?.current?.reload();
},
style: {
cursor: 'pointer',
},
};
}}
options={false}
columns={[
MyColumns.ID(),
{
title: '单元',
width: '250px',
dataIndex: 'name',
},
]}
/>
<ProTable
{...MyProTableProps.props}
search={false}
actionRef={actionHousesRef}
request={async (params, sort) =>
MyProTableProps.request(
{
...params,
asset_projects_id: props?.item?.id,
asset_buildings_id: selectKey?.id,
asset_units_id: selectKeyUnits?.id,
},
sort,
Apis.Asset.AssetHouses.List,
)
}
options={false}
columns={[
MyColumns.ID(),
MyColumns.EnumTag({
title: '用途',
dataIndex: 'usage',
valueEnum: AssetHousesUsageEnum,
}),
{
title: '房号',
dataIndex: 'name',
},
MyColumns.EnumTag({
title: '产权性质',
dataIndex: 'ownership_type',
valueEnum: AssetHousesOwnershipTypeEnum,
}),
MyColumns.EnumTag({
title: '朝向',
dataIndex: 'orientation',
valueEnum: AssetHousesOrientationEnum,
}),
MyColumns.EnumTag({
title: '房屋状态',
dataIndex: 'status',
valueEnum: AssetHousesStatusEnum,
}),
{
title: '房',
dataIndex: 'room',
},
{
title: '厅',
dataIndex: 'hall',
},
{
title: '厨',
dataIndex: 'kitchen',
},
{
title: '卫',
dataIndex: 'bathroom',
},
{
title: '阳台',
dataIndex: 'balcony',
},
{
title: '产权年限',
dataIndex: 'ownership_term',
},
{
title: '建筑面积',
dataIndex: 'built_area',
},
{
title: '套内面积',
dataIndex: 'inside_area',
},
{
title: '计费面积',
dataIndex: 'chargeable_area',
},
]}
/>
</Space>
</ProCard>
);
}

View File

@ -0,0 +1,67 @@
import { MyBetaModalFormProps, renderTextHelper } from '@/common';
import {
AssetProjectsChargeEnum,
AssetProjectsEntrustTypeEnum,
AssetProjectsPropertyTypeEnum,
AssetProjectsStatusEnum,
} from '@/gen/Enums';
import { ProCard, ProDescriptions } from '@ant-design/pro-components';
export default function info(props: MyBetaModalFormProps) {
return (
<ProCard extra={props.extra}>
<ProDescriptions bordered>
<ProDescriptions.Item label="项目名称">
{props?.item?.name}
</ProDescriptions.Item>
<ProDescriptions.Item label="项目别名">
{props?.item?.alias_name}
</ProDescriptions.Item>
<ProDescriptions.Item label="项目编码">
{props?.item?.code}
</ProDescriptions.Item>
<ProDescriptions.Item label="状态">
<renderTextHelper.Tag
Enums={AssetProjectsStatusEnum}
value={props?.item?.status}
key="status"
/>
</ProDescriptions.Item>
<ProDescriptions.Item label="物业类型">
<renderTextHelper.Tag
Enums={AssetProjectsPropertyTypeEnum}
value={props?.item?.property_type}
key="property_type"
/>
</ProDescriptions.Item>
<ProDescriptions.Item label="收费方式">
<renderTextHelper.Tag
Enums={AssetProjectsChargeEnum}
value={props?.item?.charge}
key="charge"
/>
</ProDescriptions.Item>
<ProDescriptions.Item label="委托类型">
<renderTextHelper.Tag
Enums={AssetProjectsEntrustTypeEnum}
value={props?.item?.entrust_type}
key="entrust_type"
/>
</ProDescriptions.Item>
<ProDescriptions.Item label="接管日期">
{props?.item?.takeover_date}
</ProDescriptions.Item>
<ProDescriptions.Item label="封园日期">
{props?.item?.closure_date}
</ProDescriptions.Item>
<ProDescriptions.Item label="地址">
{props?.item?.province || ''}
{props?.item?.city || ''}
{props?.item?.district || ''}
{props?.item?.address || ''}
</ProDescriptions.Item>
</ProDescriptions>
</ProCard>
);
}

View File

@ -0,0 +1,106 @@
import {
MyButtons,
MyColumns,
MyPageContainer,
MyProTableProps,
} from '@/common';
import { Apis } from '@/gen/Apis';
import {
AssetProjectsChargeEnum,
AssetProjectsEntrustTypeEnum,
AssetProjectsPropertyTypeEnum,
AssetProjectsStatusEnum,
} from '@/gen/Enums';
import { ProTable } from '@ant-design/pro-components';
import { Space } from 'antd';
import { useNavigate } from 'react-router-dom';
import Create from './modals/Create';
export default function Index({ title = '项目管理' }) {
const navigate = useNavigate();
return (
<MyPageContainer title={title}>
<ProTable
{...MyProTableProps.props}
search={false}
request={async (params, sort) =>
MyProTableProps.request(params, sort, Apis.Asset.AssetProjects.List)
}
toolBarRender={(action) => [
<Create key="Create" reload={action?.reload} title={title} />,
]}
columns={[
MyColumns.ID(),
{
title: '项目名称',
dataIndex: 'name',
},
{
title: '项目别名',
dataIndex: 'alias_name',
},
{
title: '项目编码',
dataIndex: 'code',
},
MyColumns.EnumTag({
title: '类型',
dataIndex: 'property_type',
valueEnum: AssetProjectsPropertyTypeEnum,
}),
MyColumns.EnumTag({
title: '状态',
dataIndex: 'status',
valueEnum: AssetProjectsStatusEnum,
}),
MyColumns.EnumTag({
title: '收费方式',
dataIndex: 'charge',
valueEnum: AssetProjectsChargeEnum,
}),
MyColumns.EnumTag({
title: '委托类型',
dataIndex: 'entrust_type',
valueEnum: AssetProjectsEntrustTypeEnum,
}),
{
title: '地址',
render: (_, i: any) => {
return `${i?.province || ''}${i?.city || ''}${i?.district || ''}${
i?.address || ''
}`;
},
},
{
title: '接管日期',
dataIndex: 'takeover_date',
},
{
title: '封园日期',
dataIndex: 'closure_date',
},
MyColumns.CreatedAt(),
MyColumns.Option({
render: (_, item: any, index, action) => (
<Space key={index}>
<MyButtons.View
title="详情"
onClick={() => {
navigate(`/asset/asset_projects/${item.id}`);
}}
/>
<MyButtons.Delete
onConfirm={() =>
Apis.Common.Admins.Delete({ id: item.id }).then(() =>
action?.reload(),
)
}
/>
</Space>
),
}),
]}
/>
</MyPageContainer>
);
}

View File

@ -0,0 +1,47 @@
import {
MyBetaModalFormProps,
MyButtons,
MyModalFormProps,
rulesHelper,
} from '@/common';
import { Apis } from '@/gen/Apis';
import { BetaSchemaForm } from '@ant-design/pro-components';
import { message } from 'antd';
export default function Create(props: MyBetaModalFormProps) {
return (
<BetaSchemaForm<ApiTypes.Asset.AssetBuildings.Store>
{...MyModalFormProps.props}
title={`添加${props.title}`}
wrapperCol={{ span: 24 }}
width="500px"
trigger={<MyButtons.Create title={`添加${props.title}`} />}
onFinish={async (values) =>
Apis.Asset.AssetBuildings.Store({
...values,
asset_projects_id: props?.item?.id,
})
.then(() => {
props.reload?.();
message.success(props.title + '成功');
return true;
})
.catch(() => false)
}
columns={[
{
key: 'name',
title: '楼栋名称',
colProps: { span: 24 },
formItemProps: { ...rulesHelper.text },
},
{
key: 'alias_name',
title: '楼栋别名',
colProps: { span: 24 },
},
]}
/>
);
}

View File

@ -0,0 +1,186 @@
import {
MyBetaModalFormProps,
MyButtons,
MyFormItems,
MyModalFormProps,
rulesHelper,
} from '@/common';
import { Apis } from '@/gen/Apis';
import {
AssetHousesOrientationEnum,
AssetHousesOwnershipTypeEnum,
AssetHousesStatusEnum,
AssetHousesUsageEnum,
} from '@/gen/Enums';
import { BetaSchemaForm } from '@ant-design/pro-components';
import { message } from 'antd';
export default function Create(props: MyBetaModalFormProps) {
console.log(props?.item, 'item');
return (
<BetaSchemaForm<ApiTypes.Asset.AssetHouses.Store>
{...MyModalFormProps.props}
title={`添加${props.title}`}
wrapperCol={{ span: 24 }}
width="800px"
trigger={
<MyButtons.Create
title={`添加${props.title}`}
disabled={
!(props?.item?.asset_units_id && props?.item?.asset_buildings_id)
}
/>
}
onFinish={async (values) =>
Apis.Asset.AssetHouses.Store({
...values,
asset_projects_id: props?.item?.id,
asset_buildings_id: props?.item?.asset_buildings_id,
asset_units_id: props?.item?.asset_units_id,
})
.then(() => {
props.reload?.();
message.success(props.title + '成功');
return true;
})
.catch(() => false)
}
columns={[
{
key: 'name',
title: '房号',
colProps: { span: 12 },
formItemProps: { ...rulesHelper.text },
},
{
key: 'full_name',
title: '房屋全称',
colProps: { span: 12 },
},
MyFormItems.EnumRadio({
key: 'ownership_type',
title: '产权性质',
colProps: { span: 24 },
valueEnum: AssetHousesOwnershipTypeEnum,
required: true,
}),
MyFormItems.EnumRadio({
key: 'orientation',
title: '朝向',
colProps: { span: 24 },
valueEnum: AssetHousesOrientationEnum,
required: true,
}),
MyFormItems.EnumRadio({
key: 'usage',
title: '用途',
colProps: { span: 24 },
valueEnum: AssetHousesUsageEnum,
required: true,
}),
MyFormItems.EnumRadio({
key: 'status',
title: '房屋状态',
colProps: { span: 24 },
valueEnum: AssetHousesStatusEnum,
required: true,
}),
{
key: 'built_area',
title: '建筑面积',
valueType: 'digit',
fieldProps: {
addonAfter: '㎡',
},
colProps: { span: 8 },
},
{
key: 'inside_area',
title: '套内面积',
valueType: 'digit',
fieldProps: {
addonAfter: '㎡',
},
colProps: { span: 8 },
},
{
key: 'chargeable_area',
title: '计费面积',
valueType: 'digit',
fieldProps: {
addonAfter: '㎡',
},
colProps: { span: 8 },
},
{
key: 'floor',
title: '楼层',
valueType: 'digit',
fieldProps: {
addonAfter: '楼',
},
colProps: { span: 8 },
},
{
key: 'ownership_term',
title: '产权年限',
fieldProps: {
addonAfter: '年',
},
colProps: { span: 8 },
},
{
valueType: 'group',
columns: [
{
key: 'room',
title: '房',
valueType: 'digit',
fieldProps: {
addonAfter: '房',
},
colProps: { span: 4 },
},
{
key: 'hall',
title: '厅',
valueType: 'digit',
fieldProps: {
addonAfter: '厅',
},
colProps: { span: 4 },
},
{
key: 'kitchen',
title: '厨',
valueType: 'digit',
fieldProps: {
addonAfter: '厨',
},
colProps: { span: 4 },
},
{
key: 'bathroom',
title: '卫',
valueType: 'digit',
fieldProps: {
addonAfter: '卫',
},
colProps: { span: 4 },
},
{
key: 'balcony',
title: '阳台',
valueType: 'digit',
fieldProps: {
addonAfter: '阳台',
},
colProps: { span: 4 },
},
],
},
]}
/>
);
}

View File

@ -0,0 +1,86 @@
import {
MyBetaModalFormProps,
MyButtons,
MyFormItems,
MyModalFormProps,
rulesHelper,
} from '@/common';
import { Apis } from '@/gen/Apis';
import {
AssetUnitsBuildingStructureEnum,
AssetUnitsBuildingTypeEnum,
} from '@/gen/Enums';
import { BetaSchemaForm } from '@ant-design/pro-components';
import { message } from 'antd';
export default function Create(props: MyBetaModalFormProps) {
return (
<BetaSchemaForm<ApiTypes.Asset.AssetUnits.Store>
{...MyModalFormProps.props}
title={`添加${props.title}`}
wrapperCol={{ span: 24 }}
width="700px"
trigger={
<MyButtons.Create
title={`添加${props.title}`}
disabled={!props?.item?.asset_buildings_id}
/>
}
onFinish={async (values) =>
Apis.Asset.AssetUnits.Store({
...values,
asset_projects_id: props?.item?.id,
asset_buildings_id: props?.item?.asset_buildings_id,
})
.then(() => {
props.reload?.();
message.success(props.title + '成功');
return true;
})
.catch(() => false)
}
columns={[
{
key: 'name',
title: '单元名称',
colProps: { span: 12 },
formItemProps: { ...rulesHelper.text },
},
{
key: 'alias_name',
title: '单元别名',
colProps: { span: 12 },
},
MyFormItems.EnumRadio({
key: 'building_structure',
title: '建筑结构',
colProps: { span: 12 },
valueEnum: AssetUnitsBuildingStructureEnum,
required: true,
}),
MyFormItems.EnumRadio({
key: 'building_type',
title: '建筑类型',
colProps: { span: 12 },
valueEnum: AssetUnitsBuildingTypeEnum,
required: true,
}),
{
key: 'elevator_count',
title: '电梯数量',
colProps: { span: 12 },
},
{
key: 'units_per_building',
title: '单元户数',
colProps: { span: 12 },
},
{
key: 'highest_floor',
title: '最高楼层',
colProps: { span: 12 },
},
]}
/>
);
}

View File

@ -0,0 +1,138 @@
import {
MyBetaModalFormProps,
MyButtons,
MyFormItems,
MyModalFormProps,
rulesHelper,
} from '@/common';
import { Address } from '@/components/Address';
import { SysSelects } from '@/components/Select';
import { Apis } from '@/gen/Apis';
import {
AssetProjectsChargeEnum,
AssetProjectsEntrustTypeEnum,
AssetProjectsPropertyTypeEnum,
AssetProjectsStatusEnum,
} from '@/gen/Enums';
import { BetaSchemaForm } from '@ant-design/pro-components';
import { message } from 'antd';
export default function Create(props: MyBetaModalFormProps) {
return (
<BetaSchemaForm<ApiTypes.Asset.AssetProjects.Store>
{...MyModalFormProps.props}
title={`添加${props.title}`}
wrapperCol={{ span: 24 }}
width="800px"
trigger={<MyButtons.Create title={`添加${props.title}`} />}
onFinish={async (values) =>
Apis.Asset.AssetProjects.Store(values)
.then(() => {
props.reload?.();
message.success(props.title + '成功');
return true;
})
.catch(() => false)
}
columns={[
SysSelects?.Companies({
key: 'companies_id',
title: '所属机构',
colProps: { span: 24 },
formItemProps: { ...rulesHelper.number },
}),
{
key: 'name',
title: '项目名称',
colProps: { span: 8 },
formItemProps: { ...rulesHelper.text },
},
{
key: 'alias_name',
title: '项目别名',
colProps: { span: 8 },
},
{
key: 'code',
title: '项目编码',
colProps: { span: 8 },
formItemProps: { ...rulesHelper.text },
},
MyFormItems.EnumRadio({
key: 'property_type',
title: '物业类型',
colProps: { span: 24 },
valueEnum: AssetProjectsPropertyTypeEnum,
required: true,
}),
MyFormItems.EnumRadio({
key: 'status',
title: '状态',
colProps: { span: 12 },
valueEnum: AssetProjectsStatusEnum,
required: true,
}),
MyFormItems.EnumRadio({
key: 'charge',
title: '收费方式',
colProps: { span: 12 },
valueEnum: AssetProjectsChargeEnum,
required: true,
}),
MyFormItems.EnumRadio({
key: 'entrust_type',
title: '委托类型',
colProps: { span: 24 },
valueEnum: AssetProjectsEntrustTypeEnum,
required: true,
}),
Address.Cascader({
key: 'casacader',
title: '选择地址',
colProps: { span: 24 },
keys: ['province', 'city', 'area', 'street'],
required: true,
}),
{
key: 'address',
title: '详细地址',
colProps: { span: 24 },
},
{
key: 'longitude',
title: '经度',
colProps: { span: 6 },
},
{
key: 'latitude',
title: '纬度',
colProps: { span: 6 },
},
{
key: 'takeover_date',
title: '接管日期',
valueType: 'date',
fieldProps: {
style: {
width: '100%',
},
},
colProps: { span: 6 },
},
{
key: 'closure_date',
title: '封园日期',
valueType: 'date',
fieldProps: {
style: {
width: '100%',
},
},
colProps: { span: 6 },
},
]}
/>
);
}

View File

@ -0,0 +1,139 @@
import {
MyBetaModalFormProps,
MyButtons,
MyFormItems,
MyModalFormProps,
rulesHelper,
} from '@/common';
import { Address } from '@/components/Address';
import { SysSelects } from '@/components/Select';
import { Apis } from '@/gen/Apis';
import {
AssetProjectsChargeEnum,
AssetProjectsEntrustTypeEnum,
AssetProjectsPropertyTypeEnum,
AssetProjectsStatusEnum,
} from '@/gen/Enums';
import { BetaSchemaForm } from '@ant-design/pro-components';
import { message } from 'antd';
export default function Update(props: MyBetaModalFormProps) {
return (
<BetaSchemaForm<ApiTypes.Asset.AssetProjects.Update>
{...MyModalFormProps.props}
title={`编辑${props.title}`}
trigger={<MyButtons.Default title="编辑" type="primary" size="middle" />}
wrapperCol={{ span: 24 }}
width="800px"
request={() =>
Promise.resolve({
...props.item,
casacader: [
props.item?.province_id || '',
props.item?.city_id || '',
props.item?.area_id || '',
props.item?.street_id || '',
],
})
}
onFinish={async (values) =>
Apis.Asset.AssetProjects.Update({ ...values, id: props.item?.id ?? 0 })
.then(() => {
props.reload?.();
message.success(props.title + '成功');
return true;
})
.catch(() => false)
}
columns={[
SysSelects?.Companies({
key: 'companies_id',
title: '所属机构',
colProps: { span: 24 },
formItemProps: { ...rulesHelper.number },
}),
{
key: 'name',
title: '项目名称',
colProps: { span: 8 },
formItemProps: { ...rulesHelper.text },
},
{
key: 'alias_name',
title: '项目别名',
colProps: { span: 8 },
},
{
key: 'code',
title: '项目编码',
colProps: { span: 8 },
formItemProps: { ...rulesHelper.text },
},
MyFormItems.EnumRadio({
key: 'property_type',
title: '物业类型',
colProps: { span: 24 },
valueEnum: AssetProjectsPropertyTypeEnum,
required: true,
}),
MyFormItems.EnumRadio({
key: 'status',
title: '状态',
colProps: { span: 12 },
valueEnum: AssetProjectsStatusEnum,
required: true,
}),
MyFormItems.EnumRadio({
key: 'charge',
title: '收费方式',
colProps: { span: 12 },
valueEnum: AssetProjectsChargeEnum,
required: true,
}),
MyFormItems.EnumRadio({
key: 'entrust_type',
title: '委托类型',
colProps: { span: 24 },
valueEnum: AssetProjectsEntrustTypeEnum,
required: true,
}),
Address.Cascader({
key: 'casacader',
title: '选择地址',
colProps: { span: 24 },
keys: ['province', 'city', 'area', 'street'],
required: true,
}),
{
key: 'address',
title: '详细地址',
colProps: { span: 24 },
},
{
key: 'longitude',
title: '经度',
colProps: { span: 6 },
},
{
key: 'latitude',
title: '纬度',
colProps: { span: 6 },
},
{
key: 'takeover_date',
title: '接管日期',
valueType: 'date',
colProps: { span: 6 },
},
{
key: 'closure_date',
title: '封园日期',
valueType: 'date',
colProps: { span: 6 },
},
]}
/>
);
}

View File

@ -0,0 +1,77 @@
import {
MyButtons,
MyColumns,
MyPageContainer,
MyProTableProps,
} from '@/common';
import { Apis } from '@/gen/Apis';
import { CompaniesMerchantTypeEnum } from '@/gen/Enums';
import { ProTable } from '@ant-design/pro-components';
import { Space } from 'antd';
import Create from './modals/Create';
import Update from './modals/Update';
export default function Index({ title = '机构管理' }) {
return (
<MyPageContainer title={title}>
<ProTable
{...MyProTableProps.props}
search={false}
request={async (params, sort) =>
MyProTableProps.request(params, sort, Apis.Company.Companies.List)
}
toolBarRender={(action) => [
<Create key="Create" reload={action?.reload} title={title} />,
]}
columns={[
MyColumns.ID(),
{
title: '组织名称',
dataIndex: 'name',
},
{
title: '组织简称',
dataIndex: 'short_name',
},
MyColumns.EnumTag({
title: '类型',
dataIndex: 'merchant_type',
valueEnum: CompaniesMerchantTypeEnum,
}),
{
title: '营业执照号',
dataIndex: 'business_license_number',
},
{
title: '联系人',
dataIndex: 'contact_name',
},
{
title: '手机号',
dataIndex: 'contact_phone',
},
{
title: '联系人邮箱',
dataIndex: 'contact_email',
},
MyColumns.UpdatedAt(),
MyColumns.CreatedAt(),
MyColumns.Option({
render: (_, item: any, index, action) => (
<Space key={index}>
<Update item={item} reload={action?.reload} title={title} />
<MyButtons.Delete
onConfirm={() =>
Apis.Common.Admins.Delete({ id: item.id }).then(() =>
action?.reload(),
)
}
/>
</Space>
),
}),
]}
/>
</MyPageContainer>
);
}

View File

@ -0,0 +1,104 @@
import {
MyBetaModalFormProps,
MyButtons,
MyFormItems,
MyModalFormProps,
rulesHelper,
} from '@/common';
import { Address } from '@/components/Address';
import { SysSelects } from '@/components/Select';
import { Apis } from '@/gen/Apis';
import { CompaniesMerchantTypeEnum } from '@/gen/Enums';
import { BetaSchemaForm } from '@ant-design/pro-components';
import { message } from 'antd';
export default function Create(props: MyBetaModalFormProps) {
return (
<BetaSchemaForm<ApiTypes.Company.Companies.Store>
{...MyModalFormProps.props}
title={`添加${props.title}`}
wrapperCol={{ span: 24 }}
width="800px"
trigger={<MyButtons.Create title={`添加${props.title}`} />}
onFinish={async (values) =>
Apis.Company.Companies.Store(values)
.then(() => {
props.reload?.();
message.success(props.title + '成功');
return true;
})
.catch(() => false)
}
columns={[
SysSelects?.Companies({
key: 'parent_id',
title: '上级组织',
colProps: { span: 24 },
}),
{
key: 'name',
title: '组织名称',
colProps: { span: 8 },
formItemProps: { ...rulesHelper.text },
},
{
key: 'short_name',
title: '组织简称',
colProps: { span: 8 },
},
{
key: 'business_license_number',
title: '营业执照号',
colProps: { span: 8 },
formItemProps: { ...rulesHelper.text },
},
{
key: 'contact_name',
title: '联系人姓名',
colProps: { span: 8 },
formItemProps: { ...rulesHelper.text },
},
{
key: 'contact_phone',
title: '联系人手机',
colProps: { span: 8 },
valueType: 'number',
fieldProps: {
maxLength: 11,
},
formItemProps: { ...rulesHelper.number },
},
{
key: 'contact_email',
title: '联系人邮箱',
colProps: { span: 8 },
},
{
key: 'contact_address',
title: '联系人地址',
colProps: { span: 24 },
},
MyFormItems.EnumRadio({
key: 'merchant_type',
title: '商户类型',
colProps: { span: 24 },
valueEnum: CompaniesMerchantTypeEnum,
required: true,
}),
Address.Cascader({
key: 'casacader',
title: '选择地址',
colProps: { span: 24 },
keys: ['province', 'city', 'area', 'street'],
required: true,
}),
{
key: 'address',
title: '机构地址',
colProps: { span: 24 },
},
]}
/>
);
}

View File

@ -0,0 +1,115 @@
import {
MyBetaModalFormProps,
MyButtons,
MyFormItems,
MyModalFormProps,
rulesHelper,
} from '@/common';
import { Address } from '@/components/Address';
import { SysSelects } from '@/components/Select';
import { Apis } from '@/gen/Apis';
import { CompaniesMerchantTypeEnum } from '@/gen/Enums';
import { BetaSchemaForm } from '@ant-design/pro-components';
import { message } from 'antd';
export default function Update(props: MyBetaModalFormProps) {
return (
<BetaSchemaForm<ApiTypes.Company.Companies.Update>
{...MyModalFormProps.props}
title={`编辑${props.title}`}
trigger={<MyButtons.Edit />}
wrapperCol={{ span: 24 }}
width="800px"
request={() =>
Promise.resolve({
...props.item,
casacader: [
props.item?.province_id || '',
props.item?.city_id || '',
props.item?.area_id || '',
props.item?.street_id || '',
],
})
}
onFinish={async (values) =>
Apis.Company.Companies.Update({ ...values, id: props.item?.id ?? 0 })
.then(() => {
props.reload?.();
message.success(props.title + '成功');
return true;
})
.catch(() => false)
}
columns={[
SysSelects?.Companies({
key: 'parent_id',
title: '上级组织',
colProps: { span: 24 },
}),
{
key: 'name',
title: '组织名称',
colProps: { span: 8 },
formItemProps: { ...rulesHelper.text },
},
{
key: 'short_name',
title: '组织简称',
colProps: { span: 8 },
},
{
key: 'business_license_number',
title: '营业执照号',
colProps: { span: 8 },
formItemProps: { ...rulesHelper.text },
},
{
key: 'contact_name',
title: '联系人姓名',
colProps: { span: 8 },
formItemProps: { ...rulesHelper.text },
},
{
key: 'contact_phone',
title: '联系人手机',
colProps: { span: 8 },
valueType: 'number',
fieldProps: {
maxLength: 11,
},
formItemProps: { ...rulesHelper.number },
},
{
key: 'contact_email',
title: '联系人邮箱',
colProps: { span: 8 },
},
{
key: 'contact_address',
title: '联系人地址',
colProps: { span: 24 },
},
MyFormItems.EnumRadio({
key: 'merchant_type',
title: '商户类型',
colProps: { span: 24 },
valueEnum: CompaniesMerchantTypeEnum,
required: true,
}),
Address.Cascader({
key: 'casacader',
title: '选择地址',
colProps: { span: 24 },
keys: ['province', 'city', 'area', 'street'],
required: true,
}),
{
key: 'address',
title: '机构地址',
colProps: { span: 24 },
},
]}
/>
);
}