From d39df01bc39d8f06d7cd9018ec02f04cf9ad26b9 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 7 May 2026 10:16:48 +0800 Subject: [PATCH 1/4] =?UTF-8?q?fix:=E5=A2=9E=E5=8A=A0=E8=A3=85=E4=BF=AE?= =?UTF-8?q?=E9=AA=8C=E6=94=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../quality/routing_inspection/index.tsx | 146 ++++++++++++++++++ .../modals/RenovationAssign.tsx | 139 +++++++++++++++++ 2 files changed, 285 insertions(+) create mode 100644 src/pages/quality/routing_inspection/index.tsx create mode 100644 src/pages/quality/routing_inspection/modals/RenovationAssign.tsx diff --git a/src/pages/quality/routing_inspection/index.tsx b/src/pages/quality/routing_inspection/index.tsx new file mode 100644 index 0000000..cacc305 --- /dev/null +++ b/src/pages/quality/routing_inspection/index.tsx @@ -0,0 +1,146 @@ +import { MyColumns, MyProTableProps } from '@/common'; +import { Selects } from '@/components/Select'; +import { Apis } from '@/gen/Apis'; +import { + HouseWorkOrdersAssignStatusEnum, + HouseWorkOrdersLevelEnum, + HouseWorkOrdersTypeEnum, +} from '@/gen/Enums'; +import WorkOrderShow from '@/pages/work_order/list/modals/WorkOrderShow'; +import { ProTable } from '@ant-design/pro-components'; +import { Space } from 'antd'; +import RenovationAssign from './modals/RenovationAssign'; + +export const RenovationWorkOrdersStatusEnum = { + Pending: { text: '待处理', color: '#FFA500', value: 'Pending' }, + Processing: { text: '处理中', color: '#1E90FF', value: 'Processing' }, + Completed: { text: '已完成', color: '#28A745', value: 'Completed' }, + Closed: { text: '已关闭', color: '#6C757D', value: 'Closed' }, +}; + +export default function Index({ title = '装修巡检' }) { + return ( + > + {...MyProTableProps.props} + headerTitle={title} + request={async (params, sort) => { + return MyProTableProps.request( + { + ...params, + type: [ + HouseWorkOrdersTypeEnum.RenovationInspection.value, + HouseWorkOrdersTypeEnum.RenovationAcceptance.value, + ], + }, + sort, + Apis.WorkOrder.HouseWorkOrders.List, + ); + }} + // toolBarRender={(action) => [toolBarRender(action)]} + columns={[ + MyColumns.ID({ search: false }), + Selects?.AssetProjects({ + title: '选择项目', + key: 'asset_projects_id', + hidden: true, + }), + MyColumns.EnumTag({ + title: '处理状态', + dataIndex: 'status', + valueEnum: RenovationWorkOrdersStatusEnum, + }), + { + title: '项目名称', + dataIndex: 'project_name', + hidden: true, + }, + MyColumns.EnumTag({ + title: '分配状态', + dataIndex: 'assign_status', + valueEnum: HouseWorkOrdersAssignStatusEnum, + }), + MyColumns.EnumTag({ + title: '工单类型', + dataIndex: 'type', + valueEnum: HouseWorkOrdersTypeEnum, + search: false, + }), + // MyColumns.EnumTag({ + // title: '报修位置', + // dataIndex: 'location', + // valueEnum: HouseWorkOrdersLocationEnum, + // search: false, + // }), + { + title: '位置信息', + dataIndex: ['asset_house', 'full_name'], + render: (_, record) => { + return ( + + {record?.asset_house?.full_name + ? record?.asset_house?.full_name + : record?.asset_project?.name} + + ); + }, + search: { + transform: (value) => { + return { house_name: value }; + }, + }, + }, + // { + // title: '工单描述', + // dataIndex: 'content', + // search: false, + // width: 200, // 关键:固定列宽(若父容器过窄,可设 minWidth: 200 优先保证列宽) + // render: (text) => ( + //
+ // {text} + //
+ // ), + // }, + MyColumns.EnumTag({ + title: '优先级', + dataIndex: 'level', + valueEnum: HouseWorkOrdersLevelEnum, + search: false, + }), + + { + title: '处理人', + dataIndex: ['assign_employee', 'name'], + search: false, + render: (_, record) => { + return `${record?.assign_employee?.name || ''}-${ + record?.assign_employee?.phone || '' + }`; + }, + }, + MyColumns.CreatedAt(), + MyColumns.Option({ + render: (_, item: any, index, action) => ( + + + + + ), + }), + ]} + /> + ); +} diff --git a/src/pages/quality/routing_inspection/modals/RenovationAssign.tsx b/src/pages/quality/routing_inspection/modals/RenovationAssign.tsx new file mode 100644 index 0000000..81dc470 --- /dev/null +++ b/src/pages/quality/routing_inspection/modals/RenovationAssign.tsx @@ -0,0 +1,139 @@ +import { + MyBetaModalFormProps, + MyButtons, + MyFormItems, + MyModalFormProps, + rulesHelper, +} from '@/common'; +import { Selects } from '@/components/Select'; +import { Apis } from '@/gen/Apis'; +import { HouseWorkOrdersTypeEnum } from '@/gen/Enums'; +import { BetaSchemaForm } from '@ant-design/pro-components'; +import { Form, message } from 'antd'; + +export default function WorkOrderAssign( + props: MyBetaModalFormProps & { item: any }, +) { + const [form] = Form.useForm(); + return ( + + {...MyModalFormProps.props} + title={`指派工单`} + wrapperCol={{ span: 19 }} + width="600px" + layout="horizontal" + labelCol={{ span: 5 }} + labelAlign="left" + trigger={ + + } + key={new Date().getTime()} + form={form} + request={async () => { + const res = await Apis.WorkOrder.HouseWorkOrders.Show({ + id: props.item.id, + }); + return { + title: res.data.title, + assign_employee_id: res.data.assign_employee_id, + content: res.data.content, + attachments: res.data.attachments, + complaint_type: res.data.complaint_type, + locationInfo: res.data.asset_house.full_name, + type: res.data.type, + }; + }} + onFinish={async (values: any) => { + Apis.WorkOrder.HouseWorkOrders.Assign({ + ...values, + id: props.item.id, + predict_complete_at: values.predict_complete_at, + }) + .then(() => { + props.reload?.(); + message.success('指派工单成功'); + return true; + }) + .catch(() => false); + }} + columns={[ + MyFormItems.EnumRadio({ + key: 'type', + title: '工单类型', + colProps: { span: 24 }, + valueEnum: HouseWorkOrdersTypeEnum, + readonly: true, + }), + { + key: 'locationInfo', + title: '房屋信息', + colProps: { span: 24 }, + readonly: true, + }, + { + key: 'content', + title: '工单描述', + colProps: { span: 24 }, + readonly: true, + fieldProps: { + disabled: true, + }, + }, + { valueType: 'divider' }, + + // MyFormItems.EnumRadio({ + // key: 'level', + // title: '优先级', + // colProps: { span: 24 }, + // valueEnum: HouseWorkOrdersLevelEnum, + // required: true, + // }), + // { + // key: 'predict_complete_at', + // title: '完成时间要求', + // valueType: 'date', + // colProps: { span: 24 }, + // formItemProps: { ...rulesHelper.text }, + // fieldProps: { + // disabledDate: (current: any) => { + // // 只能选今天及以后的日期 + // const today = new Date(); + // today.setHours(0, 0, 0, 0); // 设置为今天的00:00:00 + // return current && current < today; + // }, + // addonAfter: '前', + // }, + // }, + Selects?.Employees({ + title: '选择处理人', + key: 'assign_employees_id', + colProps: { span: 24 }, + formItemProps: { ...rulesHelper.text }, + params: { + companies_id: props.item.companies_id, + }, + required: true, + }), + { + key: 'assign_remark', + title: '备注', + valueType: 'textarea', + colProps: { span: 24 }, + fieldProps: { + rows: 3, + // placeholder: '请输入指派备注(可选)', + }, + }, + ]} + /> + ); +} From 8cf47abdccf814719364c2bf72a84e0a691c44f9 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 7 May 2026 14:23:01 +0800 Subject: [PATCH 2/4] =?UTF-8?q?fix:=E6=9B=B4=E6=96=B0=E8=A3=85=E4=BF=AE?= =?UTF-8?q?=E9=AA=8C=E6=94=B6=E6=8C=87=E6=B4=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../quality/routing_inspection/index.tsx | 247 +++++++++--------- .../modals/RenovationAssign.tsx | 6 +- 2 files changed, 131 insertions(+), 122 deletions(-) diff --git a/src/pages/quality/routing_inspection/index.tsx b/src/pages/quality/routing_inspection/index.tsx index cacc305..ce3a4de 100644 --- a/src/pages/quality/routing_inspection/index.tsx +++ b/src/pages/quality/routing_inspection/index.tsx @@ -1,4 +1,4 @@ -import { MyColumns, MyProTableProps } from '@/common'; +import { MyColumns, MyPageContainer, MyProTableProps } from '@/common'; import { Selects } from '@/components/Select'; import { Apis } from '@/gen/Apis'; import { @@ -18,129 +18,140 @@ export const RenovationWorkOrdersStatusEnum = { Closed: { text: '已关闭', color: '#6C757D', value: 'Closed' }, }; -export default function Index({ title = '装修巡检' }) { +export default function Index({ title = '装修验收' }) { return ( - > - {...MyProTableProps.props} - headerTitle={title} - request={async (params, sort) => { - return MyProTableProps.request( + + > + {...MyProTableProps.props} + headerTitle={title} + request={async (params, sort) => { + return MyProTableProps.request( + { + ...params, + type: [ + HouseWorkOrdersTypeEnum.RenovationInspection.value, + HouseWorkOrdersTypeEnum.RenovationAcceptance.value, + ], + }, + sort, + Apis.WorkOrder.HouseWorkOrders.List, + ); + }} + // toolBarRender={(action) => [toolBarRender(action)]} + columns={[ + MyColumns.ID({ search: false }), + Selects?.AssetProjects({ + title: '选择项目', + key: 'asset_projects_id', + hidden: true, + }), + MyColumns.EnumTag({ + title: '处理状态', + dataIndex: 'status', + valueEnum: RenovationWorkOrdersStatusEnum, + }), { - ...params, - type: [ - HouseWorkOrdersTypeEnum.RenovationInspection.value, - HouseWorkOrdersTypeEnum.RenovationAcceptance.value, - ], + title: '项目名称', + dataIndex: 'project_name', + hidden: true, }, - sort, - Apis.WorkOrder.HouseWorkOrders.List, - ); - }} - // toolBarRender={(action) => [toolBarRender(action)]} - columns={[ - MyColumns.ID({ search: false }), - Selects?.AssetProjects({ - title: '选择项目', - key: 'asset_projects_id', - hidden: true, - }), - MyColumns.EnumTag({ - title: '处理状态', - dataIndex: 'status', - valueEnum: RenovationWorkOrdersStatusEnum, - }), - { - title: '项目名称', - dataIndex: 'project_name', - hidden: true, - }, - MyColumns.EnumTag({ - title: '分配状态', - dataIndex: 'assign_status', - valueEnum: HouseWorkOrdersAssignStatusEnum, - }), - MyColumns.EnumTag({ - title: '工单类型', - dataIndex: 'type', - valueEnum: HouseWorkOrdersTypeEnum, - search: false, - }), - // MyColumns.EnumTag({ - // title: '报修位置', - // dataIndex: 'location', - // valueEnum: HouseWorkOrdersLocationEnum, - // search: false, - // }), - { - title: '位置信息', - dataIndex: ['asset_house', 'full_name'], - render: (_, record) => { - return ( - - {record?.asset_house?.full_name - ? record?.asset_house?.full_name - : record?.asset_project?.name} - - ); - }, - search: { - transform: (value) => { - return { house_name: value }; + MyColumns.EnumTag({ + title: '分配状态', + dataIndex: 'assign_status', + valueEnum: HouseWorkOrdersAssignStatusEnum, + }), + MyColumns.EnumTag({ + title: '工单类型', + dataIndex: 'type', + valueEnum: HouseWorkOrdersTypeEnum, + search: false, + }), + // MyColumns.EnumTag({ + // title: '报修位置', + // dataIndex: 'location', + // valueEnum: HouseWorkOrdersLocationEnum, + // search: false, + // }), + { + title: '位置信息', + dataIndex: ['asset_house', 'full_name'], + render: (_, record) => { + return ( + + {record?.asset_house?.full_name + ? record?.asset_house?.full_name + : record?.asset_project?.name} + + ); + }, + search: { + transform: (value) => { + return { house_name: value }; + }, }, }, - }, - // { - // title: '工单描述', - // dataIndex: 'content', - // search: false, - // width: 200, // 关键:固定列宽(若父容器过窄,可设 minWidth: 200 优先保证列宽) - // render: (text) => ( - //
- // {text} - //
- // ), - // }, - MyColumns.EnumTag({ - title: '优先级', - dataIndex: 'level', - valueEnum: HouseWorkOrdersLevelEnum, - search: false, - }), + // { + // title: '工单描述', + // dataIndex: 'content', + // search: false, + // width: 200, // 关键:固定列宽(若父容器过窄,可设 minWidth: 200 优先保证列宽) + // render: (text) => ( + //
+ // {text} + //
+ // ), + // }, + MyColumns.EnumTag({ + title: '优先级', + dataIndex: 'level', + valueEnum: HouseWorkOrdersLevelEnum, + search: false, + }), - { - title: '处理人', - dataIndex: ['assign_employee', 'name'], - search: false, - render: (_, record) => { - return `${record?.assign_employee?.name || ''}-${ - record?.assign_employee?.phone || '' - }`; + { + title: '处理人', + dataIndex: ['assign_employee', 'name'], + search: false, + render: (_, record) => { + return `${record?.assign_employee?.name || ''}-${ + record?.assign_employee?.phone || '' + }`; + }, }, - }, - MyColumns.CreatedAt(), - MyColumns.Option({ - render: (_, item: any, index, action) => ( - - - - - ), - }), - ]} - /> + MyColumns.CreatedAt(), + MyColumns.Option({ + render: (_, item: any, index, action) => ( + + + + + ), + }), + ]} + /> +
); } diff --git a/src/pages/quality/routing_inspection/modals/RenovationAssign.tsx b/src/pages/quality/routing_inspection/modals/RenovationAssign.tsx index 81dc470..0f021a7 100644 --- a/src/pages/quality/routing_inspection/modals/RenovationAssign.tsx +++ b/src/pages/quality/routing_inspection/modals/RenovationAssign.tsx @@ -28,10 +28,8 @@ export default function WorkOrderAssign( From 2061b81f44f0db3bbc855482e88e03084ccde330 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 1 Jun 2026 14:54:57 +0800 Subject: [PATCH 3/4] =?UTF-8?q?fix=EF=BC=9A=E6=9B=B4=E6=96=B0=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/libs/valtio/actions.ts | 1 + src/common/libs/valtio/state.ts | 4 ++++ src/pages/company/employees/index.tsx | 18 ++++++++++++++++++ .../employees/modals/EmployeeCreate.tsx | 11 +++++++++++ .../employees/modals/EmployeeUpdate.tsx | 12 +++++++++++- 5 files changed, 45 insertions(+), 1 deletion(-) diff --git a/src/common/libs/valtio/actions.ts b/src/common/libs/valtio/actions.ts index 1d2c4d5..d2cc0bd 100644 --- a/src/common/libs/valtio/actions.ts +++ b/src/common/libs/valtio/actions.ts @@ -17,6 +17,7 @@ export const stateActions = { state.session.campus = res.data.campus; state.session.company_configs = res.data.company_configs; state.session.permissions = res.data.permissions; + state.session.company = res.data.company; state.session.current_project = res.data.current_project; if (res.data?.token?.access_token) state.storage.access_token = res.data?.token?.access_token; diff --git a/src/common/libs/valtio/state.ts b/src/common/libs/valtio/state.ts index 83c185b..a1dbc1b 100644 --- a/src/common/libs/valtio/state.ts +++ b/src/common/libs/valtio/state.ts @@ -35,6 +35,10 @@ type SessionType = { id: number; name: string; }; + company?: { + id?: number; + name?: string; + }; company_configs?: { config_value?: { logo?: { diff --git a/src/pages/company/employees/index.tsx b/src/pages/company/employees/index.tsx index 11bf919..8586d6f 100644 --- a/src/pages/company/employees/index.tsx +++ b/src/pages/company/employees/index.tsx @@ -40,6 +40,24 @@ export default function Index({ title = '员工管理' }) { { + try { + await Apis.Company.CompanyEmployees.SyncWechatEmployees(); + action?.reload?.(); + } catch (error) { + console.error('同步企微信息失败:', error); + } + }} + /> + ), add: ( { @@ -70,6 +69,17 @@ export default function Update(props: MyBetaModalFormProps) { colProps: { span: 24 }, formItemProps: { ...rulesHelper.phone }, }, + { + title: '初始登录密码', + key: 'password', + type: 'password', + // formItemProps: { ...rulesHelper.text }, + tooltip: '必须超6位数,包含数字、大小字母、#-_@&*特殊字符', + colProps: { span: 24 }, + fieldProps: { + placeholder: '必须超6位数,包含数字、大小字母、#-_@&*特殊字符', + }, + }, MyFormItems.EnumRadio({ key: 'sex', title: '性别', From 8b62bebf08876675eb3ffccdd39ad98edfe94cca Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 9 Jun 2026 15:30:14 +0800 Subject: [PATCH 4/4] =?UTF-8?q?fix:=E6=9B=B4=E6=96=B0=E8=A3=85=E4=BF=AE?= =?UTF-8?q?=E5=B7=A5=E4=BA=BA=E6=96=87=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/quality/renovation/modals/WorkerCreate.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/quality/renovation/modals/WorkerCreate.tsx b/src/pages/quality/renovation/modals/WorkerCreate.tsx index f5cc2dc..9605062 100644 --- a/src/pages/quality/renovation/modals/WorkerCreate.tsx +++ b/src/pages/quality/renovation/modals/WorkerCreate.tsx @@ -89,7 +89,7 @@ export default function Index(props: MyBetaModalFormProps) { formItemProps: { ...rulesHelper.array }, }), { - title: '证件有效期-开始', + title: '开始通行时间', colProps: { span: 12 }, valueType: 'date', key: 'valid_from', @@ -97,7 +97,7 @@ export default function Index(props: MyBetaModalFormProps) { formItemProps: { ...rulesHelper.text }, }, { - title: '证件有效期-结束', + title: '结束通行时间', colProps: { span: 12 }, valueType: 'date', key: 'valid_to',