From 13e98eaf4c1d37bb059cfb6b0f1b1bda4de009e5 Mon Sep 17 00:00:00 2001 From: uiuJun <> Date: Thu, 5 Feb 2026 20:01:45 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E5=AE=A2=E6=88=B7=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E3=80=81=E5=91=98=E5=B7=A5=E5=88=9B=E5=BB=BA=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=AF=86=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .umirc.ts | 4 +- src/gen/ApiTypes.d.ts | 162 +++++++++++++++++- src/gen/Apis.ts | 127 ++++++++++++++ src/gen/Enums.ts | 46 ++++- src/pages/company/employees/index.tsx | 4 +- .../employees/modals/EmployeeCreate.tsx | 2 +- src/pages/customer/archive/index.tsx | 23 +-- 7 files changed, 350 insertions(+), 18 deletions(-) diff --git a/.umirc.ts b/.umirc.ts index 190286d..a10f7e4 100644 --- a/.umirc.ts +++ b/.umirc.ts @@ -18,8 +18,8 @@ export default defineConfig({ proxy: { '/api/': { target: 'http://10.39.13.78:8001/', - // target: 'https://test-admin.linyikj.com.cn/', - // target: 'https://admin.linyikj.com.cn/', + // target: 'https://test-company.linyikj.com.cn/', + // target: 'https://company.linyikj.com.cn/', changeOrigin: true, pathRewrite: { '^': '' }, }, diff --git a/src/gen/ApiTypes.d.ts b/src/gen/ApiTypes.d.ts index d473266..abb4d8e 100644 --- a/src/gen/ApiTypes.d.ts +++ b/src/gen/ApiTypes.d.ts @@ -196,6 +196,9 @@ declare namespace ApiTypes { "id": number; // id "is_contact": boolean; // 是否是常用联系人 }; + type Import = { + "upload_file"?: mimes:xlsx,xls; // 上传的时候必填文件 + }; } namespace HouseRegisters { type List = { @@ -667,6 +670,156 @@ declare namespace ApiTypes { }; } } + namespace Attendance { + namespace AttendanceConfigs { + type List = { + "page"?: number; // - + "per_page"?: number; // - + }; + type Store = { + "asset_projects_id": number; // 项目ID + "check_in_range": number; // 打卡范围(米) + "require_photo": boolean; // 是否要求拍照打卡 + "allow_out_range_checkin"?: boolean; // 是否允许范围外打卡 + }; + type UpdateConfig = { + "id": number; // id + "check_in_range": number; // 打卡范围(米) + "require_photo": boolean; // 是否要求拍照打卡 + "allow_out_range_checkin"?: boolean; // 是否允许范围外打卡 + }; + type Enable = { + "id": number; // id + "is_enabled": boolean; // 是否启用: 1:启用 0:禁用 + }; + } + namespace AttendanceEmployeeTracks { + type List = { + "company_employees_id"?: number; // 员工ID + "asset_projects_id"?: number; // 项目ID + "start_date"?: Date; // 开始日期 + "end_date"?: Date; // 结束日期 + }; + type Detail = { + "company_employees_id": number; // 员工ID + "start_date": Date; // 开始日期 + "end_date": Date; // 结束日期 + "asset_projects_id"?: number; // 项目ID + }; + type Heatmap = { + "company_employees_id": number; // 员工ID + "date": Date; // 日期 + }; + } + namespace AttendanceRecords { + type List = { + "company_employees_id"?: number; // 员工ID + "asset_projects_id"?: number; // 项目ID + "status"?: string; // 状态 + "checkin_type"?: string; // 打卡类型 + "checkin_time"?: string[]; // 打卡时间 + }; + type Show = { + "id": number; // 记录ID + }; + type Export = { + "company_employees_id"?: number; // 员工ID + "asset_projects_id"?: number; // 项目ID + "status"?: string; // 状态 + "checkin_type"?: string; // 打卡类型 + "checkin_time"?: string[]; // 打卡时间 + }; + } + namespace AttendanceSchedules { + type List = { + "company_employees_id"?: number; // 员工ID + "asset_projects_id"?: number; // 项目ID + "schedule_date"?: Date; // 排班日期 + "status"?: string; // 状态,[enum:AttendanceSchedulesStatusEnum] + "project_name"?: string; // 项目名称 + "employee_name"?: string; // - + }; + type Store = { + "company_employees_id": number; // 员工ID + "attendance_shifts_id": number; // 班次ID + "asset_projects_id": number; // 项目ID + "schedule_date": Date; // 排班日期 + "remark"?: string; // 备注 + }; + type BatchStore = { + "schedules": string[]; // 排班列表 + }; + type ShiftList = { + "organizations_id": number; // 组织ID + "schedule_date": Date; // 排班日期 + }; + type Update = { + "id": number; // id + "company_employees_id"?: number; // 员工ID + "attendance_shifts_id"?: number; // 班次ID + "asset_projects_id"?: number; // 项目ID + "schedule_date"?: Date; // 排班日期 + "remark"?: string; // 备注 + }; + type ChangeStatus = { + "id": number; // id + "status": string; // 状态,[enum:AttendanceSchedulesStatusEnum] + }; + type Cancel = { + "id": number; // id + }; + type Show = { + "id": number; // id + }; + type SoftDelete = { + "id": number; // id + }; + type Restore = { + "id": number; // id + }; + type Delete = { + "id": number; // id + }; + } + namespace AttendanceShifts { + type List = { + "name"?: string; // 班次名称 + "is_enabled"?: boolean; // 状态 + "asset_projects_id"?: number; // 项目ID + "project_name"?: string; // 项目名称 + }; + type Store = { + "name": string; // 班次名称 + "asset_projects_id": number; // 关联项目IDs + "allow_checkin_start": date_format:H:i:s; // 可打卡开始时间 + "allow_checkin_end": date_format:H:i:s; // 可打卡结束时间 + "is_enabled"?: boolean; // 状态 + "remark"?: string; // 备注 + "periods": string[]; // 时段列表 + }; + type Update = { + "id": number; // id + "name"?: string; // 班次名称 + "asset_projects_id"?: number; // 关联项目IDs + "allow_checkin_start"?: date_format:H:i:s; // 可打卡开始时间 + "allow_checkin_end"?: date_format:H:i:s; // 可打卡结束时间 + "is_enabled"?: boolean; // 状态 + "remark"?: string; // 备注 + "periods"?: string[]; // 时段列表 + }; + type Show = { + "id": number; // id + }; + type Delete = { + "id": number; // id + }; + type Select = { + "name"?: string; // 班次名称 + "asset_projects_id"?: number; // 项目ID + "project_name"?: string; // 项目名称 + }; + } + } namespace Bill { namespace HouseBills { type List = { @@ -790,6 +943,9 @@ declare namespace ApiTypes { type TemporaryUrl = { "filename": string; // 文件名称 }; + type SwitchProject = { + "project_id": string; // 项目ID all-查看所有 + }; } namespace ConvenienceServices { type List = { @@ -902,7 +1058,7 @@ declare namespace ApiTypes { } namespace CompanyProjectReceiptAccounts { type List = { - "asset_projects_id"?: number; // 所属项目id,[ref:asset_projects] + "projects_id"?: number; // 所属项目id,[ref:asset_projects] }; type Store = { "projects_id": number; // 所属项目id,[ref:asset_projects] @@ -1784,6 +1940,10 @@ declare namespace ApiTypes { }; } } + namespace Statistics { + namespace IndexCount { + } + } namespace Visitor { namespace VisitorApplies { type List = { diff --git a/src/gen/Apis.ts b/src/gen/Apis.ts index 2a8fd1b..f6c7e8c 100644 --- a/src/gen/Apis.ts +++ b/src/gen/Apis.ts @@ -121,6 +121,12 @@ export const Apis = { ChangeIsContact(data: ApiTypes.Archive.HouseOccupants.ChangeIsContact): Promise { return request('company/archive/house_occupants/change_is_contact', { data }); }, + Import(data?: ApiTypes.Archive.HouseOccupants.Import): Promise { + return request('company/archive/house_occupants/import', { data }); + }, + DownloadTemplate(): Promise { + return request('company/archive/house_occupants/download_template', {responseType: 'blob',}); + }, }, HouseRegisters: { List(data?: ApiTypes.Archive.HouseRegisters.List): Promise { @@ -315,6 +321,102 @@ export const Apis = { }, }, }, + Attendance: { + AttendanceConfigs: { + List(data?: ApiTypes.Attendance.AttendanceConfigs.List): Promise { + return request('company/attendance/attendance_configs/list', { data }); + }, + Store(data: ApiTypes.Attendance.AttendanceConfigs.Store): Promise { + return request('company/attendance/attendance_configs/store', { data }); + }, + UpdateConfig(data: ApiTypes.Attendance.AttendanceConfigs.UpdateConfig): Promise { + return request('company/attendance/attendance_configs/update_config', { data }); + }, + Enable(data: ApiTypes.Attendance.AttendanceConfigs.Enable): Promise { + return request('company/attendance/attendance_configs/enable', { data }); + }, + }, + AttendanceEmployeeTracks: { + List(data?: ApiTypes.Attendance.AttendanceEmployeeTracks.List): Promise { + return request('company/attendance/attendance_employee_tracks/list', { data }); + }, + Detail(data: ApiTypes.Attendance.AttendanceEmployeeTracks.Detail): Promise { + return request('company/attendance/attendance_employee_tracks/detail', { data }); + }, + Heatmap(data: ApiTypes.Attendance.AttendanceEmployeeTracks.Heatmap): Promise { + return request('company/attendance/attendance_employee_tracks/heatmap', { data }); + }, + Cleanup(): Promise { + return request('company/attendance/attendance_employee_tracks/cleanup', {}); + }, + }, + AttendanceRecords: { + List(data?: ApiTypes.Attendance.AttendanceRecords.List): Promise { + return request('company/attendance/attendance_records/list', { data }); + }, + Show(data: ApiTypes.Attendance.AttendanceRecords.Show): Promise { + return request('company/attendance/attendance_records/show', { data }); + }, + Export(data?: ApiTypes.Attendance.AttendanceRecords.Export): Promise { + return request('company/attendance/attendance_records/export', { responseType: 'blob',data }); + }, + }, + AttendanceSchedules: { + List(data?: ApiTypes.Attendance.AttendanceSchedules.List): Promise { + return request('company/attendance/attendance_schedules/list', { data }); + }, + Store(data: ApiTypes.Attendance.AttendanceSchedules.Store): Promise { + return request('company/attendance/attendance_schedules/store', { data }); + }, + BatchStore(data: ApiTypes.Attendance.AttendanceSchedules.BatchStore): Promise { + return request('company/attendance/attendance_schedules/batch_store', { data }); + }, + ShiftList(data: ApiTypes.Attendance.AttendanceSchedules.ShiftList): Promise { + return request('company/attendance/attendance_schedules/shift_list', { data }); + }, + Update(data: ApiTypes.Attendance.AttendanceSchedules.Update): Promise { + return request('company/attendance/attendance_schedules/update', { data }); + }, + ChangeStatus(data: ApiTypes.Attendance.AttendanceSchedules.ChangeStatus): Promise { + return request('company/attendance/attendance_schedules/change_status', { data }); + }, + Cancel(data: ApiTypes.Attendance.AttendanceSchedules.Cancel): Promise { + return request('company/attendance/attendance_schedules/cancel', { data }); + }, + Show(data: ApiTypes.Attendance.AttendanceSchedules.Show): Promise { + return request('company/attendance/attendance_schedules/show', { data }); + }, + SoftDelete(data: ApiTypes.Attendance.AttendanceSchedules.SoftDelete): Promise { + return request('company/attendance/attendance_schedules/soft_delete', { data }); + }, + Restore(data: ApiTypes.Attendance.AttendanceSchedules.Restore): Promise { + return request('company/attendance/attendance_schedules/restore', { data }); + }, + Delete(data: ApiTypes.Attendance.AttendanceSchedules.Delete): Promise { + return request('company/attendance/attendance_schedules/delete', { data }); + }, + }, + AttendanceShifts: { + List(data?: ApiTypes.Attendance.AttendanceShifts.List): Promise { + return request('company/attendance/attendance_shifts/list', { data }); + }, + Store(data: ApiTypes.Attendance.AttendanceShifts.Store): Promise { + return request('company/attendance/attendance_shifts/store', { data }); + }, + Update(data: ApiTypes.Attendance.AttendanceShifts.Update): Promise { + return request('company/attendance/attendance_shifts/update', { data }); + }, + Show(data: ApiTypes.Attendance.AttendanceShifts.Show): Promise { + return request('company/attendance/attendance_shifts/show', { data }); + }, + Delete(data: ApiTypes.Attendance.AttendanceShifts.Delete): Promise { + return request('company/attendance/attendance_shifts/delete', { data }); + }, + Select(data?: ApiTypes.Attendance.AttendanceShifts.Select): Promise { + return request('company/attendance/attendance_shifts/select', { data }); + }, + }, + }, Bill: { HouseBills: { List(data?: ApiTypes.Bill.HouseBills.List): Promise { @@ -390,6 +492,12 @@ export const Apis = { TemporaryUrl(data: ApiTypes.Common.Auth.TemporaryUrl): Promise { return request('company/common/auth/temporary_url', { data }); }, + SwitchProject(data: ApiTypes.Common.Auth.SwitchProject): Promise { + return request('company/common/auth/switch_project', { data }); + }, + GetProjects(): Promise { + return request('company/common/auth/get_projects', {}); + }, }, ConvenienceServices: { List(data?: ApiTypes.Common.ConvenienceServices.List): Promise { @@ -1019,6 +1127,25 @@ export const Apis = { }, }, }, + Statistics: { + IndexCount: { + FinancialAnalysis(): Promise { + return request('company/statistics/index_count/financial_analysis', {}); + }, + TodayDynamics(): Promise { + return request('company/statistics/index_count/today_dynamics', {}); + }, + WorkOrderAnalysis(): Promise { + return request('company/statistics/index_count/work_order_analysis', {}); + }, + CommunityOverview(): Promise { + return request('company/statistics/index_count/community_overview', {}); + }, + ClearCache(): Promise { + return request('company/statistics/index_count/clear_cache', {}); + }, + }, + }, Visitor: { VisitorApplies: { List(data?: ApiTypes.Visitor.VisitorApplies.List): Promise { diff --git a/src/gen/Enums.ts b/src/gen/Enums.ts index 9c33826..cba2297 100644 --- a/src/gen/Enums.ts +++ b/src/gen/Enums.ts @@ -227,6 +227,37 @@ export const AssetUnitsBuildingTypeEnum= { 'Tower': {"text":"塔楼","color":"#ffc107","value":"Tower"}, }; +// AttendanceRecordsCheckinTypeEnum +export const AttendanceRecordsCheckinTypeEnum= { + 'CheckIn': {"text":"上班","color":"#1890ff","value":"CheckIn"}, + 'CheckOut': {"text":"下班","color":"#52c41a","value":"CheckOut"}, +}; + +// AttendanceRecordsStatusEnum +export const AttendanceRecordsStatusEnum= { + 'Normal': {"text":"正常","color":"#52c41a","value":"Normal"}, + 'Late': {"text":"迟到","color":"#faad14","value":"Late"}, + 'EarlyLeave': {"text":"早退","color":"#fa8c16","value":"EarlyLeave"}, + 'OutOfRange': {"text":"范围外","color":"#ff4d4f","value":"OutOfRange"}, + 'Reissue': {"text":"补卡","color":"#1890ff","value":"Reissue"}, +}; + +// AttendanceSchedulesStatusEnum +export const AttendanceSchedulesStatusEnum= { + 'Pending': {"text":"待生效","color":"#faad14","value":"Pending"}, + 'Active': {"text":"生效中","color":"#52c41a","value":"Active"}, + 'Cancelled': {"text":"已取消","color":"#ff4d4f","value":"Cancelled"}, +}; + +// 打卡状态枚举 +export const AttendanceStatusEnum= { + 'Normal': {"text":"正常","color":"#52c41a","value":"Normal"}, + 'Late': {"text":"迟到","color":"#faad14","value":"Late"}, + 'Early': {"text":"早退","color":"#faad14","value":"Early"}, + 'OutOfRange': {"text":"范围外","color":"#ff4d4f","value":"OutOfRange"}, + 'MakeUp': {"text":"补卡","color":"#722ed1","value":"MakeUp"}, +}; + // BannerSpacesTypeEnum export const BannerSpacesTypeEnum= { 'Popup': {"text":"弹窗","color":"#ff0000","value":"Popup"}, @@ -251,7 +282,7 @@ export const BannersTypeEnum= { // 缓存类型 export const CacheTypeEnum= { - 'MobilePhoneVerificationCode': {"text":"手机验证码","color":"#e482d3","value":"MobilePhoneVerificationCode"}, + 'MobilePhoneVerificationCode': {"text":"手机验证码","color":"#e72e44","value":"MobilePhoneVerificationCode"}, }; // CompaniesMerchantTypeEnum @@ -297,6 +328,13 @@ export const CompanyEmployeeBacklogsTypeEnum= { 'MomentTask': {"text":"朋友圈任务","color":"#FF6600","value":"MomentTask"}, }; +// CompanyEmployeesTypeEnum +export const CompanyEmployeesTypeEnum= { + 'Staff': {"text":"员工","color":"#1890ff","value":"Staff"}, + 'WeCom': {"text":"企微","color":"#2196f3","value":"WeCom"}, + 'External': {"text":"外部","color":"#4caf50","value":"External"}, +}; + // CompanyReceiptAccountsPayChannelEnum export const CompanyReceiptAccountsPayChannelEnum= { 'WeChat': {"text":"微信","color":"#07c160","value":"WeChat"}, @@ -762,6 +800,12 @@ export const HouseWorkOrdersTypeEnum= { 'Complaint': {"text":"投诉","color":"#aa00ff","value":"Complaint"}, }; +// 公告阅读者类型 +export const MsgPropertyAnnouncementReadsReaderTypeEnum= { + 'Customer': {"text":"客户","color":"#3b82f6","value":"Customer"}, + 'Employee': {"text":"员工","color":"#10b981","value":"Employee"}, +}; + // 公告接收对象 export const MsgPropertyAnnouncementsObjectEnum= { 'Customer': {"text":"客户","color":"#3b82f6","value":"Customer"}, diff --git a/src/pages/company/employees/index.tsx b/src/pages/company/employees/index.tsx index 200159c..3cc4ba9 100644 --- a/src/pages/company/employees/index.tsx +++ b/src/pages/company/employees/index.tsx @@ -44,11 +44,11 @@ export default function Index({ title = '员工管理' }) { title="重置" type="default" isConfirm={true} - description={`确定要重置用户「${item.name}」的密码为「12345678」吗?`} + description={`确定要重置用户「${item.name}」的密码为「ly#123」吗?`} onConfirm={() => Apis.Company.CompanyEmployees.ResetPassword({ id: item.id, - password: '12345678', + password: 'ly#123', }).then(() => action?.reload()) } /> diff --git a/src/pages/company/employees/modals/EmployeeCreate.tsx b/src/pages/company/employees/modals/EmployeeCreate.tsx index a5b6728..213991d 100644 --- a/src/pages/company/employees/modals/EmployeeCreate.tsx +++ b/src/pages/company/employees/modals/EmployeeCreate.tsx @@ -36,7 +36,7 @@ export default function Create(props: MyBetaModalFormProps) { ...values, companies_id: values?.companies_id || props?.item?.id, // type: CompanyEmployeesTypeEnum.External.value, - password: '12345678', + password: 'ly#123', organizations_id: values?.organizations_id?.[values.organizations_id.length - 1], }) diff --git a/src/pages/customer/archive/index.tsx b/src/pages/customer/archive/index.tsx index 3cee2ea..a446bb2 100644 --- a/src/pages/customer/archive/index.tsx +++ b/src/pages/customer/archive/index.tsx @@ -1,6 +1,7 @@ import { MyButtons, MyColumns, + MyImportModal, MyPageContainer, MyProTableProps, } from '@/common'; @@ -31,17 +32,17 @@ export default function Index({ title = '房屋档案' }) { request={async (params, sort) => MyProTableProps.request(params, sort, Apis.Asset.AssetHouses.List) } - // toolBarRender={(action) => [ - // , - // ]} + toolBarRender={(action) => [ + , + ]} columns={[ MyColumns.ID({ search: false }), Selects?.AssetProjects({