Merge pull request 'develop' (#13) from develop into main
All checks were successful
Build and Push Docker Image / build (push) Successful in 3m34s

Reviewed-on: https://code.juyouwu.cn/pay/pay-admin/pulls/13
This commit is contained in:
uiujun 2025-10-01 18:07:01 +08:00
commit 96d9a93420
45 changed files with 2228 additions and 268 deletions

View File

@ -15,10 +15,10 @@ 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/',
// target: 'http://c789629c.natappfree.cc',
changeOrigin: true,
pathRewrite: { '^': '' },

View File

@ -1,4 +1,4 @@
{
"url": "http://10.39.13.78:8001/api/docs/openapi",
"url": "http://c789629c.natappfree.cc/api/docs/openapi",
"module": "Admin"
}

View File

@ -6,7 +6,10 @@
gap: 8px !important;
align-items: flex-start !important;
}
.ant-upload-list-item-name {
width: 300px;
overflow: hidden;
}
.ant-upload-list-item {
margin: 0 !important;
margin-bottom: 0 !important;

View File

@ -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;
}
},
};

View File

@ -570,4 +570,39 @@ export const Selects = {
},
};
},
//获取项目仪表
AssetMeters(props?: PropsType): ReturnType {
const {
title = '选择仪表',
key = 'id',
required = false,
hideInTable = true,
...rest
} = props ?? {};
return {
title: title,
key: key,
valueType: 'select',
hideInTable: hideInTable,
formItemProps: { ...(required ? rulesHelper.number : {}) },
request: async (params) =>
(
await Apis.Meter.HouseMeters.List({
keywords: params?.KeyWords,
...params,
asset_projects_id: params?.asset_projects_id,
})
).data,
...rest,
fieldProps: {
showSearch: true,
fieldNames: {
label: 'label',
value: 'value',
},
...rest?.fieldProps,
},
};
},
};

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

