develop #13
@ -15,8 +15,8 @@ export default defineConfig({
|
||||
proxy: {
|
||||
'/api/': {
|
||||
// target: 'http://yt:8003',
|
||||
target: 'http://10.39.13.78:8001/',
|
||||
// target: 'https://test-admin.linyikj.com.cn/',
|
||||
// target: 'http://10.39.13.78:8001/',
|
||||
target: 'https://test-admin.linyikj.com.cn/',
|
||||
// target: 'https://admin.linyikj.com.cn/',
|
||||
// target: 'http://cd69cef8.natappfree.cc/',
|
||||
|
||||
|
||||
@ -151,4 +151,15 @@ export const rulesHelper = {
|
||||
return undefined;
|
||||
}
|
||||
},
|
||||
getDifference(startNum: number, endNum: number) {
|
||||
//获取2 个数据之间的差值 单位:天
|
||||
if (startNum && endNum) {
|
||||
const start = startNum;
|
||||
const end = endNum;
|
||||
const diffDays = end - start;
|
||||
return diffDays;
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
765
src/gen/Enums.ts
765
src/gen/Enums.ts
File diff suppressed because it is too large
Load Diff
@ -9,6 +9,7 @@ import { Apis } from '@/gen/Apis';
|
||||
import {
|
||||
HouseOccupantsCardTypeEnum,
|
||||
HouseOccupantsHouseRelationEnum,
|
||||
HouseOccupantsRelationWithOwnerEnum,
|
||||
HouseRegistersTypeEnum,
|
||||
} from '@/gen/Enums';
|
||||
import { BetaSchemaForm, ProCard } from '@ant-design/pro-components';
|
||||
@ -21,7 +22,7 @@ export default function Create(props: MyBetaModalFormProps) {
|
||||
{...MyModalFormProps.props}
|
||||
title={`${props.title}`}
|
||||
wrapperCol={{ span: 24 }}
|
||||
width="800px"
|
||||
width="1000px"
|
||||
trigger={
|
||||
<MyButtons.View
|
||||
title={props.title}
|
||||
@ -45,6 +46,8 @@ export default function Create(props: MyBetaModalFormProps) {
|
||||
return {
|
||||
...res,
|
||||
house_relation: HouseOccupantsHouseRelationEnum.Owner.value,
|
||||
relation_with_owner:
|
||||
HouseOccupantsRelationWithOwnerEnum.Self.value,
|
||||
};
|
||||
}),
|
||||
})
|
||||
@ -165,7 +168,7 @@ export default function Create(props: MyBetaModalFormProps) {
|
||||
{
|
||||
title: '是否入住',
|
||||
dataIndex: 'is_live_in',
|
||||
colProps: { span: 6 },
|
||||
colProps: { span: 4 },
|
||||
valueType: 'switch',
|
||||
},
|
||||
{
|
||||
@ -188,6 +191,11 @@ export default function Create(props: MyBetaModalFormProps) {
|
||||
: [];
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '备注',
|
||||
dataIndex: 'remark',
|
||||
colProps: { span: 24 },
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
|
||||
@ -23,7 +23,7 @@ export default function AddOccupant(props: MyBetaModalFormProps) {
|
||||
{...MyModalFormProps.props}
|
||||
title={`${props.title}`}
|
||||
wrapperCol={{ span: 24 }}
|
||||
width="800px"
|
||||
width="1000px"
|
||||
trigger={
|
||||
<MyButtons.Default title={props.title} size="middle" type="primary" />
|
||||
}
|
||||
@ -34,7 +34,7 @@ export default function AddOccupant(props: MyBetaModalFormProps) {
|
||||
form.resetFields(); // 清空表单数据
|
||||
}
|
||||
}}
|
||||
onFinish={async (values) =>
|
||||
onFinish={async (values: any) =>
|
||||
Apis.Archive.HouseRegisters.Store({
|
||||
...values,
|
||||
asset_houses_id: props?.item?.id,
|
||||
@ -43,6 +43,11 @@ export default function AddOccupant(props: MyBetaModalFormProps) {
|
||||
return {
|
||||
...res,
|
||||
house_relation: HouseOccupantsHouseRelationEnum.NonOwner.value,
|
||||
relation_with_owner:
|
||||
values?.residential_relation ===
|
||||
HouseOccupantsResidentialRelationEnum.PrimaryTenant.value
|
||||
? values?.relation_with_owner
|
||||
: values?.residential_relation,
|
||||
};
|
||||
}),
|
||||
})
|
||||
@ -106,16 +111,16 @@ export default function AddOccupant(props: MyBetaModalFormProps) {
|
||||
name: ['residential_relation'],
|
||||
valueType: 'dependency',
|
||||
columns: ({ residential_relation }: any) => {
|
||||
return residential_relation !==
|
||||
HouseOccupantsResidentialRelationEnum.PrimaryTenant
|
||||
.value
|
||||
return residential_relation ===
|
||||
HouseOccupantsResidentialRelationEnum.Resident.value
|
||||
? [
|
||||
MyFormItems.EnumRadio({
|
||||
key: 'relation_with_owner',
|
||||
title:
|
||||
residential_relation === 'Resident'
|
||||
? '与产权人关系'
|
||||
: '与主租人关系',
|
||||
title: '与产权人关系',
|
||||
// title:
|
||||
// residential_relation === 'Resident'
|
||||
// ? '与产权人关系'
|
||||
// : '与主租人关系',
|
||||
valueEnum: HouseOccupantsRelationWithOwnerEnum,
|
||||
colProps: { span: 16 },
|
||||
required: true,
|
||||
@ -227,6 +232,7 @@ export default function AddOccupant(props: MyBetaModalFormProps) {
|
||||
key: 'card_front_image',
|
||||
title: '证件正面',
|
||||
// uploadType: 'file',
|
||||
required: true,
|
||||
max: 1,
|
||||
colProps: { span: 6 },
|
||||
}),
|
||||
@ -234,13 +240,14 @@ export default function AddOccupant(props: MyBetaModalFormProps) {
|
||||
key: 'card_back_image',
|
||||
title: '证件反面',
|
||||
// uploadType: 'file',
|
||||
required: true,
|
||||
max: 1,
|
||||
colProps: { span: 6 },
|
||||
}),
|
||||
{
|
||||
title: '是否入住',
|
||||
dataIndex: 'is_live_in',
|
||||
colProps: { span: 6 },
|
||||
colProps: { span: 4 },
|
||||
valueType: 'switch',
|
||||
},
|
||||
{
|
||||
@ -263,6 +270,11 @@ export default function AddOccupant(props: MyBetaModalFormProps) {
|
||||
: [];
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '备注',
|
||||
dataIndex: 'remark',
|
||||
colProps: { span: 24 },
|
||||
},
|
||||
];
|
||||
},
|
||||
},
|
||||
|
||||
@ -21,7 +21,7 @@ export default function Create(props: MyBetaModalFormProps) {
|
||||
{...MyModalFormProps.props}
|
||||
title={`${props.title}`}
|
||||
wrapperCol={{ span: 24 }}
|
||||
width="900px"
|
||||
width="1000px"
|
||||
trigger={
|
||||
<MyButtons.Default title={props.title} size="middle" type="primary" />
|
||||
}
|
||||
@ -164,7 +164,7 @@ export default function Create(props: MyBetaModalFormProps) {
|
||||
colProps: { span: 6 },
|
||||
}),
|
||||
{
|
||||
title: '是否办理入住',
|
||||
title: '是否入住',
|
||||
dataIndex: 'is_live_in',
|
||||
colProps: { span: 6 },
|
||||
valueType: 'switch',
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
import {
|
||||
MyButtons,
|
||||
MyColumns,
|
||||
MyImportModal,
|
||||
MyPageContainer,
|
||||
MyProTableProps,
|
||||
usePageTabs,
|
||||
@ -32,6 +33,15 @@ export default function Index({ title = '项目列表' }) {
|
||||
}
|
||||
// headerTitle="项目列表"
|
||||
toolBarRender={(action) => [
|
||||
<MyImportModal
|
||||
key="ImportHouse"
|
||||
title="批量导入"
|
||||
type="danger"
|
||||
size="middle"
|
||||
templateApi={Apis.Asset.AssetProjects.DownloadTemplate}
|
||||
importApi={Apis.Asset.AssetProjects.Import}
|
||||
reload={action?.reload}
|
||||
/>,
|
||||
<AssetCreate key="Create" reload={action?.reload} title={'项目'} />,
|
||||
]}
|
||||
columns={[
|
||||
|
||||
73
src/pages/common/positions/index.tsx
Normal file
73
src/pages/common/positions/index.tsx
Normal file
@ -0,0 +1,73 @@
|
||||
import {
|
||||
MyButtons,
|
||||
MyColumns,
|
||||
MyPageContainer,
|
||||
MyProTableProps,
|
||||
usePageTabs,
|
||||
} from '@/common';
|
||||
import { Apis } from '@/gen/Apis';
|
||||
import { ProTable } from '@ant-design/pro-components';
|
||||
import { useNavigate } from '@umijs/max';
|
||||
import { Space } from 'antd';
|
||||
import Create from './modals/Create';
|
||||
import Update from './modals/Update';
|
||||
|
||||
export default function Index({ title = '岗位管理' }) {
|
||||
const navigate = useNavigate();
|
||||
|
||||
// 注册当前页面为标签页
|
||||
usePageTabs({
|
||||
tabKey: 'positions',
|
||||
tabLabel: title,
|
||||
});
|
||||
|
||||
return (
|
||||
<MyPageContainer
|
||||
title={title}
|
||||
enableTabs={true}
|
||||
tabKey="positions"
|
||||
tabLabel={title}
|
||||
>
|
||||
<ProTable
|
||||
{...MyProTableProps.props}
|
||||
request={async (params, sort) =>
|
||||
MyProTableProps.request(params, sort, Apis.Common.Positions.List)
|
||||
}
|
||||
toolBarRender={(action) => [
|
||||
<Create key="Create" reload={action?.reload} title={title} />,
|
||||
]}
|
||||
columns={[
|
||||
MyColumns.ID(),
|
||||
{
|
||||
title: '岗位名称',
|
||||
dataIndex: 'name',
|
||||
width: 300,
|
||||
},
|
||||
{
|
||||
title: '是否启用',
|
||||
dataIndex: 'is_use',
|
||||
search: false,
|
||||
render: (text) => (text ? '是' : '否'),
|
||||
width: 200,
|
||||
},
|
||||
MyColumns.CreatedAt(),
|
||||
MyColumns.UpdatedAt(),
|
||||
MyColumns.Option({
|
||||
render: (_, item: any, index, action) => (
|
||||
<Space key={index}>
|
||||
<Update item={item} reload={action?.reload} title="岗位" />
|
||||
<MyButtons.Delete
|
||||
onConfirm={() =>
|
||||
Apis.Common.Positions.Delete({ id: item.id }).then(() =>
|
||||
action?.reload(),
|
||||
)
|
||||
}
|
||||
/>
|
||||
</Space>
|
||||
),
|
||||
}),
|
||||
]}
|
||||
/>
|
||||
</MyPageContainer>
|
||||
);
|
||||
}
|
||||
51
src/pages/common/positions/modals/Create.tsx
Normal file
51
src/pages/common/positions/modals/Create.tsx
Normal file
@ -0,0 +1,51 @@
|
||||
import {
|
||||
MyBetaModalFormProps,
|
||||
MyButtons,
|
||||
MyModalFormProps,
|
||||
rulesHelper,
|
||||
} from '@/common';
|
||||
import { Apis } from '@/gen/Apis';
|
||||
import { BetaSchemaForm } from '@ant-design/pro-components';
|
||||
import { Form, message } from 'antd';
|
||||
|
||||
export default function Create(props: MyBetaModalFormProps) {
|
||||
const [form] = Form.useForm();
|
||||
return (
|
||||
<BetaSchemaForm<ApiTypes.Common.Positions.Store>
|
||||
{...MyModalFormProps.props}
|
||||
title={`添加岗位`}
|
||||
layout="horizontal"
|
||||
labelCol={{ span: 6 }}
|
||||
wrapperCol={{ span: 18 }}
|
||||
width="450px"
|
||||
trigger={<MyButtons.Create title={`添加岗位`} />}
|
||||
form={form}
|
||||
key={new Date().getTime()}
|
||||
onOpenChange={(open: any) => {
|
||||
if (open) {
|
||||
form.resetFields(); // 清空表单数据
|
||||
}
|
||||
}}
|
||||
onFinish={async (values: any) =>
|
||||
Apis.Common.Positions.Store({
|
||||
...values,
|
||||
is_use: 1,
|
||||
})
|
||||
.then(() => {
|
||||
props.reload?.();
|
||||
message.success(props.title + '成功');
|
||||
return true;
|
||||
})
|
||||
.catch(() => false)
|
||||
}
|
||||
columns={[
|
||||
{
|
||||
key: 'name',
|
||||
title: '岗位名称',
|
||||
colProps: { span: 24 },
|
||||
formItemProps: { ...rulesHelper.text },
|
||||
},
|
||||
]}
|
||||
/>
|
||||
);
|
||||
}
|
||||
62
src/pages/common/positions/modals/Update.tsx
Normal file
62
src/pages/common/positions/modals/Update.tsx
Normal file
@ -0,0 +1,62 @@
|
||||
import {
|
||||
MyBetaModalFormProps,
|
||||
MyButtons,
|
||||
MyModalFormProps,
|
||||
rulesHelper,
|
||||
} from '@/common';
|
||||
|
||||
import { Apis } from '@/gen/Apis';
|
||||
import { BetaSchemaForm } from '@ant-design/pro-components';
|
||||
import { Form, message } from 'antd';
|
||||
export default function Update(props: MyBetaModalFormProps) {
|
||||
const [form] = Form.useForm();
|
||||
return (
|
||||
<BetaSchemaForm<ApiTypes.Company.CompanyPositions.Update>
|
||||
{...MyModalFormProps.props}
|
||||
title={`编辑${props.title}`}
|
||||
trigger={<MyButtons.Edit />}
|
||||
layout="horizontal"
|
||||
labelCol={{ span: 6 }}
|
||||
wrapperCol={{ span: 18 }}
|
||||
width="450px"
|
||||
form={form}
|
||||
key={new Date().getTime()}
|
||||
onOpenChange={(open: any) => {
|
||||
if (open && props.item) {
|
||||
form.setFieldsValue(props.item);
|
||||
}
|
||||
}}
|
||||
onFinish={async (values: any) =>
|
||||
Apis.Common.Positions.Update({
|
||||
...values,
|
||||
id: props.item?.id ?? 0,
|
||||
is_use: Number(values.is_use),
|
||||
})
|
||||
.then(() => {
|
||||
props.reload?.();
|
||||
message.success(props.title + '成功');
|
||||
return true;
|
||||
})
|
||||
.catch(() => false)
|
||||
}
|
||||
columns={[
|
||||
{
|
||||
key: 'name',
|
||||
title: '岗位名称',
|
||||
colProps: { span: 24 },
|
||||
formItemProps: { ...rulesHelper.text },
|
||||
},
|
||||
{
|
||||
key: 'is_use',
|
||||
title: '是否启用',
|
||||
valueType: 'switch',
|
||||
colProps: { span: 24 },
|
||||
formItemProps: { required: true },
|
||||
fieldProps: {
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
]}
|
||||
/>
|
||||
);
|
||||
}
|
||||
@ -7,6 +7,7 @@ import {
|
||||
import { Apis } from '@/gen/Apis';
|
||||
import { ProTable } from '@ant-design/pro-components';
|
||||
import { Space } from 'antd';
|
||||
import PositionAdd from '../../positions/modals/PositionAdd';
|
||||
import PositionCreate from '../../positions/modals/PositionCreate';
|
||||
import PositionUpdate from '../../positions/modals/PositionUpdate';
|
||||
|
||||
@ -24,6 +25,12 @@ export default function Organizations(props: MyBetaModalFormProps) {
|
||||
)
|
||||
}
|
||||
toolBarRender={(action) => [
|
||||
<PositionAdd
|
||||
key="Create"
|
||||
reload={action?.reload}
|
||||
item={props?.item}
|
||||
title="岗位111"
|
||||
/>,
|
||||
<PositionCreate
|
||||
key="Create"
|
||||
reload={action?.reload}
|
||||
|
||||
135
src/pages/company/positions/modals/PositionAdd.tsx
Normal file
135
src/pages/company/positions/modals/PositionAdd.tsx
Normal file
@ -0,0 +1,135 @@
|
||||
import {
|
||||
MyBetaModalFormProps,
|
||||
MyButtons,
|
||||
MyColumns,
|
||||
MyProTableProps,
|
||||
} from '@/common';
|
||||
import { MyModal } from '@/components/MyModal';
|
||||
|
||||
import { Apis } from '@/gen/Apis';
|
||||
import { ProTable } from '@ant-design/pro-components';
|
||||
import { message, Space } from 'antd';
|
||||
import { useRef, useState } from 'react';
|
||||
|
||||
export default function PositionAdd(props: MyBetaModalFormProps) {
|
||||
// 使用 useState 保存选中的岗位 ID 和行数据,确保跨页选中状态保持
|
||||
const [selectedPositionsIds, setSelectedPositionsIds] = useState<number[]>(
|
||||
[],
|
||||
);
|
||||
const [selectedRows, setSelectedRows] = useState<any[]>([]);
|
||||
|
||||
// 添加 tableRef 用于操作表格
|
||||
const tableRef = useRef<any>();
|
||||
|
||||
const onShowContactPhone = () => {
|
||||
if (selectedPositionsIds.length === 0) {
|
||||
message.warning('请至少选择一个岗位');
|
||||
return;
|
||||
}
|
||||
|
||||
// 确保 positions_ids 是字符串数组
|
||||
const positionsIds = selectedPositionsIds.map((id) => String(id));
|
||||
|
||||
Apis.Company.CompanyPositions.BatchStore({
|
||||
companies_id: props?.item?.id ?? 0,
|
||||
positions_ids: positionsIds,
|
||||
})
|
||||
.then(() => {
|
||||
// 成功后重置选中状态
|
||||
setSelectedPositionsIds([]);
|
||||
setSelectedRows([]);
|
||||
props.reload?.();
|
||||
message.success('添加成功!');
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error('添加失败:', error);
|
||||
message.error('添加失败: ' + (error.message || '未知错误'));
|
||||
return false;
|
||||
});
|
||||
};
|
||||
|
||||
return (
|
||||
<MyModal
|
||||
title={'岗位库'}
|
||||
type="primary"
|
||||
size="middle"
|
||||
width="600px"
|
||||
node={
|
||||
<ProTable
|
||||
actionRef={tableRef}
|
||||
{...MyProTableProps.props}
|
||||
request={async (params, sort) =>
|
||||
MyProTableProps.request(
|
||||
{
|
||||
...params,
|
||||
is_use: 1,
|
||||
},
|
||||
sort,
|
||||
Apis.Common.Positions.List,
|
||||
undefined,
|
||||
(res) => {
|
||||
// 确保响应数据正确处理
|
||||
console.log('加载岗位数据:', res);
|
||||
return res;
|
||||
},
|
||||
)
|
||||
}
|
||||
// style={{ height: '800px', overflowY: 'auto', overflowX: 'hidden' }}
|
||||
pagination={{
|
||||
showQuickJumper: true,
|
||||
}}
|
||||
rowSelection={{
|
||||
type: 'checkbox',
|
||||
preserveSelectedRowKeys: true, // 启用跨页选择
|
||||
selectedRowKeys: selectedPositionsIds,
|
||||
onChange: (selectedRowKeys, selectedRows) => {
|
||||
// 确保 selectedRowKeys 是数字类型
|
||||
const numericKeys = selectedRowKeys.map((key) =>
|
||||
typeof key === 'string' ? parseInt(key, 10) : key,
|
||||
) as number[];
|
||||
|
||||
// 更新选中状态
|
||||
setSelectedPositionsIds(numericKeys);
|
||||
|
||||
// 合并当前页面选中的行和之前选中的行
|
||||
const newSelectedRows = [...selectedRows];
|
||||
|
||||
// 设置选中行数据
|
||||
setSelectedRows(newSelectedRows);
|
||||
},
|
||||
}}
|
||||
tableAlertOptionRender={({ selectedRowKeys, onCleanSelected }) => {
|
||||
return (
|
||||
<Space>
|
||||
<span>已选 {selectedRowKeys.length} 项</span>
|
||||
<a onClick={onCleanSelected}>清空</a>
|
||||
<MyButtons.Create
|
||||
title="批量添加"
|
||||
type="primary"
|
||||
key="create2"
|
||||
onClick={() => onShowContactPhone()}
|
||||
/>
|
||||
</Space>
|
||||
);
|
||||
}}
|
||||
options={false}
|
||||
columns={[
|
||||
MyColumns.ID(),
|
||||
{
|
||||
title: '岗位名称',
|
||||
dataIndex: 'name',
|
||||
width: 300,
|
||||
},
|
||||
{
|
||||
title: '是否启用',
|
||||
dataIndex: 'is_use',
|
||||
search: false,
|
||||
render: (text) => (text ? '是' : '否'),
|
||||
width: 200,
|
||||
},
|
||||
]}
|
||||
/>
|
||||
}
|
||||
/>
|
||||
);
|
||||
}
|
||||
@ -17,7 +17,7 @@ export default function Create(props: MyBetaModalFormProps) {
|
||||
title={`添加岗位`}
|
||||
wrapperCol={{ span: 24 }}
|
||||
width="500px"
|
||||
trigger={<MyButtons.Create title={`添加岗位`} />}
|
||||
trigger={<MyButtons.Create title={`岗位`} />}
|
||||
form={form}
|
||||
onOpenChange={(open: any) => {
|
||||
if (open) {
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
import {
|
||||
MyButtons,
|
||||
MyColumns,
|
||||
MyImportModal,
|
||||
MyPageContainer,
|
||||
MyProTableProps,
|
||||
usePageTabs,
|
||||
@ -41,6 +42,15 @@ export default function Index({ title = '仪表管理' }) {
|
||||
MyProTableProps.request(params, sort, Apis.Meter.HouseMeters.List)
|
||||
}
|
||||
toolBarRender={(action) => [
|
||||
<MyImportModal
|
||||
key="ImportHouse"
|
||||
title="批量导入"
|
||||
type="danger"
|
||||
size="middle"
|
||||
templateApi={Apis.Meter.HouseMeters.DownloadTemplate}
|
||||
importApi={Apis.Meter.HouseMeters.Import}
|
||||
reload={action?.reload}
|
||||
/>,
|
||||
<CompanyCreate key="Create" reload={action?.reload} title={title} />,
|
||||
]}
|
||||
columns={[
|
||||
@ -93,15 +103,20 @@ export default function Index({ title = '仪表管理' }) {
|
||||
},
|
||||
|
||||
MyColumns.SoftDelete({
|
||||
onRestore: Apis.Company.Companies.Restore,
|
||||
onSoftDelete: Apis.Company.Companies.SoftDelete,
|
||||
onRestore: Apis.Meter.HouseMeters.Restore,
|
||||
onSoftDelete: Apis.Meter.HouseMeters.SoftDelete,
|
||||
search: false,
|
||||
}),
|
||||
MyColumns.CreatedAt(),
|
||||
MyColumns.Option({
|
||||
render: (_, item: any, index, action) => (
|
||||
<Space key={index}>
|
||||
{/* <CompanyShow item={item} title="查看" reload={action?.reload} /> */}
|
||||
<MyButtons.View
|
||||
title="查看"
|
||||
onClick={() => {
|
||||
navigate(`/meter/readings/show/${item.id}`);
|
||||
}}
|
||||
/>
|
||||
<CompanyUpdate
|
||||
item={{ ...item, type: 'link' }}
|
||||
title="机构"
|
||||
@ -110,7 +125,7 @@ export default function Index({ title = '仪表管理' }) {
|
||||
{item.meter_type ===
|
||||
HouseMetersMeterTypeEnum.HouseMeter.value && (
|
||||
<MeterHasOne
|
||||
item={item}
|
||||
item={{ ...item, size: 'small' }}
|
||||
reload={action?.reload}
|
||||
title={'绑房'}
|
||||
/>
|
||||
@ -118,14 +133,14 @@ export default function Index({ title = '仪表管理' }) {
|
||||
{item.meter_type ===
|
||||
HouseMetersMeterTypeEnum.CommonMeter.value && (
|
||||
<MeterHasHouse
|
||||
item={item}
|
||||
item={{ ...item, size: 'small' }}
|
||||
reload={action?.reload}
|
||||
title={'绑房'}
|
||||
/>
|
||||
)}
|
||||
<MyButtons.Delete
|
||||
onConfirm={() =>
|
||||
Apis.Company.Companies.Delete({ id: item.id }).then(() =>
|
||||
Apis.Meter.HouseMeters.Delete({ id: item.id }).then(() =>
|
||||
action?.reload(),
|
||||
)
|
||||
}
|
||||
@ -37,6 +37,8 @@ export default function Create(props: MyBetaModalFormProps) {
|
||||
onFinish={async (values) =>
|
||||
Apis.Meter.HouseMeters.Store({
|
||||
...values,
|
||||
latest_value: values.initial_value,
|
||||
latest_time: values.initial_time,
|
||||
})
|
||||
.then(() => {
|
||||
props.reload?.();
|
||||
@ -93,11 +95,62 @@ export default function Create(props: MyBetaModalFormProps) {
|
||||
{
|
||||
key: 'initial_time',
|
||||
title: '初始抄表时间',
|
||||
valueType: 'date',
|
||||
valueType: 'dateTime',
|
||||
colProps: { span: 24 },
|
||||
formItemProps: { ...rulesHelper.text },
|
||||
fieldProps: {
|
||||
disabledDate: (current: any) => {
|
||||
// 禁用未来的日期
|
||||
return current && current > new Date();
|
||||
},
|
||||
disabledTime: (current: any) => {
|
||||
// 如果是今天,禁用未来的时间
|
||||
if (
|
||||
current &&
|
||||
current.format('YYYY-MM-DD') ===
|
||||
new Date().toISOString().split('T')[0]
|
||||
) {
|
||||
const now = new Date();
|
||||
return {
|
||||
disabledHours: () => {
|
||||
const hours = [];
|
||||
for (let i = now.getHours() + 1; i < 24; i++) {
|
||||
hours.push(i);
|
||||
}
|
||||
return hours;
|
||||
},
|
||||
disabledMinutes: (selectedHour: number) => {
|
||||
if (selectedHour === now.getHours()) {
|
||||
const minutes = [];
|
||||
for (let i = now.getMinutes() + 1; i < 60; i++) {
|
||||
minutes.push(i);
|
||||
}
|
||||
return minutes;
|
||||
}
|
||||
return [];
|
||||
},
|
||||
disabledSeconds: (
|
||||
selectedHour: number,
|
||||
selectedMinute: number,
|
||||
) => {
|
||||
if (
|
||||
selectedHour === now.getHours() &&
|
||||
selectedMinute === now.getMinutes()
|
||||
) {
|
||||
const seconds = [];
|
||||
for (let i = now.getSeconds() + 1; i < 60; i++) {
|
||||
seconds.push(i);
|
||||
}
|
||||
return seconds;
|
||||
}
|
||||
return [];
|
||||
},
|
||||
};
|
||||
}
|
||||
return {};
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
valueType: 'dependency',
|
||||
name: ['asset_projects_id'],
|
||||
@ -54,6 +54,7 @@ export default function ChargeStandardHasHouse(props: MyBetaModalFormProps) {
|
||||
<MyModal
|
||||
title={props.title || '查看'}
|
||||
type="primary"
|
||||
size={props?.item?.size || 'small'}
|
||||
width="920px"
|
||||
node={
|
||||
<ProTable
|
||||
@ -53,13 +53,13 @@ export default function ChargeStandardHasHouse(props: MyBetaModalFormProps) {
|
||||
return false;
|
||||
});
|
||||
};
|
||||
|
||||
return (
|
||||
<MyModal
|
||||
title={props.title || '查看'}
|
||||
type="primary"
|
||||
width="920px"
|
||||
myRef={modalRef}
|
||||
size={props?.item?.size || 'small'}
|
||||
node={
|
||||
<ProTable
|
||||
actionRef={tableRef}
|
||||
60
src/pages/meter/readings/components/MeteInfo.tsx
Normal file
60
src/pages/meter/readings/components/MeteInfo.tsx
Normal file
@ -0,0 +1,60 @@
|
||||
import { MyBetaModalFormProps, renderTextHelper } from '@/common';
|
||||
import {
|
||||
HouseMetersMeterTypeEnum,
|
||||
HouseMetersUsageTypeEnum,
|
||||
} from '@/gen/Enums';
|
||||
import { ProCard, ProDescriptions } from '@ant-design/pro-components';
|
||||
import { Space } from 'antd';
|
||||
|
||||
export default function info(props: MyBetaModalFormProps) {
|
||||
const { item } = props;
|
||||
|
||||
return (
|
||||
<Space direction="vertical" style={{ width: '100%' }}>
|
||||
<ProCard title="基本信息">
|
||||
<ProDescriptions bordered>
|
||||
<ProDescriptions.Item label="仪表名称">
|
||||
<div style={{ fontWeight: 'bold' }}>
|
||||
【{item?.id}】{item?.name}
|
||||
</div>
|
||||
</ProDescriptions.Item>
|
||||
<ProDescriptions.Item label="类型">
|
||||
<renderTextHelper.Tag
|
||||
Enums={HouseMetersMeterTypeEnum}
|
||||
value={item?.meter_type}
|
||||
key="meter_type"
|
||||
/>
|
||||
</ProDescriptions.Item>
|
||||
<ProDescriptions.Item label="使用类型">
|
||||
<renderTextHelper.Tag
|
||||
Enums={HouseMetersUsageTypeEnum}
|
||||
value={item?.usage_type}
|
||||
key="usage_type"
|
||||
/>
|
||||
</ProDescriptions.Item>
|
||||
|
||||
<ProDescriptions.Item label="收费标准">
|
||||
{item?.charge_standard?.name || '-'}
|
||||
</ProDescriptions.Item>
|
||||
<ProDescriptions.Item label="初始抄表读数">
|
||||
{item?.initial_value}
|
||||
</ProDescriptions.Item>
|
||||
<ProDescriptions.Item label="初始抄表时间">
|
||||
{item?.initial_time}
|
||||
</ProDescriptions.Item>
|
||||
<ProDescriptions.Item label="最新抄表读数">
|
||||
{item?.latest_value}
|
||||
</ProDescriptions.Item>
|
||||
|
||||
<ProDescriptions.Item label="最新抄表时间">
|
||||
{item?.latest_time}
|
||||
</ProDescriptions.Item>
|
||||
|
||||
<ProDescriptions.Item label="备注">
|
||||
{item?.remark || '-'}
|
||||
</ProDescriptions.Item>
|
||||
</ProDescriptions>
|
||||
</ProCard>
|
||||
</Space>
|
||||
);
|
||||
}
|
||||
@ -15,6 +15,7 @@ import {
|
||||
HouseMetersUsageTypeEnum,
|
||||
} from '@/gen/Enums';
|
||||
import NormalReading from './modals/NormalReading';
|
||||
import ResetReading from './modals/ResetReading';
|
||||
|
||||
export default function Index({ title = '抄表数据' }) {
|
||||
const navigate = useNavigate();
|
||||
@ -58,6 +59,10 @@ export default function Index({ title = '抄表数据' }) {
|
||||
title: '仪表名称',
|
||||
dataIndex: 'name',
|
||||
},
|
||||
{
|
||||
title: '关联房屋',
|
||||
dataIndex: 'full_name',
|
||||
},
|
||||
{
|
||||
title: '收费标准',
|
||||
dataIndex: ['charge_standard', 'name'],
|
||||
@ -83,34 +88,27 @@ export default function Index({ title = '抄表数据' }) {
|
||||
dataIndex: 'latest_time',
|
||||
search: false,
|
||||
},
|
||||
{
|
||||
title: '备注',
|
||||
dataIndex: 'remark',
|
||||
search: false,
|
||||
},
|
||||
|
||||
MyColumns.SoftDelete({
|
||||
onRestore: Apis.Company.Companies.Restore,
|
||||
onSoftDelete: Apis.Company.Companies.SoftDelete,
|
||||
search: false,
|
||||
}),
|
||||
MyColumns.CreatedAt(),
|
||||
MyColumns.Option({
|
||||
render: (_, item: any, index, action) => (
|
||||
<Space key={index}>
|
||||
{/* <CompanyShow item={item} title="查看" reload={action?.reload} /> */}
|
||||
<MyButtons.View
|
||||
title="查看"
|
||||
onClick={() => {
|
||||
navigate(`/meter/readings/show/${item.id}`);
|
||||
}}
|
||||
/>
|
||||
<NormalReading
|
||||
item={{ ...item, type: 'link' }}
|
||||
item={{ ...item, size: 'small' }}
|
||||
title="抄表"
|
||||
reload={action?.reload}
|
||||
/>
|
||||
|
||||
<MyButtons.Delete
|
||||
onConfirm={() =>
|
||||
Apis.Company.Companies.Delete({ id: item.id }).then(() =>
|
||||
action?.reload(),
|
||||
)
|
||||
}
|
||||
<ResetReading
|
||||
item={{ ...item, title: '重置', size: 'small' }}
|
||||
title="重置"
|
||||
reload={action?.reload}
|
||||
/>
|
||||
</Space>
|
||||
),
|
||||
210
src/pages/meter/readings/modals/CorrectReading.tsx
Normal file
210
src/pages/meter/readings/modals/CorrectReading.tsx
Normal file
@ -0,0 +1,210 @@
|
||||
import {
|
||||
MyBetaModalFormProps,
|
||||
MyButtons,
|
||||
MyModalFormProps,
|
||||
rulesHelper,
|
||||
} from '@/common';
|
||||
import { Selects } from '@/components/Select';
|
||||
import { Apis } from '@/gen/Apis';
|
||||
import { HouseMeterReadingsOperationTypeEnum } from '@/gen/Enums';
|
||||
import { BetaSchemaForm } from '@ant-design/pro-components';
|
||||
import { Form, message } from 'antd';
|
||||
|
||||
export default function Create(props: MyBetaModalFormProps) {
|
||||
const [form] = Form.useForm();
|
||||
|
||||
return (
|
||||
<BetaSchemaForm<ApiTypes.Meter.HouseMeterReadings.Update>
|
||||
{...MyModalFormProps.props}
|
||||
title={`修正抄表数据`}
|
||||
layout="horizontal"
|
||||
labelCol={{ span: 6 }}
|
||||
wrapperCol={{ span: 18 }}
|
||||
labelAlign="left"
|
||||
width="600px"
|
||||
key={new Date().getTime()}
|
||||
trigger={<MyButtons.Default title={`修正`} type="primary" />}
|
||||
form={form}
|
||||
onOpenChange={(open: any) => {
|
||||
if (open && props.item) {
|
||||
form.setFieldsValue(props.item);
|
||||
}
|
||||
}}
|
||||
onFinish={async (values) =>
|
||||
Apis.Meter.HouseMeterReadings.Update({
|
||||
...values,
|
||||
id: props.item?.id ?? 0,
|
||||
house_meters_id: props.item?.house_meters_id,
|
||||
previous_reading: props.item?.previous_reading,
|
||||
operation_type:
|
||||
HouseMeterReadingsOperationTypeEnum.CorrectReading.value,
|
||||
})
|
||||
.then(() => {
|
||||
props.reload?.();
|
||||
message.success(props.title + '成功');
|
||||
return true;
|
||||
})
|
||||
.catch(() => false)
|
||||
}
|
||||
columns={[
|
||||
{
|
||||
key: 'previous_reading',
|
||||
title: '上次抄表读数',
|
||||
colProps: { span: 24 },
|
||||
fieldProps: { disabled: true },
|
||||
},
|
||||
{
|
||||
key: 'current_reading',
|
||||
title: '修正抄表读数',
|
||||
valueType: 'number',
|
||||
colProps: { span: 24 },
|
||||
formItemProps: {
|
||||
...rulesHelper.number,
|
||||
rules: [
|
||||
...rulesHelper.number.rules,
|
||||
{
|
||||
validator: (_, value) => {
|
||||
const latestValue = form.getFieldValue('latest_value');
|
||||
if (
|
||||
value &&
|
||||
latestValue &&
|
||||
Number(value) <= Number(latestValue)
|
||||
) {
|
||||
return Promise.reject(
|
||||
new Error('本次读数必须大于上次抄表读数'),
|
||||
);
|
||||
}
|
||||
return Promise.resolve();
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
fieldProps: {
|
||||
onChange: (e: any, num: number) => {
|
||||
form.setFieldsValue({
|
||||
usage_amount: rulesHelper.getDifference(
|
||||
parseFloat(form.getFieldValue('previous_reading')),
|
||||
parseFloat(form.getFieldValue('current_reading')),
|
||||
),
|
||||
remark: `修正前读数:${props.item?.current_reading}`,
|
||||
});
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
key: 'reading_time',
|
||||
title: '修正抄表时间',
|
||||
valueType: 'dateTime',
|
||||
colProps: { span: 24 },
|
||||
formItemProps: {
|
||||
...rulesHelper.text,
|
||||
rules: [
|
||||
...rulesHelper.text.rules,
|
||||
{
|
||||
validator: (_, value) => {
|
||||
const latestTime = form.getFieldValue('latest_time');
|
||||
if (value && latestTime) {
|
||||
const currentTime = new Date(value);
|
||||
const lastTime = new Date(latestTime);
|
||||
if (currentTime <= lastTime) {
|
||||
return Promise.reject(
|
||||
new Error('本次抄表时间必须大于上次抄表时间'),
|
||||
);
|
||||
}
|
||||
}
|
||||
return Promise.resolve();
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
fieldProps: {
|
||||
disabledDate: (current: any) => {
|
||||
// 禁用未来的日期
|
||||
return current && current > new Date();
|
||||
},
|
||||
disabledTime: (current: any) => {
|
||||
// 如果是今天,禁用未来的时间
|
||||
if (
|
||||
current &&
|
||||
current.format('YYYY-MM-DD') ===
|
||||
new Date().toISOString().split('T')[0]
|
||||
) {
|
||||
const now = new Date();
|
||||
return {
|
||||
disabledHours: () => {
|
||||
const hours = [];
|
||||
for (let i = now.getHours() + 1; i < 24; i++) {
|
||||
hours.push(i);
|
||||
}
|
||||
return hours;
|
||||
},
|
||||
disabledMinutes: (selectedHour: number) => {
|
||||
if (selectedHour === now.getHours()) {
|
||||
const minutes = [];
|
||||
for (let i = now.getMinutes() + 1; i < 60; i++) {
|
||||
minutes.push(i);
|
||||
}
|
||||
return minutes;
|
||||
}
|
||||
return [];
|
||||
},
|
||||
disabledSeconds: (
|
||||
selectedHour: number,
|
||||
selectedMinute: number,
|
||||
) => {
|
||||
if (
|
||||
selectedHour === now.getHours() &&
|
||||
selectedMinute === now.getMinutes()
|
||||
) {
|
||||
const seconds = [];
|
||||
for (let i = now.getSeconds() + 1; i < 60; i++) {
|
||||
seconds.push(i);
|
||||
}
|
||||
return seconds;
|
||||
}
|
||||
return [];
|
||||
},
|
||||
};
|
||||
}
|
||||
return {};
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
key: 'usage_amount',
|
||||
title: '修正后用量',
|
||||
valueType: 'number',
|
||||
colProps: { span: 24 },
|
||||
formItemProps: {
|
||||
...rulesHelper.number,
|
||||
},
|
||||
fieldProps: {
|
||||
disabled: true,
|
||||
},
|
||||
},
|
||||
Selects?.Employees({
|
||||
key: 'company_employees_id',
|
||||
title: '抄表人',
|
||||
params: {
|
||||
companies_id: props.item?.companies_id,
|
||||
},
|
||||
colProps: { span: 24 },
|
||||
required: true,
|
||||
fieldProps: {
|
||||
showSearch: true,
|
||||
fieldNames: {
|
||||
label: 'label',
|
||||
value: 'value',
|
||||
},
|
||||
},
|
||||
}),
|
||||
{
|
||||
key: 'remark',
|
||||
title: '备注',
|
||||
valueType: 'textarea',
|
||||
colProps: { span: 24 },
|
||||
},
|
||||
]}
|
||||
/>
|
||||
);
|
||||
}
|
||||
@ -10,7 +10,7 @@ import { HouseMeterReadingsOperationTypeEnum } from '@/gen/Enums';
|
||||
import { BetaSchemaForm } from '@ant-design/pro-components';
|
||||
import { Form, message } from 'antd';
|
||||
|
||||
export default function Create(props: MyBetaModalFormProps) {
|
||||
export default function NormalReading(props: MyBetaModalFormProps) {
|
||||
const [form] = Form.useForm();
|
||||
|
||||
return (
|
||||
@ -23,7 +23,13 @@ export default function Create(props: MyBetaModalFormProps) {
|
||||
labelAlign="left"
|
||||
width="600px"
|
||||
key={new Date().getTime()}
|
||||
trigger={<MyButtons.Default title={`抄表`} type="primary" />}
|
||||
trigger={
|
||||
<MyButtons.Create
|
||||
title={`抄表`}
|
||||
type="primary"
|
||||
size={props.item?.size || 'middle'}
|
||||
/>
|
||||
}
|
||||
form={form}
|
||||
onOpenChange={(open: any) => {
|
||||
if (open && props.item) {
|
||||
@ -41,6 +47,7 @@ export default function Create(props: MyBetaModalFormProps) {
|
||||
onFinish={async (values) =>
|
||||
Apis.Meter.HouseMeterReadings.Store({
|
||||
...values,
|
||||
house_meters_id: props.item?.id,
|
||||
operation_type:
|
||||
HouseMeterReadingsOperationTypeEnum.NormalReading.value,
|
||||
})
|
||||
@ -61,11 +68,10 @@ export default function Create(props: MyBetaModalFormProps) {
|
||||
{
|
||||
key: 'latest_time',
|
||||
title: '上次抄表时间',
|
||||
valueType: 'date',
|
||||
valueType: 'dateTime',
|
||||
colProps: { span: 24 },
|
||||
fieldProps: { disabled: true },
|
||||
},
|
||||
|
||||
{
|
||||
key: 'current_reading',
|
||||
title: '本次抄表读数',
|
||||
@ -96,7 +102,7 @@ export default function Create(props: MyBetaModalFormProps) {
|
||||
{
|
||||
key: 'reading_time',
|
||||
title: '本次抄表时间',
|
||||
valueType: 'date',
|
||||
valueType: 'dateTime',
|
||||
colProps: { span: 24 },
|
||||
formItemProps: {
|
||||
...rulesHelper.text,
|
||||
@ -119,6 +125,58 @@ export default function Create(props: MyBetaModalFormProps) {
|
||||
},
|
||||
],
|
||||
},
|
||||
fieldProps: {
|
||||
disabledDate: (current: any) => {
|
||||
// 禁用未来的日期
|
||||
return current && current > new Date();
|
||||
},
|
||||
disabledTime: (current: any) => {
|
||||
// 如果是今天,禁用未来的时间
|
||||
if (
|
||||
current &&
|
||||
current.format('YYYY-MM-DD') ===
|
||||
new Date().toISOString().split('T')[0]
|
||||
) {
|
||||
const now = new Date();
|
||||
return {
|
||||
disabledHours: () => {
|
||||
const hours = [];
|
||||
for (let i = now.getHours() + 1; i < 24; i++) {
|
||||
hours.push(i);
|
||||
}
|
||||
return hours;
|
||||
},
|
||||
disabledMinutes: (selectedHour: number) => {
|
||||
if (selectedHour === now.getHours()) {
|
||||
const minutes = [];
|
||||
for (let i = now.getMinutes() + 1; i < 60; i++) {
|
||||
minutes.push(i);
|
||||
}
|
||||
return minutes;
|
||||
}
|
||||
return [];
|
||||
},
|
||||
disabledSeconds: (
|
||||
selectedHour: number,
|
||||
selectedMinute: number,
|
||||
) => {
|
||||
if (
|
||||
selectedHour === now.getHours() &&
|
||||
selectedMinute === now.getMinutes()
|
||||
) {
|
||||
const seconds = [];
|
||||
for (let i = now.getSeconds() + 1; i < 60; i++) {
|
||||
seconds.push(i);
|
||||
}
|
||||
return seconds;
|
||||
}
|
||||
return [];
|
||||
},
|
||||
};
|
||||
}
|
||||
return {};
|
||||
},
|
||||
},
|
||||
},
|
||||
Selects?.Employees({
|
||||
key: 'company_employees_id',
|
||||
220
src/pages/meter/readings/modals/ResetReading.tsx
Normal file
220
src/pages/meter/readings/modals/ResetReading.tsx
Normal file
@ -0,0 +1,220 @@
|
||||
import {
|
||||
MyBetaModalFormProps,
|
||||
MyButtons,
|
||||
MyFormItems,
|
||||
MyModalFormProps,
|
||||
rulesHelper,
|
||||
} from '@/common';
|
||||
import { Selects } from '@/components/Select';
|
||||
import { Apis } from '@/gen/Apis';
|
||||
import {
|
||||
HouseMeterReadingsOperationTypeEnum,
|
||||
HouseMetersMeterTypeEnum,
|
||||
HouseMetersUsageTypeEnum,
|
||||
} from '@/gen/Enums';
|
||||
import { BetaSchemaForm } from '@ant-design/pro-components';
|
||||
import { Form, message } from 'antd';
|
||||
|
||||
export default function Create(props: MyBetaModalFormProps) {
|
||||
const [form] = Form.useForm();
|
||||
|
||||
return (
|
||||
<BetaSchemaForm<ApiTypes.Meter.HouseMeterReadings.Store>
|
||||
{...MyModalFormProps.props}
|
||||
title={`重置抄表数据`}
|
||||
layout="horizontal"
|
||||
labelCol={{ span: 6 }}
|
||||
wrapperCol={{ span: 18 }}
|
||||
labelAlign="left"
|
||||
width="600px"
|
||||
key={new Date().getTime()}
|
||||
trigger={
|
||||
<MyButtons.Default
|
||||
title={props.item?.title || `重置读数`}
|
||||
type="primary"
|
||||
size={props.item?.size || 'middle'}
|
||||
danger
|
||||
/>
|
||||
}
|
||||
form={form}
|
||||
onOpenChange={(open: any) => {
|
||||
if (open && props.item) {
|
||||
form.resetFields(); // 清空表单数据
|
||||
form.setFieldsValue({
|
||||
...props.item,
|
||||
house_meters_id: props.item?.id,
|
||||
latest_value:
|
||||
props.item?.latest_value === '0.00'
|
||||
? props.item?.initial_value
|
||||
: props.item?.latest_value,
|
||||
latest_time: props.item?.latest_time || props.item?.initial_time,
|
||||
});
|
||||
}
|
||||
}}
|
||||
onFinish={async (values) =>
|
||||
Apis.Meter.HouseMeterReadings.Store({
|
||||
...values,
|
||||
house_meters_id: props.item?.id,
|
||||
operation_type:
|
||||
HouseMeterReadingsOperationTypeEnum.ResetReading.value,
|
||||
})
|
||||
.then(() => {
|
||||
props.reload?.();
|
||||
message.success(props.title + '成功');
|
||||
return true;
|
||||
})
|
||||
.catch(() => false)
|
||||
}
|
||||
columns={[
|
||||
{
|
||||
key: 'name',
|
||||
title: '仪表名称',
|
||||
colProps: { span: 24 },
|
||||
fieldProps: { disabled: true },
|
||||
formItemProps: { ...rulesHelper.text },
|
||||
},
|
||||
MyFormItems.EnumRadio({
|
||||
key: 'meter_type',
|
||||
title: '仪表类型',
|
||||
colProps: { span: 24 },
|
||||
valueEnum: HouseMetersMeterTypeEnum,
|
||||
required: true,
|
||||
fieldProps: { disabled: true },
|
||||
}),
|
||||
MyFormItems.EnumRadio({
|
||||
key: 'usage_type',
|
||||
title: '使用类型',
|
||||
colProps: { span: 24 },
|
||||
valueEnum: HouseMetersUsageTypeEnum,
|
||||
required: true,
|
||||
fieldProps: { disabled: true },
|
||||
}),
|
||||
{
|
||||
key: 'latest_value',
|
||||
title: '上次抄表读数',
|
||||
colProps: { span: 24 },
|
||||
fieldProps: { disabled: true },
|
||||
},
|
||||
{
|
||||
key: 'latest_time',
|
||||
title: '上次抄表时间',
|
||||
valueType: 'dateTime',
|
||||
colProps: { span: 24 },
|
||||
fieldProps: { disabled: true },
|
||||
},
|
||||
|
||||
{
|
||||
key: 'current_reading',
|
||||
title: '重置抄表读数',
|
||||
valueType: 'number',
|
||||
colProps: { span: 24 },
|
||||
formItemProps: {
|
||||
...rulesHelper.number,
|
||||
},
|
||||
},
|
||||
{
|
||||
key: 'reading_time',
|
||||
title: '重置抄表时间',
|
||||
valueType: 'dateTime',
|
||||
colProps: { span: 24 },
|
||||
formItemProps: {
|
||||
...rulesHelper.text,
|
||||
rules: [
|
||||
...rulesHelper.text.rules,
|
||||
{
|
||||
validator: (_, value) => {
|
||||
const latestTime = form.getFieldValue('latest_time');
|
||||
if (value && latestTime) {
|
||||
const currentTime = new Date(value);
|
||||
const lastTime = new Date(latestTime);
|
||||
if (currentTime <= lastTime) {
|
||||
return Promise.reject(
|
||||
new Error('本次抄表时间必须大于上次抄表时间'),
|
||||
);
|
||||
}
|
||||
}
|
||||
return Promise.resolve();
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
fieldProps: {
|
||||
disabledDate: (current: any) => {
|
||||
// 禁用未来的日期
|
||||
return current && current > new Date();
|
||||
},
|
||||
disabledTime: (current: any) => {
|
||||
// 如果是今天,禁用未来的时间
|
||||
if (
|
||||
current &&
|
||||
current.format('YYYY-MM-DD') ===
|
||||
new Date().toISOString().split('T')[0]
|
||||
) {
|
||||
const now = new Date();
|
||||
return {
|
||||
disabledHours: () => {
|
||||
const hours = [];
|
||||
for (let i = now.getHours() + 1; i < 24; i++) {
|
||||
hours.push(i);
|
||||
}
|
||||
return hours;
|
||||
},
|
||||
disabledMinutes: (selectedHour: number) => {
|
||||
if (selectedHour === now.getHours()) {
|
||||
const minutes = [];
|
||||
for (let i = now.getMinutes() + 1; i < 60; i++) {
|
||||
minutes.push(i);
|
||||
}
|
||||
return minutes;
|
||||
}
|
||||
return [];
|
||||
},
|
||||
disabledSeconds: (
|
||||
selectedHour: number,
|
||||
selectedMinute: number,
|
||||
) => {
|
||||
if (
|
||||
selectedHour === now.getHours() &&
|
||||
selectedMinute === now.getMinutes()
|
||||
) {
|
||||
const seconds = [];
|
||||
for (let i = now.getSeconds() + 1; i < 60; i++) {
|
||||
seconds.push(i);
|
||||
}
|
||||
return seconds;
|
||||
}
|
||||
return [];
|
||||
},
|
||||
};
|
||||
}
|
||||
return {};
|
||||
},
|
||||
},
|
||||
},
|
||||
Selects?.Employees({
|
||||
key: 'company_employees_id',
|
||||
title: '抄表人',
|
||||
params: {
|
||||
companies_id: props.item?.companies_id,
|
||||
},
|
||||
colProps: { span: 24 },
|
||||
required: true,
|
||||
fieldProps: {
|
||||
showSearch: true,
|
||||
fieldNames: {
|
||||
label: 'label',
|
||||
value: 'value',
|
||||
},
|
||||
},
|
||||
}),
|
||||
|
||||
{
|
||||
key: 'remark',
|
||||
title: '备注',
|
||||
valueType: 'textarea',
|
||||
colProps: { span: 24 },
|
||||
},
|
||||
]}
|
||||
/>
|
||||
);
|
||||
}
|
||||
71
src/pages/meter/readings/show/$id.tsx
Normal file
71
src/pages/meter/readings/show/$id.tsx
Normal file
@ -0,0 +1,71 @@
|
||||
import { MyPageContainer, usePageTabs } from '@/common';
|
||||
import { Apis } from '@/gen/Apis';
|
||||
import { ProCard } from '@ant-design/pro-components';
|
||||
import { useParams } from '@umijs/max';
|
||||
import { Tabs } from 'antd';
|
||||
import { useEffect, useState } from 'react';
|
||||
import MeteInfo from '../components/MeteInfo';
|
||||
import HasHouse from '../table/HasHouse';
|
||||
import ReadingLIst from '../table/ReadingLIst';
|
||||
|
||||
export default function Show({ title = '仪表详情' }) {
|
||||
const { id } = useParams<{ id: string }>();
|
||||
const [data, setShow] = useState<any>({});
|
||||
console.log('id', data);
|
||||
|
||||
// 注册标签页
|
||||
const { addTab } = usePageTabs({
|
||||
tabKey: `meter-detail-${id}`,
|
||||
tabLabel: `仪表:${data?.name}` || title,
|
||||
});
|
||||
|
||||
const loadShow = () => {
|
||||
let paramsId: any = { id: id ?? 0 };
|
||||
Apis.Meter.HouseMeters.Show(paramsId).then((res) => {
|
||||
setShow(res?.data);
|
||||
// 更新标签页标题
|
||||
if (res?.data?.name) {
|
||||
addTab({
|
||||
key: `meter-detail-${id}`,
|
||||
label: title,
|
||||
path: `/mete/readings/show/${id}`,
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
loadShow();
|
||||
}, [id]);
|
||||
|
||||
let items = [
|
||||
{
|
||||
label: '抄表数据',
|
||||
key: '1',
|
||||
closable: false,
|
||||
children: (
|
||||
<ReadingLIst
|
||||
item={{ ...data, id: id }}
|
||||
reload={() => {
|
||||
loadShow();
|
||||
}}
|
||||
/>
|
||||
),
|
||||
},
|
||||
{
|
||||
label: '关联房屋',
|
||||
key: '2',
|
||||
closable: false,
|
||||
children: <HasHouse item={{ ...data, id: id }} />,
|
||||
},
|
||||
];
|
||||
|
||||
return (
|
||||
<MyPageContainer title={title}>
|
||||
<MeteInfo item={data} reload={loadShow} />
|
||||
<ProCard style={{ marginTop: 16 }}>
|
||||
<Tabs type="card" items={items} defaultActiveKey="1" size="small" />
|
||||
</ProCard>
|
||||
</MyPageContainer>
|
||||
);
|
||||
}
|
||||
103
src/pages/meter/readings/table/HasHouse.tsx
Normal file
103
src/pages/meter/readings/table/HasHouse.tsx
Normal file
@ -0,0 +1,103 @@
|
||||
import {
|
||||
MyBetaModalFormProps,
|
||||
MyButtons,
|
||||
MyColumns,
|
||||
MyProTableProps,
|
||||
} from '@/common';
|
||||
import { Apis } from '@/gen/Apis';
|
||||
import { HouseMetersMeterTypeEnum } from '@/gen/Enums';
|
||||
import { ProTable } from '@ant-design/pro-components';
|
||||
import { Space } from 'antd';
|
||||
import MeterHasHouse from '../../list/modals/MeterHasHouse';
|
||||
import MeterHasOne from '../../list/modals/MeterHasOne';
|
||||
import NormalReading from '../modals/NormalReading';
|
||||
|
||||
export default function Index(props: MyBetaModalFormProps) {
|
||||
return (
|
||||
<>
|
||||
<ProTable
|
||||
{...MyProTableProps.props}
|
||||
request={async (params, sort) =>
|
||||
MyProTableProps.request(
|
||||
{ ...params, house_meters_id: props?.item?.id },
|
||||
sort,
|
||||
Apis.Meter.HouseMeterHasHouses.List,
|
||||
)
|
||||
}
|
||||
toolBarRender={(action) => [
|
||||
<NormalReading
|
||||
key="Create"
|
||||
reload={action?.reload}
|
||||
item={props?.item}
|
||||
title="抄表"
|
||||
/>,
|
||||
...(props?.item?.meter_type ===
|
||||
HouseMetersMeterTypeEnum.HouseMeter.value
|
||||
? [
|
||||
<MeterHasOne
|
||||
key="MeterHasOne"
|
||||
item={{ ...props?.item, size: 'middle' }}
|
||||
reload={action?.reload}
|
||||
title={'绑房'}
|
||||
/>,
|
||||
]
|
||||
: []),
|
||||
...(props?.item?.meter_type ===
|
||||
HouseMetersMeterTypeEnum.CommonMeter.value
|
||||
? [
|
||||
<MeterHasHouse
|
||||
key="MeterHasHouse"
|
||||
item={{ ...props?.item, size: 'middle' }}
|
||||
reload={action?.reload}
|
||||
title={'绑房'}
|
||||
/>,
|
||||
]
|
||||
: []),
|
||||
]}
|
||||
// search={false}
|
||||
// options={false}
|
||||
columns={[
|
||||
MyColumns.ID(),
|
||||
{
|
||||
title: '项目名称',
|
||||
dataIndex: 'project_name',
|
||||
search: false,
|
||||
},
|
||||
{
|
||||
title: '楼栋名称',
|
||||
dataIndex: 'building_name',
|
||||
search: false,
|
||||
},
|
||||
{
|
||||
title: '单元名称',
|
||||
dataIndex: 'unit_name',
|
||||
search: false,
|
||||
},
|
||||
{
|
||||
title: '房号',
|
||||
dataIndex: 'name',
|
||||
search: false,
|
||||
},
|
||||
{
|
||||
title: '房屋名称',
|
||||
dataIndex: 'full_name',
|
||||
},
|
||||
MyColumns.UpdatedAt(),
|
||||
MyColumns.Option({
|
||||
render: (_, item: any, index, action) => (
|
||||
<Space key={index}>
|
||||
<MyButtons.Delete
|
||||
onConfirm={() =>
|
||||
Apis.Meter.HouseMeterHasHouses.Delete({ id: item.id }).then(
|
||||
() => action?.reload(),
|
||||
)
|
||||
}
|
||||
/>
|
||||
</Space>
|
||||
),
|
||||
}),
|
||||
]}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
}
|
||||
91
src/pages/meter/readings/table/ReadingLIst.tsx
Normal file
91
src/pages/meter/readings/table/ReadingLIst.tsx
Normal file
@ -0,0 +1,91 @@
|
||||
import { MyBetaModalFormProps, MyColumns, MyProTableProps } from '@/common';
|
||||
import { Apis } from '@/gen/Apis';
|
||||
import { HouseMeterReadingsOperationTypeEnum } from '@/gen/Enums';
|
||||
import { ProTable } from '@ant-design/pro-components';
|
||||
import { Space } from 'antd';
|
||||
import CorrectReading from '../modals/CorrectReading';
|
||||
import NormalReading from '../modals/NormalReading';
|
||||
import ResetReading from '../modals/ResetReading';
|
||||
|
||||
export default function Index(props: MyBetaModalFormProps) {
|
||||
return (
|
||||
<>
|
||||
<ProTable
|
||||
{...MyProTableProps.props}
|
||||
request={async (params, sort) =>
|
||||
MyProTableProps.request(
|
||||
{ ...params, house_meters_id: props?.item?.id },
|
||||
sort,
|
||||
Apis.Meter.HouseMeterReadings.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.EnumTag({
|
||||
title: '操作类型',
|
||||
dataIndex: 'operation_type',
|
||||
valueEnum: HouseMeterReadingsOperationTypeEnum,
|
||||
}),
|
||||
{
|
||||
title: '抄表读数',
|
||||
dataIndex: 'current_reading',
|
||||
search: false,
|
||||
},
|
||||
{
|
||||
title: '抄表用量',
|
||||
dataIndex: 'usage_amount',
|
||||
search: false,
|
||||
},
|
||||
{
|
||||
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,
|
||||
},
|
||||
MyColumns.Option({
|
||||
render: (_, item: any, index, action) => (
|
||||
<Space key={index}>
|
||||
{/* 只有未生成账单的抄表记录,且不是重置读数,才显示修正按钮 */}
|
||||
{!item?.bill_status &&
|
||||
item?.operation_type !==
|
||||
HouseMeterReadingsOperationTypeEnum.ResetReading.value && (
|
||||
<CorrectReading item={item} reload={action?.reload} />
|
||||
)}
|
||||
</Space>
|
||||
),
|
||||
}),
|
||||
]}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user