diff --git a/.umirc.ts b/.umirc.ts index 28f6911..6fdf83b 100644 --- a/.umirc.ts +++ b/.umirc.ts @@ -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: { '^': '' }, diff --git a/gencode.json b/gencode.json index b5fb778..cc974bb 100644 --- a/gencode.json +++ b/gencode.json @@ -1,4 +1,4 @@ { - "url": "http://10.39.13.78:8001/api/docs/openapi", + "url": "http://c789629c.natappfree.cc/api/docs/openapi", "module": "Admin" } diff --git a/src/common/components/formFields/MyUploadImages.scss b/src/common/components/formFields/MyUploadImages.scss index ec352be..acd0931 100644 --- a/src/common/components/formFields/MyUploadImages.scss +++ b/src/common/components/formFields/MyUploadImages.scss @@ -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; diff --git a/src/common/utils/rulesHelper.ts b/src/common/utils/rulesHelper.ts index c407cf4..37fa840 100644 --- a/src/common/utils/rulesHelper.ts +++ b/src/common/utils/rulesHelper.ts @@ -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; + } + }, }; diff --git a/src/components/Select.tsx b/src/components/Select.tsx index b6d129a..0ebb2f5 100644 --- a/src/components/Select.tsx +++ b/src/components/Select.tsx @@ -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, + }, + }; + }, }; diff --git a/src/gen/ApiTypes.d.ts b/src/gen/ApiTypes.d.ts index 3141e45..67827a0 100644 --- a/src/gen/ApiTypes.d.ts +++ b/src/gen/ApiTypes.d.ts @@ -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 = { diff --git a/src/gen/Apis.ts b/src/gen/Apis.ts index cf3e4bd..3de29c3 100644 --- a/src/gen/Apis.ts +++ b/src/gen/Apis.ts @@ -46,6 +46,12 @@ export const Apis = { List(data?: ApiTypes.Archive.HouseOccupants.List): Promise { return request('admin/archive/house_occupants/list', { data }); }, + CustomerList(data?: ApiTypes.Archive.HouseOccupants.CustomerList): Promise { + return request('admin/archive/house_occupants/customer_list', { data }); + }, + CustomerHouseByPhone(data: ApiTypes.Archive.HouseOccupants.CustomerHouseByPhone): Promise { + return request('admin/archive/house_occupants/customer_house_by_phone', { data }); + }, Update(data: ApiTypes.Archive.HouseOccupants.Update): Promise { return request('admin/archive/house_occupants/update', { data }); }, @@ -737,6 +743,9 @@ export const Apis = { Delete(data: ApiTypes.HouseCharage.HouseChargeTaskDetails.Delete): Promise { return request('admin/house_charage/house_charge_task_details/delete', { data }); }, + CreateHouseBill(data: ApiTypes.HouseCharage.HouseChargeTaskDetails.CreateHouseBill): Promise { + return request('admin/house_charage/house_charge_task_details/create_house_bill', { data }); + }, }, HouseChargeTasks: { List(data?: ApiTypes.HouseCharage.HouseChargeTasks.List): Promise { @@ -757,6 +766,9 @@ export const Apis = { Delete(data: ApiTypes.HouseCharage.HouseChargeTasks.Delete): Promise { return request('admin/house_charage/house_charge_tasks/delete', { data }); }, + ExecuteTask(data: ApiTypes.HouseCharage.HouseChargeTasks.ExecuteTask): Promise { + 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 { + List(data: ApiTypes.Meter.HouseMeterReadings.List): Promise { return request('admin/meter/house_meter_readings/list', { data }); }, Store(data: ApiTypes.Meter.HouseMeterReadings.Store): Promise { @@ -831,6 +843,9 @@ export const Apis = { Delete(data: ApiTypes.Meter.HouseMeterTaskDetails.Delete): Promise { return request('admin/meter/house_meter_task_details/delete', { data }); }, + CreateMeterBill(data: ApiTypes.Meter.HouseMeterTaskDetails.CreateMeterBill): Promise { + return request('admin/meter/house_meter_task_details/create_meter_bill', { data }); + }, }, HouseMeterTasks: { List(data?: ApiTypes.Meter.HouseMeterTasks.List): Promise { @@ -851,6 +866,9 @@ export const Apis = { Delete(data: ApiTypes.Meter.HouseMeterTasks.Delete): Promise { return request('admin/meter/house_meter_tasks/delete', { data }); }, + ExecuteMeterTasks(data: ApiTypes.Meter.HouseMeterTasks.ExecuteMeterTasks): Promise { + return request('admin/meter/house_meter_tasks/execute_meter_tasks', { data }); + }, }, HouseMeters: { List(data?: ApiTypes.Meter.HouseMeters.List): Promise { diff --git a/src/gen/Enums.ts b/src/gen/Enums.ts index 1a7d72a..4478ebb 100644 --- a/src/gen/Enums.ts +++ b/src/gen/Enums.ts @@ -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"}, }; diff --git a/src/pages/archive/modals/Delivery.tsx b/src/pages/archive/modals/Delivery.tsx index 744d191..ff6de1f 100644 --- a/src/pages/archive/modals/Delivery.tsx +++ b/src/pages/archive/modals/Delivery.tsx @@ -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={ } @@ -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 }, + }, ]; }, }, diff --git a/src/pages/archive/table/modals/Transfer.tsx b/src/pages/archive/table/modals/Transfer.tsx index 916b040..2f5a668 100644 --- a/src/pages/archive/table/modals/Transfer.tsx +++ b/src/pages/archive/table/modals/Transfer.tsx @@ -21,7 +21,7 @@ export default function Create(props: MyBetaModalFormProps) { {...MyModalFormProps.props} title={`${props.title}`} wrapperCol={{ span: 24 }} - width="900px" + width="1000px" trigger={ } @@ -164,7 +164,7 @@ export default function Create(props: MyBetaModalFormProps) { colProps: { span: 6 }, }), { - title: '是否办理入住', + title: '是否入住', dataIndex: 'is_live_in', colProps: { span: 6 }, valueType: 'switch', diff --git a/src/pages/asset/list/index.tsx b/src/pages/asset/list/index.tsx index 850bb88..189762b 100644 --- a/src/pages/asset/list/index.tsx +++ b/src/pages/asset/list/index.tsx @@ -1,6 +1,7 @@ import { MyButtons, MyColumns, + MyImportModal, MyPageContainer, MyProTableProps, usePageTabs, @@ -32,6 +33,15 @@ export default function Index({ title = '项目列表' }) { } // headerTitle="项目列表" toolBarRender={(action) => [ + , , ]} columns={[ diff --git a/src/pages/charge/tasks/index.tsx b/src/pages/charge/tasks/index.tsx index 5c23cda..6ae1e83 100644 --- a/src/pages/charge/tasks/index.tsx +++ b/src/pages/charge/tasks/index.tsx @@ -98,6 +98,18 @@ export default function Index({ title = '账单任务' }) { render: (_, item: any, index, action) => ( + + Apis.HouseCharage.HouseChargeTasks.ExecuteTask({ + id: item.id, + }).then(() => action?.reload()) + } + /> Apis.HouseCharage.HouseChargeTasks.Delete({ diff --git a/src/pages/charge/tasks/modals/TaskShow.tsx b/src/pages/charge/tasks/modals/TaskShow.tsx index 795010d..daf0a05 100644 --- a/src/pages/charge/tasks/modals/TaskShow.tsx +++ b/src/pages/charge/tasks/modals/TaskShow.tsx @@ -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) => ( + + + Apis.HouseCharage.HouseChargeTaskDetails.CreateHouseBill({ + id: item.id, + }).then(() => action?.reload()) + } + /> + + ), + }), ]} /> } diff --git a/src/pages/common/positions/index.tsx b/src/pages/common/positions/index.tsx new file mode 100644 index 0000000..d600319 --- /dev/null +++ b/src/pages/common/positions/index.tsx @@ -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 ( + + + MyProTableProps.request(params, sort, Apis.Common.Positions.List) + } + toolBarRender={(action) => [ + , + ]} + 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) => ( + + + + Apis.Common.Positions.Delete({ id: item.id }).then(() => + action?.reload(), + ) + } + /> + + ), + }), + ]} + /> + + ); +} diff --git a/src/pages/common/positions/modals/Create.tsx b/src/pages/common/positions/modals/Create.tsx new file mode 100644 index 0000000..76047e7 --- /dev/null +++ b/src/pages/common/positions/modals/Create.tsx @@ -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 ( + + {...MyModalFormProps.props} + title={`添加岗位`} + layout="horizontal" + labelCol={{ span: 6 }} + wrapperCol={{ span: 18 }} + width="450px" + trigger={} + 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 }, + }, + ]} + /> + ); +} diff --git a/src/pages/common/positions/modals/Update.tsx b/src/pages/common/positions/modals/Update.tsx new file mode 100644 index 0000000..afa4974 --- /dev/null +++ b/src/pages/common/positions/modals/Update.tsx @@ -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 ( + + {...MyModalFormProps.props} + title={`编辑${props.title}`} + trigger={} + 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, + }, + }, + ]} + /> + ); +} diff --git a/src/pages/company/list/table/Positions.tsx b/src/pages/company/list/table/Positions.tsx index 81a9bda..c7b629b 100644 --- a/src/pages/company/list/table/Positions.tsx +++ b/src/pages/company/list/table/Positions.tsx @@ -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) => [ + , ( + [], + ); + const [selectedRows, setSelectedRows] = useState([]); + + // 添加 tableRef 用于操作表格 + const tableRef = useRef(); + + 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 ( + + 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 ( + + 已选 {selectedRowKeys.length} 项 + 清空 + onShowContactPhone()} + /> + + ); + }} + options={false} + columns={[ + MyColumns.ID(), + { + title: '岗位名称', + dataIndex: 'name', + width: 300, + }, + { + title: '是否启用', + dataIndex: 'is_use', + search: false, + render: (text) => (text ? '是' : '否'), + width: 200, + }, + ]} + /> + } + /> + ); +} diff --git a/src/pages/company/positions/modals/PositionCreate.tsx b/src/pages/company/positions/modals/PositionCreate.tsx index c40be6a..7e500e2 100644 --- a/src/pages/company/positions/modals/PositionCreate.tsx +++ b/src/pages/company/positions/modals/PositionCreate.tsx @@ -17,7 +17,7 @@ export default function Create(props: MyBetaModalFormProps) { title={`添加岗位`} wrapperCol={{ span: 24 }} width="500px" - trigger={} + trigger={} form={form} onOpenChange={(open: any) => { if (open) { diff --git a/src/pages/customer/components/CustomerHouse.tsx b/src/pages/customer/components/CustomerHouse.tsx new file mode 100644 index 0000000..e7d94e4 --- /dev/null +++ b/src/pages/customer/components/CustomerHouse.tsx @@ -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 ( + <> + + 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) => ( + // + // {/* 只有未生成账单的抄表记录,且不是重置读数,才显示修正按钮 */} + // {!item?.bill_status && + // item?.operation_type !== + // HouseMeterReadingsOperationTypeEnum.ResetReading.value && ( + // + // )} + // + // ), + // }), + ]} + /> + + ); +} diff --git a/src/pages/customer/components/CustomerInfo.tsx b/src/pages/customer/components/CustomerInfo.tsx new file mode 100644 index 0000000..1d2b29d --- /dev/null +++ b/src/pages/customer/components/CustomerInfo.tsx @@ -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 ( + + + + +
{item?.name}
+
+ + + {item?.phone} + + + + + + + + + + {props?.item?.id_card} + + + + + {props?.item?.card_front_image?.map( + (res: any, index: number) => { + return ( + + ); + }, + )} + + + {props?.item?.card_back_image?.map( + (res: any, index: number) => { + return ( + + ); + }, + )} + + + +
+
+
+ ); +} diff --git a/src/pages/customer/index.tsx b/src/pages/customer/index.tsx new file mode 100644 index 0000000..85b7811 --- /dev/null +++ b/src/pages/customer/index.tsx @@ -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 ( + + + 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) => ( + + { + navigate(`/customer/show/${item.id}`); + }} + /> + + ), + }), + ]} + /> + + ); +} diff --git a/src/pages/customer/show/$id.tsx b/src/pages/customer/show/$id.tsx new file mode 100644 index 0000000..86c1fdc --- /dev/null +++ b/src/pages/customer/show/$id.tsx @@ -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({}); + + // 注册标签页 + 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: ( + { + loadShow(); + }} + /> + ), + }, + ]; + + return ( + + + + + + + ); +} diff --git a/src/pages/mete/tasks/modals/TaskCreate.tsx b/src/pages/mete/tasks/modals/TaskCreate.tsx deleted file mode 100644 index 5a0dff8..0000000 --- a/src/pages/mete/tasks/modals/TaskCreate.tsx +++ /dev/null @@ -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 ( - - {...MyModalFormProps.props} - title={`创建${props.title}`} - width="480px" - layout="horizontal" - labelCol={{ span: 8 }} - wrapperCol={{ span: 16 }} - labelAlign="left" - trigger={} - 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 }, - }, - ]} - /> - ); -} diff --git a/src/pages/mete/list/index.tsx b/src/pages/meter/list/index.tsx similarity index 81% rename from src/pages/mete/list/index.tsx rename to src/pages/meter/list/index.tsx index d55c764..c40dd5c 100644 --- a/src/pages/mete/list/index.tsx +++ b/src/pages/meter/list/index.tsx @@ -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) => [ + , , ]} 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) => ( - {/* */} + { + navigate(`/meter/readings/show/${item.id}`); + }} + /> @@ -118,14 +133,14 @@ export default function Index({ title = '仪表管理' }) { {item.meter_type === HouseMetersMeterTypeEnum.CommonMeter.value && ( )} - Apis.Company.Companies.Delete({ id: item.id }).then(() => + Apis.Meter.HouseMeters.Delete({ id: item.id }).then(() => action?.reload(), ) } diff --git a/src/pages/mete/list/modals/MeterCreate.tsx b/src/pages/meter/list/modals/MeterCreate.tsx similarity index 63% rename from src/pages/mete/list/modals/MeterCreate.tsx rename to src/pages/meter/list/modals/MeterCreate.tsx index edf4ef3..3e083c8 100644 --- a/src/pages/mete/list/modals/MeterCreate.tsx +++ b/src/pages/meter/list/modals/MeterCreate.tsx @@ -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'], diff --git a/src/pages/mete/list/modals/MeterHasHouse.tsx b/src/pages/meter/list/modals/MeterHasHouse.tsx similarity index 99% rename from src/pages/mete/list/modals/MeterHasHouse.tsx rename to src/pages/meter/list/modals/MeterHasHouse.tsx index e7d52ca..76db1b2 100644 --- a/src/pages/mete/list/modals/MeterHasHouse.tsx +++ b/src/pages/meter/list/modals/MeterHasHouse.tsx @@ -54,6 +54,7 @@ export default function ChargeStandardHasHouse(props: MyBetaModalFormProps) { + + + +
+ 【{item?.id}】{item?.name} +
+
+ + + + + + + + + {item?.charge_standard?.name || '-'} + + + {item?.initial_value} + + + {item?.initial_time} + + + {item?.latest_value} + + + + {item?.latest_time} + + + + {item?.remark || '-'} + +
+
+
+ ); +} diff --git a/src/pages/mete/readings/index.tsx b/src/pages/meter/readings/index.tsx similarity index 83% rename from src/pages/mete/readings/index.tsx rename to src/pages/meter/readings/index.tsx index 885176e..9057773 100644 --- a/src/pages/mete/readings/index.tsx +++ b/src/pages/meter/readings/index.tsx @@ -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) => ( {/* */} + { + navigate(`/meter/readings/show/${item.id}`); + }} + /> - - - Apis.Company.Companies.Delete({ id: item.id }).then(() => - action?.reload(), - ) - } + ), diff --git a/src/pages/meter/readings/modals/CorrectReading.tsx b/src/pages/meter/readings/modals/CorrectReading.tsx new file mode 100644 index 0000000..48a8249 --- /dev/null +++ b/src/pages/meter/readings/modals/CorrectReading.tsx @@ -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 ( + + {...MyModalFormProps.props} + title={`修正抄表数据`} + layout="horizontal" + labelCol={{ span: 6 }} + wrapperCol={{ span: 18 }} + labelAlign="left" + width="600px" + key={new Date().getTime()} + trigger={} + 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 }, + }, + ]} + /> + ); +} diff --git a/src/pages/mete/readings/modals/NormalReading.tsx b/src/pages/meter/readings/modals/NormalReading.tsx similarity index 65% rename from src/pages/mete/readings/modals/NormalReading.tsx rename to src/pages/meter/readings/modals/NormalReading.tsx index bbdae65..a337fc8 100644 --- a/src/pages/mete/readings/modals/NormalReading.tsx +++ b/src/pages/meter/readings/modals/NormalReading.tsx @@ -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={} + trigger={ + + } 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', diff --git a/src/pages/meter/readings/modals/ResetReading.tsx b/src/pages/meter/readings/modals/ResetReading.tsx new file mode 100644 index 0000000..c73897d --- /dev/null +++ b/src/pages/meter/readings/modals/ResetReading.tsx @@ -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 ( + + {...MyModalFormProps.props} + title={`重置抄表数据`} + layout="horizontal" + labelCol={{ span: 6 }} + wrapperCol={{ span: 18 }} + labelAlign="left" + width="600px" + key={new Date().getTime()} + trigger={ + + } + 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 }, + }, + ]} + /> + ); +} diff --git a/src/pages/meter/readings/show/$id.tsx b/src/pages/meter/readings/show/$id.tsx new file mode 100644 index 0000000..cef7e4e --- /dev/null +++ b/src/pages/meter/readings/show/$id.tsx @@ -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({}); + 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: ( + { + loadShow(); + }} + /> + ), + }, + { + label: '关联房屋', + key: '2', + closable: false, + children: , + }, + ]; + + return ( + + + + + + + ); +} diff --git a/src/pages/meter/readings/table/HasHouse.tsx b/src/pages/meter/readings/table/HasHouse.tsx new file mode 100644 index 0000000..f8aeb0e --- /dev/null +++ b/src/pages/meter/readings/table/HasHouse.tsx @@ -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 ( + <> + + MyProTableProps.request( + { ...params, house_meters_id: props?.item?.id }, + sort, + Apis.Meter.HouseMeterHasHouses.List, + ) + } + toolBarRender={(action) => [ + , + ...(props?.item?.meter_type === + HouseMetersMeterTypeEnum.HouseMeter.value + ? [ + , + ] + : []), + ...(props?.item?.meter_type === + HouseMetersMeterTypeEnum.CommonMeter.value + ? [ + , + ] + : []), + ]} + // 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) => ( + + + Apis.Meter.HouseMeterHasHouses.Delete({ id: item.id }).then( + () => action?.reload(), + ) + } + /> + + ), + }), + ]} + /> + + ); +} diff --git a/src/pages/meter/readings/table/ReadingLIst.tsx b/src/pages/meter/readings/table/ReadingLIst.tsx new file mode 100644 index 0000000..33d60e6 --- /dev/null +++ b/src/pages/meter/readings/table/ReadingLIst.tsx @@ -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 ( + <> + + MyProTableProps.request( + { ...params, house_meters_id: props?.item?.id }, + sort, + Apis.Meter.HouseMeterReadings.List, + ) + } + toolBarRender={(action) => [ + , + , + ]} + // 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) => ( + + {/* 只有未生成账单的抄表记录,且不是重置读数,才显示修正按钮 */} + {!item?.bill_status && + item?.operation_type !== + HouseMeterReadingsOperationTypeEnum.ResetReading.value && ( + + )} + + ), + }), + ]} + /> + + ); +} diff --git a/src/pages/mete/tasks/index.tsx b/src/pages/meter/tasks/index.tsx similarity index 92% rename from src/pages/mete/tasks/index.tsx rename to src/pages/meter/tasks/index.tsx index 5c23cda..e248912 100644 --- a/src/pages/mete/tasks/index.tsx +++ b/src/pages/meter/tasks/index.tsx @@ -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 = '账单任务' }) { - MyProTableProps.request( - params, - sort, - Apis.HouseCharage.HouseChargeTasks.List, - ) + MyProTableProps.request(params, sort, Apis.Meter.HouseMeterTasks.List) } toolBarRender={(action) => [ , diff --git a/src/pages/meter/tasks/modals/TaskCreate.tsx b/src/pages/meter/tasks/modals/TaskCreate.tsx new file mode 100644 index 0000000..94af007 --- /dev/null +++ b/src/pages/meter/tasks/modals/TaskCreate.tsx @@ -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 ( + + {...MyModalFormProps.props} + title={`创建${props.title}`} + width="480px" + layout="horizontal" + labelCol={{ span: 8 }} + wrapperCol={{ span: 16 }} + labelAlign="left" + trigger={} + 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 }, + }), + ] + : []; + }, + }, + ] + : []; + }, + }, + ]} + /> + ); +} diff --git a/src/pages/mete/tasks/modals/TaskShow.tsx b/src/pages/meter/tasks/modals/TaskShow.tsx similarity index 97% rename from src/pages/mete/tasks/modals/TaskShow.tsx rename to src/pages/meter/tasks/modals/TaskShow.tsx index 795010d..9887856 100644 --- a/src/pages/mete/tasks/modals/TaskShow.tsx +++ b/src/pages/meter/tasks/modals/TaskShow.tsx @@ -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={[ diff --git a/src/pages/moments/list/components/infoPreview.tsx b/src/pages/moments/list/components/infoPreview.tsx new file mode 100644 index 0000000..77332bc --- /dev/null +++ b/src/pages/moments/list/components/infoPreview.tsx @@ -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' ? ( +
+
内容预览:朋友圈/图片消息
+ +
+
员工头像
+
+
员工的名字
+
此处显示“发送文案”输入的文案
+
+
+
+
+
+
+
+
+
+
+ ) : props?.item?.type === 'Video' ? ( +
+
内容预览:朋友圈/视频消息
+ +
+
员工头像
+
+
员工的名字
+
此处显示“发送文案”输入的文案
+
+
+
+
+ +
+
+
+
+ ) : props?.item?.type === 'Link' || + props?.item?.type === 'MiniProgram' ? ( +
+
内容预览:朋友圈/转载链接消息
+ +
+
员工头像
+
+
员工的名字
+
此处显示“发送文案”输入的文案
+
+
+
+
封面图
+
+ 此处显示“链接标题”输入的文案,文案字数多时可以换行显示 +
+
+
+
+ ) : ( + <> + )} + + ); +} diff --git a/src/pages/moments/list/components/style.scss b/src/pages/moments/list/components/style.scss new file mode 100644 index 0000000..437de62 --- /dev/null +++ b/src/pages/moments/list/components/style.scss @@ -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; + } + } +} diff --git a/src/pages/moments/list/index.tsx b/src/pages/moments/list/index.tsx index 84dfae9..50741b9 100644 --- a/src/pages/moments/list/index.tsx +++ b/src/pages/moments/list/index.tsx @@ -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 ( + + + +
{i?.title}
+
+
+ ); + }, + }, + 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) => ( - - */} + { + Apis.Customer.CustomerMoments.Send({ + id: item.id, + }).then(() => action?.reload()); + }} + /> + {/* - Apis.Customer.CustomerMomentCategories.Delete({ + Apis.Customer.CustomerMoments.Delete({ id: item.id, }).then(() => action?.reload()) } - /> + /> */} ), }), diff --git a/src/pages/moments/list/modals/Create.tsx b/src/pages/moments/list/modals/Create.tsx index 5e747ae..dfe9a85 100644 --- a/src/pages/moments/list/modals/Create.tsx +++ b/src/pages/moments/list/modals/Create.tsx @@ -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({}); + 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={ - - - {...MyModalFormProps.props} - title={`添加${props.title}`} - wrapperCol={{ span: 24 }} - width="800px" - layoutType="Form" - trigger={} - 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 ( - - {current > 0 && ( - - )} - {current < steps.length - 1 ? ( - - ) : ( - - )} - - ); - }, - }} - /> + {current > 0 && ( + + )} + {current < steps.length - 1 ? ( + + ) : ( + + )} + + ); + }, + }} + /> + + {current ? : ''} +
} />