@ -67,6 +67,16 @@ declare namespace ApiTypes {
"asset_houses_id"?: number; // 资产房屋ID
"status"?: string; // 状态,[enum:HouseOccupantsStatusEnum]
};
type CustomerList = {
"name"?: string; // 客户姓名
"phone"?: string; // 客户手机号
"house_relation"?: string; // 房客关系,[enum:HouseOccupantsHouseRelationEnum]
"residential_relation"?: string; // 居住关系,[enum:HouseOccupantsResidentialRelationEnum]
"relation_with_owner"?: string; // 与产权人关系,[enum:HouseOccupantsRelationWithOwnerEnum]
};
type CustomerHouseByPhone = {
"phone": string; // 客户手机号
};
type Update = {
"id": number; // id
"name": string; // 客户姓名
@ -644,6 +654,7 @@ declare namespace ApiTypes {
namespace Positions {
type List = {
"name"?: string; // 模糊搜索:名称
"is_use"?: number; // 是否启用1启用0禁用
};
type Store = {
"name": string; // 岗位名称
@ -1256,6 +1267,9 @@ declare namespace ApiTypes {
type Delete = {
"id": number; // id
};
type CreateHouseBill = {
"id": number; // 任务明单id
};
}
namespace HouseChargeTasks {
type List = {
@ -1285,6 +1299,9 @@ declare namespace ApiTypes {
type Delete = {
"id": number; // id
};
type ExecuteTask = {
"id": number; // id
};
}
}
namespace HouseOrder {
@ -1344,7 +1361,8 @@ declare namespace ApiTypes {
}
namespace HouseMeterReadings {
type List = {
"name"?: string; // 模糊搜索:名称
"house_meters_id": number; // 仪表id,[ref:house_meters]
"operation_type"?: string; // 操作类型,[enum:HouseMeterReadingsOperationTypeEnum]
};
type Store = {
"house_meters_id": number; // 仪表id,[ref:house_meters]
@ -1352,7 +1370,7 @@ declare namespace ApiTypes {
"current_reading": number; // 本次读数
"reading_time": Date; // 抄表时间
"company_employees_id": number; // 抄表人id,[ref:company_employees]
"remark": string; // 备注
"remark"?: string; // 备注
};
type Update = {
"id": number; // id
@ -1364,7 +1382,7 @@ declare namespace ApiTypes {
"loss_amount"?: number; // 损耗
"reading_time": Date; // 抄表时间
"company_employees_id": number; // 抄表人id,[ref:company_employees]
"remark": string; // 备注
"remark"?: string; // 备注
};
type Show = {
"id": number; // id
@ -1385,6 +1403,9 @@ declare namespace ApiTypes {
type Delete = {
"id": number; // id
};
type CreateMeterBill = {
"id": number; // 仪表任务明细id
};
}
namespace HouseMeterTasks {
type List = {
@ -1410,6 +1431,9 @@ declare namespace ApiTypes {
type Delete = {
"id": number; // id
};
type ExecuteMeterTasks = {
"id": number; // id
};
}
namespace HouseMeters {
type List = {

View File

@ -46,6 +46,12 @@ export const Apis = {
List(data?: ApiTypes.Archive.HouseOccupants.List): Promise<MyResponseType> {
return request('admin/archive/house_occupants/list', { data });
},
CustomerList(data?: ApiTypes.Archive.HouseOccupants.CustomerList): Promise<MyResponseType> {
return request('admin/archive/house_occupants/customer_list', { data });
},
CustomerHouseByPhone(data: ApiTypes.Archive.HouseOccupants.CustomerHouseByPhone): Promise<MyResponseType> {
return request('admin/archive/house_occupants/customer_house_by_phone', { data });
},
Update(data: ApiTypes.Archive.HouseOccupants.Update): Promise<MyResponseType> {
return request('admin/archive/house_occupants/update', { data });
},
@ -737,6 +743,9 @@ export const Apis = {
Delete(data: ApiTypes.HouseCharage.HouseChargeTaskDetails.Delete): Promise<MyResponseType> {
return request('admin/house_charage/house_charge_task_details/delete', { data });
},
CreateHouseBill(data: ApiTypes.HouseCharage.HouseChargeTaskDetails.CreateHouseBill): Promise<MyResponseType> {
return request('admin/house_charage/house_charge_task_details/create_house_bill', { data });
},
},
HouseChargeTasks: {
List(data?: ApiTypes.HouseCharage.HouseChargeTasks.List): Promise<MyResponseType> {
@ -757,6 +766,9 @@ export const Apis = {
Delete(data: ApiTypes.HouseCharage.HouseChargeTasks.Delete): Promise<MyResponseType> {
return request('admin/house_charage/house_charge_tasks/delete', { data });
},
ExecuteTask(data: ApiTypes.HouseCharage.HouseChargeTasks.ExecuteTask): Promise<MyResponseType> {
return request('admin/house_charage/house_charge_tasks/execute_task', { data });
},
},
},
HouseOrder: {
@ -805,7 +817,7 @@ export const Apis = {
},
},
HouseMeterReadings: {
List(data?: ApiTypes.Meter.HouseMeterReadings.List): Promise<MyResponseType> {
List(data: ApiTypes.Meter.HouseMeterReadings.List): Promise<MyResponseType> {
return request('admin/meter/house_meter_readings/list', { data });
},
Store(data: ApiTypes.Meter.HouseMeterReadings.Store): Promise<MyResponseType> {
@ -831,6 +843,9 @@ export const Apis = {
Delete(data: ApiTypes.Meter.HouseMeterTaskDetails.Delete): Promise<MyResponseType> {
return request('admin/meter/house_meter_task_details/delete', { data });
},
CreateMeterBill(data: ApiTypes.Meter.HouseMeterTaskDetails.CreateMeterBill): Promise<MyResponseType> {
return request('admin/meter/house_meter_task_details/create_meter_bill', { data });
},
},
HouseMeterTasks: {
List(data?: ApiTypes.Meter.HouseMeterTasks.List): Promise<MyResponseType> {
@ -851,6 +866,9 @@ export const Apis = {
Delete(data: ApiTypes.Meter.HouseMeterTasks.Delete): Promise<MyResponseType> {
return request('admin/meter/house_meter_tasks/delete', { data });
},
ExecuteMeterTasks(data: ApiTypes.Meter.HouseMeterTasks.ExecuteMeterTasks): Promise<MyResponseType> {
return request('admin/meter/house_meter_tasks/execute_meter_tasks', { data });
},
},
HouseMeters: {
List(data?: ApiTypes.Meter.HouseMeters.List): Promise<MyResponseType> {

View File

@ -154,7 +154,7 @@ export const BannersTypeEnum= {
// 缓存类型
export const CacheTypeEnum= {
'MobilePhoneVerificationCode': {"text":"手机验证码","color":"#e3da02","value":"MobilePhoneVerificationCode"},
'MobilePhoneVerificationCode': {"text":"手机验证码","color":"#dc15e2","value":"MobilePhoneVerificationCode"},
};
// CompaniesMerchantTypeEnum
@ -452,7 +452,7 @@ export const HouseOccupantsRelationWithOwnerEnum= {
'Children': {"text":"子女","color":"#87d068","value":"Children"},
'Parents': {"text":"父母","color":"#faad14","value":"Parents"},
'Siblings': {"text":"兄弟姐妹","color":"#fa8c16","value":"Siblings"},
'OtherRelatives': {"text":"其他亲属","color":"#f5222d","value":"OtherRelatives"},
'OtherRelatives': {"text":"其他","color":"#f5222d","value":"OtherRelatives"},
'PrimaryTenant': {"text":"主租客","color":"#722ed1","value":"PrimaryTenant"},
'Tenant': {"text":"租客","color":"#1890ff","value":"Tenant"},
};

View File

@ -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 },
},
],
},
],

View File

@ -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 },
},
];
},
},

View File

@ -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',

View File

@ -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={[

View File

@ -98,6 +98,18 @@ export default function Index({ title = '账单任务' }) {
render: (_, item: any, index, action) => (
<Space key={index}>
<TaskShow item={item} title="查看" reload={action?.reload} />
<MyButtons.Default
title="重新执行"
type="link"
color="primary"
isConfirm
description="是否重新执行此任务?"
onConfirm={() =>
Apis.HouseCharage.HouseChargeTasks.ExecuteTask({
id: item.id,
}).then(() => action?.reload())
}
/>
<MyButtons.Delete
onConfirm={() =>
Apis.HouseCharage.HouseChargeTasks.Delete({

View File

@ -1,8 +1,14 @@
import { MyBetaModalFormProps, MyColumns, MyProTableProps } from '@/common';
import {
MyBetaModalFormProps,
MyButtons,
MyColumns,
MyProTableProps,
} from '@/common';
import { MyModal } from '@/components/MyModal';
import { Apis } from '@/gen/Apis';
import { HouseChargeTaskDetailsStatusEnum } from '@/gen/Enums';
import { ProTable } from '@ant-design/pro-components';
import { Space } from 'antd';
export default function AssetInfo(props: MyBetaModalFormProps) {
return (
@ -61,6 +67,24 @@ export default function AssetInfo(props: MyBetaModalFormProps) {
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>
),
}),
]}
/>
}

View 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>
);
}

View 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 },
},
]}
/>
);
}

View 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,
},
},
]}
/>
);
}

View File

@ -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}

View 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,
},
]}
/>
}
/>
);
}

