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

Reviewed-on: #22
This commit is contained in:
uiujun 2026-04-29 18:15:21 +08:00
commit 0c3ac74274
34 changed files with 999 additions and 1530 deletions

View File

@ -1,227 +1,60 @@
import { HomeOutlined } from '@ant-design/icons'; import { HomeOutlined, LeftOutlined } from '@ant-design/icons';
import { PageContainer, PageContainerProps } from '@ant-design/pro-components'; import { PageContainer, PageContainerProps } from '@ant-design/pro-components';
import { useLocation, useNavigate } from '@umijs/max'; import { useLocation, useNavigate } from '@umijs/max';
import { Breadcrumb, Space } from 'antd'; import { Breadcrumb, Button, Space, Tooltip } from 'antd';
import { useEffect, useState } from 'react'; import { useCallback, useEffect, useRef, useState } from 'react';
// import './MyPageContainer.scss';
export interface TabItem {
key: string;
label: string;
path: string;
closable?: boolean;
}
interface BreadcrumbItem { interface BreadcrumbItem {
title: string; title: string;
path: string; path: string;
onClick?: () => void;
} }
export interface MyPageContainerProps extends PageContainerProps { export interface MyPageContainerProps extends PageContainerProps {
/* 多标签页功能已废弃,此参数不再生效,保留以避免破坏现有调用方 */
enableTabs?: boolean; enableTabs?: boolean;
/* 多标签页功能已废弃,此参数不再生效,保留以避免破坏现有调用方 */
tabKey?: string; tabKey?: string;
/* 多标签页功能已废弃,此参数不再生效,保留以避免破坏现有调用方 */
tabLabel?: string; tabLabel?: string;
/* 多标签页功能已废弃,此参数不再生效,保留以避免破坏现有调用方 */
onTabChange?: (activeKey: string) => void; onTabChange?: (activeKey: string) => void;
} }
// 注释掉标签页管理相关代码,不再使用
// // 全局标签页状态管理
// class TabsManager {
// private tabs: TabItem[] = [];
// private activeKey: string = '';
// private listeners: Set<() => void> = new Set();
// subscribe(listener: () => void) {
// this.listeners.add(listener);
// return () => this.listeners.delete(listener);
// }
// private notify() {
// this.listeners.forEach((listener) => listener());
// }
// getTabs() {
// return this.tabs;
// }
// getActiveKey() {
// return this.activeKey;
// }
// addTab(tab: TabItem) {
// const existingIndex = this.tabs.findIndex((t) => t.key === tab.key);
// if (existingIndex === -1) {
// // 如果是新标签页,插入到当前激活标签页的右边
// const currentActiveIndex = this.tabs.findIndex(
// (t) => t.key === this.activeKey,
// );
// if (currentActiveIndex !== -1) {
// // 在当前激活标签页的右边插入新标签页
// this.tabs.splice(currentActiveIndex + 1, 0, tab);
// } else {
// // 如果没有当前激活标签页,添加到末尾
// this.tabs.push(tab);
// }
// } else {
// // 如果标签页已存在,更新其信息
// this.tabs[existingIndex] = { ...this.tabs[existingIndex], ...tab };
// }
// this.activeKey = tab.key;
// this.notify();
// }
// addTabNext(tab: TabItem) {
// const existingIndex = this.tabs.findIndex((t) => t.key === tab.key);
// if (existingIndex === -1) {
// // 强制在当前激活标签页的右边插入新标签页
// const currentActiveIndex = this.tabs.findIndex(
// (t) => t.key === this.activeKey,
// );
// if (currentActiveIndex !== -1) {
// this.tabs.splice(currentActiveIndex + 1, 0, tab);
// } else {
// this.tabs.push(tab);
// }
// } else {
// // 如果标签页已存在,移动到当前激活标签页的右边
// const existingTab = this.tabs[existingIndex];
// this.tabs.splice(existingIndex, 1); // 先移除原位置的标签页
// const currentActiveIndex = this.tabs.findIndex(
// (t) => t.key === this.activeKey,
// );
// if (currentActiveIndex !== -1) {
// this.tabs.splice(currentActiveIndex + 1, 0, { ...existingTab, ...tab });
// } else {
// this.tabs.push({ ...existingTab, ...tab });
// }
// }
// this.activeKey = tab.key;
// this.notify();
// }
// removeTab(targetKey: string) {
// const targetIndex = this.tabs.findIndex((tab) => tab.key === targetKey);
// if (targetIndex === -1) return;
// const newTabs = this.tabs.filter((tab) => tab.key !== targetKey);
// if (newTabs.length === 0) {
// this.tabs = [];
// this.activeKey = '';
// history.push('/');
// } else {
// this.tabs = newTabs;
// if (this.activeKey === targetKey) {
// // 如果关闭的是当前激活的标签,激活相邻的标签
// const newActiveKey =
// targetIndex > 0 ? newTabs[targetIndex - 1].key : newTabs[0].key;
// this.activeKey = newActiveKey;
// const targetTab = newTabs.find((tab) => tab.key === newActiveKey);
// if (targetTab) {
// history.push(targetTab.path);
// }
// }
// }
// this.notify();
// }
// setActiveKey(key: string) {
// this.activeKey = key;
// const targetTab = this.tabs.find((tab) => tab.key === key);
// if (targetTab) {
// history.push(targetTab.path);
// }
// this.notify();
// }
// closeOtherTabs(currentKey: string) {
// const currentTab = this.tabs.find((tab) => tab.key === currentKey);
// if (currentTab) {
// this.tabs = [currentTab];
// this.activeKey = currentKey;
// this.notify();
// }
// }
// closeLeftTabs(currentKey: string) {
// const currentIndex = this.tabs.findIndex((tab) => tab.key === currentKey);
// if (currentIndex > 0) {
// this.tabs = this.tabs.slice(currentIndex);
// this.notify();
// }
// }
// closeRightTabs(currentKey: string) {
// const currentIndex = this.tabs.findIndex((tab) => tab.key === currentKey);
// if (currentIndex !== -1) {
// this.tabs = this.tabs.slice(0, currentIndex + 1);
// this.notify();
// }
// }
// refreshTab(key: string) {
// // 通过路由跳转的方式刷新当前标签页,避免整个页面刷新导致标签页状态丢失
// const targetTab = this.tabs.find((tab) => tab.key === key);
// if (targetTab) {
// const originalPath = targetTab.path;
// // 移除可能存在的刷新参数,确保获取干净的原始路径
// const cleanPath = originalPath
// .replace(/[?&]_refresh=\d+/g, '')
// .replace(/\?$/, '');
// // 添加时间戳参数强制刷新
// const refreshPath = cleanPath.includes('?')
// ? `${cleanPath}&_refresh=${Date.now()}`
// : `${cleanPath}?_refresh=${Date.now()}`;
// // 先更新为带刷新参数的路径并跳转
// targetTab.path = refreshPath;
// this.setActiveKey(key);
// // 延迟恢复原始路径,确保路由跳转完成
// setTimeout(() => {
// // 恢复为干净的原始路径
// targetTab.path = cleanPath;
// // 再次跳转到干净路径移除URL中的刷新参数
// history.push(cleanPath);
// this.notify();
// }, 300);
// }
// }
// }
// // 全局标签页管理器实例
// const tabsManager = new TabsManager();
export function MyPageContainer({ export function MyPageContainer({
title, title,
children, children,
enableTabs = false, // 默认关闭多标签页功能 enableTabs: _enableTabs,
tabKey, tabKey: _tabKey,
tabLabel, tabLabel: _tabLabel,
onTabChange, onTabChange: _onTabChange,
...rest ...rest
}: MyPageContainerProps) { }: MyPageContainerProps) {
const navigate = useNavigate(); const navigate = useNavigate();
const location = useLocation(); // 使用useLocation钩子 const location = useLocation();
const [dataBre, setDataBre] = useState<any>( const [dataBre, setDataBre] = useState<BreadcrumbItem[]>(
JSON.parse(sessionStorage.getItem('breadcrumbs') || '[]'), JSON.parse(sessionStorage.getItem('breadcrumbs') || '[]'),
); );
const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
// 简化的面包屑更新逻辑 const canGoBack = location.pathname !== '/';
const updateBreadcrumbs = () => {
const handleGoBack = useCallback(() => {
navigate(-1);
}, [navigate]);
const updateBreadcrumbs = useCallback(() => {
try { try {
// 获取当前路径和标题
const currentPath = location.pathname + location.search; const currentPath = location.pathname + location.search;
const currentTitle = const currentTitle =
typeof title === 'string' typeof title === 'string'
? title ? title
: String(title?.props?.children || ''); : String(
(title as { props?: { children?: unknown } })?.props?.children ??
'',
);
// 清空无效的面包屑数据(重置逻辑)
const newBreadcrumbs: BreadcrumbItem[] = []; const newBreadcrumbs: BreadcrumbItem[] = [];
// 只添加当前页面的面包屑
if (currentPath && currentTitle) { if (currentPath && currentTitle) {
newBreadcrumbs.push({ newBreadcrumbs.push({
title: currentTitle, title: currentTitle,
@ -229,30 +62,31 @@ export function MyPageContainer({
}); });
} }
// 更新sessionStorage
try { try {
sessionStorage.setItem('breadcrumbs', JSON.stringify(newBreadcrumbs)); sessionStorage.setItem('breadcrumbs', JSON.stringify(newBreadcrumbs));
} catch (storageError) { } catch (storageError) {
console.error('存储到sessionStorage失败:', storageError); console.error('存储到sessionStorage失败:', storageError);
} }
// 更新状态
setDataBre(newBreadcrumbs); setDataBre(newBreadcrumbs);
} catch (error) { } catch (error) {
console.error('更新面包屑时出错:', error); console.error('更新面包屑时出错:', error);
// 出错时重置面包屑
setDataBre([]); setDataBre([]);
} }
}; }, [location.pathname, location.search, title]);
useEffect(() => { useEffect(() => {
console.log('title', title); timeoutRef.current = setTimeout(() => {
setTimeout(() => {
updateBreadcrumbs(); updateBreadcrumbs();
}, 250); }, 250);
}, [location.pathname, location.search, title]);
// 不再需要标签页相关的状态和逻辑 return () => {
// 直接返回简化版的PageContainer if (timeoutRef.current) {
clearTimeout(timeoutRef.current);
}
};
}, [updateBreadcrumbs]);
return ( return (
<PageContainer <PageContainer
fixedHeader fixedHeader
@ -260,15 +94,24 @@ export function MyPageContainer({
breadcrumb: {}, breadcrumb: {},
title: ( title: (
<Space style={{ fontSize: '12px', cursor: 'pointer', color: '#999' }}> <Space style={{ fontSize: '12px', cursor: 'pointer', color: '#999' }}>
{canGoBack && (
<Tooltip title="返回上级">
<Button
type="text"
size="small"
icon={<LeftOutlined />}
onClick={handleGoBack}
style={{ marginRight: 8, color: '#999' }}
/>
</Tooltip>
)}
<Breadcrumb <Breadcrumb
items={[ items={[
{ {
title: <HomeOutlined />, title: <HomeOutlined />,
onClick: () => { onClick: () => navigate('/'),
navigate('/');
}, },
}, ...dataBre.map((res) => ({
...dataBre?.map((res: any) => ({
title: res.title || '', title: res.title || '',
onClick: () => { onClick: () => {
navigate(res.path); navigate(res.path);
@ -301,6 +144,3 @@ export function MyPageContainer({
</PageContainer> </PageContainer>
); );
} }
// 不再导出标签页管理器
// export { tabsManager };

View File

@ -8,8 +8,9 @@ import {
import { Selects } from '@/components/Select'; import { Selects } from '@/components/Select';
import { Apis } from '@/gen/Apis'; import { Apis } from '@/gen/Apis';
import { ProTable } from '@ant-design/pro-components'; import { ProTable } from '@ant-design/pro-components';
import { useNavigate } from '@umijs/max';
import { Space, Tooltip } from 'antd'; import { Space, Tooltip } from 'antd';
import Create from './modals/Create';
import Update from './modals/Update';
export default function Index({ export default function Index({
title = '班次管理', title = '班次管理',
@ -18,8 +19,6 @@ export default function Index({
title?: string; title?: string;
noPermission?: boolean; noPermission?: boolean;
}) { }) {
const navigate = useNavigate();
return ( return (
<ProTable <ProTable
{...MyProTableProps.props} {...MyProTableProps.props}
@ -31,17 +30,13 @@ export default function Index({
) )
} }
headerTitle={title} headerTitle={title}
toolBarRender={() => toolBarRender={(action) =>
noPermission noPermission
? [ ? [
<MyButtons.Default <Create
key="Create" key="Create"
size="middle" reload={() => action?.reload()}
type="primary" title={title}
onClick={() => {
navigate('/attendance/attendance_shifts/pages/create');
}}
title="新增班次"
/>, />,
] ]
: [ : [
@ -49,14 +44,10 @@ export default function Index({
key="toolbar" key="toolbar"
actions={{ actions={{
add: ( add: (
<MyButtons.Default <Create
key="Create" key="Create"
size="middle" reload={() => action?.reload()}
type="primary" title={title}
onClick={() => {
navigate('/attendance/attendance_shifts/pages/create');
}}
title="新增班次"
/> />
), ),
}} }}
@ -72,16 +63,16 @@ export default function Index({
key: 'asset_projects_id', key: 'asset_projects_id',
hidden: true, hidden: true,
}), }),
{ // {
title: '关联项目', // title: '关联项目',
dataIndex: ['asset_project', 'name'], // dataIndex: ['asset_project', 'name'],
// search: { // // search: {
// transform: (value) => { // // transform: (value) => {
// return { project_name: value }; // // return { project_name: value };
// // },
// // },
// search: false,
// }, // },
// },
search: false,
},
{ {
title: '班次名称', title: '班次名称',
dataIndex: 'name', dataIndex: 'name',
@ -96,7 +87,7 @@ export default function Index({
const periodTexts = periods.map((res: any) => { const periodTexts = periods.map((res: any) => {
return `时段${ return `时段${
res?.period_order res?.period_order
}: ${res?.work_start_time?.substring( } ${res?.work_start_time?.substring(
0, 0,
5, 5,
)}-${res?.work_end_time?.substring(0, 5)}`; )}-${res?.work_end_time?.substring(0, 5)}`;
@ -129,7 +120,10 @@ export default function Index({
{ {
title: '可打卡时间范围', title: '可打卡时间范围',
render(_, record) { render(_, record) {
return `${record?.allow_checkin_start} - ${record?.allow_checkin_end}`; return `${record?.allow_checkin_start?.substring(
0,
5,
)} - ${record?.allow_checkin_end?.substring(0, 5)}`;
}, },
search: false, search: false,
}, },
@ -151,16 +145,11 @@ export default function Index({
<MyTableActions <MyTableActions
actions={{ actions={{
update: ( update: (
<MyButtons.Default <Update
key="Update" key="Update"
size="small" item={item}
type="primary" reload={action?.reload}
onClick={() => { title={title}
navigate(
`/attendance/attendance_shifts/pages/update?id=${item.id}`,
);
}}
title="编辑"
/> />
), ),
delete: ( delete: (

View File

@ -0,0 +1,156 @@
import {
MyBetaModalFormProps,
MyButtons,
MyFormItems,
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.Attendance.AttendanceShifts.Store>
{...MyModalFormProps.props}
title="新增班次"
trigger={<MyButtons.Create title="新增班次" />}
key={new Date().getTime()}
width="800px"
wrapperCol={{ span: 24 }}
form={form}
onOpenChange={(open: any) => {
if (open) {
form.resetFields();
}
}}
onFinish={async (values: any) => {
const formattedValues = { ...values };
if (formattedValues.periods) {
formattedValues.periods = formattedValues.periods.map(
(period: any) => ({
...period,
work_start_time: period.work_start_time
? `${period.work_start_time}:00`
: '',
work_end_time: period.work_end_time
? `${period.work_end_time}:00`
: '',
}),
);
}
if (formattedValues.allow_checkin_start) {
formattedValues.allow_checkin_start = `${formattedValues.allow_checkin_start}:00`;
}
if (formattedValues.allow_checkin_end) {
formattedValues.allow_checkin_end = `${formattedValues.allow_checkin_end}:00`;
}
return Apis.Attendance.AttendanceShifts.Store({
...formattedValues,
is_enabled: true,
})
.then(() => {
props.reload?.();
message.success('新增成功');
return true;
})
.catch(() => false);
}}
columns={[
{
title: '班次名称',
key: 'name',
formItemProps: { ...rulesHelper.text },
fieldProps: {
placeholder: '请输入(如:早班、晚班)',
},
},
{
valueType: 'formList',
dataIndex: 'periods',
title: '设置需打卡时段',
formItemProps: { ...rulesHelper.array },
fieldProps: {
copyIconProps: false,
},
columns: [
{
valueType: 'group',
colProps: { span: 24 },
columns: [
MyFormItems.EnumSelect({
key: 'period_order',
valueEnum: {
1: '1',
2: '2',
3: '3',
4: '4',
5: '5',
},
required: true,
colProps: { span: 4 },
}),
{
key: 'work_start_time',
valueType: 'time',
fieldProps: {
style: { width: '100%' },
placeholder: '请选择班次开始时间',
format: 'HH:mm',
},
colProps: { span: 8 },
formItemProps: { ...rulesHelper.text },
},
{
key: 'work_end_time',
valueType: 'time',
fieldProps: {
style: { width: '100%' },
placeholder: '请选择班次结束时间',
format: 'HH:mm',
},
colProps: { span: 8 },
formItemProps: { ...rulesHelper.text },
},
],
},
],
},
{ valueType: 'divider' },
{
title: '可打卡开始时间',
key: 'allow_checkin_start',
valueType: 'time',
fieldProps: {
style: { width: '100%' },
format: 'HH:mm',
},
colProps: { span: 12 },
formItemProps: { ...rulesHelper.text },
},
{
title: '可打卡结束时间',
key: 'allow_checkin_end',
fieldProps: {
style: { width: '100%' },
format: 'HH:mm',
},
valueType: 'time',
colProps: { span: 12 },
formItemProps: { ...rulesHelper.text },
},
{
title: '备注',
key: 'remark',
valueType: 'textarea',
colProps: { span: 24 },
},
]}
/>
);
}

View File

@ -0,0 +1,206 @@
import {
MyBetaModalFormProps,
MyButtons,
MyFormItems,
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();
const loadShow = () => {
if (!props.item?.id) return;
Apis.Attendance.AttendanceShifts.Show({ id: Number(props.item.id) }).then(
(res) => {
const formData = { ...res?.data };
if (formData.allow_checkin_start) {
formData.allow_checkin_start = formData.allow_checkin_start.slice(
0,
5,
);
}
if (formData.allow_checkin_end) {
formData.allow_checkin_end = formData.allow_checkin_end.slice(0, 5);
}
if (formData.attendance_shift_periods) {
formData.periods = formData.attendance_shift_periods.map(
(period: any) => ({
...period,
work_start_time: period.work_start_time
? period.work_start_time.slice(0, 5)
: '',
work_end_time: period.work_end_time
? period.work_end_time.slice(0, 5)
: '',
}),
);
}
form.setFieldsValue({
...formData,
asset_projects_id: res?.data?.asset_project?.id,
});
},
);
};
return (
<BetaSchemaForm<ApiTypes.Attendance.AttendanceShifts.Update>
{...MyModalFormProps.props}
title="编辑班次"
trigger={<MyButtons.Default type="primary" size="small" title="编辑" />}
key={new Date().getTime()}
width="800px"
wrapperCol={{ span: 24 }}
form={form}
onOpenChange={(open: any) => {
if (open && props.item) {
loadShow();
}
}}
onFinish={async (values: any) => {
const formattedValues = { ...values };
if (formattedValues.periods) {
formattedValues.periods = formattedValues.periods.map(
(period: any) => ({
...period,
work_start_time: period.work_start_time
? `${period.work_start_time}:00`
: '',
work_end_time: period.work_end_time
? `${period.work_end_time}:00`
: '',
}),
);
}
if (formattedValues.allow_checkin_start) {
formattedValues.allow_checkin_start = `${formattedValues.allow_checkin_start}:00`;
}
if (formattedValues.allow_checkin_end) {
formattedValues.allow_checkin_end = `${formattedValues.allow_checkin_end}:00`;
}
return Apis.Attendance.AttendanceShifts.Update({
...formattedValues,
is_enabled: values.is_enabled ? true : false,
id: props.item?.id ?? 0,
})
.then(() => {
props.reload?.();
message.success('编辑成功');
return true;
})
.catch(() => false);
}}
columns={[
{
title: '班次名称',
key: 'name',
formItemProps: { ...rulesHelper.text },
colProps: { span: 12 },
},
{
title: '状态',
key: 'is_enabled',
valueType: 'switch',
colProps: { span: 12 },
fieldProps(form, config) {
return {
...config.fieldProps,
style: { width: '100%' },
checkedChildren: '启用',
unCheckedChildren: '停用',
};
},
},
{
valueType: 'formList',
dataIndex: 'periods',
title: '设置需打卡时段',
formItemProps: { ...rulesHelper.array },
fieldProps: {
copyIconProps: false,
},
columns: [
{
valueType: 'group',
colProps: { span: 24 },
columns: [
MyFormItems.EnumSelect({
key: 'period_order',
valueEnum: {
1: '1',
2: '2',
3: '3',
4: '4',
5: '5',
},
required: true,
colProps: { span: 4 },
}),
{
key: 'work_start_time',
valueType: 'time',
fieldProps: {
style: { width: '100%' },
placeholder: '请选择班次开始时间',
format: 'HH:mm',
},
colProps: { span: 8 },
formItemProps: { ...rulesHelper.text },
},
{
key: 'work_end_time',
valueType: 'time',
fieldProps: {
style: { width: '100%' },
placeholder: '请选择班次结束时间',
format: 'HH:mm',
},
colProps: { span: 8 },
formItemProps: { ...rulesHelper.text },
},
],
},
],
},
{
title: '可打卡开始时间',
key: 'allow_checkin_start',
valueType: 'time',
fieldProps: {
style: { width: '100%' },
format: 'HH:mm',
},
colProps: { span: 12 },
formItemProps: { ...rulesHelper.text },
},
{
title: '可打卡结束时间',
key: 'allow_checkin_end',
fieldProps: {
style: { width: '100%' },
format: 'HH:mm',
},
valueType: 'time',
colProps: { span: 12 },
formItemProps: { ...rulesHelper.text },
},
{
title: '备注',
key: 'remark',
valueType: 'textarea',
colProps: { span: 24 },
},
]}
/>
);
}

View File

@ -1,259 +0,0 @@
import {
MyFormItems,
MyModalFormProps,
MyPageContainer,
rulesHelper,
} from '@/common';
import { Selects } from '@/components/Select';
import { Apis } from '@/gen/Apis';
import { BetaSchemaForm, ProCard } from '@ant-design/pro-components';
import { useNavigate } from '@umijs/max';
import { Form, message, Space } from 'antd';
import { useState } from 'react';
export default function Index({ title = '新增班次' }) {
const [form] = Form.useForm();
const navigate = useNavigate();
const [dataSource, setDataSource] = useState<
ApiTypes.Asset.AssetProjects.List[]
>([]);
return (
<MyPageContainer
title={
<Space
style={{ cursor: 'pointer' }}
onClick={() => {
navigate(-1);
}}
>
{/* <LeftCircleOutlined size={34} /> */}
{title}
</Space>
}
enableTabs={false}
tabKey="attendance-shifts-create"
tabLabel={title}
>
<ProCard>
<div style={{ width: 900, minHeight: '83vh', margin: '0 auto' }}>
<BetaSchemaForm<ApiTypes.Attendance.AttendanceShifts.Store>
{...MyModalFormProps.props}
title={title}
// 基础表单
layoutType="Form"
labelCol={{ span: 24 }}
wrapperCol={{ span: 24 }}
labelAlign="left"
width="900px"
form={form}
onFinish={async (values: any) => {
// 处理时间格式转换将HH:mm转换为HH:mm:ss格式秒数固定为00
const formattedValues = { ...values };
// 处理work_start_time和work_end_time数组
if (formattedValues.periods) {
formattedValues.periods = formattedValues.periods.map(
(period: any) => {
return {
...period,
work_start_time: period.work_start_time
? `${period.work_start_time}:00`
: '',
work_end_time: period.work_end_time
? `${period.work_end_time}:00`
: '',
};
},
);
}
// 处理可打卡开始和结束时间
if (formattedValues.allow_checkin_start) {
formattedValues.allow_checkin_start = `${formattedValues.allow_checkin_start}:00`;
}
if (formattedValues.allow_checkin_end) {
formattedValues.allow_checkin_end = `${formattedValues.allow_checkin_end}:00`;
}
Apis.Attendance.AttendanceShifts.Store({
...formattedValues,
// is_enabled: values.is_enabled ? true : false,
is_enabled: true,
})
.then(() => {
//提交
navigate(-1);
message.success('提交成功');
})
.catch(() => false);
}}
columns={[
{
title: '班次名称',
key: 'name',
formItemProps: { ...rulesHelper.text },
fieldProps: {
placeholder: '请输入(如:早班、晚班)',
},
},
{
valueType: 'formList',
dataIndex: 'periods',
title: '设置需打卡时段',
formItemProps: { ...rulesHelper.array },
fieldProps: {
copyIconProps: false,
// deleteIconProps: false,
},
columns: [
{
valueType: 'group',
colProps: { span: 24 },
columns: [
MyFormItems.EnumSelect({
key: 'period_order',
valueEnum: {
1: '1',
2: '2',
3: '3',
4: '4',
5: '5',
},
required: true,
colProps: { span: 4 },
}),
{
key: 'work_start_time',
valueType: 'time',
fieldProps: {
style: { width: '100%' },
placeholder: '请选择班次开始时间',
format: 'HH:mm',
},
colProps: { span: 8 },
formItemProps: { ...rulesHelper.text },
},
{
key: 'work_end_time',
valueType: 'time',
fieldProps: {
style: { width: '100%' },
placeholder: '请选择班次结束时间',
format: 'HH:mm',
},
colProps: { span: 8 },
formItemProps: { ...rulesHelper.text },
},
],
},
],
},
{ valueType: 'divider' },
{
title: '可打卡开始时间',
key: 'allow_checkin_start',
valueType: 'time',
fieldProps: {
style: { width: '100%' },
format: 'HH:mm',
},
colProps: { span: 12 },
formItemProps: { ...rulesHelper.text },
},
{
title: '可打卡结束时间',
key: 'allow_checkin_end',
fieldProps: {
style: { width: '100%' },
format: 'HH:mm',
},
valueType: 'time',
colProps: { span: 12 },
formItemProps: { ...rulesHelper.text },
},
// {
// title: '启用',
// key: 'is_enabled',
// valueType: 'switch',
// colProps: { span: 24 },
// },
// {
// colProps: { span: 24 },
// title: '选择关联项目',
// tooltip: '选择后对应项目的人员可排班',
// key: 'asset_projects_id',
// formItemProps: { ...rulesHelper.text },
// renderFormItem: () => {
// return (
// <ProCard size="small" bordered>
// <ProTable
// {...MyProTableProps.props}
// options={false}
// size="small"
// search={false}
// pagination={false}
// dataSource={dataSource || []}
// headerTitle={
// <MyAssetsProjectSelectList
// key="select_project"
// item={dataSource}
// type="radio"
// onChange={(e: any) => {
// let row = e?.[0];
// form.setFieldsValue({
// asset_projects_id:
// row?.asset_projects_id || row?.id,
// });
// setDataSource(e);
// }}
// />
// }
// columns={[
// MyColumns.ID({
// search: false,
// }),
// {
// title: '名称',
// dataIndex: 'name',
// },
// MyColumns.Option({
// render: (_, item: any, index) => (
// <Space key={index}>
// <MyButtons.Delete
// onConfirm={() => {
// setDataSource(
// dataSource.filter(
// (res: any) => res?.id !== item?.id,
// ),
// );
// }}
// />
// </Space>
// ),
// }),
// ]}
// />
// </ProCard>
// );
// },
// },
Selects?.AssetProjects({
title: '关联项目',
key: 'asset_projects_id',
colProps: { span: 24 },
formItemProps: { ...rulesHelper.text },
}),
{
title: '备注',
key: 'remark',
valueType: 'textarea',
colProps: { span: 24 },
},
]}
/>
</div>
</ProCard>
</MyPageContainer>
);
}

View File

@ -1,263 +0,0 @@
import {
MyFormItems,
MyModalFormProps,
MyPageContainer,
rulesHelper,
} from '@/common';
import { Selects } from '@/components/Select';
import { Apis } from '@/gen/Apis';
import { BetaSchemaForm, ProCard } from '@ant-design/pro-components';
import { useNavigate, useSearchParams } from '@umijs/max';
import { Form, message, Space } from 'antd';
import { useEffect, useState } from 'react';
export default function Index({ title = '编辑班次' }) {
const [form] = Form.useForm();
const navigate = useNavigate();
const [searchParams] = useSearchParams();
const id = searchParams.get('id') ?? 0;
const [data, setShow] = useState<any>({});
const [dataSource, setDataSource] = useState<
ApiTypes.Asset.AssetProjects.List[]
>([]);
const loadShow = () => {
Apis.Attendance.AttendanceShifts.Show({ id: Number(id) }).then((res) => {
setShow(res?.data);
setDataSource([res?.data?.asset_project]);
// 处理时间格式将hh:mm:ss转换为hh:mm用于表单显示
const formData = { ...res?.data };
// 处理可打卡开始和结束时间
if (formData.allow_checkin_start) {
formData.allow_checkin_start = formData.allow_checkin_start.slice(0, 5);
}
if (formData.allow_checkin_end) {
formData.allow_checkin_end = formData.allow_checkin_end.slice(0, 5);
}
// 处理时间段数组中的时间格式
if (formData.attendance_shift_periods) {
formData.periods = formData.attendance_shift_periods.map(
(period: any) => {
return {
...period,
work_start_time: period.work_start_time
? period.work_start_time.slice(0, 5)
: '',
work_end_time: period.work_end_time
? period.work_end_time.slice(0, 5)
: '',
};
},
);
}
form.setFieldsValue({
...formData,
asset_projects_id: res?.data?.asset_project?.id,
}); // 编辑赋值
});
};
useEffect(() => {
loadShow();
}, [id]);
return (
<MyPageContainer
title={
<Space
style={{ cursor: 'pointer' }}
onClick={() => {
navigate(-1);
}}
>
{/* <LeftCircleOutlined size={34} /> */}
{title}
</Space>
}
enableTabs={false}
tabKey="attendance-shifts-update"
tabLabel={title}
>
<ProCard>
<div style={{ width: 900, minHeight: '83vh', margin: '0 auto' }}>
<BetaSchemaForm<ApiTypes.Attendance.AttendanceShifts.Update>
{...MyModalFormProps.props}
title={title}
// 基础表单
layoutType="Form"
labelCol={{ span: 24 }}
wrapperCol={{ span: 24 }}
labelAlign="left"
width="900px"
form={form}
onFinish={async (values: any) => {
// 处理时间格式转换将HH:mm转换为HH:mm:ss格式秒数固定为00
const formattedValues = { ...values };
// 处理work_start_time和work_end_time数组
if (formattedValues.periods) {
formattedValues.periods = formattedValues.periods.map(
(period: any) => {
return {
...period,
work_start_time: period.work_start_time
? `${period.work_start_time}:00`
: '',
work_end_time: period.work_end_time
? `${period.work_end_time}:00`
: '',
};
},
);
}
// 处理可打卡开始和结束时间
if (formattedValues.allow_checkin_start) {
formattedValues.allow_checkin_start = `${formattedValues.allow_checkin_start}:00`;
}
if (formattedValues.allow_checkin_end) {
formattedValues.allow_checkin_end = `${formattedValues.allow_checkin_end}:00`;
}
Apis.Attendance.AttendanceShifts.Update({
...formattedValues,
is_enabled: values.is_enabled ? true : false,
id: data?.id,
})
.then(() => {
//提交
navigate(-1);
message.success('编辑成功');
})
.catch(() => false);
}}
columns={[
{
title: '班次名称',
key: 'name',
formItemProps: { ...rulesHelper.text },
colProps: { span: 12 },
},
{
title: '状态',
key: 'is_enabled',
valueType: 'switch',
colProps: { span: 12 },
fieldProps(form, config) {
return {
...config.fieldProps,
style: { width: '100%' },
checkedChildren: '启用',
unCheckedChildren: '停用',
};
},
},
{
valueType: 'formList',
dataIndex: 'periods',
title: '设置需打卡时段',
formItemProps: { ...rulesHelper.array },
fieldProps: {
copyIconProps: false,
// deleteIconProps: false,
},
columns: [
{
valueType: 'group',
colProps: { span: 24 },
columns: [
MyFormItems.EnumSelect({
key: 'period_order',
valueEnum: {
1: '1',
2: '2',
3: '3',
4: '4',
5: '5',
},
required: true,
colProps: { span: 4 },
}),
// {
// key: 'period_order',
// valueType: 'digit',
// colProps: { span: 6 },
// formItemProps: { ...rulesHelper.text },
// fieldProps: {
// style: { width: '100%' },
// placeholder: '请输入班次序号',
// },
// },
{
key: 'work_start_time',
valueType: 'time',
fieldProps: {
style: { width: '100%' },
placeholder: '请选择班次开始时间',
format: 'HH:mm',
},
colProps: { span: 8 },
formItemProps: { ...rulesHelper.text },
},
{
key: 'work_end_time',
fieldProps: {
style: { width: '100%' },
placeholder: '请选择班次结束时间',
format: 'HH:mm',
},
valueType: 'time',
colProps: { span: 8 },
formItemProps: { ...rulesHelper.text },
},
],
},
],
},
{
title: '可打卡开始时间',
key: 'allow_checkin_start',
valueType: 'time',
fieldProps: {
style: { width: '100%' },
format: 'HH:mm',
},
colProps: { span: 12 },
formItemProps: { ...rulesHelper.text },
},
{
title: '可打卡结束时间',
key: 'allow_checkin_end',
fieldProps: {
style: { width: '100%' },
format: 'HH:mm',
},
valueType: 'time',
colProps: { span: 12 },
formItemProps: { ...rulesHelper.text },
},
Selects?.AssetProjects({
title: '关联项目',
key: 'asset_projects_id',
colProps: { span: 24 },
formItemProps: { ...rulesHelper.text },
}),
{
title: '备注',
key: 'remark',
valueType: 'textarea',
colProps: { span: 24 },
},
]}
/>
</div>
</ProCard>
</MyPageContainer>
);
}

View File

@ -2,6 +2,7 @@ import { MyBetaModalFormProps } from '@/common';
import { MyModal } from '@/components/MyModal'; import { MyModal } from '@/components/MyModal';
import { Apis } from '@/gen/Apis'; import { Apis } from '@/gen/Apis';
import { HouseBillsTypeEnum } from '@/gen/Enums'; import { HouseBillsTypeEnum } from '@/gen/Enums';
import { Spin } from 'antd';
import { useState } from 'react'; import { useState } from 'react';
import HasCar from '../components/HasCar'; import HasCar from '../components/HasCar';
import HasHouse from '../components/HasHouse'; import HasHouse from '../components/HasHouse';
@ -42,20 +43,26 @@ function getPageType(chargeType: string) {
export default function Show(props: MyBetaModalFormProps) { export default function Show(props: MyBetaModalFormProps) {
const { item, reload, title = '详情' } = props; const { item, reload, title = '详情' } = props;
const [data, setData] = useState<any>({}); const [data, setData] = useState<any>({});
const [loading, setLoading] = useState(false);
const pageType = getPageType(item?.charge_type); const pageType = getPageType(item?.charge_type);
const meterConfig = getMeterConfig(item?.charge_type); const meterConfig = getMeterConfig(item?.charge_type);
const loadShow = () => { const loadShow = () => {
setLoading(true);
Apis.HouseCharge.HouseChargeStandards.Show({ Apis.HouseCharge.HouseChargeStandards.Show({
id: item?.id ?? 0, id: item?.id ?? 0,
}).then((res) => { })
.then((res) => {
setData(res?.data || {}); setData(res?.data || {});
})
.finally(() => {
setLoading(false);
}); });
reload?.();
}; };
const renderContent = () => { const renderContent = () => {
if (!data?.id) return null;
if (pageType === 'Meter') { if (pageType === 'Meter') {
return ( return (
<Instrument <Instrument
@ -93,7 +100,7 @@ export default function Show(props: MyBetaModalFormProps) {
onOpen={() => { onOpen={() => {
loadShow(); loadShow();
}} }}
node={renderContent()} node={<Spin spinning={loading}>{renderContent()}</Spin>}
/> />
); );
} }

View File

@ -377,7 +377,7 @@ export default function Create() {
}, },
}, },
{ {
title: '合同标', title: '合同标',
formItemProps: { ...rulesHelper.text }, formItemProps: { ...rulesHelper.text },
dataIndex: 'object_name', dataIndex: 'object_name',
colProps: { span: 6 }, colProps: { span: 6 },

View File

@ -246,7 +246,7 @@ export default function Index({ title = '编辑合同账单' }) {
}, },
}, },
{ {
title: '合同标', title: '合同标',
formItemProps: { ...rulesHelper.text }, formItemProps: { ...rulesHelper.text },
dataIndex: 'object_name', dataIndex: 'object_name',
fieldProps: { fieldProps: {

View File

@ -266,7 +266,7 @@ export default function Index({ title = '新增补充协议' }) {
}, },
required: true, required: true,
fieldProps: { fieldProps: {
placeholder: '请选择签约主体', placeholder: '请选择供应商',
}, },
}), }),
] ]
@ -285,7 +285,45 @@ export default function Index({ title = '新增补充协议' }) {
}, },
required: true, required: true,
fieldProps: { fieldProps: {
placeholder: '请选择签约主体', placeholder: '请选择内部企业',
},
}),
]
: counterparty_type === 'CustomerCompany'
? [
SelectContract.SupplierName({
key: 'counterparty',
title: '',
params: {
counterparty: 'CustomerCompany',
},
colProps: { span: 12 },
formItemProps: {
...rulesHelper.text,
wrapperCol: { span: 24 },
},
required: true,
fieldProps: {
placeholder: '请选择客户单位',
},
}),
]
: counterparty_type === 'Other'
? [
SelectContract.SupplierName({
key: 'counterparty',
title: '',
params: {
counterparty: 'Other',
},
colProps: { span: 12 },
formItemProps: {
...rulesHelper.text,
wrapperCol: { span: 24 },
},
required: true,
fieldProps: {
placeholder: '请选择其他',
}, },
}), }),
] ]

View File

@ -240,7 +240,7 @@ export default function Index({ title = '修改补充协议' }) {
}, },
required: true, required: true,
fieldProps: { fieldProps: {
placeholder: '请选择签约主体', placeholder: '请选择供应商',
}, },
}), }),
] ]
@ -259,7 +259,45 @@ export default function Index({ title = '修改补充协议' }) {
}, },
required: true, required: true,
fieldProps: { fieldProps: {
placeholder: '请选择签约主体', placeholder: '请选择内部企业',
},
}),
]
: counterparty_type === 'CustomerCompany'
? [
SelectContract.SupplierName({
key: 'counterparty',
title: '',
params: {
counterparty: 'CustomerCompany',
},
colProps: { span: 12 },
formItemProps: {
...rulesHelper.text,
wrapperCol: { span: 24 },
},
required: true,
fieldProps: {
placeholder: '请选择客户单位',
},
}),
]
: counterparty_type === 'Other'
? [
SelectContract.SupplierName({
key: 'counterparty',
title: '',
params: {
counterparty: 'Other',
},
colProps: { span: 12 },
formItemProps: {
...rulesHelper.text,
wrapperCol: { span: 24 },
},
required: true,
fieldProps: {
placeholder: '请选择其他',
}, },
}), }),
] ]

View File

@ -597,15 +597,22 @@ export default function Index({ title = '新增合同' }) {
buttonStyle: 'solid', buttonStyle: 'solid',
}, },
}), }),
MyFormItems.EnumRadio({ MyFormItems.EnumSelect({
key: 'counterparty_type', key: 'counterparty_type',
title: '', title: '',
valueEnum: CompanySuppliersCounterpartyEnum, valueEnum: CompanySuppliersCounterpartyEnum,
colProps: { span: 7 }, colProps: { span: 5 },
formItemProps: { formItemProps: {
...rulesHelper.text, ...rulesHelper.text,
wrapperCol: { span: 24 }, wrapperCol: { span: 24 },
}, },
// fieldProps: {
// buttonStyle: 'solid',
// onChange: () => {
// // 切换计量单位时清空计费模式
// form.setFieldValue('counterparty', undefined);
// },
// },
}), }),
{ {
valueType: 'dependency', valueType: 'dependency',
@ -619,7 +626,7 @@ export default function Index({ title = '新增合同' }) {
params: { params: {
counterparty: 'Supplier', counterparty: 'Supplier',
}, },
colProps: { span: 10 }, colProps: { span: 12 },
formItemProps: { formItemProps: {
...rulesHelper.text, ...rulesHelper.text,
wrapperCol: { span: 24 }, wrapperCol: { span: 24 },
@ -638,14 +645,52 @@ export default function Index({ title = '新增合同' }) {
params: { params: {
counterparty: 'InternalCompany', counterparty: 'InternalCompany',
}, },
colProps: { span: 10 }, colProps: { span: 12 },
formItemProps: { formItemProps: {
...rulesHelper.text, ...rulesHelper.text,
wrapperCol: { span: 24 }, wrapperCol: { span: 24 },
}, },
required: true, required: true,
fieldProps: { fieldProps: {
placeholder: '请选择内部公司', placeholder: '请选择内部企业',
},
}),
]
: counterparty_type === 'CustomerCompany'
? [
SelectContract.SupplierName({
key: 'counterparty',
title: '',
params: {
counterparty: 'CustomerCompany',
},
colProps: { span: 12 },
formItemProps: {
...rulesHelper.text,
wrapperCol: { span: 24 },
},
required: true,
fieldProps: {
placeholder: '请选择客户单位',
},
}),
]
: counterparty_type === 'Other'
? [
SelectContract.SupplierName({
key: 'counterparty',
title: '',
params: {
counterparty: 'Other',
},
colProps: { span: 12 },
formItemProps: {
...rulesHelper.text,
wrapperCol: { span: 24 },
},
required: true,
fieldProps: {
placeholder: '请选择其他',
}, },
}), }),
] ]
@ -656,7 +701,7 @@ export default function Index({ title = '新增合同' }) {
params: { params: {
counterparty: 'InternalCompany', counterparty: 'InternalCompany',
}, },
colProps: { span: 10 }, colProps: { span: 12 },
formItemProps: { formItemProps: {
...rulesHelper.text, ...rulesHelper.text,
wrapperCol: { span: 24 }, wrapperCol: { span: 24 },
@ -833,12 +878,12 @@ export default function Index({ title = '新增合同' }) {
fieldProps: { fieldProps: {
options: contractData?.peoples options: contractData?.peoples
?.filter((item: any) => { ?.filter((item: any) => {
// 当收入类型为Income时只显示内部公司 // 当收入类型为Income时只显示内部企业
if (contractData?.income_expense_type === 'Income') { if (contractData?.income_expense_type === 'Income') {
return item?.counterparty_type === 'InternalCompany'; return item?.counterparty_type === 'InternalCompany';
} }
// 其他情况显示所有 // 支出时显示外部单位
return item?.counterparty_type === 'Supplier'; return item?.counterparty_type !== 'InternalCompany';
}) })
.map((item: any) => ({ .map((item: any) => ({
label: item?.counterparty, label: item?.counterparty,
@ -855,12 +900,12 @@ export default function Index({ title = '新增合同' }) {
fieldProps: { fieldProps: {
options: contractData?.peoples options: contractData?.peoples
?.filter((item: any) => { ?.filter((item: any) => {
// 当收入类型为Income时只显示内部公司 // 当支出类型为Expense时只显示内部企业
if (contractData?.income_expense_type === 'Expense') { if (contractData?.income_expense_type === 'Expense') {
return item?.counterparty_type === 'InternalCompany'; return item?.counterparty_type === 'InternalCompany';
} }
// 其他情况显示所有 // 收入时显示外部单位
return item?.counterparty_type === 'Supplier'; return item?.counterparty_type !== 'InternalCompany';
}) })
.map((item: any) => ({ .map((item: any) => ({
label: item?.counterparty, label: item?.counterparty,

View File

@ -35,7 +35,7 @@ export default function Index({ title = '编辑合同' }) {
const [submitModalVisible, setSubmitModalVisible] = useState<boolean>(false); const [submitModalVisible, setSubmitModalVisible] = useState<boolean>(false);
const [currentStep, setCurrentStep] = useState<number>(0); const [currentStep, setCurrentStep] = useState<number>(0);
const [contractData, setContractData] = useState<any>({}); const [contractData, setContractData] = useState<any>({});
// const [billsData, setBillsData] = useState<any[]>([]); const [billsData, setBillsData] = useState<any[]>([]);
const loadShow = () => { const loadShow = () => {
Apis.Contract.Contracts.Show({ id: Number(id) }).then((res) => { Apis.Contract.Contracts.Show({ id: Number(id) }).then((res) => {
@ -44,8 +44,8 @@ export default function Index({ title = '编辑合同' }) {
setContractData(contractData); setContractData(contractData);
setSelectedRow(res?.data?.resource); setSelectedRow(res?.data?.resource);
// 提取账单数据 // 提取账单数据
// const bills = contractData?.contract_bills || []; const bills = contractData?.contract_bills || [];
// setBillsData(bills); setBillsData(bills);
form2.setFieldsValue({ form2.setFieldsValue({
...contractData, ...contractData,
payee: res?.data?.contract_bills?.[0]?.payee, payee: res?.data?.contract_bills?.[0]?.payee,
@ -76,9 +76,9 @@ export default function Index({ title = '编辑合同' }) {
}, [id]); }, [id]);
const onSave = (formData: any, subType: number = 1) => { const onSave = (formData: any, subType: number = 1) => {
// formData?.peoples?.forEach((res: any) => { formData?.peoples?.forEach((res: any) => {
// res.company_suppliers_id = res?.counterparty?.split('')?.[0]; res.company_suppliers_id = res?.counterparty?.split('')?.[0];
// }); });
const contractDataToSave = { const contractDataToSave = {
...formData, ...formData,
is_deposit: is_deposit:
@ -336,10 +336,10 @@ export default function Index({ title = '编辑合同' }) {
onClick={() => { onClick={() => {
// 先保存合同,然后显示提审弹窗 // 先保存合同,然后显示提审弹窗
const values = form.getFieldsValue(); const values = form.getFieldsValue();
// values?.peoples?.forEach((res: any) => { values?.peoples?.forEach((res: any) => {
// res.company_suppliers_id = res.company_suppliers_id =
// res?.counterparty?.split('')?.[0]; res?.counterparty?.split('')?.[0];
// }); });
form?.validateFields().then(() => { form?.validateFields().then(() => {
Apis.Contract.Contracts.Update({ Apis.Contract.Contracts.Update({
...values, ...values,
@ -662,11 +662,11 @@ export default function Index({ title = '编辑合同' }) {
buttonStyle: 'solid', buttonStyle: 'solid',
}, },
}), }),
MyFormItems.EnumRadio({ MyFormItems.EnumSelect({
key: 'counterparty_type', key: 'counterparty_type',
title: '', title: '',
valueEnum: CompanySuppliersCounterpartyEnum, valueEnum: CompanySuppliersCounterpartyEnum,
colProps: { span: 7 }, colProps: { span: 6 },
formItemProps: { formItemProps: {
...rulesHelper.text, ...rulesHelper.text,
wrapperCol: { span: 24 }, wrapperCol: { span: 24 },
@ -691,7 +691,7 @@ export default function Index({ title = '编辑合同' }) {
params: { params: {
counterparty: 'Supplier', counterparty: 'Supplier',
}, },
colProps: { span: 10 }, colProps: { span: 12 },
formItemProps: { formItemProps: {
...rulesHelper.text, ...rulesHelper.text,
wrapperCol: { span: 24 }, wrapperCol: { span: 24 },
@ -710,14 +710,52 @@ export default function Index({ title = '编辑合同' }) {
params: { params: {
counterparty: 'InternalCompany', counterparty: 'InternalCompany',
}, },
colProps: { span: 10 }, colProps: { span: 12 },
formItemProps: { formItemProps: {
...rulesHelper.text, ...rulesHelper.text,
wrapperCol: { span: 24 }, wrapperCol: { span: 24 },
}, },
required: true, required: true,
fieldProps: { fieldProps: {
placeholder: '请选择内部公司', placeholder: '请选择内部企业',
},
}),
]
: counterparty_type === 'CustomerCompany'
? [
SelectContract.SupplierName({
key: 'counterparty',
title: '',
params: {
counterparty: 'CustomerCompany',
},
colProps: { span: 12 },
formItemProps: {
...rulesHelper.text,
wrapperCol: { span: 24 },
},
required: true,
fieldProps: {
placeholder: '请选择客户单位',
},
}),
]
: counterparty_type === 'Other'
? [
SelectContract.SupplierName({
key: 'counterparty',
title: '',
params: {
counterparty: 'Other',
},
colProps: { span: 12 },
formItemProps: {
...rulesHelper.text,
wrapperCol: { span: 24 },
},
required: true,
fieldProps: {
placeholder: '请选择其他',
}, },
}), }),
] ]
@ -728,7 +766,7 @@ export default function Index({ title = '编辑合同' }) {
params: { params: {
counterparty: 'InternalCompany', counterparty: 'InternalCompany',
}, },
colProps: { span: 10 }, colProps: { span: 12 },
formItemProps: { formItemProps: {
...rulesHelper.text, ...rulesHelper.text,
wrapperCol: { span: 24 }, wrapperCol: { span: 24 },
@ -904,12 +942,12 @@ export default function Index({ title = '编辑合同' }) {
fieldProps: { fieldProps: {
options: contractData?.peoples options: contractData?.peoples
?.filter((item: any) => { ?.filter((item: any) => {
// 当收入类型为Income时只显示内部公司 // 当收入类型为Income时只显示内部企业
if (contractData?.income_expense_type === 'Income') { if (contractData?.income_expense_type === 'Income') {
return item?.counterparty_type === 'InternalCompany'; return item?.counterparty_type === 'InternalCompany';
} }
// 其他情况显示所有 // 支出时显示外部单位
return item?.counterparty_type === 'Supplier'; return item?.counterparty_type !== 'InternalCompany';
}) })
.map((item: any) => ({ .map((item: any) => ({
label: item?.counterparty, label: item?.counterparty,
@ -926,12 +964,12 @@ export default function Index({ title = '编辑合同' }) {
fieldProps: { fieldProps: {
options: contractData?.peoples options: contractData?.peoples
?.filter((item: any) => { ?.filter((item: any) => {
// 当收入类型为Income时只显示内部公司 // 当支出类型为Expense时只显示内部企业
if (contractData?.income_expense_type === 'Expense') { if (contractData?.income_expense_type === 'Expense') {
return item?.counterparty_type === 'InternalCompany'; return item?.counterparty_type === 'InternalCompany';
} }
// 其他情况显示所有 // 收入时显示外部单位
return item?.counterparty_type === 'Supplier'; return item?.counterparty_type !== 'InternalCompany';
}) })
.map((item: any) => ({ .map((item: any) => ({
label: item?.counterparty, label: item?.counterparty,

View File

@ -37,7 +37,7 @@ export default function Index({ title = '合同详情' }) {
}, },
{ {
key: '3', key: '3',
label: '合同标', label: '合同标',
children: <MyContractBillObjects item={showData} />, children: <MyContractBillObjects item={showData} />,
}, },
{ {

View File

@ -15,7 +15,7 @@ export default function Index(props: MyBetaModalFormProps) {
Apis.Contract.ContractBillObjects.List, Apis.Contract.ContractBillObjects.List,
) )
} }
headerTitle="合同标" headerTitle="合同标"
search={false} search={false}
columns={[ columns={[
MyColumns.ID({ MyColumns.ID({

View File

@ -29,7 +29,7 @@ export default function Index({ title = '合同详情' }) {
}, },
{ {
key: '3', key: '3',
label: '合同标', label: '合同标',
children: <MyContractBillObjects item={showData} />, children: <MyContractBillObjects item={showData} />,
}, },
{ {

View File

@ -15,7 +15,7 @@ export default function Index(props: MyBetaModalFormProps) {
Apis.Contract.ContractBillObjects.List, Apis.Contract.ContractBillObjects.List,
) )
} }
headerTitle="合同标" headerTitle="合同标"
search={false} search={false}
columns={[ columns={[
MyColumns.ID({ MyColumns.ID({

View File

@ -142,20 +142,20 @@ export default function CommonMeter({ title = '公摊表' }) {
// search: { transform: (value) => ({ project_name: value }) } // search: { transform: (value) => ({ project_name: value }) }
search: false, search: false,
}, },
{ // {
title: '房屋', // title: '房屋',
render: (_, item: any) => { // render: (_, item: any) => {
return ( // return (
<Space> // <Space>
{item.house_meter_has_houses?.map( // {item.house_meter_has_houses?.map(
(res: { full_name: string }) => { // (res: { full_name: string }) => {
return res?.full_name; // return res?.full_name;
}, // },
)} // )}
</Space> // </Space>
); // );
}, // },
}, // },
{ {
title: '仪表编号', title: '仪表编号',
dataIndex: 'name', dataIndex: 'name',

View File

@ -12,16 +12,16 @@ import {
EmergencyEventsStatusEnum, EmergencyEventsStatusEnum,
} from '@/gen/Enums'; } from '@/gen/Enums';
import { ProTable } from '@ant-design/pro-components'; import { ProTable } from '@ant-design/pro-components';
import { useNavigate } from '@umijs/max';
import { Space } from 'antd'; import { Space } from 'antd';
import CategoriesModal from './modals/CategoriesModal';
import EventApplyClose from './modals/EventApplyClose'; import EventApplyClose from './modals/EventApplyClose';
import EventCreate from './modals/EventCreate'; import EventCreate from './modals/EventCreate';
import EventReview from './modals/EventReview'; import EventReview from './modals/EventReview';
import EventUpdate from './modals/EventUpdate'; import EventUpdate from './modals/EventUpdate';
import LevelsModal from './modals/LevelsModal';
import TeamsModal from './modals/TeamsModal';
export default function Index({ title = '突发事件' }) { export default function Index({ title = '突发事件' }) {
const navigate = useNavigate();
return ( return (
<MyPageContainer <MyPageContainer
title={title} title={title}
@ -50,36 +50,9 @@ export default function Index({ title = '突发事件' }) {
title={title} title={title}
/> />
), ),
teams: ( teams: <TeamsModal key="TeamsModal" />,
<MyButtons.Default categories: <CategoriesModal key="CategoriesModal" />,
key="Teams" levels: <LevelsModal key="LevelsModal" />,
size="middle"
onClick={() => {
navigate('/quality/emergency/teams');
}}
title="应急小组"
/>
),
categories: (
<MyButtons.Default
key="Categories"
size="middle"
onClick={() => {
navigate('/quality/emergency/categories');
}}
title="事件分类"
/>
),
levels: (
<MyButtons.Default
key="Levels"
size="middle"
onClick={() => {
navigate('/quality/emergency/levels');
}}
title="级别配置"
/>
),
}} }}
/>, />,
]} ]}

View File

@ -0,0 +1,27 @@
import { MyButtons } from '@/common';
import { Modal } from 'antd';
import { useState } from 'react';
import CategoriesIndex from '../categories';
export default function CategoriesModal() {
const [open, setOpen] = useState(false);
return (
<>
<MyButtons.Default
size="middle"
onClick={() => setOpen(true)}
title="事件分类"
/>
<Modal
open={open}
onCancel={() => setOpen(false)}
footer={null}
width="80%"
destroyOnClose
>
<CategoriesIndex />
</Modal>
</>
);
}

View File

@ -0,0 +1,27 @@
import { MyButtons } from '@/common';
import { Modal } from 'antd';
import { useState } from 'react';
import LevelsIndex from '../levels';
export default function LevelsModal() {
const [open, setOpen] = useState(false);
return (
<>
<MyButtons.Default
size="middle"
onClick={() => setOpen(true)}
title="级别配置"
/>
<Modal
open={open}
onCancel={() => setOpen(false)}
footer={null}
width="80%"
destroyOnClose
>
<LevelsIndex />
</Modal>
</>
);
}

View File

@ -0,0 +1,27 @@
import { MyButtons } from '@/common';
import { Modal } from 'antd';
import { useState } from 'react';
import TeamsIndex from '../teams';
export default function TeamsModal() {
const [open, setOpen] = useState(false);
return (
<>
<MyButtons.Default
size="middle"
onClick={() => setOpen(true)}
title="应急小组"
/>
<Modal
open={open}
onCancel={() => setOpen(false)}
footer={null}
width="80%"
destroyOnClose
>
<TeamsIndex />
</Modal>
</>
);
}

View File

@ -1,9 +1,4 @@
import { import { MyButtons, MyColumns, MyProTableProps } from '@/common';
MyButtons,
MyColumns,
MyPageContainer,
MyProTableProps,
} from '@/common';
import { Apis } from '@/gen/Apis'; import { Apis } from '@/gen/Apis';
import { ProTable } from '@ant-design/pro-components'; import { ProTable } from '@ant-design/pro-components';
import { Space } from 'antd'; import { Space } from 'antd';
@ -12,12 +7,6 @@ import Update from '../modals/TeamUpdate';
export default function Index({ title = '应急小组' }) { export default function Index({ title = '应急小组' }) {
return ( return (
<MyPageContainer
title={title}
enableTabs={true}
tabKey="emergency_events_teams"
tabLabel={title}
>
<ProTable <ProTable
{...MyProTableProps.props} {...MyProTableProps.props}
request={async (params, sort) => request={async (params, sort) =>
@ -89,6 +78,5 @@ export default function Index({ title = '应急小组' }) {
}), }),
]} ]}
/> />
</MyPageContainer>
); );
} }

View File

@ -2,12 +2,10 @@ import { MyButtons, MyColumns, MyProTableProps } from '@/common';
import { Apis } from '@/gen/Apis'; import { Apis } from '@/gen/Apis';
import { RenovationAppliesStatusEnum } from '@/gen/Enums'; import { RenovationAppliesStatusEnum } from '@/gen/Enums';
import { ProTable } from '@ant-design/pro-components'; import { ProTable } from '@ant-design/pro-components';
import { useNavigate } from '@umijs/max';
import { Space } from 'antd'; import { Space } from 'antd';
import Review from '../modals/Review';
export default function Index() { export default function Index() {
const navigate = useNavigate();
return ( return (
<ProTable<Record<any, any>> <ProTable<Record<any, any>>
{...MyProTableProps.props} {...MyProTableProps.props}
@ -74,16 +72,12 @@ export default function Index() {
}, },
MyColumns.CreatedAt(), MyColumns.CreatedAt(),
MyColumns.Option({ MyColumns.Option({
render: (_, item: any, index) => ( render: (_, item: any, index, action) => (
<Space key={index}> <Space key={index}>
<MyButtons.Default <Review
key="Update" key="Review"
size="small" item={item}
type="primary" reload={action?.reload}
onClick={() => {
navigate(`/quality/renovation/pages/review?id=${item.id}`);
}}
title="查看并审核"
/> />
</Space> </Space>
), ),

View File

@ -178,6 +178,44 @@ export default function Info(props: MyBetaModalFormProps) {
</> </>
)} )}
{props?.item?.major_construction?.length > 0 && (
<ProCard bordered title="重大施工项目" style={{ marginTop: 16 }}>
{props.item.major_construction.map(
(item: any, index: number, arr: any[]) => (
<div
key={index}
style={{
marginBottom:
index < arr.length - 1 ? 16 : 0,
}}
>
<div
style={{ fontWeight: 'bold', marginBottom: 8 }}
>
{index + 1}{item.name || '-'}
</div>
<ProDescriptions column={3}>
<ProDescriptions.Item label="施工图纸">
{item.draw ? '已上传' : '-'}
</ProDescriptions.Item>
<ProDescriptions.Item label="执业证件">
{item.certificate ? '已上传' : '-'}
</ProDescriptions.Item>
</ProDescriptions>
{index < arr.length - 1 && (
<div
style={{
borderBottom: '1px solid #f0f0f0',
margin: '16px 0',
}}
/>
)}
</div>
),
)}
</ProCard>
)}
<ProCard bordered title="其他附件" style={{ marginTop: 16 }}> <ProCard bordered title="其他附件" style={{ marginTop: 16 }}>
<ProDescriptions column={3}> <ProDescriptions column={3}>
<ProDescriptions.Item label="施工图"> <ProDescriptions.Item label="施工图">

View File

@ -16,8 +16,10 @@ import { PlusOutlined } from '@ant-design/icons';
import { ProTable } from '@ant-design/pro-components'; import { ProTable } from '@ant-design/pro-components';
import { useNavigate } from '@umijs/max'; import { useNavigate } from '@umijs/max';
import { Space } from 'antd'; import { Space } from 'antd';
import AuditModal from './modals/AuditModal';
import DepositPay from './modals/DepositPay'; import DepositPay from './modals/DepositPay';
import DepositRefund from './modals/DepositRefund'; import DepositRefund from './modals/DepositRefund';
import InspectionRulesModal from './modals/InspectionRulesModal';
import MyWorkerCreate from './modals/WorkerCreate'; import MyWorkerCreate from './modals/WorkerCreate';
export default function Index({ title = '装修管理' }) { export default function Index({ title = '装修管理' }) {
@ -56,26 +58,8 @@ export default function Index({ title = '装修管理' }) {
title="装修申请" title="装修申请"
/> />
), ),
rules: ( rules: <InspectionRulesModal key="InspectionRulesModal" />,
<MyButtons.Default audit: <AuditModal key="AuditModal" />,
key="InspectionRules"
size="middle"
onClick={() => {
navigate('/quality/renovation/inspection_rules');
}}
title="巡检配置"
/>
),
audit: (
<MyButtons.Default
key="Audit"
size="middle"
onClick={() => {
navigate('/quality/renovation/audit');
}}
title="资料审核"
/>
),
}} }}
/>, />,
]} ]}

View File

@ -0,0 +1,27 @@
import { MyButtons } from '@/common';
import { Modal } from 'antd';
import { useState } from 'react';
import AuditIndex from '../audit';
export default function AuditModal() {
const [open, setOpen] = useState(false);
return (
<>
<MyButtons.Default
size="middle"
onClick={() => setOpen(true)}
title="资料审核"
/>
<Modal
open={open}
onCancel={() => setOpen(false)}
footer={null}
width="80%"
destroyOnClose
>
<AuditIndex />
</Modal>
</>
);
}

View File

@ -8,7 +8,6 @@ import {
import { Selects } from '@/components/Select'; import { Selects } from '@/components/Select';
import { Apis } from '@/gen/Apis'; import { Apis } from '@/gen/Apis';
import { BetaSchemaForm } from '@ant-design/pro-components'; import { BetaSchemaForm } from '@ant-design/pro-components';
import { useNavigate } from '@umijs/max';
import { Form, message } from 'antd'; import { Form, message } from 'antd';
const DormigoryBedAuditFlowsAuditStatusEnum = { const DormigoryBedAuditFlowsAuditStatusEnum = {
@ -17,7 +16,6 @@ const DormigoryBedAuditFlowsAuditStatusEnum = {
}; };
export default function Update(props: MyBetaModalFormProps) { export default function Update(props: MyBetaModalFormProps) {
const [form] = Form.useForm(); const [form] = Form.useForm();
const navigate = useNavigate();
return ( return (
<BetaSchemaForm<ApiTypes.Renovation.RenovationApplies.Audit> <BetaSchemaForm<ApiTypes.Renovation.RenovationApplies.Audit>
{...MyModalFormProps.props} {...MyModalFormProps.props}
@ -39,7 +37,7 @@ export default function Update(props: MyBetaModalFormProps) {
}) })
.then(() => { .then(() => {
message.success('审核成功'); message.success('审核成功');
navigate(-1); props.reload?.();
return true; return true;
}) })
.catch(() => false) .catch(() => false)
@ -55,8 +53,8 @@ export default function Update(props: MyBetaModalFormProps) {
{ {
valueType: 'dependency', valueType: 'dependency',
name: ['status'], name: ['status'],
columns: ({ audit_status }) => { columns: ({ status }) => {
return audit_status === 'Rejected' return status === 'Rejected'
? [ ? [
{ {
title: '驳回理由', title: '驳回理由',
@ -92,10 +90,14 @@ export default function Update(props: MyBetaModalFormProps) {
min: 1, min: 1,
}, },
}, },
Selects?.ProjectReceiptAccountsSelect({ Selects?.ProjectAccounts({
key: 'receipt_accounts_id', key: 'receipt_accounts_id',
title: '选择收款账户', title: '选择收款账户',
colProps: { span: 12 }, colProps: { span: 12 },
params: {
asset_projects_id:
props.item?.asset_projects_id,
},
formItemProps: { ...rulesHelper.number }, formItemProps: { ...rulesHelper.number },
fieldProps: { fieldProps: {
showSearch: true, showSearch: true,

View File

@ -0,0 +1,27 @@
import { MyButtons } from '@/common';
import { Modal } from 'antd';
import { useState } from 'react';
import InspectionRulesIndex from '../inspection_rules';
export default function InspectionRulesModal() {
const [open, setOpen] = useState(false);
return (
<>
<MyButtons.Default
size="middle"
onClick={() => setOpen(true)}
title="巡检配置"
/>
<Modal
open={open}
onCancel={() => setOpen(false)}
footer={null}
width="80%"
destroyOnClose
>
<InspectionRulesIndex />
</Modal>
</>
);
}

View File

@ -0,0 +1,60 @@
import { MyBetaModalFormProps, MyButtons } from '@/common';
import { Apis } from '@/gen/Apis';
import { Modal } from 'antd';
import { useEffect, useState } from 'react';
import MyInfo from '../components/info';
import AuditReview from './AuditReview';
export default function Review(props: MyBetaModalFormProps) {
const [open, setOpen] = useState(false);
const [data, setData] = useState<any>({});
const [loading, setLoading] = useState(false);
useEffect(() => {
if (open && props.item?.id) {
setLoading(true);
Apis.Renovation.RenovationApplies.Show({ id: Number(props.item.id) })
.then((res) => {
setData(res?.data || {});
})
.finally(() => {
setLoading(false);
});
}
}, [open, props.item?.id]);
const handleAuditSuccess = () => {
props.reload?.();
setOpen(false);
};
return (
<>
<MyButtons.Default
type="primary"
size="small"
title="审核"
onClick={() => setOpen(true)}
/>
<Modal
title="装修申请审核"
open={open}
onCancel={() => setOpen(false)}
width={1000}
footer={
<div style={{ display: 'flex', justifyContent: 'flex-end', gap: 8 }}>
<MyButtons.Default
size="middle"
title="关闭"
onClick={() => setOpen(false)}
/>
<AuditReview item={data} reload={handleAuditSuccess} title="审核" />
</div>
}
destroyOnClose
>
<MyInfo item={{ ...data, loading }} />
</Modal>
</>
);
}

View File

@ -325,13 +325,13 @@ export default function Index({ title = '新装修申请' }) {
{ {
title: '公司负责人姓名', title: '公司负责人姓名',
key: 'company_principal_name', key: 'company_principal_name',
formItemProps: { ...rulesHelper.text }, // formItemProps: { ...rulesHelper.text },
colProps: { span: 6 }, colProps: { span: 6 },
}, },
{ {
title: '公司负责人手机', title: '公司负责人手机',
key: 'company_principal_phone', key: 'company_principal_phone',
formItemProps: { ...rulesHelper.phone }, // formItemProps: { ...rulesHelper.phone },
colProps: { span: 6 }, colProps: { span: 6 },
fieldProps: { fieldProps: {
maxLength: 11, maxLength: 11,

View File

@ -1,539 +0,0 @@
import {
MyFormItems,
MyModalFormProps,
MyPageContainer,
rulesHelper,
} from '@/common';
import { Apis } from '@/gen/Apis';
import {
HouseOccupantsCardTypeEnum,
RenovationAppliesProcessTypeEnum,
RenovationAppliesRenovationContentEnum,
RenovationAppliesTypeEnum,
} from '@/gen/Enums';
import { BetaSchemaForm, ProCard } from '@ant-design/pro-components';
import { useNavigate, useSearchParams } from '@umijs/max';
import { Form, Space } from 'antd';
import { useEffect, useState } from 'react';
import Review from '../modals/AuditReview';
export default function Index({ title = '装修申请审核' }) {
const [form] = Form.useForm();
const navigate = useNavigate();
const [searchParams] = useSearchParams();
const id = searchParams.get('id') ?? 0;
const [data, setShow] = useState<any>({});
const [getSelectHouse, setSelectHouse] = useState<any>({});
const loadShow = () => {
Apis.Renovation.RenovationApplies.Show({ id: Number(id) }).then((res) => {
setShow(res?.data);
setSelectHouse(res?.data?.asset_house);
form.setFieldsValue(res?.data); // 编辑赋值
});
};
useEffect(() => {
loadShow();
}, [id]);
return (
<MyPageContainer
title={
<Space
style={{ cursor: 'pointer' }}
onClick={() => {
navigate(-1);
}}
>
{/* <LeftCircleOutlined size={34} /> */}
{title}
</Space>
}
enableTabs={false}
tabKey="renovation_applies-review"
tabLabel={title}
>
<ProCard>
<div style={{ width: 900, minHeight: '83vh', margin: '0 auto' }}>
<BetaSchemaForm<ApiTypes.Renovation.RenovationApplies.Update>
{...MyModalFormProps.props}
title={title}
// 基础表单
layoutType="Form"
labelCol={{ span: 24 }}
wrapperCol={{ span: 24 }}
labelAlign="left"
width="900px"
form={form}
submitter={{
render: () => {
return [<Review item={data} key="review" />];
},
}}
columns={[
{
colProps: { span: 24 },
key: 'asset_houses_id',
formItemProps: { ...rulesHelper.text },
renderFormItem: () => {
return (
<ProCard bordered title="房屋信息">
<div>{getSelectHouse?.full_name}</div>
</ProCard>
);
},
},
MyFormItems.EnumRadio({
key: 'type',
title: '装修类型',
valueEnum: RenovationAppliesTypeEnum,
colProps: { span: 6 },
formItemProps: { ...rulesHelper.text },
}),
MyFormItems.EnumRadio({
key: 'process_type',
title: '办理类型',
valueEnum: RenovationAppliesProcessTypeEnum,
colProps: { span: 6 },
formItemProps: { ...rulesHelper.text },
}),
{
title: '是否有保证金',
colProps: { span: 6 },
key: 'is_deposit',
valueType: 'switch',
},
{
valueType: 'dependency',
name: ['is_deposit'],
columns: ({ is_deposit }) => {
return is_deposit
? [
{
title: '保证金金额',
colProps: { span: 6 },
key: 'deposit_amount',
valueType: 'digit',
formItemProps: { ...rulesHelper.number },
fieldProps: {
style: {
width: '100%',
},
},
},
]
: [];
},
},
{
valueType: 'divider',
fieldProps: {
orientation: 'left',
children: '业主信息',
},
},
{
title: '业主姓名',
key: 'owner_name',
colProps: { span: 6 },
formItemProps: { ...rulesHelper.text },
},
{
title: '业主手机',
key: 'owner_phone',
colProps: { span: 6 },
fieldProps: {
maxLength: 11,
},
formItemProps: { ...rulesHelper.phone },
},
MyFormItems.EnumSelect({
key: 'card_type',
title: '证件类型',
valueEnum: HouseOccupantsCardTypeEnum,
colProps: { span: 6 },
formItemProps: { ...rulesHelper.text },
}),
{
title: '证件号码',
key: 'owner_id_card',
colProps: { span: 6 },
formItemProps: { ...rulesHelper.text },
fieldProps: {
maxLength: 18,
},
},
MyFormItems.UploadImages({
key: 'id_card_front',
title: '证件正面',
max: 1,
colProps: { span: 6 },
formItemProps: { ...rulesHelper.array },
}),
MyFormItems.UploadImages({
key: 'id_card_back',
title: '证件反面',
max: 1,
colProps: { span: 6 },
formItemProps: { ...rulesHelper.array },
}),
MyFormItems.UploadImages({
key: 'property_certificate',
title: '房产证明',
max: 1,
colProps: { span: 8 },
formItemProps: { ...rulesHelper.array },
}),
{
valueType: 'dependency',
name: ['process_type'],
columns: ({ process_type }) => {
return process_type === 'AgentProcess'
? [
{
valueType: 'divider',
fieldProps: {
orientation: 'left',
children: '代理人信息',
},
},
{
title: '代理人名称',
key: 'agent_name',
colProps: { span: 6 },
formItemProps: { ...rulesHelper.text },
},
{
title: '代理人手机',
key: 'agent_phone',
colProps: { span: 6 },
fieldProps: {
maxLength: 11,
},
formItemProps: { ...rulesHelper.phone },
},
MyFormItems.EnumSelect({
key: 'agent_card_type',
title: '证件类型',
valueEnum: HouseOccupantsCardTypeEnum,
colProps: { span: 6 },
formItemProps: { ...rulesHelper.text },
}),
{
title: '证件号码',
key: 'agent_id_card',
colProps: { span: 6 },
formItemProps: { ...rulesHelper.text },
fieldProps: {
maxLength: 18,
},
},
MyFormItems.UploadImages({
key: 'agent_id_card_front',
title: '证件正面',
max: 1,
colProps: { span: 6 },
}),
MyFormItems.UploadImages({
key: 'agent_id_card_back',
title: '证件反面',
max: 1,
colProps: { span: 6 },
}),
MyFormItems.UploadImages({
key: 'power_attorney',
title: '代理人授权书',
max: 1,
colProps: { span: 6 },
}),
]
: [];
},
},
{
valueType: 'dependency',
name: ['type'],
columns: ({ type }) => {
return type === 'RenovationCompany'
? [
{
valueType: 'divider',
fieldProps: {
orientation: 'left',
children: '装修公司信息',
},
},
{
title: '公司名称',
key: 'company_name',
colProps: { span: 6 },
formItemProps: { ...rulesHelper.text },
},
{
title: '营业执照号',
key: 'company_business_license_num',
colProps: { span: 6 },
formItemProps: { ...rulesHelper.text },
fieldProps: {
maxLength: 18,
},
},
{
title: '公司负责人手机',
key: 'company_principal_phone',
formItemProps: { ...rulesHelper.text },
colProps: { span: 6 },
},
{
title: '负责人手机号',
key: 'company_principal_phone',
formItemProps: { ...rulesHelper.phone },
colProps: { span: 6 },
},
{
valueType: 'dependency',
name: ['type'],
columns: ({ type }) => {
return type === 'RenovationCompany'
? [
MyFormItems.UploadImages({
key: 'company_business_license',
title: '装修公司营业执照',
max: 1,
colProps: { span: 6 },
formItemProps: { ...rulesHelper.array },
}),
MyFormItems.UploadImages({
key: 'company_asset_certificate',
title: '装修公司资质证明',
max: 1,
colProps: { span: 6 },
formItemProps: { ...rulesHelper.array },
}),
MyFormItems.UploadImages({
key: 'company_power_attorney',
title: '装修公司装修授权书',
max: 1,
colProps: { span: 6 },
formItemProps: { ...rulesHelper.array },
}),
]
: [];
},
},
]
: [];
},
},
{
valueType: 'divider',
fieldProps: {
orientation: 'left',
children: '施工信息',
},
},
{
valueType: 'dependency',
name: ['type'],
columns: ({ type }) => {
return type === 'RenovationCompany'
? [
{
title: '施工负责人名称',
key: 'construction_principal_name',
colProps: { span: 6 },
formItemProps: { ...rulesHelper.text },
},
{
title: '施工负责人手机',
key: 'construction_principal_phone',
colProps: { span: 6 },
formItemProps: { ...rulesHelper.phone },
},
MyFormItems.EnumSelect({
key: 'construction_principal_card_type',
title: '证件类型',
valueEnum: HouseOccupantsCardTypeEnum,
colProps: { span: 6 },
formItemProps: { ...rulesHelper.text },
}),
{
title: '施工负责人证件号',
key: 'construction_principal_id_card',
colProps: { span: 6 },
formItemProps: { ...rulesHelper.text },
fieldProps: {
maxLength: 18,
},
},
MyFormItems.UploadImages({
key: 'construction_principal_id_card_front',
title: '施工负责人身份证正面',
max: 1,
colProps: { span: 6 },
}),
MyFormItems.UploadImages({
key: 'construction_principal_id_card_back',
title: '施工负责人身份证反面',
max: 1,
colProps: { span: 6 },
}),
]
: [];
},
},
{
valueType: 'group',
columns: [
{
title: '施工开始时间',
valueType: 'date',
key: 'construction_start_date',
formItemProps: { ...rulesHelper.text },
colProps: { span: 6 },
fieldProps: {
format: 'YYYY-MM-DD',
onChange: (value: string, dateString: string) => {
form.setFieldValue(
'construction_start_date',
dateString,
);
console.log('construction_start_date', value);
},
style: {
width: '100%',
},
},
},
{
title: '施工结束时间',
valueType: 'date',
key: 'construction_end_date',
formItemProps: { ...rulesHelper.text },
colProps: { span: 6 },
fieldProps: {
format: 'YYYY-MM-DD',
onChange: (value: string, dateString: string) => {
form.setFieldValue('construction_end_date', dateString);
console.log('construction_end_date', value);
},
style: {
width: '100%',
},
},
},
MyFormItems.EnumRadio({
key: 'renovation_content',
title: '装修内容',
valueEnum: RenovationAppliesRenovationContentEnum,
colProps: { span: 12 },
formItemProps: { ...rulesHelper.text },
}),
],
},
{
valueType: 'divider',
fieldProps: {
orientation: 'left',
children: '其他附件',
},
},
MyFormItems.UploadImages({
key: 'construction_draw',
title: '施工图',
uploadType: 'file',
max: 1,
colProps: { span: 6 },
}),
MyFormItems.UploadImages({
key: 'construction_commitment_letter',
title: '施工承诺书',
uploadType: 'file',
max: 1,
colProps: { span: 6 },
}),
MyFormItems.UploadImages({
key: 'other_attachments',
title: '其他补充附件',
max: 100,
uploadType: 'file',
colProps: { span: 6 },
}),
{
valueType: 'divider',
fieldProps: {
orientation: 'left',
children: '重大施工项目',
},
},
{
valueType: 'formList',
dataIndex: 'major_construction',
// title: '重大施工项目',
fieldProps: {
copyIconProps: false,
// deleteIconProps: false,
},
formItemProps: {
...rulesHelper.array,
wrapperCol: { span: 24 },
},
initialValue: [
{
sign_party: null,
counterparty_type: null,
counterparty: null,
},
{
sign_party: null,
counterparty_type: null,
counterparty: null,
},
],
columns: [
{
valueType: 'group',
title: '',
colProps: { span: 24 },
columns: [
{
title: '重大施工内容',
key: 'name',
colProps: { span: 12 },
// formItemProps: { ...rulesHelper.text },
},
MyFormItems.UploadImages({
key: 'draw',
title: '施工图纸',
uploadType: 'file',
max: 1,
colProps: { span: 6 },
}),
MyFormItems.UploadImages({
key: 'certificate',
title: '执业证件',
uploadType: 'file',
max: 1,
colProps: { span: 6 },
}),
],
},
],
},
{
title: '备注',
key: 'renovation_remark',
valueType: 'textarea',
colProps: { span: 24 },
},
]}
/>
</div>
</ProCard>
</MyPageContainer>
);
}

View File

@ -447,13 +447,13 @@ export default function Index({ title = '编辑新装修申请' }) {
{ {
title: '公司负责人姓名', title: '公司负责人姓名',
key: 'company_principal_name', key: 'company_principal_name',
formItemProps: { ...rulesHelper.text }, // formItemProps: { ...rulesHelper.text },
colProps: { span: 6 }, colProps: { span: 6 },
}, },
{ {
title: '公司负责人手机', title: '公司负责人手机',
key: 'company_principal_phone', key: 'company_principal_phone',
formItemProps: { ...rulesHelper.phone }, // formItemProps: { ...rulesHelper.phone },
colProps: { span: 6 }, colProps: { span: 6 },
fieldProps: { fieldProps: {
maxLength: 11, maxLength: 11,

View File

@ -15,7 +15,6 @@ export default function SurveysListShow(props: MyBetaModalFormProps) {
title={props.title || '查看问卷'} title={props.title || '查看问卷'}
type={props.item?.type || 'primary'} type={props.item?.type || 'primary'}
width="800px" width="800px"
trigger={props?.trigger}
onOpen={() => { onOpen={() => {
if (props?.item?.id) { if (props?.item?.id) {
setLoading(true); setLoading(true);