develop #18
@ -15,9 +15,9 @@ export default defineConfig({
|
|||||||
proxy: {
|
proxy: {
|
||||||
'/api/': {
|
'/api/': {
|
||||||
// target: 'http://yt:8003',
|
// target: 'http://yt:8003',
|
||||||
// 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://c789629c.natappfree.cc',
|
// target: 'http://c789629c.natappfree.cc',
|
||||||
|
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
{
|
{
|
||||||
"url": "http://v79683c9.natappfree.cc/api/docs/openapi",
|
"url": "http://10.39.13.78:8001/api/docs/openapi",
|
||||||
"module": "Admin"
|
"module": "Admin"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -41,9 +41,10 @@ export const LayoutConfig: RuntimeConfig['layout'] = () => {
|
|||||||
avatarProps: {
|
avatarProps: {
|
||||||
render: () => <AvatarProps user={snap.session.user} />,
|
render: () => <AvatarProps user={snap.session.user} />,
|
||||||
},
|
},
|
||||||
waterMarkProps: {
|
//水印设置
|
||||||
content: snap.session.user?.username,
|
// waterMarkProps: {
|
||||||
},
|
// content: snap.session.user?.username,
|
||||||
|
// },
|
||||||
collapsedButtonRender: false,
|
collapsedButtonRender: false,
|
||||||
token: {
|
token: {
|
||||||
bgLayout: '#eef0f3',
|
bgLayout: '#eef0f3',
|
||||||
|
|||||||
@ -10,7 +10,7 @@ export function MyModal(props?: any) {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (open) {
|
if (open) {
|
||||||
props?.onOpen(true);
|
props?.onOpen?.(true);
|
||||||
}
|
}
|
||||||
}, [open]);
|
}, [open]);
|
||||||
|
|
||||||
|
|||||||
@ -585,15 +585,16 @@ export const Selects = {
|
|||||||
formItemProps: { ...(required ? rulesHelper.number : {}) },
|
formItemProps: { ...(required ? rulesHelper.number : {}) },
|
||||||
|
|
||||||
request: async (params) => {
|
request: async (params) => {
|
||||||
|
console.log(params, '1111');
|
||||||
let res = await Apis.Meter.HouseMeters.List({
|
let res = await Apis.Meter.HouseMeters.List({
|
||||||
keywords: params?.KeyWords,
|
...params,
|
||||||
asset_projects_id: params?.asset_projects_id,
|
asset_projects_id: params?.asset_projects_id,
|
||||||
charge_standards_id: params?.house_charge_standards_id,
|
charge_standards_id: params?.house_charge_standards_id,
|
||||||
...params,
|
name: params?.keyWords || undefined,
|
||||||
});
|
});
|
||||||
res?.data?.map((l: any) => {
|
res?.data?.map((l: any) => {
|
||||||
l.label = l.id + ':' + l.name;
|
l.label = l.id + ':' + l.name;
|
||||||
l.value = l.house_meter_has_houses[0].asset_houses_id;
|
l.value = l.id;
|
||||||
});
|
});
|
||||||
return res?.data;
|
return res?.data;
|
||||||
},
|
},
|
||||||
|
|||||||
@ -154,7 +154,7 @@ export const BannersTypeEnum= {
|
|||||||
|
|
||||||
// 缓存类型
|
// 缓存类型
|
||||||
export const CacheTypeEnum= {
|
export const CacheTypeEnum= {
|
||||||
'MobilePhoneVerificationCode': {"text":"手机验证码","color":"#b2685c","value":"MobilePhoneVerificationCode"},
|
'MobilePhoneVerificationCode': {"text":"手机验证码","color":"#ad9561","value":"MobilePhoneVerificationCode"},
|
||||||
};
|
};
|
||||||
|
|
||||||
// CompaniesMerchantTypeEnum
|
// CompaniesMerchantTypeEnum
|
||||||
|
|||||||
@ -1,49 +1,56 @@
|
|||||||
import { MyBetaModalFormProps, MyProTableProps } from '@/common';
|
import { MyBetaModalFormProps, MyButtons } from '@/common';
|
||||||
import { Apis } from '@/gen/Apis';
|
import { Apis } from '@/gen/Apis';
|
||||||
import { ProCard, ProTable } from '@ant-design/pro-components';
|
import { ProCard, ProDescriptions } from '@ant-design/pro-components';
|
||||||
|
import { useNavigate } from '@umijs/max';
|
||||||
|
import { Space } from 'antd';
|
||||||
|
import { useEffect, useState } from 'react';
|
||||||
|
|
||||||
|
export default function Info(props: MyBetaModalFormProps) {
|
||||||
|
const [getShow, setDataShow] = useState<any>({});
|
||||||
|
const navigate = useNavigate();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
Apis.Bill.HouseBills.SummaryShow({
|
||||||
|
asset_houses_id: props?.item?.id,
|
||||||
|
})
|
||||||
|
.then((res) => {
|
||||||
|
console.log(res);
|
||||||
|
setDataShow(JSON.parse(JSON.stringify(res?.data)));
|
||||||
|
return false;
|
||||||
|
})
|
||||||
|
.catch(() => false);
|
||||||
|
}, [props?.item?.id]);
|
||||||
|
|
||||||
export default function info(props: MyBetaModalFormProps) {
|
|
||||||
const { item } = props;
|
|
||||||
return (
|
return (
|
||||||
<ProCard>
|
<ProCard>
|
||||||
<ProTable
|
<ProDescriptions bordered column={1}>
|
||||||
{...MyProTableProps.props}
|
{/* <ProDescriptions.Item label="账单金额">
|
||||||
request={async (params, sort) =>
|
{getShow?.payable_amount_sum || '-'}
|
||||||
MyProTableProps.request(
|
</ProDescriptions.Item>
|
||||||
{
|
<ProDescriptions.Item label="滞纳金">
|
||||||
...params,
|
{getShow?.late_fee_sum || '-'}
|
||||||
asset_houses_id: item?.asset_houses_id,
|
</ProDescriptions.Item>
|
||||||
},
|
<ProDescriptions.Item label="优惠金额">
|
||||||
sort,
|
{getShow?.discount_amount_sum || '-'}
|
||||||
Apis.Bill.HouseBills.SummaryBillList,
|
</ProDescriptions.Item> */}
|
||||||
)
|
<ProDescriptions.Item label="账单未缴金额">
|
||||||
}
|
<Space>
|
||||||
search={false}
|
{getShow?.total_payable_sum || ''}
|
||||||
options={false}
|
{getShow?.payable_amount_sum ? (
|
||||||
pagination={false}
|
<MyButtons.View
|
||||||
columns={[
|
title="查看账单明细"
|
||||||
{
|
size="small"
|
||||||
title: '账单金额合计',
|
type="link"
|
||||||
dataIndex: 'payable_amount_sum',
|
onClick={() => {
|
||||||
search: false,
|
navigate(`/bills/summary/show/${props?.item?.id || 0}`);
|
||||||
},
|
}}
|
||||||
{
|
|
||||||
title: '滞纳金合计',
|
|
||||||
dataIndex: 'late_fee_sum',
|
|
||||||
search: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '优惠金额合计',
|
|
||||||
dataIndex: 'discount_amount_sum',
|
|
||||||
search: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '应付合计',
|
|
||||||
dataIndex: 'total_payable_sum',
|
|
||||||
search: false,
|
|
||||||
},
|
|
||||||
]}
|
|
||||||
/>
|
/>
|
||||||
|
) : (
|
||||||
|
'无账单'
|
||||||
|
)}
|
||||||
|
</Space>
|
||||||
|
</ProDescriptions.Item>
|
||||||
|
</ProDescriptions>
|
||||||
</ProCard>
|
</ProCard>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -126,7 +126,6 @@ export default function Index({ title = '房客关系' }) {
|
|||||||
},
|
},
|
||||||
search: false,
|
search: false,
|
||||||
},
|
},
|
||||||
|
|
||||||
MyColumns.Option({
|
MyColumns.Option({
|
||||||
render: (_, item: any, index, action) => (
|
render: (_, item: any, index, action) => (
|
||||||
<Space key={index}>
|
<Space key={index}>
|
||||||
|
|||||||
@ -9,7 +9,6 @@ import SummaryInfo from '../components/SummaryInfo';
|
|||||||
import OccupantsHistory from '../table/OccupantsHistory';
|
import OccupantsHistory from '../table/OccupantsHistory';
|
||||||
import OccupantsNow from '../table/OccupantsNow';
|
import OccupantsNow from '../table/OccupantsNow';
|
||||||
import RegistersList from '../table/RegistersList';
|
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 }>();
|
||||||
@ -90,18 +89,18 @@ export default function Show({ title = '房屋档案' }) {
|
|||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
{
|
// {
|
||||||
label: '欠费账单',
|
// label: '欠费账单',
|
||||||
key: '4',
|
// key: '4',
|
||||||
closable: false,
|
// closable: false,
|
||||||
children: <UnpaidBill item={{ ...data, asset_houses_id: id }} />,
|
// 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} />
|
{id && <SummaryInfo item={{ ...data, 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>
|
||||||
|
|||||||
@ -100,14 +100,57 @@ export default function Index({ title = '项目活动' }) {
|
|||||||
render: (_, item: any, index, action) => (
|
render: (_, item: any, index, action) => (
|
||||||
<Space key={index}>
|
<Space key={index}>
|
||||||
<ActivityShow item={item} />
|
<ActivityShow item={item} />
|
||||||
{(!item.end_time || new Date(item.end_time) > new Date()) && (
|
{/* {(!item.end_time || new Date(item.end_time) > new Date()) && (
|
||||||
|
)} */}
|
||||||
<ActivityUpdate
|
<ActivityUpdate
|
||||||
item={item}
|
item={item}
|
||||||
reload={action?.reload}
|
reload={action?.reload}
|
||||||
// title={title}
|
// title={title}
|
||||||
/>
|
/>
|
||||||
)}
|
{/* {(!item.end_time || new Date(item.end_time) > new Date()) && (
|
||||||
{(!item.end_time || new Date(item.end_time) > new Date()) && (
|
<MyButtons.Default
|
||||||
|
title={
|
||||||
|
item.publish_status ===
|
||||||
|
ActivitiesPublishStatusEnum.Unpublished.value
|
||||||
|
? '发布'
|
||||||
|
: item.publish_status ===
|
||||||
|
ActivitiesPublishStatusEnum.Published.value
|
||||||
|
? '下架'
|
||||||
|
: '重新发布'
|
||||||
|
}
|
||||||
|
type="primary"
|
||||||
|
isConfirm
|
||||||
|
description={
|
||||||
|
item.publish_status ===
|
||||||
|
ActivitiesPublishStatusEnum.Unpublished.value
|
||||||
|
? '确认发布此活动吗?'
|
||||||
|
: item.publish_status ===
|
||||||
|
ActivitiesPublishStatusEnum.Published.value
|
||||||
|
? '确认下架此活动吗?'
|
||||||
|
: '确认重新发布此活动吗?'
|
||||||
|
}
|
||||||
|
onConfirm={() => {
|
||||||
|
let newStatus;
|
||||||
|
if (
|
||||||
|
item.publish_status ===
|
||||||
|
ActivitiesPublishStatusEnum.Unpublished.value
|
||||||
|
) {
|
||||||
|
newStatus = ActivitiesPublishStatusEnum.Published.value;
|
||||||
|
} else if (
|
||||||
|
item.publish_status ===
|
||||||
|
ActivitiesPublishStatusEnum.Published.value
|
||||||
|
) {
|
||||||
|
newStatus = ActivitiesPublishStatusEnum.Unlisted.value;
|
||||||
|
} else {
|
||||||
|
newStatus = ActivitiesPublishStatusEnum.Published.value;
|
||||||
|
}
|
||||||
|
Apis.Activity.Activities.ChangePublishStatus({
|
||||||
|
id: item.id,
|
||||||
|
publish_status: newStatus,
|
||||||
|
}).then(() => action?.reload());
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
)} */}
|
||||||
<MyButtons.Default
|
<MyButtons.Default
|
||||||
title={
|
title={
|
||||||
item.publish_status ===
|
item.publish_status ===
|
||||||
@ -150,8 +193,6 @@ export default function Index({ title = '项目活动' }) {
|
|||||||
}).then(() => action?.reload());
|
}).then(() => action?.reload());
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
)}
|
|
||||||
|
|
||||||
{item.is_enroll === 1 && (
|
{item.is_enroll === 1 && (
|
||||||
<EnrollsList
|
<EnrollsList
|
||||||
item={item}
|
item={item}
|
||||||
|
|||||||
@ -38,7 +38,7 @@ export default function Show(props: MyBetaModalFormProps) {
|
|||||||
<MyModal
|
<MyModal
|
||||||
title={props.title || '查看'}
|
title={props.title || '查看'}
|
||||||
width={800}
|
width={800}
|
||||||
onOpen={getShow}
|
onOpen={() => getShow()}
|
||||||
node={
|
node={
|
||||||
<ProCard>
|
<ProCard>
|
||||||
<Spin spinning={loading}>
|
<Spin spinning={loading}>
|
||||||
|
|||||||
@ -39,6 +39,7 @@ export default function Index({ title = '楼栋范围' }) {
|
|||||||
<GridCreate key="Select" reload={action?.reload} title="楼栋划分" />,
|
<GridCreate key="Select" reload={action?.reload} title="楼栋划分" />,
|
||||||
]}
|
]}
|
||||||
columns={[
|
columns={[
|
||||||
|
MyColumns.ID(),
|
||||||
{
|
{
|
||||||
title: '关联项目',
|
title: '关联项目',
|
||||||
dataIndex: ['asset_project', 'name'],
|
dataIndex: ['asset_project', 'name'],
|
||||||
@ -48,23 +49,15 @@ export default function Index({ title = '楼栋范围' }) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
|
||||||
title: 'ID',
|
|
||||||
dataIndex: 'id',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
title: '板块名称',
|
title: '板块名称',
|
||||||
dataIndex: 'name',
|
dataIndex: 'name',
|
||||||
},
|
},
|
||||||
{
|
|
||||||
title: '标识',
|
|
||||||
dataIndex: 'grid_mark',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
title: '楼栋管家',
|
title: '楼栋管家',
|
||||||
dataIndex: ['company_employee', 'name'],
|
dataIndex: ['company_employee', 'name'],
|
||||||
render: (_, item: any) =>
|
render: (_, item: any) =>
|
||||||
`${item?.company_employee?.name || ''}-${
|
`${item?.company_employee?.name || ''}:${
|
||||||
item?.company_employee?.phone || ''
|
item?.company_employee?.phone || ''
|
||||||
}`,
|
}`,
|
||||||
},
|
},
|
||||||
|
|||||||
@ -16,12 +16,12 @@ export default function Create(
|
|||||||
return (
|
return (
|
||||||
<BetaSchemaForm<ApiTypes.Grid.Grids.AddManager>
|
<BetaSchemaForm<ApiTypes.Grid.Grids.AddManager>
|
||||||
{...MyModalFormProps.props}
|
{...MyModalFormProps.props}
|
||||||
title={`设置管理员`}
|
title={`设置楼栋管家`}
|
||||||
wrapperCol={{ span: 24 }}
|
wrapperCol={{ span: 24 }}
|
||||||
width="500px"
|
width="500px"
|
||||||
form={form}
|
form={form}
|
||||||
key={new Date().getTime()}
|
key={new Date().getTime()}
|
||||||
trigger={<MyButtons.Default title="管理员" type="link" />}
|
trigger={<MyButtons.Default title="楼栋管家" type="link" />}
|
||||||
request={() => Promise.resolve(props.item)}
|
request={() => Promise.resolve(props.item)}
|
||||||
onOpenChange={(open: any) => {
|
onOpenChange={(open: any) => {
|
||||||
if (open && props.item) {
|
if (open && props.item) {
|
||||||
@ -49,7 +49,7 @@ export default function Create(
|
|||||||
}
|
}
|
||||||
columns={[
|
columns={[
|
||||||
Selects?.Employees({
|
Selects?.Employees({
|
||||||
title: '设置网格员',
|
title: '设置楼栋管家',
|
||||||
dataIndex: 'company_employees_id',
|
dataIndex: 'company_employees_id',
|
||||||
colProps: { span: 24 },
|
colProps: { span: 24 },
|
||||||
formItemProps: { ...rulesHelper.text },
|
formItemProps: { ...rulesHelper.text },
|
||||||
|
|||||||
@ -1,12 +1,6 @@
|
|||||||
import { MyBetaModalFormProps, renderTextHelper } from '@/common';
|
import { MyBetaModalFormProps } from '@/common';
|
||||||
import { MyModal } from '@/components/MyModal';
|
import { MyModal } from '@/components/MyModal';
|
||||||
import { Apis } from '@/gen/Apis';
|
import { Apis } from '@/gen/Apis';
|
||||||
import {
|
|
||||||
AssetHousesOrientationEnum,
|
|
||||||
AssetHousesOwnershipTypeEnum,
|
|
||||||
AssetHousesStatusEnum,
|
|
||||||
AssetHousesUsageEnum,
|
|
||||||
} 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 { useState } from 'react';
|
import { useState } from 'react';
|
||||||
@ -14,12 +8,10 @@ import { useState } from 'react';
|
|||||||
export default function Info(props: MyBetaModalFormProps) {
|
export default function Info(props: MyBetaModalFormProps) {
|
||||||
const [getShow, setDataShow] = useState<any>({});
|
const [getShow, setDataShow] = useState<any>({});
|
||||||
|
|
||||||
// 只在弹窗打开时获取数据
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<MyModal
|
<MyModal
|
||||||
title={props.title || '查看'}
|
title={props.title || '查看'}
|
||||||
width="800px"
|
width="600px"
|
||||||
onOpen={(e: boolean) => {
|
onOpen={(e: boolean) => {
|
||||||
if (e) {
|
if (e) {
|
||||||
return Apis.Grid.Grids.Show({
|
return Apis.Grid.Grids.Show({
|
||||||
@ -37,60 +29,25 @@ export default function Info(props: MyBetaModalFormProps) {
|
|||||||
node={
|
node={
|
||||||
<>
|
<>
|
||||||
<ProCard extra={props.extra}>
|
<ProCard extra={props.extra}>
|
||||||
<ProDescriptions bordered>
|
<ProDescriptions bordered column={1}>
|
||||||
<ProDescriptions.Item label="房屋全名" span={2}>
|
<ProDescriptions.Item label="板块名称">
|
||||||
<Space>
|
<Space>{getShow?.name}</Space>
|
||||||
<span>【{getShow?.id}】</span>
|
|
||||||
{getShow?.name}
|
|
||||||
</Space>
|
|
||||||
</ProDescriptions.Item>
|
</ProDescriptions.Item>
|
||||||
<ProDescriptions.Item label="房号">
|
|
||||||
{getShow?.name}
|
<ProDescriptions.Item label="楼栋单元">
|
||||||
|
{getShow?.grid_ranges
|
||||||
|
?.map(
|
||||||
|
(item: any) =>
|
||||||
|
item?.asset_building?.name + item?.asset_unit?.name,
|
||||||
|
)
|
||||||
|
.join(';')}
|
||||||
</ProDescriptions.Item>
|
</ProDescriptions.Item>
|
||||||
<ProDescriptions.Item label="楼层">
|
|
||||||
{getShow?.floor}
|
<ProDescriptions.Item label="创建时间">
|
||||||
|
{getShow?.created_at}
|
||||||
</ProDescriptions.Item>
|
</ProDescriptions.Item>
|
||||||
<ProDescriptions.Item label="房屋用途">
|
<ProDescriptions.Item label="最近修改">
|
||||||
<renderTextHelper.Tag
|
{getShow?.updated_at}
|
||||||
Enums={AssetHousesUsageEnum}
|
|
||||||
value={getShow?.usage}
|
|
||||||
key="usage"
|
|
||||||
/>
|
|
||||||
</ProDescriptions.Item>
|
|
||||||
<ProDescriptions.Item label="产权性质">
|
|
||||||
<renderTextHelper.Tag
|
|
||||||
Enums={AssetHousesOwnershipTypeEnum}
|
|
||||||
value={getShow?.ownership_type}
|
|
||||||
key="ownership_type"
|
|
||||||
/>
|
|
||||||
</ProDescriptions.Item>
|
|
||||||
<ProDescriptions.Item label="建筑面积">
|
|
||||||
{getShow?.built_area}m²
|
|
||||||
</ProDescriptions.Item>
|
|
||||||
<ProDescriptions.Item label="套内面积">
|
|
||||||
{getShow?.inside_area}m²
|
|
||||||
</ProDescriptions.Item>
|
|
||||||
<ProDescriptions.Item label="计费面积">
|
|
||||||
{getShow?.chargeable_area}m²
|
|
||||||
</ProDescriptions.Item>
|
|
||||||
<ProDescriptions.Item label="房屋状态">
|
|
||||||
<renderTextHelper.Tag
|
|
||||||
Enums={AssetHousesStatusEnum}
|
|
||||||
value={getShow?.status}
|
|
||||||
key="status"
|
|
||||||
/>
|
|
||||||
</ProDescriptions.Item>
|
|
||||||
<ProDescriptions.Item label="户型">
|
|
||||||
{getShow?.room || ''}房{getShow?.hall || ''}厅
|
|
||||||
{getShow?.bathroom || ''}卫{getShow?.kitchen || ''}厨
|
|
||||||
{getShow?.balcony || ''}阳台
|
|
||||||
</ProDescriptions.Item>
|
|
||||||
<ProDescriptions.Item label="朝向">
|
|
||||||
<renderTextHelper.Tag
|
|
||||||
Enums={AssetHousesOrientationEnum}
|
|
||||||
value={getShow?.orientation}
|
|
||||||
key="orientation"
|
|
||||||
/>
|
|
||||||
</ProDescriptions.Item>
|
</ProDescriptions.Item>
|
||||||
</ProDescriptions>
|
</ProDescriptions>
|
||||||
</ProCard>
|
</ProCard>
|
||||||
|
|||||||
@ -131,7 +131,7 @@ export default function Index({ title = '项目列表' }) {
|
|||||||
/>
|
/>
|
||||||
<MyButtons.Delete
|
<MyButtons.Delete
|
||||||
onConfirm={() =>
|
onConfirm={() =>
|
||||||
Apis.Common.Admins.Delete({ id: item.id }).then(() =>
|
Apis.Asset.AssetProjects.Delete({ id: item.id }).then(() =>
|
||||||
action?.reload(),
|
action?.reload(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -113,7 +113,7 @@ export default function Index({ title = '账单明细' }) {
|
|||||||
<BillUpdate item={item} reload={action?.reload} title={title} />
|
<BillUpdate item={item} reload={action?.reload} title={title} />
|
||||||
<MyButtons.Delete
|
<MyButtons.Delete
|
||||||
onConfirm={() =>
|
onConfirm={() =>
|
||||||
Apis.Common.Admins.Delete({ id: item.id }).then(() =>
|
Apis.Bill.HouseBills.Delete({ id: item.id }).then(() =>
|
||||||
action?.reload(),
|
action?.reload(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -201,12 +201,6 @@ export default function Create(props: MyBetaModalFormProps) {
|
|||||||
formItemProps: { ...rulesHelper.number },
|
formItemProps: { ...rulesHelper.number },
|
||||||
fieldProps: {
|
fieldProps: {
|
||||||
showSearch: true,
|
showSearch: true,
|
||||||
onChange: () => {
|
|
||||||
form.setFieldsValue({
|
|
||||||
asset_units_id: undefined,
|
|
||||||
asset_floors_id: undefined,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
|
|||||||
@ -147,12 +147,6 @@ export default function Update(props: MyBetaModalFormProps) {
|
|||||||
formItemProps: { ...rulesHelper.number },
|
formItemProps: { ...rulesHelper.number },
|
||||||
fieldProps: {
|
fieldProps: {
|
||||||
showSearch: true,
|
showSearch: true,
|
||||||
onChange: () => {
|
|
||||||
form.setFieldsValue({
|
|
||||||
asset_units_id: undefined,
|
|
||||||
asset_floors_id: undefined,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
|
|||||||
@ -13,6 +13,7 @@ export default function Show({ title = '账单详情' }) {
|
|||||||
const { id } = useParams<{ id: string }>();
|
const { id } = useParams<{ id: string }>();
|
||||||
const [data, setShow] = useState<any>({});
|
const [data, setShow] = useState<any>({});
|
||||||
|
|
||||||
|
console.log(data, 'pppp');
|
||||||
// 注册标签页
|
// 注册标签页
|
||||||
const { addTab } = usePageTabs({
|
const { addTab } = usePageTabs({
|
||||||
tabKey: `bill-detail-${id}`,
|
tabKey: `bill-detail-${id}`,
|
||||||
@ -43,27 +44,19 @@ export default function Show({ title = '账单详情' }) {
|
|||||||
label: '欠费账单',
|
label: '欠费账单',
|
||||||
key: '1',
|
key: '1',
|
||||||
closable: false,
|
closable: false,
|
||||||
children: (
|
children: <UnpaidBill item={{ ...data, asset_houses_id: id }} />,
|
||||||
<UnpaidBill item={{ ...data, asset_houses_id: data.asset_houses_id }} />
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '已付账单',
|
label: '已付账单',
|
||||||
key: '2',
|
key: '2',
|
||||||
closable: false,
|
closable: false,
|
||||||
children: (
|
children: <PaidBill item={{ ...data, asset_houses_id: id }} />,
|
||||||
<PaidBill item={{ ...data, asset_houses_id: data.asset_houses_id }} />
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '作废账单',
|
label: '作废账单',
|
||||||
key: '3',
|
key: '3',
|
||||||
closable: false,
|
closable: false,
|
||||||
children: (
|
children: <CancelledBill item={{ ...data, asset_houses_id: id }} />,
|
||||||
<CancelledBill
|
|
||||||
item={{ ...data, asset_houses_id: data.asset_houses_id }}
|
|
||||||
/>
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
import { MyButtons, MyColumns, MyProTableProps } from '@/common';
|
import { MyButtons, MyColumns, MyProTableProps } from '@/common';
|
||||||
import { Apis } from '@/gen/Apis';
|
import { Apis } from '@/gen/Apis';
|
||||||
|
|
||||||
|
import { HouseBillsTypeEnum } from '@/gen/Enums';
|
||||||
import { ProTable } from '@ant-design/pro-components';
|
import { ProTable } from '@ant-design/pro-components';
|
||||||
import { Space } from 'antd';
|
import { Space } from 'antd';
|
||||||
import { useEffect, useRef } from 'react';
|
import { useEffect, useRef } from 'react';
|
||||||
@ -28,11 +29,15 @@ export default function Index({ ...rest }) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
toolBarRender={(action) => [
|
toolBarRender={(action) => [
|
||||||
|
(rest?.item.charge_type === HouseBillsTypeEnum.PropertyFee.value ||
|
||||||
|
rest?.item.charge_type ===
|
||||||
|
HouseBillsTypeEnum.MaintenanceFund.value) && (
|
||||||
<ChargeStandardHasHouse
|
<ChargeStandardHasHouse
|
||||||
item={rest.item}
|
item={rest.item}
|
||||||
reload={action?.reload}
|
reload={action?.reload}
|
||||||
title={'绑房'}
|
title={'绑房'}
|
||||||
/>,
|
/>
|
||||||
|
),
|
||||||
]}
|
]}
|
||||||
search={false}
|
search={false}
|
||||||
columns={[
|
columns={[
|
||||||
|
|||||||
@ -69,6 +69,11 @@ export default function Index({ title = '收费标准' }) {
|
|||||||
dataIndex: 'name',
|
dataIndex: 'name',
|
||||||
search: false,
|
search: false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: '关联房屋数',
|
||||||
|
dataIndex: 'house_charge_has_houses_count',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
MyColumns.EnumTag({
|
MyColumns.EnumTag({
|
||||||
title: '收费项',
|
title: '收费项',
|
||||||
dataIndex: 'charge_type',
|
dataIndex: 'charge_type',
|
||||||
@ -148,11 +153,16 @@ export default function Index({ title = '收费标准' }) {
|
|||||||
reload={action?.reload}
|
reload={action?.reload}
|
||||||
title="编辑"
|
title="编辑"
|
||||||
/>
|
/>
|
||||||
|
{(item.charge_type === HouseBillsTypeEnum.PropertyFee.value ||
|
||||||
|
item.charge_type ===
|
||||||
|
HouseBillsTypeEnum.MaintenanceFund.value) && (
|
||||||
<ChargeStandardHasHouse
|
<ChargeStandardHasHouse
|
||||||
item={item}
|
item={item}
|
||||||
reload={action?.reload}
|
reload={action?.reload}
|
||||||
title={'绑房'}
|
title={'绑房'}
|
||||||
/>
|
/>
|
||||||
|
)}
|
||||||
|
|
||||||
<MyButtons.Delete
|
<MyButtons.Delete
|
||||||
onConfirm={() =>
|
onConfirm={() =>
|
||||||
Apis.HouseCharage.HouseChargeStandards.Delete({
|
Apis.HouseCharage.HouseChargeStandards.Delete({
|
||||||
|
|||||||
@ -55,11 +55,6 @@ export default function Index({ title = '账单任务' }) {
|
|||||||
dataIndex: ['asset_project', 'name'],
|
dataIndex: ['asset_project', 'name'],
|
||||||
search: false,
|
search: false,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
title: '任务ID',
|
|
||||||
dataIndex: 'id',
|
|
||||||
search: false,
|
|
||||||
},
|
|
||||||
MyColumns.EnumTag({
|
MyColumns.EnumTag({
|
||||||
title: '创建类型',
|
title: '创建类型',
|
||||||
dataIndex: 'type',
|
dataIndex: 'type',
|
||||||
@ -118,7 +113,11 @@ export default function Index({ title = '账单任务' }) {
|
|||||||
<Space key={index}>
|
<Space key={index}>
|
||||||
<TaskShow item={item} title="查看" reload={action?.reload} />
|
<TaskShow item={item} title="查看" reload={action?.reload} />
|
||||||
<MyButtons.Default
|
<MyButtons.Default
|
||||||
title="重新执行"
|
title={
|
||||||
|
item.status === HouseChargeTasksStatusEnum.Completed.value
|
||||||
|
? '重新执行'
|
||||||
|
: '执行'
|
||||||
|
}
|
||||||
type="link"
|
type="link"
|
||||||
color="primary"
|
color="primary"
|
||||||
isConfirm
|
isConfirm
|
||||||
|
|||||||
@ -11,7 +11,7 @@ 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';
|
||||||
|
|
||||||
export default function AssetInfo(props: MyBetaModalFormProps) {
|
export default function TaskShow(props: MyBetaModalFormProps) {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
return (
|
return (
|
||||||
<MyModal
|
<MyModal
|
||||||
@ -28,10 +28,11 @@ export default function AssetInfo(props: MyBetaModalFormProps) {
|
|||||||
Apis.HouseCharage.HouseChargeTaskDetails.List,
|
Apis.HouseCharage.HouseChargeTaskDetails.List,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
options={false}
|
||||||
columns={[
|
columns={[
|
||||||
MyColumns.ID(),
|
MyColumns.ID(),
|
||||||
{
|
{
|
||||||
title: '对象',
|
title: '关联房屋',
|
||||||
dataIndex: 'full_name',
|
dataIndex: 'full_name',
|
||||||
search: false,
|
search: false,
|
||||||
render: (_, record) => (
|
render: (_, record) => (
|
||||||
@ -63,6 +64,7 @@ export default function AssetInfo(props: MyBetaModalFormProps) {
|
|||||||
'0',
|
'0',
|
||||||
)}`;
|
)}`;
|
||||||
},
|
},
|
||||||
|
search: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '计费周期',
|
title: '计费周期',
|
||||||
|
|||||||
@ -12,7 +12,7 @@ import { Space } from 'antd';
|
|||||||
import Create from './modals/Create';
|
import Create from './modals/Create';
|
||||||
import Update from './modals/Update';
|
import Update from './modals/Update';
|
||||||
|
|
||||||
export default function Index({ title = '岗位管理' }) {
|
export default function Index({ title = '岗位库' }) {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
// 注册当前页面为标签页
|
// 注册当前页面为标签页
|
||||||
|
|||||||
@ -45,10 +45,12 @@ export default function Index({ title = '品牌管理' }) {
|
|||||||
{
|
{
|
||||||
title: '机构',
|
title: '机构',
|
||||||
dataIndex: ['company', 'name'],
|
dataIndex: ['company', 'name'],
|
||||||
|
width: 300,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '品牌名称',
|
title: '品牌名称',
|
||||||
dataIndex: 'name',
|
dataIndex: 'name',
|
||||||
|
width: 200,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'logo',
|
title: 'logo',
|
||||||
@ -66,7 +68,9 @@ export default function Index({ title = '品牌管理' }) {
|
|||||||
</Space>
|
</Space>
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
width: 100,
|
||||||
},
|
},
|
||||||
|
MyColumns.UpdatedAt(),
|
||||||
MyColumns.Option({
|
MyColumns.Option({
|
||||||
render: (_, item: any, index, action) => (
|
render: (_, item: any, index, action) => (
|
||||||
<Space key={index}>
|
<Space key={index}>
|
||||||
|
|||||||
@ -92,8 +92,8 @@ export default function Index({ title = '员工管理' }) {
|
|||||||
<Change item={item} reload={action?.reload} title={title} />
|
<Change item={item} reload={action?.reload} title={title} />
|
||||||
<MyButtons.Delete
|
<MyButtons.Delete
|
||||||
onConfirm={() =>
|
onConfirm={() =>
|
||||||
Apis.Common.Admins.Delete({ id: item.id }).then(() =>
|
Apis.Company.CompanyEmployees.Delete({ id: item.id }).then(
|
||||||
action?.reload(),
|
() => action?.reload(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
|
|||||||
82
src/pages/complaint/components/WorkLogsCreate.tsx
Normal file
82
src/pages/complaint/components/WorkLogsCreate.tsx
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
import {
|
||||||
|
MyButtons,
|
||||||
|
MyFormItems,
|
||||||
|
MyModalFormProps,
|
||||||
|
rulesHelper,
|
||||||
|
} from '@/common';
|
||||||
|
import { Apis } from '@/gen/Apis';
|
||||||
|
import { HouseWorkOrdersStatusEnum } from '@/gen/Enums';
|
||||||
|
import { BetaSchemaForm } from '@ant-design/pro-components';
|
||||||
|
import { Form, message } from 'antd';
|
||||||
|
|
||||||
|
interface WorkLogsCreateProps {
|
||||||
|
workOrderId: number;
|
||||||
|
reload?: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function WorkLogsCreate({
|
||||||
|
workOrderId,
|
||||||
|
reload,
|
||||||
|
}: WorkLogsCreateProps) {
|
||||||
|
const [form] = Form.useForm();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<BetaSchemaForm<ApiTypes.WorkOrder.HouseWorkLogs.Store>
|
||||||
|
{...MyModalFormProps.props}
|
||||||
|
title={`添加处理记录`}
|
||||||
|
wrapperCol={{ span: 24 }}
|
||||||
|
width="600px"
|
||||||
|
trigger={<MyButtons.Create title={`添加处理记录`} />}
|
||||||
|
onOpenChange={(open: any) => {
|
||||||
|
if (open) {
|
||||||
|
form.resetFields(); // 清空表单数据
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
key={new Date().getTime()}
|
||||||
|
form={form}
|
||||||
|
onFinish={async (values) => {
|
||||||
|
try {
|
||||||
|
await Apis.WorkOrder.HouseWorkLogs.Store({
|
||||||
|
...values,
|
||||||
|
house_work_orders_id: workOrderId,
|
||||||
|
});
|
||||||
|
reload?.();
|
||||||
|
message.success('添加处理记录成功');
|
||||||
|
return true;
|
||||||
|
} catch (error) {
|
||||||
|
message.error('添加处理记录失败');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
columns={[
|
||||||
|
MyFormItems.EnumRadio({
|
||||||
|
key: 'status',
|
||||||
|
title: '工单状态',
|
||||||
|
colProps: { span: 24 },
|
||||||
|
valueEnum: HouseWorkOrdersStatusEnum,
|
||||||
|
required: true,
|
||||||
|
formItemProps: { ...rulesHelper.text },
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
key: 'description',
|
||||||
|
title: '进度描述',
|
||||||
|
valueType: 'textarea',
|
||||||
|
colProps: { span: 24 },
|
||||||
|
formItemProps: { ...rulesHelper.text },
|
||||||
|
fieldProps: {
|
||||||
|
rows: 4,
|
||||||
|
placeholder: '请输入处理进度描述',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
MyFormItems.UploadImages({
|
||||||
|
key: 'attachments',
|
||||||
|
title: '相关图片',
|
||||||
|
uploadType: 'file',
|
||||||
|
max: 5,
|
||||||
|
colProps: { span: 24 },
|
||||||
|
formItemProps: { required: false },
|
||||||
|
}),
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
143
src/pages/complaint/components/WorkLogsLIst.tsx
Normal file
143
src/pages/complaint/components/WorkLogsLIst.tsx
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
import { MyButtons, MyColumns, MyProTableProps } from '@/common';
|
||||||
|
import { Apis } from '@/gen/Apis';
|
||||||
|
import { HouseWorkOrdersStatusEnum } from '@/gen/Enums';
|
||||||
|
import { ProTable } from '@ant-design/pro-components';
|
||||||
|
import { Image, Space } from 'antd';
|
||||||
|
import { useEffect, useRef } from 'react';
|
||||||
|
import WorkLogsCreate from './WorkLogsCreate';
|
||||||
|
|
||||||
|
interface WorkLogsListProps {
|
||||||
|
workOrderId: number;
|
||||||
|
reload?: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function WorkLogsList({
|
||||||
|
workOrderId,
|
||||||
|
reload,
|
||||||
|
}: WorkLogsListProps) {
|
||||||
|
const actionRef = useRef<any>();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
actionRef?.current?.reload();
|
||||||
|
}, [workOrderId]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<ProTable<Record<any, any>>
|
||||||
|
{...MyProTableProps.props}
|
||||||
|
actionRef={actionRef}
|
||||||
|
request={async (params, sort) =>
|
||||||
|
MyProTableProps.request(
|
||||||
|
{
|
||||||
|
...params,
|
||||||
|
house_work_orders_id: workOrderId,
|
||||||
|
},
|
||||||
|
sort,
|
||||||
|
Apis.WorkOrder.HouseWorkLogs.List,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
toolBarRender={(action) => [
|
||||||
|
<WorkLogsCreate
|
||||||
|
key="CreateWorkLog"
|
||||||
|
workOrderId={workOrderId}
|
||||||
|
reload={() => {
|
||||||
|
action?.reload();
|
||||||
|
reload?.();
|
||||||
|
}}
|
||||||
|
/>,
|
||||||
|
]}
|
||||||
|
search={false}
|
||||||
|
pagination={{
|
||||||
|
pageSize: 10,
|
||||||
|
showSizeChanger: false,
|
||||||
|
}}
|
||||||
|
columns={[
|
||||||
|
MyColumns.ID(),
|
||||||
|
MyColumns.EnumTag({
|
||||||
|
title: '工单状态',
|
||||||
|
dataIndex: 'status',
|
||||||
|
valueEnum: HouseWorkOrdersStatusEnum,
|
||||||
|
search: false,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
title: '进度描述',
|
||||||
|
dataIndex: 'description',
|
||||||
|
search: false,
|
||||||
|
ellipsis: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
title: '附件',
|
||||||
|
dataIndex: 'attachments',
|
||||||
|
search: false,
|
||||||
|
render: (_, record) => {
|
||||||
|
if (
|
||||||
|
!Array.isArray(record.attachments) ||
|
||||||
|
record.attachments.length === 0
|
||||||
|
) {
|
||||||
|
return '无附件';
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<div style={{ display: 'flex', flexWrap: 'wrap' }}>
|
||||||
|
{record.attachments.map((item: any, index: number) => {
|
||||||
|
if (item.type && item.type.includes('image')) {
|
||||||
|
return (
|
||||||
|
<Image
|
||||||
|
key={index}
|
||||||
|
width={40}
|
||||||
|
height={30}
|
||||||
|
style={{
|
||||||
|
marginRight: 8,
|
||||||
|
marginBottom: 8,
|
||||||
|
objectFit: 'cover',
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
} else if (item.type && item.type.includes('video')) {
|
||||||
|
return (
|
||||||
|
<video
|
||||||
|
key={index}
|
||||||
|
width={40}
|
||||||
|
height={30}
|
||||||
|
controls
|
||||||
|
style={{
|
||||||
|
marginRight: 8,
|
||||||
|
marginBottom: 8,
|
||||||
|
objectFit: 'cover',
|
||||||
|
}}
|
||||||
|
src={item.url}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '创建时间',
|
||||||
|
dataIndex: 'created_at',
|
||||||
|
valueType: 'dateTime',
|
||||||
|
search: false,
|
||||||
|
width: 160,
|
||||||
|
},
|
||||||
|
MyColumns.UpdatedAt(),
|
||||||
|
MyColumns.Option({
|
||||||
|
render: (_, item: any, index, action) => (
|
||||||
|
<Space key={index}>
|
||||||
|
<MyButtons.Delete
|
||||||
|
onConfirm={() =>
|
||||||
|
Apis.WorkOrder.HouseWorkLogs.Delete({
|
||||||
|
id: item.id,
|
||||||
|
}).then(() => action?.reload())
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</Space>
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
186
src/pages/complaint/index.tsx
Normal file
186
src/pages/complaint/index.tsx
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
import {
|
||||||
|
MyButtons,
|
||||||
|
MyColumns,
|
||||||
|
MyPageContainer,
|
||||||
|
MyProTableProps,
|
||||||
|
usePageTabs,
|
||||||
|
} from '@/common';
|
||||||
|
import { Apis } from '@/gen/Apis';
|
||||||
|
import {
|
||||||
|
HouseWorkOrdersAssignStatusEnum,
|
||||||
|
HouseWorkOrdersLevelEnum,
|
||||||
|
HouseWorkOrdersStatusEnum,
|
||||||
|
HouseWorkOrdersTypeEnum,
|
||||||
|
} from '@/gen/Enums';
|
||||||
|
import { ProTable } from '@ant-design/pro-components';
|
||||||
|
import { useNavigate } from '@umijs/max';
|
||||||
|
import { Image, Space } from 'antd';
|
||||||
|
import ComplaintAssign from './modals/ComplaintAssign';
|
||||||
|
|
||||||
|
import ComplaintShow from './modals/ComplaintShow';
|
||||||
|
|
||||||
|
export default function Index({ title = '投诉列表' }) {
|
||||||
|
const navigate = useNavigate();
|
||||||
|
|
||||||
|
// 注册当前页面为标签页
|
||||||
|
usePageTabs({
|
||||||
|
tabKey: 'complaint',
|
||||||
|
tabLabel: title,
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<MyPageContainer
|
||||||
|
title={title}
|
||||||
|
enableTabs={true}
|
||||||
|
tabKey="complaint"
|
||||||
|
tabLabel={title}
|
||||||
|
>
|
||||||
|
<ProTable
|
||||||
|
{...MyProTableProps.props}
|
||||||
|
request={async (params, sort) =>
|
||||||
|
MyProTableProps.request(
|
||||||
|
{
|
||||||
|
...params,
|
||||||
|
type: [HouseWorkOrdersTypeEnum.Complaint.value],
|
||||||
|
},
|
||||||
|
sort,
|
||||||
|
Apis.WorkOrder.HouseWorkOrders.List,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
// toolBarRender={(action) => [
|
||||||
|
// <WorkOrderCreate
|
||||||
|
// key="Create"
|
||||||
|
// reload={action?.reload}
|
||||||
|
// title={title}
|
||||||
|
// />,
|
||||||
|
// ]}
|
||||||
|
columns={[
|
||||||
|
MyColumns.ID(),
|
||||||
|
MyColumns.EnumTag({
|
||||||
|
title: '状态',
|
||||||
|
dataIndex: 'status',
|
||||||
|
valueEnum: HouseWorkOrdersStatusEnum,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
title: '描述',
|
||||||
|
dataIndex: 'content',
|
||||||
|
width: 120, // 关键:固定列宽(若父容器过窄,可设 minWidth: 200 优先保证列宽)
|
||||||
|
search: false,
|
||||||
|
render: (text) => (
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
width: '100%', // 继承列宽
|
||||||
|
// height: '60px', // 设置固定高度,约显示3行文本
|
||||||
|
overflow: 'hidden', // 超出隐藏
|
||||||
|
textOverflow: 'ellipsis', // 省略号
|
||||||
|
display: '-webkit-box',
|
||||||
|
WebkitBoxOrient: 'vertical',
|
||||||
|
WebkitLineClamp: 1, // 显示3行
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{text}
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '附件',
|
||||||
|
dataIndex: 'attachments',
|
||||||
|
search: false,
|
||||||
|
render: (_, record) => {
|
||||||
|
if (
|
||||||
|
!Array.isArray(record.attachments) ||
|
||||||
|
record.attachments.length === 0
|
||||||
|
) {
|
||||||
|
return '无附件';
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<div style={{ display: 'flex', flexWrap: 'wrap' }}>
|
||||||
|
{record.attachments.map((item: any, index: number) => {
|
||||||
|
if (item.type && item.type.includes('image')) {
|
||||||
|
return (
|
||||||
|
<Image
|
||||||
|
key={index}
|
||||||
|
width={40}
|
||||||
|
height={30}
|
||||||
|
src={item.url}
|
||||||
|
style={{
|
||||||
|
marginRight: 8,
|
||||||
|
marginBottom: 8,
|
||||||
|
objectFit: 'cover',
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
} else if (item.type && item.type.includes('video')) {
|
||||||
|
return (
|
||||||
|
<video
|
||||||
|
key={index}
|
||||||
|
width={40}
|
||||||
|
height={30}
|
||||||
|
controls
|
||||||
|
style={{
|
||||||
|
marginRight: 8,
|
||||||
|
marginBottom: 8,
|
||||||
|
objectFit: 'cover',
|
||||||
|
}}
|
||||||
|
src={item.url}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
MyColumns.EnumTag({
|
||||||
|
title: '分配状态',
|
||||||
|
dataIndex: 'assign_status',
|
||||||
|
valueEnum: HouseWorkOrdersAssignStatusEnum,
|
||||||
|
}),
|
||||||
|
MyColumns.EnumTag({
|
||||||
|
title: '优先级',
|
||||||
|
dataIndex: 'level',
|
||||||
|
valueEnum: HouseWorkOrdersLevelEnum,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
title: '处理人',
|
||||||
|
dataIndex: ['assign_employee', 'name'],
|
||||||
|
search: false,
|
||||||
|
render: (_, record) => {
|
||||||
|
return `${record?.assign_employee?.name || ''}-${
|
||||||
|
record?.assign_employee?.phone || ''
|
||||||
|
}`;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
MyColumns.CreatedAt(),
|
||||||
|
MyColumns.Option({
|
||||||
|
render: (_, item: any, index, action) => (
|
||||||
|
<Space key={index}>
|
||||||
|
<ComplaintShow
|
||||||
|
item={item}
|
||||||
|
title="详情"
|
||||||
|
reload={action?.reload}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{item.assign_status === 'Unassigned' && (
|
||||||
|
<ComplaintAssign
|
||||||
|
item={item}
|
||||||
|
reload={action?.reload}
|
||||||
|
title="分配"
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
<MyButtons.Delete
|
||||||
|
onConfirm={() =>
|
||||||
|
Apis.WorkOrder.HouseWorkOrders.SoftDelete({
|
||||||
|
id: item.id,
|
||||||
|
}).then(() => action?.reload())
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</Space>
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</MyPageContainer>
|
||||||
|
);
|
||||||
|
}
|
||||||
88
src/pages/complaint/modals/ComplaintAssign.tsx
Normal file
88
src/pages/complaint/modals/ComplaintAssign.tsx
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
import {
|
||||||
|
MyBetaModalFormProps,
|
||||||
|
MyButtons,
|
||||||
|
MyFormItems,
|
||||||
|
MyModalFormProps,
|
||||||
|
rulesHelper,
|
||||||
|
} from '@/common';
|
||||||
|
import { Selects } from '@/components/Select';
|
||||||
|
import { Apis } from '@/gen/Apis';
|
||||||
|
import { HouseWorkOrdersLevelEnum } from '@/gen/Enums';
|
||||||
|
import { BetaSchemaForm } from '@ant-design/pro-components';
|
||||||
|
import { Form, message } from 'antd';
|
||||||
|
|
||||||
|
export default function WorkOrderAssign(
|
||||||
|
props: MyBetaModalFormProps & { item: any },
|
||||||
|
) {
|
||||||
|
const [form] = Form.useForm();
|
||||||
|
return (
|
||||||
|
<BetaSchemaForm<ApiTypes.WorkOrder.HouseWorkOrders.Assign>
|
||||||
|
{...MyModalFormProps.props}
|
||||||
|
title={`派发工单`}
|
||||||
|
wrapperCol={{ span: 24 }}
|
||||||
|
width="500px"
|
||||||
|
trigger={<MyButtons.Edit title={`派发`} />}
|
||||||
|
key={new Date().getTime()}
|
||||||
|
form={form}
|
||||||
|
request={async () => {
|
||||||
|
const res = await Apis.WorkOrder.HouseWorkOrders.Show({
|
||||||
|
id: props.item.id,
|
||||||
|
});
|
||||||
|
return {
|
||||||
|
title: res.data.title,
|
||||||
|
assign_employee_id: res.data.assign_employee_id,
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
onFinish={async (values) =>
|
||||||
|
Apis.WorkOrder.HouseWorkOrders.Assign({
|
||||||
|
...values,
|
||||||
|
id: props.item.id,
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
props.reload?.();
|
||||||
|
message.success('指派工单成功');
|
||||||
|
return true;
|
||||||
|
})
|
||||||
|
.catch(() => false)
|
||||||
|
}
|
||||||
|
columns={[
|
||||||
|
{
|
||||||
|
key: 'content',
|
||||||
|
title: '工单描述',
|
||||||
|
colProps: { span: 24 },
|
||||||
|
readonly: true,
|
||||||
|
fieldProps: {
|
||||||
|
disabled: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
MyFormItems.EnumRadio({
|
||||||
|
key: 'level',
|
||||||
|
title: '优先级',
|
||||||
|
colProps: { span: 24 },
|
||||||
|
valueEnum: HouseWorkOrdersLevelEnum,
|
||||||
|
required: true,
|
||||||
|
}),
|
||||||
|
Selects?.Employees({
|
||||||
|
title: '选择处理人',
|
||||||
|
key: 'assign_employees_id',
|
||||||
|
colProps: { span: 24 },
|
||||||
|
formItemProps: { ...rulesHelper.text },
|
||||||
|
params: {
|
||||||
|
companies_id: props.item.companies_id,
|
||||||
|
},
|
||||||
|
required: true,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
key: 'assign_remark',
|
||||||
|
title: '指派备注',
|
||||||
|
valueType: 'textarea',
|
||||||
|
colProps: { span: 24 },
|
||||||
|
fieldProps: {
|
||||||
|
rows: 3,
|
||||||
|
placeholder: '请输入指派备注(可选)',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
251
src/pages/complaint/modals/ComplaintShow.tsx
Normal file
251
src/pages/complaint/modals/ComplaintShow.tsx
Normal file
@ -0,0 +1,251 @@
|
|||||||
|
import { MyButtons } from '@/common';
|
||||||
|
import { Apis } from '@/gen/Apis';
|
||||||
|
import {
|
||||||
|
HouseWorkOrdersAssignStatusEnum,
|
||||||
|
HouseWorkOrdersLevelEnum,
|
||||||
|
HouseWorkOrdersStatusEnum,
|
||||||
|
} from '@/gen/Enums';
|
||||||
|
import { ProDescriptions } from '@ant-design/pro-components';
|
||||||
|
import { Image, Modal, Space, Tag } from 'antd';
|
||||||
|
import { useState } from 'react';
|
||||||
|
import WorkLogsList from '../components/WorkLogsLIst';
|
||||||
|
import WorkOrderAssign from './ComplaintAssign';
|
||||||
|
|
||||||
|
interface WorkOrderShowProps {
|
||||||
|
item: any;
|
||||||
|
title?: string;
|
||||||
|
reload?: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function ComplaintShow({
|
||||||
|
item,
|
||||||
|
title = '投诉详情',
|
||||||
|
reload,
|
||||||
|
}: WorkOrderShowProps) {
|
||||||
|
const [open, setOpen] = useState(false);
|
||||||
|
const [data, setData] = useState<any>(null);
|
||||||
|
|
||||||
|
const handleOpen = async () => {
|
||||||
|
try {
|
||||||
|
const res = await Apis.WorkOrder.HouseWorkOrders.Show({ id: item.id });
|
||||||
|
setData(res.data);
|
||||||
|
setOpen(true);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('获取投诉详情失败:', error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<MyButtons.Default onClick={handleOpen} title={title} />
|
||||||
|
<Modal
|
||||||
|
title={title}
|
||||||
|
open={open}
|
||||||
|
onCancel={() => setOpen(false)}
|
||||||
|
footer={null}
|
||||||
|
width={800}
|
||||||
|
>
|
||||||
|
{data && (
|
||||||
|
<>
|
||||||
|
<ProDescriptions
|
||||||
|
column={2}
|
||||||
|
dataSource={data}
|
||||||
|
columns={[
|
||||||
|
// {
|
||||||
|
// title: '工单类型',
|
||||||
|
// dataIndex: 'type',
|
||||||
|
// span: 1,
|
||||||
|
// render: (_, record) => (
|
||||||
|
// <Tag color="blue">
|
||||||
|
// {HouseWorkOrdersTypeEnum[
|
||||||
|
// record.type as keyof typeof HouseWorkOrdersTypeEnum
|
||||||
|
// ]?.text || record.type}
|
||||||
|
// </Tag>
|
||||||
|
// ),
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// title: '报修位置',
|
||||||
|
// dataIndex: 'location',
|
||||||
|
// span: 1,
|
||||||
|
// render: (_, record) => {
|
||||||
|
// const locationConfig =
|
||||||
|
// HouseWorkOrdersLocationEnum[
|
||||||
|
// record.location as keyof typeof HouseWorkOrdersLocationEnum
|
||||||
|
// ];
|
||||||
|
|
||||||
|
// return <Tag>{locationConfig?.text || record.location}</Tag>;
|
||||||
|
// },
|
||||||
|
// },
|
||||||
|
|
||||||
|
{
|
||||||
|
title: 'ID',
|
||||||
|
dataIndex: 'id',
|
||||||
|
span: 1,
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
title: '投诉描述',
|
||||||
|
dataIndex: 'content',
|
||||||
|
span: 2,
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
title: '投诉状态',
|
||||||
|
dataIndex: 'status',
|
||||||
|
span: 1,
|
||||||
|
render: (_, record) => {
|
||||||
|
const statusConfig =
|
||||||
|
HouseWorkOrdersStatusEnum[
|
||||||
|
record.status as keyof typeof HouseWorkOrdersStatusEnum
|
||||||
|
];
|
||||||
|
const color =
|
||||||
|
record.status === 'Completed'
|
||||||
|
? 'green'
|
||||||
|
: record.status === 'InProgress'
|
||||||
|
? 'blue'
|
||||||
|
: 'default';
|
||||||
|
return (
|
||||||
|
<Tag color={color}>
|
||||||
|
{statusConfig?.text || record.status}
|
||||||
|
</Tag>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '分配状态',
|
||||||
|
dataIndex: 'assign_status',
|
||||||
|
span: 1,
|
||||||
|
render: (_, record) => {
|
||||||
|
const assignConfig =
|
||||||
|
HouseWorkOrdersAssignStatusEnum[
|
||||||
|
record.assign_status as keyof typeof HouseWorkOrdersAssignStatusEnum
|
||||||
|
];
|
||||||
|
const color =
|
||||||
|
record.assign_status === 'Assigned' ? 'green' : 'orange';
|
||||||
|
return (
|
||||||
|
<Tag color={color}>
|
||||||
|
{assignConfig?.text || record.assign_status}
|
||||||
|
</Tag>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '优先级',
|
||||||
|
dataIndex: 'level',
|
||||||
|
span: 1,
|
||||||
|
render: (_, record) => {
|
||||||
|
const levelConfig =
|
||||||
|
HouseWorkOrdersLevelEnum[
|
||||||
|
record.level as keyof typeof HouseWorkOrdersLevelEnum
|
||||||
|
];
|
||||||
|
return <Tag>{levelConfig?.text || record.level}</Tag>;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '处理人',
|
||||||
|
dataIndex: 'assign_employee_name',
|
||||||
|
span: 1,
|
||||||
|
render: (_, record) => {
|
||||||
|
const assigneeInfo = record?.assign_employee
|
||||||
|
? `${record.assign_employee.name || ''}-${
|
||||||
|
record.assign_employee.phone || ''
|
||||||
|
}`
|
||||||
|
: '未分配';
|
||||||
|
return (
|
||||||
|
<Space>
|
||||||
|
<span>{assigneeInfo}</span>
|
||||||
|
<WorkOrderAssign
|
||||||
|
item={item}
|
||||||
|
reload={handleOpen}
|
||||||
|
title="重新分配"
|
||||||
|
/>
|
||||||
|
</Space>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
title: '创建时间',
|
||||||
|
dataIndex: 'created_at',
|
||||||
|
span: 1,
|
||||||
|
valueType: 'dateTime',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '更新时间',
|
||||||
|
dataIndex: 'updated_at',
|
||||||
|
span: 1,
|
||||||
|
valueType: 'dateTime',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '相关附件',
|
||||||
|
dataIndex: 'attachments',
|
||||||
|
span: 2,
|
||||||
|
render: (_, record) => {
|
||||||
|
// 检查attachments是否为数组且有数据
|
||||||
|
if (
|
||||||
|
!Array.isArray(record.attachments) ||
|
||||||
|
record.attachments.length === 0
|
||||||
|
) {
|
||||||
|
return '无附件';
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
display: 'flex',
|
||||||
|
flexWrap: 'wrap',
|
||||||
|
marginRight: 10,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{record.attachments.map((item: any, index: number) => {
|
||||||
|
if (item.type && item.type.includes('image')) {
|
||||||
|
return (
|
||||||
|
<Image
|
||||||
|
key={index}
|
||||||
|
width={120}
|
||||||
|
height={90}
|
||||||
|
src={item.url}
|
||||||
|
style={{
|
||||||
|
marginRight: 8,
|
||||||
|
marginBottom: 8,
|
||||||
|
objectFit: 'cover',
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
} else if (item.type && item.type.includes('video')) {
|
||||||
|
return (
|
||||||
|
<video
|
||||||
|
key={index}
|
||||||
|
width={120}
|
||||||
|
height={90}
|
||||||
|
controls
|
||||||
|
style={{
|
||||||
|
marginRight: 8,
|
||||||
|
marginBottom: 8,
|
||||||
|
objectFit: 'cover',
|
||||||
|
}}
|
||||||
|
src={item.url}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
{/* <Divider orientation="left">处理记录</Divider> */}
|
||||||
|
<WorkLogsList
|
||||||
|
workOrderId={data.id}
|
||||||
|
reload={() => {
|
||||||
|
handleOpen();
|
||||||
|
reload?.();
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</Modal>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -1,6 +1,10 @@
|
|||||||
import { MyBetaModalFormProps, MyColumns, MyProTableProps } from '@/common';
|
import { MyBetaModalFormProps, MyColumns, MyProTableProps } from '@/common';
|
||||||
import { Apis } from '@/gen/Apis';
|
import { Apis } from '@/gen/Apis';
|
||||||
import { HouseMeterReadingsOperationTypeEnum } from '@/gen/Enums';
|
import {
|
||||||
|
HouseOccupantsHouseRelationEnum,
|
||||||
|
HouseOccupantsRelationWithOwnerEnum,
|
||||||
|
HouseOccupantsStatusEnum,
|
||||||
|
} from '@/gen/Enums';
|
||||||
import { ProTable } from '@ant-design/pro-components';
|
import { ProTable } from '@ant-design/pro-components';
|
||||||
|
|
||||||
export default function Index(props: MyBetaModalFormProps) {
|
export default function Index(props: MyBetaModalFormProps) {
|
||||||
@ -16,45 +20,49 @@ export default function Index(props: MyBetaModalFormProps) {
|
|||||||
Apis.Archive.HouseOccupants.CustomerHouseByPhone,
|
Apis.Archive.HouseOccupants.CustomerHouseByPhone,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
// search={false}
|
search={false}
|
||||||
// options={false}
|
options={false}
|
||||||
columns={[
|
columns={[
|
||||||
|
{
|
||||||
|
title: '关联房屋',
|
||||||
|
dataIndex: ['asset_house', 'full_name'],
|
||||||
|
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
MyColumns.EnumTag({
|
MyColumns.EnumTag({
|
||||||
title: '操作类型',
|
title: '状态',
|
||||||
dataIndex: 'operation_type',
|
dataIndex: 'status',
|
||||||
valueEnum: HouseMeterReadingsOperationTypeEnum,
|
valueEnum: HouseOccupantsStatusEnum,
|
||||||
|
}),
|
||||||
|
MyColumns.EnumTag({
|
||||||
|
title: '房客关系',
|
||||||
|
dataIndex: 'house_relation',
|
||||||
|
valueEnum: HouseOccupantsHouseRelationEnum,
|
||||||
|
search: false,
|
||||||
|
}),
|
||||||
|
MyColumns.EnumTag({
|
||||||
|
title: '与产权人关系',
|
||||||
|
dataIndex: 'relation_with_owner',
|
||||||
|
valueEnum: HouseOccupantsRelationWithOwnerEnum,
|
||||||
|
search: false,
|
||||||
}),
|
}),
|
||||||
{
|
{
|
||||||
title: '抄表读数',
|
title: '入住日期',
|
||||||
dataIndex: 'current_reading',
|
dataIndex: 'is_live_in',
|
||||||
|
render(_, record) {
|
||||||
|
return `${record?.move_in_date || '未入住'}`;
|
||||||
|
},
|
||||||
search: false,
|
search: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '抄表用量',
|
title: '退房日期',
|
||||||
dataIndex: 'usage_amount',
|
dataIndex: 'move_out_date',
|
||||||
search: false,
|
render(_, record) {
|
||||||
},
|
return `${record?.move_out_date || '-'}`;
|
||||||
{
|
},
|
||||||
title: '抄表时间',
|
|
||||||
dataIndex: 'reading_time',
|
|
||||||
search: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '抄表人',
|
|
||||||
dataIndex: ['company_employee', 'name'],
|
|
||||||
search: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '备注',
|
|
||||||
dataIndex: 'remark',
|
|
||||||
search: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '账单状态',
|
|
||||||
dataIndex: 'bill_status',
|
|
||||||
render: (value) => (value ? '已生成' : '未生成'),
|
|
||||||
search: false,
|
search: false,
|
||||||
},
|
},
|
||||||
|
|
||||||
// MyColumns.Option({
|
// MyColumns.Option({
|
||||||
// render: (_, item: any, index, action) => (
|
// render: (_, item: any, index, action) => (
|
||||||
// <Space key={index}>
|
// <Space key={index}>
|
||||||
|
|||||||
@ -14,7 +14,7 @@ export default function Show({ title = '客户档案' }) {
|
|||||||
// 注册标签页
|
// 注册标签页
|
||||||
const { addTab } = usePageTabs({
|
const { addTab } = usePageTabs({
|
||||||
tabKey: `customer-detail-${id}`,
|
tabKey: `customer-detail-${id}`,
|
||||||
tabLabel: `${data?.name}档案` || title,
|
tabLabel: `客户:${data?.name}` || title,
|
||||||
});
|
});
|
||||||
|
|
||||||
const loadShow = () => {
|
const loadShow = () => {
|
||||||
@ -56,7 +56,12 @@ export default function Show({ title = '客户档案' }) {
|
|||||||
<MyPageContainer title={title}>
|
<MyPageContainer title={title}>
|
||||||
<CustomerInfo item={data} reload={loadShow} />
|
<CustomerInfo item={data} reload={loadShow} />
|
||||||
<ProCard style={{ marginTop: 16 }}>
|
<ProCard style={{ marginTop: 16 }}>
|
||||||
<Tabs type="card" items={items} defaultActiveKey="1" size="small" />
|
<Tabs
|
||||||
|
type="card"
|
||||||
|
items={data?.id ? items : []}
|
||||||
|
defaultActiveKey="1"
|
||||||
|
size="small"
|
||||||
|
/>
|
||||||
</ProCard>
|
</ProCard>
|
||||||
</MyPageContainer>
|
</MyPageContainer>
|
||||||
);
|
);
|
||||||
|
|||||||
111
src/pages/meter/bills/index.tsx
Normal file
111
src/pages/meter/bills/index.tsx
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
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 { useNavigate } from '@umijs/max';
|
||||||
|
import { Space } from 'antd';
|
||||||
|
|
||||||
|
export default function Index({ title = '仪表账单' }) {
|
||||||
|
const navigate = useNavigate();
|
||||||
|
|
||||||
|
// 注册当前页面为标签页
|
||||||
|
usePageTabs({
|
||||||
|
tabKey: 'house_meter_bills',
|
||||||
|
tabLabel: title,
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<MyPageContainer
|
||||||
|
title={title}
|
||||||
|
enableTabs={true}
|
||||||
|
tabKey="house_meter_bills"
|
||||||
|
tabLabel={title}
|
||||||
|
>
|
||||||
|
<ProTable
|
||||||
|
{...MyProTableProps.props}
|
||||||
|
request={async (params, sort) =>
|
||||||
|
MyProTableProps.request(
|
||||||
|
params,
|
||||||
|
sort,
|
||||||
|
Apis.Meter.HouseMeterTaskDetails.List,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
// toolBarRender={(action) => [
|
||||||
|
// <TaskCreate key="Create" reload={action?.reload} title="账单任务" />,
|
||||||
|
// ]}
|
||||||
|
columns={[
|
||||||
|
MyColumns.ID(),
|
||||||
|
{
|
||||||
|
title: '仪表名称',
|
||||||
|
dataIndex: ['meter_data', 'name'],
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '关联房屋',
|
||||||
|
dataIndex: 'full_name',
|
||||||
|
search: false,
|
||||||
|
render: (_, record) => (
|
||||||
|
<MyButtons.View
|
||||||
|
title={record.full_name}
|
||||||
|
type="link"
|
||||||
|
onClick={() => {
|
||||||
|
navigate(`/bills/summary/show/${record.asset_houses_id}`);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
MyColumns.EnumTag({
|
||||||
|
title: '状态',
|
||||||
|
dataIndex: 'status',
|
||||||
|
valueEnum: HouseChargeTaskDetailsStatusEnum,
|
||||||
|
}),
|
||||||
|
|
||||||
|
{
|
||||||
|
title: '收费标准',
|
||||||
|
dataIndex: ['charge_standard', 'name'],
|
||||||
|
render: (_, record) => {
|
||||||
|
return `【${record.charge_standard.id}】${record.charge_standard.name}`;
|
||||||
|
},
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '账单月份',
|
||||||
|
render: (_, record) => {
|
||||||
|
return `${record.year}-${String(record.month).padStart(2, '0')}`;
|
||||||
|
},
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '完成时间',
|
||||||
|
dataIndex: 'processed_time',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
MyColumns.Option({
|
||||||
|
render: (_, item: any, index, action) => (
|
||||||
|
<Space key={index}>
|
||||||
|
<MyButtons.Default
|
||||||
|
title="重新执行"
|
||||||
|
type="link"
|
||||||
|
color="primary"
|
||||||
|
isConfirm
|
||||||
|
description="确认执行此任务吗?"
|
||||||
|
onConfirm={() =>
|
||||||
|
Apis.Meter.HouseMeterTaskDetails.CreateMeterBill({
|
||||||
|
id: item.id,
|
||||||
|
}).then(() => action?.reload())
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</Space>
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</MyPageContainer>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -44,17 +44,36 @@ export default function Index({ title = '仪表管理' }) {
|
|||||||
toolBarRender={(action) => [
|
toolBarRender={(action) => [
|
||||||
<MyImportModal
|
<MyImportModal
|
||||||
key="ImportHouse"
|
key="ImportHouse"
|
||||||
title="批量导入"
|
title="导入仪表"
|
||||||
type="danger"
|
type="danger"
|
||||||
size="middle"
|
size="middle"
|
||||||
templateApi={Apis.Meter.HouseMeters.DownloadTemplate}
|
templateApi={Apis.Meter.HouseMeters.DownloadTemplate}
|
||||||
importApi={Apis.Meter.HouseMeters.Import}
|
importApi={Apis.Meter.HouseMeters.Import}
|
||||||
reload={action?.reload}
|
reload={action?.reload}
|
||||||
/>,
|
/>,
|
||||||
|
<MyImportModal
|
||||||
|
key="ImportHouse"
|
||||||
|
title="导入关联房屋"
|
||||||
|
type="danger"
|
||||||
|
size="middle"
|
||||||
|
templateApi={Apis.Meter.HouseMeterHasHouses.DownloadTemplate}
|
||||||
|
importApi={Apis.Meter.HouseMeterHasHouses.Import}
|
||||||
|
reload={action?.reload}
|
||||||
|
/>,
|
||||||
<CompanyCreate key="Create" reload={action?.reload} title={title} />,
|
<CompanyCreate key="Create" reload={action?.reload} title={title} />,
|
||||||
]}
|
]}
|
||||||
columns={[
|
columns={[
|
||||||
MyColumns.ID(),
|
MyColumns.ID(),
|
||||||
|
{
|
||||||
|
title: '机构',
|
||||||
|
dataIndex: ['company', 'name'],
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '项目',
|
||||||
|
dataIndex: ['asset_project', 'name'],
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
MyColumns.EnumTag({
|
MyColumns.EnumTag({
|
||||||
title: '类型',
|
title: '类型',
|
||||||
dataIndex: 'meter_type',
|
dataIndex: 'meter_type',
|
||||||
@ -76,6 +95,11 @@ export default function Index({ title = '仪表管理' }) {
|
|||||||
dataIndex: ['charge_standard', 'name'],
|
dataIndex: ['charge_standard', 'name'],
|
||||||
search: false,
|
search: false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: '关联房屋数',
|
||||||
|
dataIndex: 'house_meter_has_houses_count',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: '初始抄表读数',
|
title: '初始抄表读数',
|
||||||
dataIndex: 'initial_value',
|
dataIndex: 'initial_value',
|
||||||
@ -96,6 +120,7 @@ export default function Index({ title = '仪表管理' }) {
|
|||||||
dataIndex: 'latest_time',
|
dataIndex: 'latest_time',
|
||||||
search: false,
|
search: false,
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
title: '备注',
|
title: '备注',
|
||||||
dataIndex: 'remark',
|
dataIndex: 'remark',
|
||||||
|
|||||||
@ -7,6 +7,7 @@ import { useEffect, useState } from 'react';
|
|||||||
import MeteInfo from '../components/MeteInfo';
|
import MeteInfo from '../components/MeteInfo';
|
||||||
import HasHouse from '../table/HasHouse';
|
import HasHouse from '../table/HasHouse';
|
||||||
import ReadingLIst from '../table/ReadingLIst';
|
import ReadingLIst from '../table/ReadingLIst';
|
||||||
|
import Tasks from '../table/Tasks';
|
||||||
|
|
||||||
export default function Show({ title = '仪表详情' }) {
|
export default function Show({ title = '仪表详情' }) {
|
||||||
const { id } = useParams<{ id: string }>();
|
const { id } = useParams<{ id: string }>();
|
||||||
@ -58,6 +59,12 @@ export default function Show({ title = '仪表详情' }) {
|
|||||||
closable: false,
|
closable: false,
|
||||||
children: <HasHouse item={{ ...data, id: id }} />,
|
children: <HasHouse item={{ ...data, id: id }} />,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: '仪表任务',
|
||||||
|
key: '3',
|
||||||
|
closable: false,
|
||||||
|
children: <Tasks item={{ ...data, id: id }} />,
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@ -10,7 +10,6 @@ import { ProTable } from '@ant-design/pro-components';
|
|||||||
import { Space } from 'antd';
|
import { Space } from 'antd';
|
||||||
import MeterHasHouse from '../../list/modals/MeterHasHouse';
|
import MeterHasHouse from '../../list/modals/MeterHasHouse';
|
||||||
import MeterHasOne from '../../list/modals/MeterHasOne';
|
import MeterHasOne from '../../list/modals/MeterHasOne';
|
||||||
import NormalReading from '../modals/NormalReading';
|
|
||||||
|
|
||||||
export default function Index(props: MyBetaModalFormProps) {
|
export default function Index(props: MyBetaModalFormProps) {
|
||||||
return (
|
return (
|
||||||
@ -25,12 +24,6 @@ export default function Index(props: MyBetaModalFormProps) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
toolBarRender={(action) => [
|
toolBarRender={(action) => [
|
||||||
<NormalReading
|
|
||||||
key="Create"
|
|
||||||
reload={action?.reload}
|
|
||||||
item={props?.item}
|
|
||||||
title="抄表"
|
|
||||||
/>,
|
|
||||||
...(props?.item?.meter_type ===
|
...(props?.item?.meter_type ===
|
||||||
HouseMetersMeterTypeEnum.HouseMeter.value
|
HouseMetersMeterTypeEnum.HouseMeter.value
|
||||||
? [
|
? [
|
||||||
|
|||||||
111
src/pages/meter/readings/table/Tasks.tsx
Normal file
111
src/pages/meter/readings/table/Tasks.tsx
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
import {
|
||||||
|
MyBetaModalFormProps,
|
||||||
|
MyButtons,
|
||||||
|
MyColumns,
|
||||||
|
MyProTableProps,
|
||||||
|
} from '@/common';
|
||||||
|
import { Apis } from '@/gen/Apis';
|
||||||
|
import { HouseChargeTaskDetailsStatusEnum } from '@/gen/Enums';
|
||||||
|
import { ProTable } from '@ant-design/pro-components';
|
||||||
|
import { useNavigate } from '@umijs/max';
|
||||||
|
import { Space } from 'antd';
|
||||||
|
|
||||||
|
export default function Index(props: MyBetaModalFormProps) {
|
||||||
|
const navigate = useNavigate();
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<ProTable
|
||||||
|
{...MyProTableProps.props}
|
||||||
|
request={async (params, sort) =>
|
||||||
|
MyProTableProps.request(
|
||||||
|
{ ...params, id: props?.item?.id },
|
||||||
|
sort,
|
||||||
|
Apis.Meter.HouseMeterTaskDetails.List,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
// toolBarRender={(action) => [
|
||||||
|
// <NormalReading
|
||||||
|
// key="Create"
|
||||||
|
// reload={action?.reload}
|
||||||
|
// item={props?.item}
|
||||||
|
// title="抄表"
|
||||||
|
// />,
|
||||||
|
// <ResetReading
|
||||||
|
// key="Reset"
|
||||||
|
// reload={action?.reload}
|
||||||
|
// item={props?.item}
|
||||||
|
// title="重置"
|
||||||
|
// />,
|
||||||
|
// ]}
|
||||||
|
// search={false}
|
||||||
|
// options={false}
|
||||||
|
columns={[
|
||||||
|
MyColumns.ID(),
|
||||||
|
{
|
||||||
|
title: '仪表名称',
|
||||||
|
dataIndex: ['meter_data', 'name'],
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '关联房屋',
|
||||||
|
dataIndex: 'full_name',
|
||||||
|
search: false,
|
||||||
|
render: (_, record) => (
|
||||||
|
<MyButtons.View
|
||||||
|
title={record.full_name}
|
||||||
|
type="link"
|
||||||
|
onClick={() => {
|
||||||
|
navigate(`/bills/summary/show/${record.asset_houses_id}`);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
MyColumns.EnumTag({
|
||||||
|
title: '状态',
|
||||||
|
dataIndex: 'status',
|
||||||
|
valueEnum: HouseChargeTaskDetailsStatusEnum,
|
||||||
|
}),
|
||||||
|
|
||||||
|
{
|
||||||
|
title: '收费标准',
|
||||||
|
dataIndex: ['charge_standard', 'name'],
|
||||||
|
render: (_, record) => {
|
||||||
|
return `【${record.charge_standard.id}】${record.charge_standard.name}`;
|
||||||
|
},
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '账单月份',
|
||||||
|
render: (_, record) => {
|
||||||
|
return `${record.year}-${String(record.month).padStart(2, '0')}`;
|
||||||
|
},
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '完成时间',
|
||||||
|
dataIndex: 'processed_time',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
MyColumns.Option({
|
||||||
|
render: (_, item: any, index, action) => (
|
||||||
|
<Space key={index}>
|
||||||
|
<MyButtons.Default
|
||||||
|
title="重新执行"
|
||||||
|
type="link"
|
||||||
|
color="primary"
|
||||||
|
isConfirm
|
||||||
|
description="确认执行此任务吗?"
|
||||||
|
onConfirm={() =>
|
||||||
|
Apis.HouseCharage.HouseChargeTaskDetails.CreateHouseBill({
|
||||||
|
id: item.id,
|
||||||
|
}).then(() => action?.reload())
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</Space>
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -15,7 +15,7 @@ import { Space } from 'antd';
|
|||||||
import TaskCreate from './modals/TaskCreate';
|
import TaskCreate from './modals/TaskCreate';
|
||||||
import TaskShow from './modals/TaskShow';
|
import TaskShow from './modals/TaskShow';
|
||||||
|
|
||||||
export default function Index({ title = '仪表账单' }) {
|
export default function Index({ title = '仪表任务' }) {
|
||||||
// 注册当前页面为标签页
|
// 注册当前页面为标签页
|
||||||
usePageTabs({
|
usePageTabs({
|
||||||
tabKey: 'house_meter_tasks',
|
tabKey: 'house_meter_tasks',
|
||||||
@ -35,7 +35,7 @@ export default function Index({ title = '仪表账单' }) {
|
|||||||
MyProTableProps.request(params, sort, Apis.Meter.HouseMeterTasks.List)
|
MyProTableProps.request(params, sort, Apis.Meter.HouseMeterTasks.List)
|
||||||
}
|
}
|
||||||
toolBarRender={(action) => [
|
toolBarRender={(action) => [
|
||||||
<TaskCreate key="Create" reload={action?.reload} title="账单任务" />,
|
<TaskCreate key="Create" reload={action?.reload} title="仪表任务" />,
|
||||||
]}
|
]}
|
||||||
columns={[
|
columns={[
|
||||||
MyColumns.ID(),
|
MyColumns.ID(),
|
||||||
@ -95,7 +95,6 @@ export default function Index({ title = '仪表账单' }) {
|
|||||||
render: (_, item: any, index, action) => (
|
render: (_, item: any, index, action) => (
|
||||||
<Space key={index}>
|
<Space key={index}>
|
||||||
<TaskShow item={item} title="查看" reload={action?.reload} />
|
<TaskShow item={item} title="查看" reload={action?.reload} />
|
||||||
|
|
||||||
<MyButtons.Default
|
<MyButtons.Default
|
||||||
title={
|
title={
|
||||||
item.status ===
|
item.status ===
|
||||||
|
|||||||
@ -208,6 +208,9 @@ export default function Create(props: MyBetaModalFormProps) {
|
|||||||
key: 'data_id',
|
key: 'data_id',
|
||||||
colProps: { span: 24 },
|
colProps: { span: 24 },
|
||||||
formItemProps: { ...rulesHelper.text },
|
formItemProps: { ...rulesHelper.text },
|
||||||
|
fieldProps: {
|
||||||
|
showSearch: true,
|
||||||
|
},
|
||||||
}),
|
}),
|
||||||
]
|
]
|
||||||
: [];
|
: [];
|
||||||
|
|||||||
@ -1,10 +1,18 @@
|
|||||||
import { MyBetaModalFormProps, MyColumns, MyProTableProps } from '@/common';
|
import {
|
||||||
|
MyBetaModalFormProps,
|
||||||
|
MyButtons,
|
||||||
|
MyColumns,
|
||||||
|
MyProTableProps,
|
||||||
|
} from '@/common';
|
||||||
import { MyModal } from '@/components/MyModal';
|
import { MyModal } from '@/components/MyModal';
|
||||||
import { Apis } from '@/gen/Apis';
|
import { Apis } from '@/gen/Apis';
|
||||||
import { HouseChargeTaskDetailsStatusEnum } from '@/gen/Enums';
|
import { HouseChargeTaskDetailsStatusEnum } from '@/gen/Enums';
|
||||||
import { ProTable } from '@ant-design/pro-components';
|
import { ProTable } from '@ant-design/pro-components';
|
||||||
|
import { useNavigate } from '@umijs/max';
|
||||||
|
import { Space } from 'antd';
|
||||||
|
|
||||||
export default function AssetInfo(props: MyBetaModalFormProps) {
|
export default function TaskShow(props: MyBetaModalFormProps) {
|
||||||
|
const navigate = useNavigate();
|
||||||
return (
|
return (
|
||||||
<MyModal
|
<MyModal
|
||||||
title={props.title || '查看'}
|
title={props.title || '查看'}
|
||||||
@ -20,12 +28,27 @@ export default function AssetInfo(props: MyBetaModalFormProps) {
|
|||||||
Apis.Meter.HouseMeterTaskDetails.List,
|
Apis.Meter.HouseMeterTaskDetails.List,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
options={false}
|
||||||
columns={[
|
columns={[
|
||||||
MyColumns.ID(),
|
MyColumns.ID(),
|
||||||
{
|
{
|
||||||
title: '对象',
|
title: '仪表名称',
|
||||||
|
dataIndex: ['meter_data', 'name'],
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '关联房屋',
|
||||||
dataIndex: 'full_name',
|
dataIndex: 'full_name',
|
||||||
search: false,
|
search: false,
|
||||||
|
render: (_, record) => (
|
||||||
|
<MyButtons.View
|
||||||
|
title={record.full_name}
|
||||||
|
type="link"
|
||||||
|
onClick={() => {
|
||||||
|
navigate(`/bills/summary/show/${record.asset_houses_id}`);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
MyColumns.EnumTag({
|
MyColumns.EnumTag({
|
||||||
title: '状态',
|
title: '状态',
|
||||||
@ -35,7 +58,10 @@ export default function AssetInfo(props: MyBetaModalFormProps) {
|
|||||||
|
|
||||||
{
|
{
|
||||||
title: '收费标准',
|
title: '收费标准',
|
||||||
dataIndex: ['house_charge_task', 'house_charge_standard', 'name'],
|
dataIndex: ['charge_standard', 'name'],
|
||||||
|
render: (_, record) => {
|
||||||
|
return `【${record.charge_standard.id}】${record.charge_standard.name}`;
|
||||||
|
},
|
||||||
search: false,
|
search: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -46,14 +72,6 @@ export default function AssetInfo(props: MyBetaModalFormProps) {
|
|||||||
'0',
|
'0',
|
||||||
)}`;
|
)}`;
|
||||||
},
|
},
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '计费周期',
|
|
||||||
render: (_, record) => {
|
|
||||||
return `${record.house_charge_task.start_date} 至 ${String(
|
|
||||||
record.house_charge_task.end_date,
|
|
||||||
).padStart(2, '0')}`;
|
|
||||||
},
|
|
||||||
search: false,
|
search: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -61,6 +79,24 @@ export default function AssetInfo(props: MyBetaModalFormProps) {
|
|||||||
dataIndex: 'processed_time',
|
dataIndex: 'processed_time',
|
||||||
search: false,
|
search: false,
|
||||||
},
|
},
|
||||||
|
MyColumns.Option({
|
||||||
|
render: (_, item: any, index, action) => (
|
||||||
|
<Space key={index}>
|
||||||
|
<MyButtons.Default
|
||||||
|
title="重新执行"
|
||||||
|
type="link"
|
||||||
|
color="primary"
|
||||||
|
isConfirm
|
||||||
|
description="确认执行此任务吗?"
|
||||||
|
onConfirm={() =>
|
||||||
|
Apis.HouseCharage.HouseChargeTaskDetails.CreateHouseBill({
|
||||||
|
id: item.id,
|
||||||
|
}).then(() => action?.reload())
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</Space>
|
||||||
|
),
|
||||||
|
}),
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import { Space } from 'antd';
|
|||||||
import Create from './modals/Create';
|
import Create from './modals/Create';
|
||||||
import Update from './modals/Update';
|
import Update from './modals/Update';
|
||||||
|
|
||||||
export default function Index({ title = '朋友圈分类' }) {
|
export default function Index({ title = '内容分类' }) {
|
||||||
// 注册当前页面为标签页
|
// 注册当前页面为标签页
|
||||||
usePageTabs({
|
usePageTabs({
|
||||||
tabKey: 'moments-classification',
|
tabKey: 'moments-classification',
|
||||||
|
|||||||
@ -7,8 +7,9 @@ import {
|
|||||||
import { MomentSelect } from '@/components/MomentCategories';
|
import { MomentSelect } from '@/components/MomentCategories';
|
||||||
import { Apis } from '@/gen/Apis';
|
import { Apis } from '@/gen/Apis';
|
||||||
import { BetaSchemaForm } from '@ant-design/pro-components';
|
import { BetaSchemaForm } from '@ant-design/pro-components';
|
||||||
import { message } from 'antd';
|
import { Form, message } from 'antd';
|
||||||
export default function Create(props: MyBetaModalFormProps) {
|
export default function Create(props: MyBetaModalFormProps) {
|
||||||
|
const [form] = Form.useForm();
|
||||||
return (
|
return (
|
||||||
<BetaSchemaForm<ApiTypes.Customer.CustomerMomentCategories.Store>
|
<BetaSchemaForm<ApiTypes.Customer.CustomerMomentCategories.Store>
|
||||||
{...MyModalFormProps.props}
|
{...MyModalFormProps.props}
|
||||||
@ -16,6 +17,12 @@ export default function Create(props: MyBetaModalFormProps) {
|
|||||||
wrapperCol={{ span: 24 }}
|
wrapperCol={{ span: 24 }}
|
||||||
width="500px"
|
width="500px"
|
||||||
trigger={<MyButtons.Create title={`添加${props.title}`} />}
|
trigger={<MyButtons.Create title={`添加${props.title}`} />}
|
||||||
|
key={new Date().getTime()}
|
||||||
|
onOpenChange={(open: any) => {
|
||||||
|
if (open) {
|
||||||
|
form.resetFields(); // 清空表单数据
|
||||||
|
}
|
||||||
|
}}
|
||||||
onFinish={async (values) =>
|
onFinish={async (values) =>
|
||||||
Apis.Customer.CustomerMomentCategories.Store(values)
|
Apis.Customer.CustomerMomentCategories.Store(values)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
|
|||||||
@ -12,8 +12,8 @@ export default function infoPreview(props: MyBetaModalFormProps) {
|
|||||||
<div className="preview_header">
|
<div className="preview_header">
|
||||||
<div className="avatar">员工头像</div>
|
<div className="avatar">员工头像</div>
|
||||||
<div className="info">
|
<div className="info">
|
||||||
<div className="name">员工的名字</div>
|
<div className="name">员工名字</div>
|
||||||
<div className="desc">此处显示“发送文案”输入的文案</div>
|
<div className="desc">此处显示“发送文案”</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="preview_content">
|
<div className="preview_content">
|
||||||
@ -31,8 +31,8 @@ export default function infoPreview(props: MyBetaModalFormProps) {
|
|||||||
<div className="preview_header">
|
<div className="preview_header">
|
||||||
<div className="avatar">员工头像</div>
|
<div className="avatar">员工头像</div>
|
||||||
<div className="info">
|
<div className="info">
|
||||||
<div className="name">员工的名字</div>
|
<div className="name">员工名字</div>
|
||||||
<div className="desc">此处显示“发送文案”输入的文案</div>
|
<div className="desc">此处显示“发送文案”</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="preview_content">
|
<div className="preview_content">
|
||||||
@ -55,9 +55,9 @@ export default function infoPreview(props: MyBetaModalFormProps) {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="preview_content cover_image_preview">
|
<div className="preview_content cover_image_preview">
|
||||||
<div className="cover_image">封面图</div>
|
<div className="cover_image">封面</div>
|
||||||
<div className="cover_info">
|
<div className="cover_info">
|
||||||
此处显示“链接标题”输入的文案,文案字数多时可以换行显示
|
此处显示“链接标题”,字数较多时自动换行显示
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</ProCard>
|
</ProCard>
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
background-color: #f8f8f8;
|
background-color: #f8f8f8;
|
||||||
width: 400px;
|
width: 400px;
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
margin-left: 10px;
|
margin-left: 60px;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
.title {
|
.title {
|
||||||
border-left: 3px solid #1890ff;
|
border-left: 3px solid #1890ff;
|
||||||
|
|||||||
@ -9,6 +9,7 @@ import { Apis } from '@/gen/Apis';
|
|||||||
import {
|
import {
|
||||||
CustomerMomentsChannelEnum,
|
CustomerMomentsChannelEnum,
|
||||||
CustomerMomentsContentTypeEnum,
|
CustomerMomentsContentTypeEnum,
|
||||||
|
CustomerMomentsPushStatusEnum,
|
||||||
CustomerMomentsPushTypeEnum,
|
CustomerMomentsPushTypeEnum,
|
||||||
CustomerMomentsTaskEndTypeEnum,
|
CustomerMomentsTaskEndTypeEnum,
|
||||||
} from '@/gen/Enums';
|
} from '@/gen/Enums';
|
||||||
@ -16,7 +17,7 @@ import { ProTable } from '@ant-design/pro-components';
|
|||||||
import { Card, Space } from 'antd';
|
import { Card, Space } from 'antd';
|
||||||
import Create from './modals/Create';
|
import Create from './modals/Create';
|
||||||
|
|
||||||
export default function Index({ title = '推送任务' }) {
|
export default function Index({ title = '创建内容' }) {
|
||||||
// 注册当前页面为标签页
|
// 注册当前页面为标签页
|
||||||
usePageTabs({
|
usePageTabs({
|
||||||
tabKey: 'moments-list',
|
tabKey: 'moments-list',
|
||||||
@ -47,15 +48,29 @@ export default function Index({ title = '推送任务' }) {
|
|||||||
]}
|
]}
|
||||||
columns={[
|
columns={[
|
||||||
MyColumns.ID(),
|
MyColumns.ID(),
|
||||||
|
MyColumns.EnumTag({
|
||||||
|
title: '任务推送',
|
||||||
|
dataIndex: 'push_status',
|
||||||
|
valueEnum: CustomerMomentsPushStatusEnum,
|
||||||
|
search: false,
|
||||||
|
}),
|
||||||
{
|
{
|
||||||
title: '名称',
|
title: '标题',
|
||||||
dataIndex: 'title',
|
dataIndex: 'title',
|
||||||
render: (_, i: any) => {
|
render: (_, i: any) => {
|
||||||
return (
|
return (
|
||||||
<Card size="small">
|
<Card size="small">
|
||||||
<Space align="start">
|
<Space align="start">
|
||||||
<img src={i?.cover_image[0]?.url} width={45} height={45} />
|
|
||||||
<div>{i?.title}</div>
|
<div>{i?.title}</div>
|
||||||
|
<img
|
||||||
|
src={
|
||||||
|
i?.cover_image?.length > 0
|
||||||
|
? i?.cover_image[0]?.url
|
||||||
|
: i?.attachments[0]?.url
|
||||||
|
}
|
||||||
|
width={45}
|
||||||
|
height={45}
|
||||||
|
/>
|
||||||
</Space>
|
</Space>
|
||||||
</Card>
|
</Card>
|
||||||
);
|
);
|
||||||
@ -77,7 +92,7 @@ export default function Index({ title = '推送任务' }) {
|
|||||||
valueEnum: CustomerMomentsPushTypeEnum,
|
valueEnum: CustomerMomentsPushTypeEnum,
|
||||||
}),
|
}),
|
||||||
{
|
{
|
||||||
title: '定时发送时间',
|
title: '推送时间',
|
||||||
dataIndex: 'scheduled_time',
|
dataIndex: 'scheduled_time',
|
||||||
search: false,
|
search: false,
|
||||||
},
|
},
|
||||||
@ -89,15 +104,16 @@ export default function Index({ title = '推送任务' }) {
|
|||||||
search: false,
|
search: false,
|
||||||
}),
|
}),
|
||||||
{
|
{
|
||||||
title: '任务结束天数',
|
title: '任务结束时间',
|
||||||
dataIndex: 'task_days',
|
dataIndex: 'task_days',
|
||||||
search: false,
|
search: false,
|
||||||
|
render: (_, record: any) => {
|
||||||
|
return record?.task_end_type === 'AfterNDays'
|
||||||
|
? `任务发送后:${record?.task_days}天`
|
||||||
|
: '${record?.task_end_time}';
|
||||||
},
|
},
|
||||||
{
|
|
||||||
title: '定时结束',
|
|
||||||
dataIndex: 'task_end_time',
|
|
||||||
search: false,
|
|
||||||
},
|
},
|
||||||
|
|
||||||
MyColumns.UpdatedAt(),
|
MyColumns.UpdatedAt(),
|
||||||
MyColumns.CreatedAt(),
|
MyColumns.CreatedAt(),
|
||||||
MyColumns.Option({
|
MyColumns.Option({
|
||||||
|
|||||||
@ -40,7 +40,7 @@ export default function Create(props: MyBetaModalFormProps) {
|
|||||||
}),
|
}),
|
||||||
Selects?.Companies({
|
Selects?.Companies({
|
||||||
key: 'companies_id',
|
key: 'companies_id',
|
||||||
title: '公司',
|
title: '选择机构',
|
||||||
colProps: { span: 24 },
|
colProps: { span: 24 },
|
||||||
required: true,
|
required: true,
|
||||||
}),
|
}),
|
||||||
@ -54,10 +54,11 @@ export default function Create(props: MyBetaModalFormProps) {
|
|||||||
columns: [
|
columns: [
|
||||||
MyFormItems.EnumRadio({
|
MyFormItems.EnumRadio({
|
||||||
key: 'push_type',
|
key: 'push_type',
|
||||||
title: '推送类型',
|
title: '任务推送方式',
|
||||||
|
tooltip: '内容穿创建后,推送任务给员工的方式',
|
||||||
valueEnum: CustomerMomentsPushTypeEnum,
|
valueEnum: CustomerMomentsPushTypeEnum,
|
||||||
required: true,
|
required: true,
|
||||||
colProps: { span: 9 },
|
colProps: { span: 12 },
|
||||||
}),
|
}),
|
||||||
{
|
{
|
||||||
name: ['push_type'],
|
name: ['push_type'],
|
||||||
@ -67,9 +68,9 @@ export default function Create(props: MyBetaModalFormProps) {
|
|||||||
? [
|
? [
|
||||||
{
|
{
|
||||||
key: 'scheduled_time',
|
key: 'scheduled_time',
|
||||||
title: '定时发送时间',
|
title: '定时推送时间',
|
||||||
valueType: 'dateTime',
|
valueType: 'dateTime',
|
||||||
colProps: { span: 10 },
|
colProps: { span: 12 },
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
: [];
|
: [];
|
||||||
@ -86,7 +87,7 @@ export default function Create(props: MyBetaModalFormProps) {
|
|||||||
title: '任务结束类型',
|
title: '任务结束类型',
|
||||||
valueEnum: CustomerMomentsTaskEndTypeEnum,
|
valueEnum: CustomerMomentsTaskEndTypeEnum,
|
||||||
required: true,
|
required: true,
|
||||||
colProps: { span: 9 },
|
colProps: { span: 12 },
|
||||||
}),
|
}),
|
||||||
{
|
{
|
||||||
name: ['task_end_type'],
|
name: ['task_end_type'],
|
||||||
@ -96,7 +97,7 @@ export default function Create(props: MyBetaModalFormProps) {
|
|||||||
? [
|
? [
|
||||||
{
|
{
|
||||||
key: 'task_days',
|
key: 'task_days',
|
||||||
title: '任务结束天数',
|
title: ' ',
|
||||||
colProps: { span: 10 },
|
colProps: { span: 10 },
|
||||||
valueType: 'digit',
|
valueType: 'digit',
|
||||||
formItemProps: { ...rulesHelper.number },
|
formItemProps: { ...rulesHelper.number },
|
||||||
@ -123,7 +124,7 @@ export default function Create(props: MyBetaModalFormProps) {
|
|||||||
},
|
},
|
||||||
MyFormItems.EnumSelect({
|
MyFormItems.EnumSelect({
|
||||||
key: 'range_type',
|
key: 'range_type',
|
||||||
title: '范围类型',
|
title: '推送范围',
|
||||||
valueEnum: CustomerMomentsRangeTypeEnum,
|
valueEnum: CustomerMomentsRangeTypeEnum,
|
||||||
required: true,
|
required: true,
|
||||||
}),
|
}),
|
||||||
@ -150,6 +151,12 @@ export default function Create(props: MyBetaModalFormProps) {
|
|||||||
{
|
{
|
||||||
title: '创建内容',
|
title: '创建内容',
|
||||||
columns: [
|
columns: [
|
||||||
|
{
|
||||||
|
key: 'title',
|
||||||
|
title: '标题',
|
||||||
|
formItemProps: { ...rulesHelper.text },
|
||||||
|
colProps: { span: 24 },
|
||||||
|
},
|
||||||
MyFormItems.EnumRadio({
|
MyFormItems.EnumRadio({
|
||||||
key: 'content_type',
|
key: 'content_type',
|
||||||
title: '内容类型',
|
title: '内容类型',
|
||||||
@ -157,18 +164,58 @@ export default function Create(props: MyBetaModalFormProps) {
|
|||||||
required: true,
|
required: true,
|
||||||
colProps: { span: 24 },
|
colProps: { span: 24 },
|
||||||
}),
|
}),
|
||||||
|
|
||||||
{
|
{
|
||||||
key: 'skip_url',
|
name: ['content_type'],
|
||||||
title: '链接',
|
valueType: 'dependency',
|
||||||
|
columns: ({ content_type }: any) => {
|
||||||
|
return content_type === CustomerMomentsContentTypeEnum.Image.value
|
||||||
|
? [
|
||||||
|
{
|
||||||
|
key: 'content',
|
||||||
|
title: '发送文案',
|
||||||
|
valueType: 'textarea',
|
||||||
|
colProps: { span: 24 },
|
||||||
formItemProps: { ...rulesHelper.text },
|
formItemProps: { ...rulesHelper.text },
|
||||||
colProps: { span: 12 },
|
|
||||||
},
|
},
|
||||||
|
MyFormItems.UploadImages({
|
||||||
|
key: 'attachments',
|
||||||
|
title: '上传图片',
|
||||||
|
// uploadType: 'file',
|
||||||
|
required: true,
|
||||||
|
tooltip: '限9张图片',
|
||||||
|
max: 9,
|
||||||
|
colProps: { span: 24 },
|
||||||
|
}),
|
||||||
|
]
|
||||||
|
: content_type === CustomerMomentsContentTypeEnum.Video.value
|
||||||
|
? [
|
||||||
{
|
{
|
||||||
key: 'title',
|
key: 'content',
|
||||||
title: '标题',
|
title: '发送文案',
|
||||||
|
valueType: 'textarea',
|
||||||
|
colProps: { span: 24 },
|
||||||
|
formItemProps: { ...rulesHelper.text },
|
||||||
|
},
|
||||||
|
MyFormItems.UploadImages({
|
||||||
|
key: 'attachments',
|
||||||
|
title: '上传视频',
|
||||||
|
required: true,
|
||||||
|
tooltip: '限1个视频',
|
||||||
|
// uploadType: 'file',
|
||||||
|
max: 1,
|
||||||
|
colProps: { span: 24 },
|
||||||
|
}),
|
||||||
|
]
|
||||||
|
: content_type === CustomerMomentsContentTypeEnum.Link.value ||
|
||||||
|
content_type ===
|
||||||
|
CustomerMomentsContentTypeEnum.MiniProgram.value
|
||||||
|
? [
|
||||||
|
{
|
||||||
|
key: 'content',
|
||||||
|
title: '发送文案',
|
||||||
|
valueType: 'textarea',
|
||||||
|
colProps: { span: 24 },
|
||||||
formItemProps: { ...rulesHelper.text },
|
formItemProps: { ...rulesHelper.text },
|
||||||
colProps: { span: 12 },
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: ['content_type'],
|
name: ['content_type'],
|
||||||
@ -181,37 +228,54 @@ export default function Create(props: MyBetaModalFormProps) {
|
|||||||
key: 'mini_program_app_id',
|
key: 'mini_program_app_id',
|
||||||
title: '小程序APPID',
|
title: '小程序APPID',
|
||||||
formItemProps: { ...rulesHelper.text },
|
formItemProps: { ...rulesHelper.text },
|
||||||
|
colProps: { span: 12 },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'skip_url',
|
||||||
|
title: '链接地址',
|
||||||
|
formItemProps: { ...rulesHelper.text },
|
||||||
|
colProps: { span: 12 },
|
||||||
|
},
|
||||||
|
]
|
||||||
|
: [
|
||||||
|
{
|
||||||
|
key: 'skip_url',
|
||||||
|
title: '链接地址',
|
||||||
|
formItemProps: { ...rulesHelper.text },
|
||||||
|
colProps: { span: 24 },
|
||||||
|
},
|
||||||
|
];
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
key: 'desc',
|
||||||
|
title: '链接标题',
|
||||||
|
colProps: { span: 24 },
|
||||||
|
formItemProps: { ...rulesHelper.text },
|
||||||
|
},
|
||||||
|
MyFormItems.UploadImages({
|
||||||
|
key: 'cover_image',
|
||||||
|
tooltip: '限1张图片',
|
||||||
|
title: '设置封面',
|
||||||
|
required: true,
|
||||||
|
max: 1,
|
||||||
|
}),
|
||||||
|
]
|
||||||
|
: content_type === CustomerMomentsContentTypeEnum.Link.value ||
|
||||||
|
content_type ===
|
||||||
|
CustomerMomentsContentTypeEnum.MiniProgram.value
|
||||||
|
? [
|
||||||
|
{
|
||||||
|
key: 'skip_url',
|
||||||
|
title: '链接',
|
||||||
|
formItemProps: { ...rulesHelper.text },
|
||||||
colProps: { span: 24 },
|
colProps: { span: 24 },
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
: [];
|
: [];
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
|
||||||
key: 'content',
|
|
||||||
title: '内容',
|
|
||||||
valueType: 'textarea',
|
|
||||||
colProps: { span: 24 },
|
|
||||||
formItemProps: { ...rulesHelper.text },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: 'desc',
|
|
||||||
title: '描述',
|
|
||||||
valueType: 'textarea',
|
|
||||||
colProps: { span: 24 },
|
|
||||||
},
|
|
||||||
MyFormItems.UploadImages({
|
|
||||||
key: 'cover_image',
|
|
||||||
title: '封面',
|
|
||||||
max: 1,
|
|
||||||
}),
|
|
||||||
MyFormItems.UploadImages({
|
|
||||||
key: 'attachments',
|
|
||||||
title: '附件',
|
|
||||||
uploadType: 'file',
|
|
||||||
max: 100,
|
|
||||||
colProps: { span: 12 },
|
|
||||||
}),
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
@ -236,23 +300,23 @@ export default function Create(props: MyBetaModalFormProps) {
|
|||||||
type="primary"
|
type="primary"
|
||||||
size={'middle'}
|
size={'middle'}
|
||||||
myRef={modalRef}
|
myRef={modalRef}
|
||||||
width="1200px"
|
width="580px"
|
||||||
node={
|
node={
|
||||||
<Space direction="vertical">
|
<Space direction="vertical">
|
||||||
<div style={{ width: '1160px' }}>
|
<div style={{ width: '666px' }}>
|
||||||
<Steps
|
<Steps
|
||||||
style={{ padding: '50px 150px 30px 150px' }}
|
style={{ padding: '20px 200px 20px 20px' }}
|
||||||
current={current}
|
current={current}
|
||||||
items={steps}
|
items={steps}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<Space align="start">
|
<Space align="start">
|
||||||
<div style={{ width: '700px' }}>
|
<div style={{ width: '500px' }}>
|
||||||
<BetaSchemaForm<ApiTypes.Customer.CustomerMomentCategories.Store>
|
<BetaSchemaForm<ApiTypes.Customer.CustomerMomentCategories.Store>
|
||||||
{...MyModalFormProps.props}
|
{...MyModalFormProps.props}
|
||||||
title={`添加${props.title}`}
|
title={`添加${props.title}`}
|
||||||
wrapperCol={{ span: 24 }}
|
wrapperCol={{ span: 24 }}
|
||||||
width="800px"
|
// width="1200px"
|
||||||
form={form}
|
form={form}
|
||||||
layoutType="Form"
|
layoutType="Form"
|
||||||
trigger={<MyButtons.Create title={`添加${props.title}`} />}
|
trigger={<MyButtons.Create title={`添加${props.title}`} />}
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
import {
|
import {
|
||||||
|
MyButtons,
|
||||||
MyColumns,
|
MyColumns,
|
||||||
MyPageContainer,
|
MyPageContainer,
|
||||||
MyProTableProps,
|
MyProTableProps,
|
||||||
@ -10,8 +11,10 @@ import {
|
|||||||
HouseOrdersPaymentMethodEnum,
|
HouseOrdersPaymentMethodEnum,
|
||||||
} from '@/gen/Enums';
|
} from '@/gen/Enums';
|
||||||
import { ProTable } from '@ant-design/pro-components';
|
import { ProTable } from '@ant-design/pro-components';
|
||||||
|
import { Space } from 'antd';
|
||||||
|
import Payments from './modals/Payments';
|
||||||
|
|
||||||
export default function Index({ title = '支付明细' }) {
|
export default function Index({ title = '支付订单' }) {
|
||||||
// 注册当前页面为标签页
|
// 注册当前页面为标签页
|
||||||
usePageTabs({
|
usePageTabs({
|
||||||
tabKey: 'house_order',
|
tabKey: 'house_order',
|
||||||
@ -44,10 +47,10 @@ export default function Index({ title = '支付明细' }) {
|
|||||||
// importApi={Apis.Bill.HouseBills.Import}
|
// importApi={Apis.Bill.HouseBills.Import}
|
||||||
// reload={action?.reload}
|
// reload={action?.reload}
|
||||||
// />,
|
// />,
|
||||||
// <BillCreate key="Create" reload={action?.reload} title={title} />,
|
|
||||||
// ]}
|
// ]}
|
||||||
columns={[
|
columns={[
|
||||||
// MyColumns.ID(),
|
MyColumns.ID(),
|
||||||
|
|
||||||
{
|
{
|
||||||
title: '订单号',
|
title: '订单号',
|
||||||
dataIndex: 'order_code',
|
dataIndex: 'order_code',
|
||||||
@ -63,32 +66,22 @@ export default function Index({ title = '支付明细' }) {
|
|||||||
dataIndex: 'order_status',
|
dataIndex: 'order_status',
|
||||||
valueEnum: HouseOrdersOrderStatusEnum,
|
valueEnum: HouseOrdersOrderStatusEnum,
|
||||||
}),
|
}),
|
||||||
|
|
||||||
// {
|
|
||||||
// title: '支付单号',
|
|
||||||
// dataIndex: 'payment_no',
|
|
||||||
// search: false,
|
|
||||||
// },
|
|
||||||
{
|
{
|
||||||
title: '应收金额',
|
title: '应收金额',
|
||||||
|
dataIndex: 'amount',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '实收金额',
|
||||||
dataIndex: 'actual_paid_amount',
|
dataIndex: 'actual_paid_amount',
|
||||||
search: false,
|
search: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '滞纳金',
|
title: '退款金额',
|
||||||
dataIndex: 'late_fee',
|
|
||||||
search: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '退款总金额',
|
|
||||||
dataIndex: 'refund_amount',
|
dataIndex: 'refund_amount',
|
||||||
search: false,
|
search: false,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
title: '实缴金额',
|
|
||||||
dataIndex: 'actual_paid_amount',
|
|
||||||
search: false,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
title: '收款账号',
|
title: '收款账号',
|
||||||
dataIndex: ['house_order_items', 'receipt_account'],
|
dataIndex: ['house_order_items', 'receipt_account'],
|
||||||
@ -114,20 +107,20 @@ export default function Index({ title = '支付明细' }) {
|
|||||||
},
|
},
|
||||||
|
|
||||||
// MyColumns.CreatedAt(),
|
// MyColumns.CreatedAt(),
|
||||||
// MyColumns.Option({
|
MyColumns.Option({
|
||||||
// render: (_, item: any, index, action) => (
|
render: (_, item: any, index, action) => (
|
||||||
// <Space key={index}>
|
<Space key={index}>
|
||||||
// <BillUpdate item={item} reload={action?.reload} title={title} />
|
<Payments item={item} title="查看" reload={action?.reload} />
|
||||||
// <MyButtons.Delete
|
<MyButtons.Delete
|
||||||
// onConfirm={() =>
|
onConfirm={() =>
|
||||||
// Apis.Common.Admins.Delete({ id: item.id }).then(() =>
|
Apis.HouseOrder.HouseOrders.Delete({ id: item.id }).then(
|
||||||
// action?.reload(),
|
() => action?.reload(),
|
||||||
// )
|
)
|
||||||
// }
|
}
|
||||||
// />
|
/>
|
||||||
// </Space>
|
</Space>
|
||||||
// ),
|
),
|
||||||
// }),
|
}),
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
</MyPageContainer>
|
</MyPageContainer>
|
||||||
79
src/pages/order/list/modals/Payments.tsx
Normal file
79
src/pages/order/list/modals/Payments.tsx
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
import { MyBetaModalFormProps, MyColumns, MyProTableProps } from '@/common';
|
||||||
|
import { MyModal } from '@/components/MyModal';
|
||||||
|
import { Apis } from '@/gen/Apis';
|
||||||
|
import {
|
||||||
|
HouseOrdersOrderStatusEnum,
|
||||||
|
HouseOrdersPaymentMethodEnum,
|
||||||
|
} from '@/gen/Enums';
|
||||||
|
import { ProTable } from '@ant-design/pro-components';
|
||||||
|
import { useNavigate } from '@umijs/max';
|
||||||
|
|
||||||
|
export default function TaskShow(props: MyBetaModalFormProps) {
|
||||||
|
const navigate = useNavigate();
|
||||||
|
return (
|
||||||
|
<MyModal
|
||||||
|
title={props.title || '查看'}
|
||||||
|
type={props.item?.type || 'primary'}
|
||||||
|
width="1000px"
|
||||||
|
node={
|
||||||
|
<ProTable
|
||||||
|
{...MyProTableProps.props}
|
||||||
|
request={async (params, sort) =>
|
||||||
|
MyProTableProps.request(
|
||||||
|
{ ...params, house_orders_id: props?.item?.id },
|
||||||
|
sort,
|
||||||
|
Apis.HouseOrder.HouseOrderPayments.List,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
// options={false}
|
||||||
|
columns={[
|
||||||
|
MyColumns.ID(),
|
||||||
|
MyColumns.EnumTag({
|
||||||
|
title: '支付状态',
|
||||||
|
dataIndex: 'payment_status',
|
||||||
|
valueEnum: HouseOrdersOrderStatusEnum,
|
||||||
|
}),
|
||||||
|
MyColumns.EnumTag({
|
||||||
|
title: '支付方式',
|
||||||
|
dataIndex: 'payment_method',
|
||||||
|
valueEnum: HouseOrdersPaymentMethodEnum,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
title: '账单金额',
|
||||||
|
dataIndex: 'amount',
|
||||||
|
render: (value: any) => `${value / 100}元`,
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '实际金额',
|
||||||
|
dataIndex: 'actual_amount',
|
||||||
|
render: (value: any) => `${value / 100}元`,
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
title: '支付人',
|
||||||
|
render: (record: any) =>
|
||||||
|
`${record?.customer?.name || ''}${
|
||||||
|
record?.customer?.phone || ''
|
||||||
|
}`,
|
||||||
|
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '备注',
|
||||||
|
dataIndex: 'remark',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '支付单号',
|
||||||
|
dataIndex: 'payment_no',
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
MyColumns.UpdatedAt(),
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -5,6 +5,10 @@ import {
|
|||||||
usePageTabs,
|
usePageTabs,
|
||||||
} from '@/common';
|
} from '@/common';
|
||||||
import { Apis } from '@/gen/Apis';
|
import { Apis } from '@/gen/Apis';
|
||||||
|
import {
|
||||||
|
HouseOrdersOrderStatusEnum,
|
||||||
|
HouseOrdersPaymentMethodEnum,
|
||||||
|
} from '@/gen/Enums';
|
||||||
import { ProTable } from '@ant-design/pro-components';
|
import { ProTable } from '@ant-design/pro-components';
|
||||||
|
|
||||||
export default function Index({ title = '支付明细' }) {
|
export default function Index({ title = '支付明细' }) {
|
||||||
@ -18,7 +22,7 @@ export default function Index({ title = '支付明细' }) {
|
|||||||
<MyPageContainer
|
<MyPageContainer
|
||||||
title={title}
|
title={title}
|
||||||
enableTabs={true}
|
enableTabs={true}
|
||||||
tabKey="house_order_payments"
|
tabKey="house_order"
|
||||||
tabLabel={title}
|
tabLabel={title}
|
||||||
>
|
>
|
||||||
<ProTable
|
<ProTable
|
||||||
@ -40,49 +44,51 @@ export default function Index({ title = '支付明细' }) {
|
|||||||
// importApi={Apis.Bill.HouseBills.Import}
|
// importApi={Apis.Bill.HouseBills.Import}
|
||||||
// reload={action?.reload}
|
// reload={action?.reload}
|
||||||
// />,
|
// />,
|
||||||
// <BillCreate key="Create" reload={action?.reload} title={title} />,
|
|
||||||
// ]}
|
// ]}
|
||||||
columns={[
|
columns={[
|
||||||
MyColumns.ID(),
|
MyColumns.ID(),
|
||||||
|
|
||||||
|
MyColumns.EnumTag({
|
||||||
|
title: '支付状态',
|
||||||
|
dataIndex: 'payment_status',
|
||||||
|
valueEnum: HouseOrdersOrderStatusEnum,
|
||||||
|
}),
|
||||||
|
MyColumns.EnumTag({
|
||||||
|
title: '支付方式',
|
||||||
|
dataIndex: 'payment_method',
|
||||||
|
valueEnum: HouseOrdersPaymentMethodEnum,
|
||||||
|
}),
|
||||||
{
|
{
|
||||||
title: '房屋',
|
title: '账单金额',
|
||||||
dataIndex: ['asset_house', 'full_name'],
|
dataIndex: 'amount',
|
||||||
search: {
|
render: (value: any) => `${value / 100}元`,
|
||||||
transform: (value) => {
|
search: false,
|
||||||
return { full_name: value };
|
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: '实际金额',
|
||||||
|
dataIndex: 'actual_amount',
|
||||||
|
render: (value: any) => `${value / 100}元`,
|
||||||
|
search: false,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
title: '支付人',
|
||||||
|
render: (record: any) =>
|
||||||
|
`${record?.customer?.name || ''}${record?.customer?.phone || ''}`,
|
||||||
|
|
||||||
|
search: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '备注',
|
||||||
|
dataIndex: 'remark',
|
||||||
|
search: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '支付单号',
|
title: '支付单号',
|
||||||
dataIndex: 'payment_no',
|
dataIndex: 'payment_no',
|
||||||
search: false,
|
search: false,
|
||||||
},
|
},
|
||||||
{
|
MyColumns.UpdatedAt(),
|
||||||
title: '交易单号',
|
|
||||||
dataIndex: 'transaction_id',
|
|
||||||
search: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '第三方交易号',
|
|
||||||
dataIndex: 'hird_trade_no',
|
|
||||||
search: false,
|
|
||||||
},
|
|
||||||
MyColumns.CreatedAt(),
|
|
||||||
// MyColumns.Option({
|
|
||||||
// render: (_, item: any, index, action) => (
|
|
||||||
// <Space key={index}>
|
|
||||||
// <BillUpdate item={item} reload={action?.reload} title={title} />
|
|
||||||
// <MyButtons.Delete
|
|
||||||
// onConfirm={() =>
|
|
||||||
// Apis.Common.Admins.Delete({ id: item.id }).then(() =>
|
|
||||||
// action?.reload(),
|
|
||||||
// )
|
|
||||||
// }
|
|
||||||
// />
|
|
||||||
// </Space>
|
|
||||||
// ),
|
|
||||||
// }),
|
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
</MyPageContainer>
|
</MyPageContainer>
|
||||||
@ -41,7 +41,13 @@ export default function Index({ title = '工单管理' }) {
|
|||||||
{...MyProTableProps.props}
|
{...MyProTableProps.props}
|
||||||
request={async (params, sort) =>
|
request={async (params, sort) =>
|
||||||
MyProTableProps.request(
|
MyProTableProps.request(
|
||||||
params,
|
{
|
||||||
|
...params,
|
||||||
|
type: [
|
||||||
|
HouseWorkOrdersTypeEnum.Repair.value,
|
||||||
|
HouseWorkOrdersTypeEnum.Incident.value,
|
||||||
|
],
|
||||||
|
},
|
||||||
sort,
|
sort,
|
||||||
Apis.WorkOrder.HouseWorkOrders.List,
|
Apis.WorkOrder.HouseWorkOrders.List,
|
||||||
)
|
)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user