View File

@ -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) {

View File

@ -0,0 +1,74 @@
import { MyBetaModalFormProps, MyColumns, MyProTableProps } from '@/common';
import { Apis } from '@/gen/Apis';
import { HouseMeterReadingsOperationTypeEnum } from '@/gen/Enums';
import { ProTable } from '@ant-design/pro-components';
export default function Index(props: MyBetaModalFormProps) {
console.log(props?.item, 'pppppppp');
return (
<>
<ProTable
{...MyProTableProps.props}
request={async (params, sort) =>
MyProTableProps.request(
{ ...params, phone: props?.item?.phone },
sort,
Apis.Archive.HouseOccupants.CustomerHouseByPhone,
)
}
// 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>
// ),
// }),
]}
/>
</>
);
}

View File

@ -0,0 +1,70 @@
import { MyBetaModalFormProps, renderTextHelper } from '@/common';
import { HouseOccupantsCardTypeEnum, SexEnum } from '@/gen/Enums';
import { ProCard, ProDescriptions } from '@ant-design/pro-components';
import { Image, 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?.name}</div>
</ProDescriptions.Item>
<ProDescriptions.Item label="电话">
{item?.phone}
</ProDescriptions.Item>
<ProDescriptions.Item label="性别">
<renderTextHelper.Tag Enums={SexEnum} value={item?.sex} key="sex" />
</ProDescriptions.Item>
<ProDescriptions.Item label="证件类型">
<renderTextHelper.Tag
Enums={HouseOccupantsCardTypeEnum}
value={props?.item?.card_type}
key="card_type"
/>
</ProDescriptions.Item>
<ProDescriptions.Item label="证件号码" span={2}>
{props?.item?.id_card}
</ProDescriptions.Item>
<ProDescriptions.Item label="证件材料" span={3}>
<Space>
<Image.PreviewGroup>
{props?.item?.card_front_image?.map(
(res: any, index: number) => {
return (
<Image
width={40}
height={30}
src={res?.url || ''}
key={`${res?.name}_${index}`}
/>
);
},
)}
</Image.PreviewGroup>
<Image.PreviewGroup>
{props?.item?.card_back_image?.map(
(res: any, index: number) => {
return (
<Image
width={40}
height={30}
src={res?.url || ''}
key={`${res?.name}_${index}`}
/>
);
},
)}
</Image.PreviewGroup>
</Space>
</ProDescriptions.Item>
</ProDescriptions>
</ProCard>
</Space>
);
}

View File

