fix:客户导入、员工创建初始密码
All checks were successful
Build and Push Docker Image / build (push) Successful in 4m42s

This commit is contained in:
uiuJun 2026-02-05 20:01:45 +08:00
parent 3255c9deb6
commit 13e98eaf4c
7 changed files with 350 additions and 18 deletions

View File

@ -18,8 +18,8 @@ export default defineConfig({
proxy: { proxy: {
'/api/': { '/api/': {
target: 'http://10.39.13.78:8001/', target: 'http://10.39.13.78:8001/',
// target: 'https://test-admin.linyikj.com.cn/', // target: 'https://test-company.linyikj.com.cn/',
// target: 'https://admin.linyikj.com.cn/', // target: 'https://company.linyikj.com.cn/',
changeOrigin: true, changeOrigin: true,
pathRewrite: { '^': '' }, pathRewrite: { '^': '' },
}, },

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

@ -196,6 +196,9 @@ declare namespace ApiTypes {
"id": number; // id "id": number; // id
"is_contact": boolean; // 是否是常用联系人 "is_contact": boolean; // 是否是常用联系人
}; };
type Import = {
"upload_file"?: mimes:xlsx,xls; // 上传的时候必填文件
};
} }
namespace HouseRegisters { namespace HouseRegisters {
type List = { 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 Bill {
namespace HouseBills { namespace HouseBills {
type List = { type List = {
@ -790,6 +943,9 @@ declare namespace ApiTypes {
type TemporaryUrl = { type TemporaryUrl = {
"filename": string; // 文件名称 "filename": string; // 文件名称
}; };
type SwitchProject = {
"project_id": string; // 项目ID all-查看所有
};
} }
namespace ConvenienceServices { namespace ConvenienceServices {
type List = { type List = {
@ -902,7 +1058,7 @@ declare namespace ApiTypes {
} }
namespace CompanyProjectReceiptAccounts { namespace CompanyProjectReceiptAccounts {
type List = { type List = {
"asset_projects_id"?: number; // 所属项目id,[ref:asset_projects] "projects_id"?: number; // 所属项目id,[ref:asset_projects]
}; };
type Store = { type Store = {
"projects_id": number; // 所属项目id,[ref:asset_projects] "projects_id": number; // 所属项目id,[ref:asset_projects]
@ -1784,6 +1940,10 @@ declare namespace ApiTypes {
}; };
} }
} }
namespace Statistics {
namespace IndexCount {
}
}
namespace Visitor { namespace Visitor {
namespace VisitorApplies { namespace VisitorApplies {
type List = { type List = {

View File

@ -121,6 +121,12 @@ export const Apis = {
ChangeIsContact(data: ApiTypes.Archive.HouseOccupants.ChangeIsContact): Promise<MyResponseType> { ChangeIsContact(data: ApiTypes.Archive.HouseOccupants.ChangeIsContact): Promise<MyResponseType> {
return request('company/archive/house_occupants/change_is_contact', { data }); return request('company/archive/house_occupants/change_is_contact', { data });
}, },
Import(data?: ApiTypes.Archive.HouseOccupants.Import): Promise<MyResponseType> {
return request('company/archive/house_occupants/import', { data });
},
DownloadTemplate(): Promise<MyResponseType> {
return request('company/archive/house_occupants/download_template', {responseType: 'blob',});
},
}, },
HouseRegisters: { HouseRegisters: {
List(data?: ApiTypes.Archive.HouseRegisters.List): Promise<MyResponseType> { List(data?: ApiTypes.Archive.HouseRegisters.List): Promise<MyResponseType> {
@ -315,6 +321,102 @@ export const Apis = {
}, },
}, },
}, },
Attendance: {
AttendanceConfigs: {
List(data?: ApiTypes.Attendance.AttendanceConfigs.List): Promise<MyResponseType> {
return request('company/attendance/attendance_configs/list', { data });
},
Store(data: ApiTypes.Attendance.AttendanceConfigs.Store): Promise<MyResponseType> {
return request('company/attendance/attendance_configs/store', { data });
},
UpdateConfig(data: ApiTypes.Attendance.AttendanceConfigs.UpdateConfig): Promise<MyResponseType> {
return request('company/attendance/attendance_configs/update_config', { data });
},
Enable(data: ApiTypes.Attendance.AttendanceConfigs.Enable): Promise<MyResponseType> {
return request('company/attendance/attendance_configs/enable', { data });
},
},
AttendanceEmployeeTracks: {
List(data?: ApiTypes.Attendance.AttendanceEmployeeTracks.List): Promise<MyResponseType> {
return request('company/attendance/attendance_employee_tracks/list', { data });
},
Detail(data: ApiTypes.Attendance.AttendanceEmployeeTracks.Detail): Promise<MyResponseType> {
return request('company/attendance/attendance_employee_tracks/detail', { data });
},
Heatmap(data: ApiTypes.Attendance.AttendanceEmployeeTracks.Heatmap): Promise<MyResponseType> {
return request('company/attendance/attendance_employee_tracks/heatmap', { data });
},
Cleanup(): Promise<MyResponseType> {
return request('company/attendance/attendance_employee_tracks/cleanup', {});
},
},
AttendanceRecords: {
List(data?: ApiTypes.Attendance.AttendanceRecords.List): Promise<MyResponseType> {
return request('company/attendance/attendance_records/list', { data });
},
Show(data: ApiTypes.Attendance.AttendanceRecords.Show): Promise<MyResponseType> {
return request('company/attendance/attendance_records/show', { data });
},
Export(data?: ApiTypes.Attendance.AttendanceRecords.Export): Promise<MyResponseType> {
return request('company/attendance/attendance_records/export', { responseType: 'blob',data });
},
},
AttendanceSchedules: {
List(data?: ApiTypes.Attendance.AttendanceSchedules.List): Promise<MyResponseType> {
return request('company/attendance/attendance_schedules/list', { data });
},
Store(data: ApiTypes.Attendance.AttendanceSchedules.Store): Promise<MyResponseType> {
return request('company/attendance/attendance_schedules/store', { data });
},
BatchStore(data: ApiTypes.Attendance.AttendanceSchedules.BatchStore): Promise<MyResponseType> {
return request('company/attendance/attendance_schedules/batch_store', { data });
},
ShiftList(data: ApiTypes.Attendance.AttendanceSchedules.ShiftList): Promise<MyResponseType> {
return request('company/attendance/attendance_schedules/shift_list', { data });
},
Update(data: ApiTypes.Attendance.AttendanceSchedules.Update): Promise<MyResponseType> {
return request('company/attendance/attendance_schedules/update', { data });
},
ChangeStatus(data: ApiTypes.Attendance.AttendanceSchedules.ChangeStatus): Promise<MyResponseType> {
return request('company/attendance/attendance_schedules/change_status', { data });
},
Cancel(data: ApiTypes.Attendance.AttendanceSchedules.Cancel): Promise<MyResponseType> {
return request('company/attendance/attendance_schedules/cancel', { data });
},
Show(data: ApiTypes.Attendance.AttendanceSchedules.Show): Promise<MyResponseType> {
return request('company/attendance/attendance_schedules/show', { data });
},
SoftDelete(data: ApiTypes.Attendance.AttendanceSchedules.SoftDelete): Promise<MyResponseType> {
return request('company/attendance/attendance_schedules/soft_delete', { data });
},
Restore(data: ApiTypes.Attendance.AttendanceSchedules.Restore): Promise<MyResponseType> {
return request('company/attendance/attendance_schedules/restore', { data });
},
Delete(data: ApiTypes.Attendance.AttendanceSchedules.Delete): Promise<MyResponseType> {
return request('company/attendance/attendance_schedules/delete', { data });
},
},
AttendanceShifts: {
List(data?: ApiTypes.Attendance.AttendanceShifts.List): Promise<MyResponseType> {
return request('company/attendance/attendance_shifts/list', { data });
},
Store(data: ApiTypes.Attendance.AttendanceShifts.Store): Promise<MyResponseType> {
return request('company/attendance/attendance_shifts/store', { data });
},
Update(data: ApiTypes.Attendance.AttendanceShifts.Update): Promise<MyResponseType> {
return request('company/attendance/attendance_shifts/update', { data });
},
Show(data: ApiTypes.Attendance.AttendanceShifts.Show): Promise<MyResponseType> {
return request('company/attendance/attendance_shifts/show', { data });
},
Delete(data: ApiTypes.Attendance.AttendanceShifts.Delete): Promise<MyResponseType> {
return request('company/attendance/attendance_shifts/delete', { data });
},
Select(data?: ApiTypes.Attendance.AttendanceShifts.Select): Promise<MyResponseType> {
return request('company/attendance/attendance_shifts/select', { data });
},
},
},
Bill: { Bill: {
HouseBills: { HouseBills: {
List(data?: ApiTypes.Bill.HouseBills.List): Promise<MyResponseType> { List(data?: ApiTypes.Bill.HouseBills.List): Promise<MyResponseType> {
@ -390,6 +492,12 @@ export const Apis = {
TemporaryUrl(data: ApiTypes.Common.Auth.TemporaryUrl): Promise<MyResponseType> { TemporaryUrl(data: ApiTypes.Common.Auth.TemporaryUrl): Promise<MyResponseType> {
return request('company/common/auth/temporary_url', { data }); return request('company/common/auth/temporary_url', { data });
}, },
SwitchProject(data: ApiTypes.Common.Auth.SwitchProject): Promise<MyResponseType> {
return request('company/common/auth/switch_project', { data });
},
GetProjects(): Promise<MyResponseType> {
return request('company/common/auth/get_projects', {});
},
}, },
ConvenienceServices: { ConvenienceServices: {
List(data?: ApiTypes.Common.ConvenienceServices.List): Promise<MyResponseType> { List(data?: ApiTypes.Common.ConvenienceServices.List): Promise<MyResponseType> {
@ -1019,6 +1127,25 @@ export const Apis = {
}, },
}, },
}, },
Statistics: {
IndexCount: {
FinancialAnalysis(): Promise<MyResponseType> {
return request('company/statistics/index_count/financial_analysis', {});
},
TodayDynamics(): Promise<MyResponseType> {
return request('company/statistics/index_count/today_dynamics', {});
},
WorkOrderAnalysis(): Promise<MyResponseType> {
return request('company/statistics/index_count/work_order_analysis', {});
},
CommunityOverview(): Promise<MyResponseType> {
return request('company/statistics/index_count/community_overview', {});
},
ClearCache(): Promise<MyResponseType> {
return request('company/statistics/index_count/clear_cache', {});
},
},
},
Visitor: { Visitor: {
VisitorApplies: { VisitorApplies: {
List(data?: ApiTypes.Visitor.VisitorApplies.List): Promise<MyResponseType> { List(data?: ApiTypes.Visitor.VisitorApplies.List): Promise<MyResponseType> {

View File

@ -227,6 +227,37 @@ export const AssetUnitsBuildingTypeEnum= {
'Tower': {"text":"塔楼","color":"#ffc107","value":"Tower"}, '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 // BannerSpacesTypeEnum
export const BannerSpacesTypeEnum= { export const BannerSpacesTypeEnum= {
'Popup': {"text":"弹窗","color":"#ff0000","value":"Popup"}, 'Popup': {"text":"弹窗","color":"#ff0000","value":"Popup"},
@ -251,7 +282,7 @@ export const BannersTypeEnum= {
// 缓存类型 // 缓存类型
export const CacheTypeEnum= { export const CacheTypeEnum= {
'MobilePhoneVerificationCode': {"text":"手机验证码","color":"#e482d3","value":"MobilePhoneVerificationCode"}, 'MobilePhoneVerificationCode': {"text":"手机验证码","color":"#e72e44","value":"MobilePhoneVerificationCode"},
}; };
// CompaniesMerchantTypeEnum // CompaniesMerchantTypeEnum
@ -297,6 +328,13 @@ export const CompanyEmployeeBacklogsTypeEnum= {
'MomentTask': {"text":"朋友圈任务","color":"#FF6600","value":"MomentTask"}, '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 // CompanyReceiptAccountsPayChannelEnum
export const CompanyReceiptAccountsPayChannelEnum= { export const CompanyReceiptAccountsPayChannelEnum= {
'WeChat': {"text":"微信","color":"#07c160","value":"WeChat"}, 'WeChat': {"text":"微信","color":"#07c160","value":"WeChat"},
@ -762,6 +800,12 @@ export const HouseWorkOrdersTypeEnum= {
'Complaint': {"text":"投诉","color":"#aa00ff","value":"Complaint"}, 'Complaint': {"text":"投诉","color":"#aa00ff","value":"Complaint"},
}; };
// 公告阅读者类型
export const MsgPropertyAnnouncementReadsReaderTypeEnum= {
'Customer': {"text":"客户","color":"#3b82f6","value":"Customer"},
'Employee': {"text":"员工","color":"#10b981","value":"Employee"},
};
// 公告接收对象 // 公告接收对象
export const MsgPropertyAnnouncementsObjectEnum= { export const MsgPropertyAnnouncementsObjectEnum= {
'Customer': {"text":"客户","color":"#3b82f6","value":"Customer"}, 'Customer': {"text":"客户","color":"#3b82f6","value":"Customer"},

View File

@ -44,11 +44,11 @@ export default function Index({ title = '员工管理' }) {
title="重置" title="重置"
type="default" type="default"
isConfirm={true} isConfirm={true}
description={`确定要重置用户「${item.name}」的密码为「12345678」吗?`} description={`确定要重置用户「${item.name}」的密码为「ly#123」吗`}
onConfirm={() => onConfirm={() =>
Apis.Company.CompanyEmployees.ResetPassword({ Apis.Company.CompanyEmployees.ResetPassword({
id: item.id, id: item.id,
password: '12345678', password: 'ly#123',
}).then(() => action?.reload()) }).then(() => action?.reload())
} }
/> />

View File

@ -36,7 +36,7 @@ export default function Create(props: MyBetaModalFormProps) {
...values, ...values,
companies_id: values?.companies_id || props?.item?.id, companies_id: values?.companies_id || props?.item?.id,
// type: CompanyEmployeesTypeEnum.External.value, // type: CompanyEmployeesTypeEnum.External.value,
password: '12345678', password: 'ly#123',
organizations_id: organizations_id:
values?.organizations_id?.[values.organizations_id.length - 1], values?.organizations_id?.[values.organizations_id.length - 1],
}) })

View File

@ -1,6 +1,7 @@
import { import {
MyButtons, MyButtons,
MyColumns, MyColumns,
MyImportModal,
MyPageContainer, MyPageContainer,
MyProTableProps, MyProTableProps,
} from '@/common'; } from '@/common';
@ -31,17 +32,17 @@ export default function Index({ title = '房屋档案' }) {
request={async (params, sort) => request={async (params, sort) =>
MyProTableProps.request(params, sort, Apis.Asset.AssetHouses.List) MyProTableProps.request(params, sort, Apis.Asset.AssetHouses.List)
} }
// toolBarRender={(action) => [ toolBarRender={(action) => [
// <MyImportModal <MyImportModal
// key="ImportHouse" key="ImportHouse"
// title="批量导入" title="批量导入"
// type="default" type="default"
// size="middle" size="middle"
// templateApi={Apis.Archive.HouseOccupants.DownloadTemplate} templateApi={Apis.Archive.HouseOccupants.DownloadTemplate}
// importApi={Apis.Archive.HouseOccupants.Import} importApi={Apis.Archive.HouseOccupants.Import}
// reload={action?.reload} reload={action?.reload}
// />, />,
// ]} ]}
columns={[ columns={[
MyColumns.ID({ search: false }), MyColumns.ID({ search: false }),
Selects?.AssetProjects({ Selects?.AssetProjects({