@ -0,0 +1,63 @@
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';
export default function Index({ title = '房客关系' }) {
const navigate = useNavigate();
// 注册当前页面为标签页
usePageTabs({
tabKey: 'archive-asset-houses',
tabLabel: title,
});
return (
<MyPageContainer title={title}>
<ProTable
{...MyProTableProps.props}
request={async (params, sort) =>
MyProTableProps.request(
params,
sort,
Apis.Archive.HouseOccupants.CustomerList,
)
}
columns={[
MyColumns.ID(),
{
title: '客户名称',
dataIndex: 'name',
search: {
transform: (value) => {
return { name: value };
},
},
},
{
title: '客户电话',
dataIndex: 'phone',
},
MyColumns.UpdatedAt(),
MyColumns.Option({
render: (_, item: any, index, action) => (
<Space key={index}>
<MyButtons.View
title="查看"
onClick={() => {
navigate(`/customer/show/${item.id}`);
}}
/>
</Space>
),
}),
]}
/>
</MyPageContainer>
);
}

View File

@ -0,0 +1,63 @@
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 CustomerHouse from '../components/CustomerHouse';
import CustomerInfo from '../components/CustomerInfo';
export default function Show({ title = '客户档案' }) {
const { id } = useParams<{ id: string }>();
const [data, setShow] = useState<any>({});
// 注册标签页
const { addTab } = usePageTabs({
tabKey: `customer-detail-${id}`,
tabLabel: `${data?.name}档案` || title,
});
const loadShow = () => {
let paramsId: any = { id: id ?? 0 };
Apis.Archive.HouseOccupants.Show(paramsId).then((res) => {
setShow(res?.data);
// 更新标签页标题
if (res?.data?.name) {
addTab({
key: `customer-detail-${id}`,
label: `${res?.data?.name}档案`,
path: `/customer/show/${id}`,
});
}
});
};
useEffect(() => {
loadShow();
}, [id]);
let items = [
{
label: '关联房屋',
key: '1',
closable: false,
children: (
<CustomerHouse
item={{ ...data, phone: data?.phone }}
reload={() => {
loadShow();
}}
/>
),
},
];
return (
<MyPageContainer title={title}>
<CustomerInfo item={data} reload={loadShow} />
<ProCard style={{ marginTop: 16 }}>
<Tabs type="card" items={items} defaultActiveKey="1" size="small" />
</ProCard>
</MyPageContainer>
);
}

View File

@ -1,122 +0,0 @@
import {
MyBetaModalFormProps,
MyButtons,
MyModalFormProps,
rulesHelper,
} from '@/common';
import { Selects } from '@/components/Select';
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.HouseCharage.HouseChargeTasks.Store>
{...MyModalFormProps.props}
title={`创建${props.title}`}
width="480px"
layout="horizontal"
labelCol={{ span: 8 }}
wrapperCol={{ span: 16 }}
labelAlign="left"
trigger={<MyButtons.Create title={`创建${props.title}`} />}
key={new Date().getTime()}
form={form}
onOpenChange={(open: any) => {
if (open) {
form.resetFields(); // 清空表单数据
}
}}
onFinish={async (values) =>
Apis.HouseCharage.HouseChargeTasks.Store(values)
.then(() => {
props.reload?.();
message.success(props.title + '账单任务创建成功');
return true;
})
.catch(() => false)
}
columns={[
Selects?.AssetProjects({
title: '选择项目',
key: 'asset_projects_id',
colProps: { span: 24 },
formItemProps: { ...rulesHelper.text },
fieldProps: {
onChange: (val: any) => {
form.setFieldsValue({
house_charge_standards_id: undefined,
});
},
},
}),
{
valueType: 'dependency',
name: ['asset_projects_id'],
columns: ({ asset_projects_id }) => {
return [
Selects?.ChargeStandard({
title: '选择收费标准',
key: 'house_charge_standards_id',
params: {
asset_projects_id: asset_projects_id,
},
colProps: { span: 24 },
formItemProps: { ...rulesHelper.text },
fieldProps: {
showSearch: true,
},
}),
];
},
},
{
key: 'month',
title: '选择生成月份',
valueType: 'date',
colProps: { span: 24 },
fieldProps: {
picker: 'month',
format: 'YYYY-MM',
valueFormat: 'YYYY-MM',
style: {
width: '100%',
},
onChange: (e: any, dateString: string) => {
form.setFieldsValue({
start_date: rulesHelper.getMonthStartDate(dateString),
end_date: rulesHelper.getMonthEndDate(dateString),
});
},
},
formItemProps: { ...rulesHelper.text },
},
{
key: 'start_date',
title: '计费开始日期',
valueType: 'date',
colProps: { span: 24 },
fieldProps: {
style: {
width: '100%',
},
},
formItemProps: { ...rulesHelper.text },
},
{
key: 'end_date',
title: '计费结束日期',
valueType: 'date',
colProps: { span: 24 },
fieldProps: {
style: {
width: '100%',
},
},
formItemProps: { ...rulesHelper.text },
},
]}
/>
);
}

View File

@ -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(),
)
}

View File

@ -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'],

View File

@ -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

View File

@ -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}

View 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>
);
}

View File

@ -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>
),

View 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 },
},
]}
/>
);
}

View File

@ -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',

View 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 },
},
]}
/>
);
}

View 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>
);
}

View 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>
),
}),
]}
/>
</>
);
}

View 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>
),
}),
]}
/>
</>
);
}

View File

@ -15,10 +15,10 @@ import { Space } from 'antd';
import TaskCreate from './modals/TaskCreate';
import TaskShow from './modals/TaskShow';
export default function Index({ title = '账单任务' }) {
export default function Index({ title = '仪表账单' }) {
// 注册当前页面为标签页
usePageTabs({
tabKey: 'house_charge_tasks',
tabKey: 'house_meter_tasks',
tabLabel: title,
});
@ -32,11 +32,7 @@ export default function Index({ title = '账单任务' }) {
<ProTable
{...MyProTableProps.props}
request={async (params, sort) =>
MyProTableProps.request(
params,
sort,
Apis.HouseCharage.HouseChargeTasks.List,
)
MyProTableProps.request(params, sort, Apis.Meter.HouseMeterTasks.List)
}
toolBarRender={(action) => [
<TaskCreate key="Create" reload={action?.reload} title="账单任务" />,

View File

@ -0,0 +1,223 @@
import {
MyBetaModalFormProps,
MyButtons,
MyFormItems,
MyModalFormProps,
rulesHelper,
} from '@/common';
import { Selects } from '@/components/Select';
import { Apis } from '@/gen/Apis';
import {
HouseMetersMeterTypeEnum,
HouseMeterTasksGenerationMethodEnum,
} 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.HouseMeterTasks.Store>
{...MyModalFormProps.props}
title={`创建${props.title}`}
width="480px"
layout="horizontal"
labelCol={{ span: 8 }}
wrapperCol={{ span: 16 }}
labelAlign="left"
trigger={<MyButtons.Create title={`创建${props.title}`} />}
key={new Date().getTime()}
form={form}
onOpenChange={(open: any) => {
if (open) {
form.resetFields(); // 清空表单数据
}
}}
onFinish={async (values: any) =>
Apis.Meter.HouseMeterTasks.Store({
...values,
data: [values?.data_id],
})
.then(() => {
props.reload?.();
message.success(props.title + '账单任务创建成功');
return true;
})
.catch(() => false)
}
columns={[
Selects?.AssetProjects({
title: '选择项目',
key: 'asset_projects_id',
colProps: { span: 24 },
formItemProps: { ...rulesHelper.text },
fieldProps: {
onChange: (val: any) => {
form.setFieldsValue({
house_charge_standards_id: undefined,
});
},
},
}),
{
key: 'month',
title: '选择生成月份',
valueType: 'date',
colProps: { span: 24 },
fieldProps: {
picker: 'month',
format: 'YYYY-MM',
valueFormat: 'YYYY-MM',
style: {
width: '100%',
},
onChange: (e: any, dateString: string) => {
form.setFieldsValue({
start_date: rulesHelper.getMonthStartDate(dateString),
end_date: rulesHelper.getMonthEndDate(dateString),
});
},
},
formItemProps: { ...rulesHelper.text },
},
{
key: 'start_date',
title: '计费开始日期',
valueType: 'date',
colProps: { span: 24 },
fieldProps: {
style: {
width: '100%',
},
},
formItemProps: { ...rulesHelper.text },
},
{
key: 'end_date',
title: '计费结束日期',
valueType: 'date',
colProps: { span: 24 },
fieldProps: {
style: {
width: '100%',
},
},
formItemProps: { ...rulesHelper.text },
},
MyFormItems.EnumRadio({
key: 'meter_type',
title: '仪表类型',
colProps: { span: 24 },
valueEnum: HouseMetersMeterTypeEnum,
required: true,
fieldProps: {
onChange: () => {
// 切换计量单位时清空计费模式
form.setFieldValue('generation_method', undefined);
form.setFieldValue('data', undefined);
},
},
}),
{
name: ['meter_type'],
valueType: 'dependency',
columns: ({ meter_type }: any) => {
return meter_type === HouseMetersMeterTypeEnum.CommonMeter.value
? [
MyFormItems.EnumRadio({
key: 'generation_method',
title: '生成方式',
colProps: { span: 24 },
valueEnum: () => {
let obj: any = JSON.parse(
JSON.stringify(HouseMeterTasksGenerationMethodEnum),
);
delete obj.Unit;
delete obj.Building;
return obj;
},
required: true,
}),
Selects?.AssetMeters({
title: '选择仪表',
params: {
asset_projects_id:
form.getFieldValue('asset_projects_id'),
// 仪表类型必须为房屋仪表
meter_type: HouseMetersMeterTypeEnum.CommonMeter.value,
},
key: 'data_id',
colProps: { span: 24 },
formItemProps: { ...rulesHelper.text },
}),
]
: meter_type === HouseMetersMeterTypeEnum.HouseMeter.value
? [
MyFormItems.EnumRadio({
key: 'generation_method',
title: '生成方式',
colProps: { span: 24 },
valueEnum: HouseMeterTasksGenerationMethodEnum,
required: true,
}),
{
name: ['generation_method'],
valueType: 'dependency',
columns: ({ generation_method }: any) => {
return generation_method ===
HouseMeterTasksGenerationMethodEnum.Building.value
? [
Selects?.AssetBuildings({
title: '选择楼栋',
key: 'data_id',
params: {
asset_projects_id:
form.getFieldValue('asset_projects_id'),
},
colProps: { span: 24 },
formItemProps: { ...rulesHelper.text },
}),
]
: generation_method ===
HouseMeterTasksGenerationMethodEnum.Unit.value
? [
Selects?.AssetUnits({
title: '选择单元',
key: 'data_id',
params: {
asset_projects_id:
form.getFieldValue('asset_projects_id'),
},
colProps: { span: 24 },
formItemProps: { ...rulesHelper.text },
}),
]
: generation_method ===
HouseMeterTasksGenerationMethodEnum.Meter.value
? [
Selects?.AssetMeters({
title: '选择仪表',
params: {
asset_projects_id:
form.getFieldValue('asset_projects_id'),
// 仪表类型必须为房屋仪表
meter_type:
HouseMetersMeterTypeEnum.HouseMeter.value,
},
key: 'data_id',
colProps: { span: 24 },
formItemProps: { ...rulesHelper.text },
}),
]
: [];
},
},
]
: [];
},
},
]}
/>
);
}

View File

@ -17,7 +17,7 @@ export default function AssetInfo(props: MyBetaModalFormProps) {
MyProTableProps.request(
{ ...params, house_charge_tasks_id: props?.item?.id },
sort,
Apis.HouseCharage.HouseChargeTaskDetails.List,
Apis.Meter.HouseMeterTasks.List,
)
}
columns={[

View File

@ -0,0 +1,70 @@
import { MyBetaModalFormProps } from '@/common';
import { PlayCircleFilled } from '@ant-design/icons';
import { ProCard } from '@ant-design/pro-components';
import './style.scss';
export default function infoPreview(props: MyBetaModalFormProps) {
return (
<>
{props?.item?.type === 'Image' ? (
<div className="card_info_preview">
<div className="title">/</div>
<ProCard>
<div className="preview_header">
<div className="avatar"></div>
<div className="info">
<div className="name"></div>
<div className="desc"></div>
</div>
</div>
<div className="preview_content">
<div className="item"></div>
<div className="item"></div>
<div className="item"></div>
<div className="item"></div>
</div>
</ProCard>
</div>
) : props?.item?.type === 'Video' ? (
<div className="card_info_preview">
<div className="title">/</div>
<ProCard>
<div className="preview_header">
<div className="avatar"></div>
<div className="info">
<div className="name"></div>
<div className="desc"></div>
</div>
</div>
<div className="preview_content">
<div className="video_preview">
<PlayCircleFilled style={{ fontSize: 40 }} />
</div>
</div>
</ProCard>
</div>
) : props?.item?.type === 'Link' ||
props?.item?.type === 'MiniProgram' ? (
<div className="card_info_preview">
<div className="title">/</div>
<ProCard>
<div className="preview_header">
<div className="avatar"></div>
<div className="info">
<div className="name"></div>
<div className="desc"></div>
</div>
</div>
<div className="preview_content cover_image_preview">
<div className="cover_image"></div>
<div className="cover_info">
</div>
</div>
</ProCard>
</div>
) : (
<></>
)}
</>
);
}

View File

@ -0,0 +1,76 @@
.card_info_preview {
background-color: #f8f8f8;
width: 400px;
padding: 15px;
margin-left: 10px;
border-radius: 10px;
.title {
border-left: 3px solid #1890ff;
padding-left: 15px;
margin-bottom: 12px;
}
.preview_header {
display: flex;
align-items: center;
padding-bottom: 15px;
.avatar {
width: 60px;
height: 60px;
background-color: #f8f8f8;
font-size: 17px;
font-weight: 500;
padding: 8px;
text-align: center;
line-height: 20px;
}
.info {
padding-left: 15px;
.name {
font-size: 16px;
font-weight: 500;
}
.desc {
font-size: 12px;
color: #666;
}
}
}
.preview_content {
display: flex;
align-items: center;
justify-content: space-between;
.item {
width: 70px;
height: 70px;
background-color: #f8f8f8;
}
.video_preview {
width: 150px;
height: 150px;
background-color: #f8f8f8;
display: flex;
align-items: center;
justify-content: center;
}
}
.cover_image_preview {
background-color: #f8f8f8;
padding: 10px;
border-radius: 10px;
.cover_image {
width: 70px;
height: 70px;
background-color: #eee;
text-align: center;
line-height: 70px;
font-size: 17px;
font-weight: 500;
}
.cover_info {
flex: 1;
padding-left: 10px;
font-size: 12px;
height: 70px;
}
}
}

View File

@ -6,10 +6,15 @@ import {
usePageTabs,
} from '@/common';
import { Apis } from '@/gen/Apis';
import {
CustomerMomentsChannelEnum,
CustomerMomentsContentTypeEnum,
CustomerMomentsPushTypeEnum,
CustomerMomentsTaskEndTypeEnum,
} from '@/gen/Enums';
import { ProTable } from '@ant-design/pro-components';
import { Space } from 'antd';
import { Card, Space } from 'antd';
import Create from './modals/Create';
import Update from './modals/Update';
export default function Index({ title = '推送任务' }) {
// 注册当前页面为标签页
@ -44,21 +49,83 @@ export default function Index({ title = '推送任务' }) {
MyColumns.ID(),
{
title: '名称',
dataIndex: 'name',
dataIndex: 'title',
render: (_, i: any) => {
return (
<Card size="small">
<Space align="start">
<img src={i?.cover_image[0]?.url} width={45} height={45} />
<div>{i?.title}</div>
</Space>
</Card>
);
},
},
MyColumns.EnumTag({
title: '发送渠道',
dataIndex: 'channel',
valueEnum: CustomerMomentsChannelEnum,
}),
MyColumns.EnumTag({
title: '内容类型',
dataIndex: 'content_type',
valueEnum: CustomerMomentsContentTypeEnum,
}),
MyColumns.EnumTag({
title: '推送类型',
dataIndex: 'push_type',
valueEnum: CustomerMomentsPushTypeEnum,
}),
{
title: '定时发送时间',
dataIndex: 'scheduled_time',
search: false,
},
MyColumns.EnumTag({
title: '任务结束类型',
dataIndex: 'task_end_type',
valueEnum: CustomerMomentsTaskEndTypeEnum,
search: false,
}),
{
title: '任务结束天数',
dataIndex: 'task_days',
search: false,
},
{
title: '定时结束',
dataIndex: 'task_end_time',
search: false,
},
MyColumns.UpdatedAt(),
MyColumns.CreatedAt(),
MyColumns.Option({
render: (_, item: any, index, action) => (
<Space key={index}>
<Update item={item} reload={action?.reload} title={title} />
<MyButtons.Delete
{/* <Update item={item} reload={action?.reload} title={title} /> */}
<MyButtons.Default
isConfirm
title="发送"
type="primary"
disabled={
item?.push_type === 'ScheduledPush' ||
item?.push_status === 'Pushed'
}
description="确定发送?"
onConfirm={() => {
Apis.Customer.CustomerMoments.Send({
id: item.id,
}).then(() => action?.reload());
}}
/>
{/* <MyButtons.Delete
onConfirm={() =>
Apis.Customer.CustomerMomentCategories.Delete({
Apis.Customer.CustomerMoments.Delete({
id: item.id,
}).then(() => action?.reload())
}
/>
/> */}
</Space>
),
}),

View File

@ -18,11 +18,16 @@ import {
CustomerMomentsTaskEndTypeEnum,
} from '@/gen/Enums';
import { BetaSchemaForm } from '@ant-design/pro-components';
import { Button, message, Space, Steps } from 'antd';
import { useState } from 'react';
import { Button, Form, message, Space, Steps } from 'antd';
import { useRef, useState } from 'react';
import MyinfoPreview from '../components/infoPreview';
export default function Create(props: MyBetaModalFormProps) {
const [current, setCurrent] = useState(0);
const [getContentType, setContentType] = useState('');
const [formData, setFormData] = useState<any>({});
const [form] = Form.useForm();
const modalRef: any = useRef(null);
const steps = [
{
title: '创建任务',
@ -52,7 +57,7 @@ export default function Create(props: MyBetaModalFormProps) {
title: '推送类型',
valueEnum: CustomerMomentsPushTypeEnum,
required: true,
colProps: { span: 8 },
colProps: { span: 9 },
}),
{
name: ['push_type'],
@ -81,7 +86,7 @@ export default function Create(props: MyBetaModalFormProps) {
title: '任务结束类型',
valueEnum: CustomerMomentsTaskEndTypeEnum,
required: true,
colProps: { span: 8 },
colProps: { span: 9 },
}),
{
name: ['task_end_type'],
@ -93,10 +98,11 @@ export default function Create(props: MyBetaModalFormProps) {
key: 'task_days',
title: '任务结束天数',
colProps: { span: 10 },
valueType: 'number',
valueType: 'digit',
formItemProps: { ...rulesHelper.number },
fieldProps: {
suffix: '天结束',
style: { width: '200px' },
},
},
]
@ -168,6 +174,7 @@ export default function Create(props: MyBetaModalFormProps) {
name: ['content_type'],
valueType: 'dependency',
columns: ({ content_type }: any) => {
setContentType(content_type);
return content_type === 'MiniProgram'
? [
{
@ -228,76 +235,84 @@ export default function Create(props: MyBetaModalFormProps) {
title={`创建${props.title}`}
type="primary"
size={'middle'}
width="800px"
myRef={modalRef}
width="1200px"
node={
<Space direction="vertical">
<Steps current={current} items={steps} />
<BetaSchemaForm<ApiTypes.Customer.CustomerMomentCategories.Store>
{...MyModalFormProps.props}
title={`添加${props.title}`}
wrapperCol={{ span: 24 }}
width="800px"
layoutType="Form"
trigger={<MyButtons.Create title={`添加${props.title}`} />}
onFinish={async (values) => {
setFormData(values);
console.log('提交的数据2:', values);
if (current < steps.length - 1) {
handleNext();
} else {
let data = { ...formData, ...values };
Apis.Customer.CustomerMoments.Store({
...data,
one_moment_categories_id: formData?.moment_categories_ids[0],
two_moment_categories_id: formData?.moment_categories_ids[1],
})
.then(() => {
props.reload?.();
message.success(props.title + '成功');
return true;
})
.catch(() => false);
}
}}
// onFinish={async (values) =>
// Apis.Customer.CustomerMomentCategories.Store(values)
// .then(() => {
// props.reload?.();
// message.success(props.title + '成功');
// return true;
// })
// .catch(() => false)
// }
columns={steps[current].columns}
submitter={{
render: (props, dom) => {
return (
<Space
style={{ display: 'flex', justifyContent: 'flex-end' }}
>
{current > 0 && (
<Button onClick={handlePrev}></Button>
)}
{current < steps.length - 1 ? (
<Button
type="primary"
onClick={() => props.form?.submit?.()}
<div style={{ width: '1160px' }}>
<Steps
style={{ padding: '50px 150px 30px 150px' }}
current={current}
items={steps}
/>
</div>
<Space align="start">
<div style={{ width: '700px' }}>
<BetaSchemaForm<ApiTypes.Customer.CustomerMomentCategories.Store>
{...MyModalFormProps.props}
title={`添加${props.title}`}
wrapperCol={{ span: 24 }}
width="800px"
form={form}
layoutType="Form"
trigger={<MyButtons.Create title={`添加${props.title}`} />}
onFinish={async (values) => {
setFormData(values);
if (current < steps.length - 1) {
handleNext();
} else {
let data = { ...formData, ...values };
Apis.Customer.CustomerMoments.Store({
...data,
one_moment_categories_id:
formData?.moment_categories_ids[0],
two_moment_categories_id:
formData?.moment_categories_ids[1],
})
.then(() => {
props.reload?.();
message.success('提交成功!');
form.setFieldsValue({});
modalRef.current?.close();
setCurrent(0);
return true;
})
.catch(() => false);
}
}}
columns={steps[current].columns}
submitter={{
render: (props) => {
return (
<Space
style={{ display: 'flex', justifyContent: 'flex-end' }}
>
</Button>
) : (
<Button
type="primary"
onClick={() => props.form?.submit?.()}
>
</Button>
)}
</Space>
);
},
}}
/>
{current > 0 && (
<Button onClick={handlePrev}></Button>
)}
{current < steps.length - 1 ? (
<Button
type="primary"
onClick={() => props.form?.submit?.()}
>
</Button>
) : (
<Button
type="primary"
onClick={() => props.form?.submit?.()}
>
</Button>
)}
</Space>
);
},
}}
/>
</div>
{current ? <MyinfoPreview item={{ type: getContentType }} /> : ''}
</Space>
</Space>
}
/>