Browse Source

接口

yuhongzhe
李双庆 11 months ago
parent
commit
b803b5dba2
  1. 4
      .gitignore
  2. 2
      admin/auto-imports.d.ts
  3. 8
      admin/components.d.ts
  4. 23
      admin/src/app/api/campus.ts
  5. 12
      admin/src/app/api/campus_person_role.ts
  6. 12
      admin/src/app/api/customer_resources.ts
  7. 6
      admin/src/app/api/departments.ts
  8. 56
      admin/src/app/api/market_performance.ts
  9. 10
      admin/src/app/api/six_speed_modification_log.ts
  10. 10
      admin/src/app/api/sys.ts
  11. 36
      admin/src/app/lang/zh-cn/campus.campus.json
  12. 20
      admin/src/app/lang/zh-cn/campus_person_role.campus_person_role.json
  13. 21
      admin/src/app/lang/zh-cn/customer_resources.customer_resources.json
  14. 4
      admin/src/app/lang/zh-cn/departments.departments.json
  15. 13
      admin/src/app/lang/zh-cn/market_performance.market_performance.json
  16. 8
      admin/src/app/lang/zh-cn/six_speed_modification_log.six_speed_modification_log.json
  17. 324
      admin/src/app/views/campus/campus.vue
  18. 8
      admin/src/app/views/campus/components/campus-edit.vue
  19. 94
      admin/src/app/views/campus_person_role/campus_person_role.vue
  20. 92
      admin/src/app/views/campus_person_role/components/campus-person-role-edit.vue
  21. 212
      admin/src/app/views/customer_resources/components/customer-resources-edit.vue
  22. 141
      admin/src/app/views/customer_resources/customer_resources.vue
  23. 17
      admin/src/app/views/departments/components/departments-edit.vue
  24. 20
      admin/src/app/views/departments/departments.vue
  25. 189
      admin/src/app/views/market_performance/components/market-performance-edit.vue
  26. 186
      admin/src/app/views/market_performance/market_performance.vue
  27. 32
      admin/src/app/views/six_speed_modification_log/components/six-speed-modification-log-edit.vue
  28. 45
      admin/src/app/views/six_speed_modification_log/six_speed_modification_log.vue
  29. 107
      admin/src/app/views/yjpz_config/yjpz_config.vue
  30. 248
      admin/src/components/TencentMapPicker.vue
  31. 97
      niucloud/app/adminapi/controller/campus/Campus.php
  32. 29
      niucloud/app/adminapi/controller/campus_person_role/CampusPersonRole.php
  33. 38
      niucloud/app/adminapi/controller/customer_resources/CustomerResources.php
  34. 99
      niucloud/app/adminapi/controller/market_performance/MarketPerformance.php
  35. 3
      niucloud/app/adminapi/controller/member/Config.php
  36. 116
      niucloud/app/adminapi/controller/personnel/Personnel.php
  37. 14
      niucloud/app/adminapi/controller/six_speed_modification_log/SixSpeedModificationLog.php
  38. 18
      niucloud/app/adminapi/controller/sys/System.php
  39. 37
      niucloud/app/adminapi/route/campus.php
  40. 9
      niucloud/app/adminapi/route/campus_person_role.php
  41. 28
      niucloud/app/adminapi/route/class.php
  42. 6
      niucloud/app/adminapi/route/customer_resources.php
  43. 3
      niucloud/app/adminapi/route/departments.php
  44. 41
      niucloud/app/adminapi/route/market_performance.php
  45. 37
      niucloud/app/adminapi/route/personnel.php
  46. 6
      niucloud/app/adminapi/route/six_speed_modification_log.php
  47. 4
      niucloud/app/adminapi/route/sys.php
  48. 45
      niucloud/app/api/controller/login/Login.php
  49. 3
      niucloud/app/api/route/route.php
  50. 21
      niucloud/app/common.php
  51. 3
      niucloud/app/dict/sys/AppTypeDict.php
  52. 136
      niucloud/app/model/attendance/Attendance.php
  53. 94
      niucloud/app/model/campus/Campus.php
  54. 60
      niucloud/app/model/campus_person_role/CampusPersonRole.php
  55. 88
      niucloud/app/model/contract/Contract.php
  56. 116
      niucloud/app/model/course/Course.php
  57. 194
      niucloud/app/model/customer_resources/CustomerResources.php
  58. 86
      niucloud/app/model/market_performance/MarketPerformance.php
  59. 159
      niucloud/app/model/personnel/Personnel.php
  60. 58
      niucloud/app/model/six_speed_modification_log/SixSpeedModificationLog.php
  61. 112
      niucloud/app/model/venue/Venue.php
  62. 100
      niucloud/app/service/admin/campus/CampusService.php
  63. 28
      niucloud/app/service/admin/campus_person_role/CampusPersonRoleService.php
  64. 14
      niucloud/app/service/admin/customer_resources/CustomerResourcesService.php
  65. 4
      niucloud/app/service/admin/departments/DepartmentsService.php
  66. 111
      niucloud/app/service/admin/market_performance/MarketPerformanceService.php
  67. 151
      niucloud/app/service/admin/personnel/PersonnelService.php
  68. 16
      niucloud/app/service/admin/six_speed_modification_log/SixSpeedModificationLogService.php
  69. 33
      niucloud/app/service/admin/student_courses/StudentCoursesService.php
  70. 19
      niucloud/app/service/admin/sys/SystemService.php
  71. 77
      niucloud/app/service/api/login/LoginService.php
  72. 31
      niucloud/app/service/core/member/CoreMemberConfigService.php
  73. 35
      niucloud/app/validate/campus/Campus.php
  74. 4
      niucloud/app/validate/campus_person_role/CampusPersonRole.php
  75. 20
      niucloud/app/validate/customer_resources/CustomerResources.php
  76. 35
      niucloud/app/validate/market_performance/MarketPerformance.php
  77. 44
      niucloud/app/validate/personnel/Personnel.php
  78. 20
      niucloud/app/validate/resource_sharing/ResourceSharing.php
  79. 3
      niucloud/public/index.php

4
.gitignore

@ -5,3 +5,7 @@
*.log *.log
*.txt *.txt
/.idea /.idea
/niucloud/runtime
/niucloud/vendor
/niucloud/config
config

2
admin/auto-imports.d.ts

@ -1,5 +1,5 @@
// Generated by 'unplugin-auto-import' // Generated by 'unplugin-auto-import'
export {} export {}
declare global { declare global {
const ElNotification: typeof import('element-plus/es')['ElNotification']
} }

8
admin/components.d.ts

@ -10,6 +10,7 @@ declare module '@vue/runtime-core' {
Attachment: typeof import('./src/components/upload-attachment/attachment.vue')['default'] Attachment: typeof import('./src/components/upload-attachment/attachment.vue')['default']
DiyLink: typeof import('./src/components/diy-link/index.vue')['default'] DiyLink: typeof import('./src/components/diy-link/index.vue')['default']
Editor: typeof import('./src/components/editor/index.vue')['default'] Editor: typeof import('./src/components/editor/index.vue')['default']
ElAlert: typeof import('element-plus/es')['ElAlert']
ElAside: typeof import('element-plus/es')['ElAside'] ElAside: typeof import('element-plus/es')['ElAside']
ElAvatar: typeof import('element-plus/es')['ElAvatar'] ElAvatar: typeof import('element-plus/es')['ElAvatar']
ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb'] ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb']
@ -17,15 +18,18 @@ declare module '@vue/runtime-core' {
ElButton: typeof import('element-plus/es')['ElButton'] ElButton: typeof import('element-plus/es')['ElButton']
ElCard: typeof import('element-plus/es')['ElCard'] ElCard: typeof import('element-plus/es')['ElCard']
ElCheckbox: typeof import('element-plus/es')['ElCheckbox'] ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup']
ElCol: typeof import('element-plus/es')['ElCol'] ElCol: typeof import('element-plus/es')['ElCol']
ElColorPicker: typeof import('element-plus/es')['ElColorPicker'] ElColorPicker: typeof import('element-plus/es')['ElColorPicker']
ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider'] ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
ElContainer: typeof import('element-plus/es')['ElContainer'] ElContainer: typeof import('element-plus/es')['ElContainer']
ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
ElDialog: typeof import('element-plus/es')['ElDialog'] ElDialog: typeof import('element-plus/es')['ElDialog']
ElDrawer: typeof import('element-plus/es')['ElDrawer'] ElDrawer: typeof import('element-plus/es')['ElDrawer']
ElDropdown: typeof import('element-plus/es')['ElDropdown'] ElDropdown: typeof import('element-plus/es')['ElDropdown']
ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem'] ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem']
ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu'] ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu']
ElEmpty: typeof import('element-plus/es')['ElEmpty']
ElForm: typeof import('element-plus/es')['ElForm'] ElForm: typeof import('element-plus/es')['ElForm']
ElFormItem: typeof import('element-plus/es')['ElFormItem'] ElFormItem: typeof import('element-plus/es')['ElFormItem']
ElHeader: typeof import('element-plus/es')['ElHeader'] ElHeader: typeof import('element-plus/es')['ElHeader']
@ -34,15 +38,18 @@ declare module '@vue/runtime-core' {
ElImageViewer: typeof import('element-plus/es')['ElImageViewer'] ElImageViewer: typeof import('element-plus/es')['ElImageViewer']
ElInput: typeof import('element-plus/es')['ElInput'] ElInput: typeof import('element-plus/es')['ElInput']
ElInputNumber: typeof import('element-plus/es')['ElInputNumber'] ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
ElLink: typeof import('element-plus/es')['ElLink']
ElMain: typeof import('element-plus/es')['ElMain'] ElMain: typeof import('element-plus/es')['ElMain']
ElMenu: typeof import('element-plus/es')['ElMenu'] ElMenu: typeof import('element-plus/es')['ElMenu']
ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
ElOption: typeof import('element-plus/es')['ElOption'] ElOption: typeof import('element-plus/es')['ElOption']
ElOptionGroup: typeof import('element-plus/es')['ElOptionGroup']
ElPageHeader: typeof import('element-plus/es')['ElPageHeader'] ElPageHeader: typeof import('element-plus/es')['ElPageHeader']
ElPagination: typeof import('element-plus/es')['ElPagination'] ElPagination: typeof import('element-plus/es')['ElPagination']
ElPopover: typeof import('element-plus/es')['ElPopover'] ElPopover: typeof import('element-plus/es')['ElPopover']
ElRadio: typeof import('element-plus/es')['ElRadio'] ElRadio: typeof import('element-plus/es')['ElRadio']
ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup'] ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
ElResult: typeof import('element-plus/es')['ElResult']
ElRow: typeof import('element-plus/es')['ElRow'] ElRow: typeof import('element-plus/es')['ElRow']
ElScrollbar: typeof import('element-plus/es')['ElScrollbar'] ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
ElSelect: typeof import('element-plus/es')['ElSelect'] ElSelect: typeof import('element-plus/es')['ElSelect']
@ -68,6 +75,7 @@ declare module '@vue/runtime-core' {
RouterView: typeof import('vue-router')['RouterView'] RouterView: typeof import('vue-router')['RouterView']
SelectArea: typeof import('./src/components/select-area/index.vue')['default'] SelectArea: typeof import('./src/components/select-area/index.vue')['default']
SelectIcon: typeof import('./src/components/select-icon/index.vue')['default'] SelectIcon: typeof import('./src/components/select-icon/index.vue')['default']
TencentMapPicker: typeof import('./src/components/TencentMapPicker.vue')['default']
UploadAttachment: typeof import('./src/components/upload-attachment/index.vue')['default'] UploadAttachment: typeof import('./src/components/upload-attachment/index.vue')['default']
UploadFile: typeof import('./src/components/upload-file/index.vue')['default'] UploadFile: typeof import('./src/components/upload-file/index.vue')['default']
UploadImage: typeof import('./src/components/upload-image/index.vue')['default'] UploadImage: typeof import('./src/components/upload-image/index.vue')['default']

23
admin/src/app/api/campus.ts

@ -1,5 +1,7 @@
import request from '@/utils/request' import request from '@/utils/request'
// USER_CODE_BEGIN -- campus // USER_CODE_BEGIN -- campus
/** /**
* *
@ -7,7 +9,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getCampusList(params: Record<string, any>) { export function getCampusList(params: Record<string, any>) {
return request.get(`campus/campus`, { params }) return request.get(`campus/campus`, {params})
} }
/** /**
@ -16,7 +18,7 @@ export function getCampusList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getCampusInfo(id: number) { export function getCampusInfo(id: number) {
return request.get(`campus/campus/${id}`) return request.get(`campus/campus/${id}`);
} }
/** /**
@ -25,10 +27,7 @@ export function getCampusInfo(id: number) {
* @returns * @returns
*/ */
export function addCampus(params: Record<string, any>) { export function addCampus(params: Record<string, any>) {
return request.post('campus/campus', params, { return request.post('campus/campus', params, { showErrorMessage: true, showSuccessMessage: true })
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -38,10 +37,7 @@ export function addCampus(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editCampus(params: Record<string, any>) { export function editCampus(params: Record<string, any>) {
return request.put(`campus/campus/${params.id}`, params, { return request.put(`campus/campus/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true })
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -50,10 +46,9 @@ export function editCampus(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteCampus(id: number) { export function deleteCampus(id: number) {
return request.delete(`campus/campus/${id}`, { return request.delete(`campus/campus/${id}`, { showErrorMessage: true, showSuccessMessage: true })
showErrorMessage: true,
showSuccessMessage: true,
})
} }
// USER_CODE_END -- campus // USER_CODE_END -- campus

12
admin/src/app/api/campus_person_role.ts

@ -2,6 +2,8 @@ import request from '@/utils/request'
// USER_CODE_BEGIN -- campus_person_role // USER_CODE_BEGIN -- campus_person_role
/** /**
* *
@ -49,6 +51,14 @@ export function deleteCampusPersonRole(id: number) {
return request.delete(`campus_person_role/campus_person_role/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`campus_person_role/campus_person_role/${id}`, { showErrorMessage: true, showSuccessMessage: true })
} }
export function getWithCampusList(params: Record<string,any>){
return request.get('campus_person_role/campus_all', {params})
}export function getWithPersonnelList(params: Record<string,any>){
return request.get('campus_person_role/personnel_all', {params})
}export function getWithSysRoleList(params: Record<string,any>){
return request.get('campus_person_role/sys_role_all', {params})
}export function getWithDepartmentsList(params: Record<string,any>){
return request.get('campus_person_role/departments_all', {params})
}
// USER_CODE_END -- campus_person_role // USER_CODE_END -- campus_person_role

12
admin/src/app/api/customer_resources.ts

@ -1,5 +1,13 @@
import request from '@/utils/request' import request from '@/utils/request'
// USER_CODE_BEGIN -- customer_resources // USER_CODE_BEGIN -- customer_resources
/** /**
* *
@ -47,6 +55,8 @@ export function deleteCustomerResources(id: number) {
return request.delete(`customer_resources/customer_resources/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`customer_resources/customer_resources/${id}`, { showErrorMessage: true, showSuccessMessage: true })
} }
export function getWithCampusList(params: Record<string,any>){
return request.get('customer_resources/campus_all', {params})
}
// USER_CODE_END -- customer_resources // USER_CODE_END -- customer_resources

6
admin/src/app/api/departments.ts

@ -1,5 +1,7 @@
import request from '@/utils/request' import request from '@/utils/request'
// USER_CODE_BEGIN -- departments // USER_CODE_BEGIN -- departments
/** /**
* *
@ -47,6 +49,8 @@ export function deleteDepartments(id: number) {
return request.delete(`departments/departments/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`departments/departments/${id}`, { showErrorMessage: true, showSuccessMessage: true })
} }
export function getWithDepartmentsList(params: Record<string,any>){
return request.get('departments/departments_all', {params})
}
// USER_CODE_END -- departments // USER_CODE_END -- departments

56
admin/src/app/api/market_performance.ts

@ -0,0 +1,56 @@
import request from '@/utils/request'
// USER_CODE_BEGIN -- market_performance
/**
*
* @param params
* @returns
*/
export function getMarketPerformanceList(params: Record<string, any>) {
return request.get(`market_performance/market_performance`, {params})
}
/**
*
* @param id id
* @returns
*/
export function getMarketPerformanceInfo(id: number) {
return request.get(`market_performance/market_performance/${id}`);
}
/**
*
* @param params
* @returns
*/
export function addMarketPerformance(params: Record<string, any>) {
return request.post('market_performance/market_performance', params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @param id
* @param params
* @returns
*/
export function editMarketPerformance(params: Record<string, any>) {
return request.put(`market_performance/market_performance/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
*
* @param id
* @returns
*/
export function deleteMarketPerformance(id: number) {
return request.delete(`market_performance/market_performance/${id}`, { showErrorMessage: true, showSuccessMessage: true })
}
export function getWithPersonnelList(params: Record<string,any>){
return request.get('market_performance/personnel_all', {params})
}export function getWithCampusList(params: Record<string,any>){
return request.get('market_performance/campus_all', {params})
}
// USER_CODE_END -- market_performance

10
admin/src/app/api/six_speed_modification_log.ts

@ -1,5 +1,9 @@
import request from '@/utils/request' import request from '@/utils/request'
// USER_CODE_BEGIN -- six_speed_modification_log // USER_CODE_BEGIN -- six_speed_modification_log
/** /**
* *
@ -47,6 +51,10 @@ export function deleteSixSpeedModificationLog(id: number) {
return request.delete(`six_speed_modification_log/six_speed_modification_log/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`six_speed_modification_log/six_speed_modification_log/${id}`, { showErrorMessage: true, showSuccessMessage: true })
} }
export function getWithCampusList(params: Record<string,any>){
return request.get('six_speed_modification_log/campus_all', {params})
}export function getWithPersonnelList(params: Record<string,any>){
return request.get('six_speed_modification_log/personnel_all', {params})
}
// USER_CODE_END -- six_speed_modification_log // USER_CODE_END -- six_speed_modification_log

10
admin/src/app/api/sys.ts

@ -754,3 +754,13 @@ export function deleteExport(id: number) {
export function getInstallConfig() { export function getInstallConfig() {
return request.get('sys/install/config') return request.get('sys/install/config')
} }
//业绩配置
export function getYjpzConfig() {
return request.get('sys/get_yjpz_config')
}
export function yjpzConfig(params: Record<string, any>) {
return request.post(`sys/yjpz_config`, params)
}

36
admin/src/app/lang/zh-cn/campus.campus.json

@ -1,20 +1,20 @@
{ {
"campusName": "校区名称", "campusName":"校区名称",
"campusNamePlaceholder": "请输入校区名称", "campusNamePlaceholder":"请输入校区名称",
"campusAddress": "校区地址", "campusAddress":"校区地址",
"campusAddressPlaceholder": "请输入校区地址", "campusAddressPlaceholder":"请输入校区地址",
"campusPreviewImage": "校区预览图,存储图片路径", "campusPreviewImage":"校区banner",
"campusPreviewImagePlaceholder": "请输入校区预览图,存储图片路径", "campusPreviewImagePlaceholder":"请选择图片",
"campusCoordinates": "校区坐标,格式为经度,纬度", "campusCoordinates":"校区位置",
"campusCoordinatesPlaceholder": "请输入校区坐标,格式为经度,纬度", "campusCoordinatesPlaceholder":"请选择校区位置",
"campusIntroduction": "校区介绍", "campusIntroduction":"校区介绍",
"campusIntroductionPlaceholder": "请输入校区介绍", "campusIntroductionPlaceholder":"请输入校区介绍",
"campusStatus": "校区状态", "campusStatus":"校区状态",
"campusStatusPlaceholder": "请输入校区状态", "campusStatusPlaceholder":"请输入校区状态",
"createTime": "校区创建时间", "createTime":"校区创建时间",
"addCampus": "添加校区", "addCampus":"添加校区",
"updateCampus": "编辑校区", "updateCampus":"编辑校区",
"campusDeleteTips": "确定要删除该数据吗?", "campusDeleteTips":"确定要删除该数据吗?",
"startDate": "请选择开始时间", "startDate":"请选择开始时间",
"endDate": "请选择结束时间" "endDate":"请选择结束时间"
} }

20
admin/src/app/lang/zh-cn/campus_person_role.campus_person_role.json

@ -1,20 +1,14 @@
{ {
"id":"关系编号", "id":"关系编号",
"idPlaceholder":"请输入关系编号", "idPlaceholder":"请输入关系编号",
"campusId":"校区ID", "campusId":"校区",
"campusIdPlaceholder":"请输入校区ID", "campusIdPlaceholder":"全部",
"personId":"人员ID", "personId":"人员",
"personIdPlaceholder":"请输入人员ID", "personIdPlaceholder":"全部",
"roleId":"角色ID", "roleId":"角色",
"roleIdPlaceholder":"请输入角色ID", "roleIdPlaceholder":"全部",
"deptId":"部门表", "deptId":"部门表",
"deptIdPlaceholder":"请输入部门表", "deptIdPlaceholder":"全部",
"createdAt":"创建时间",
"createdAtPlaceholder":"请输入创建时间",
"updatedAt":"更新时间",
"updatedAtPlaceholder":"请输入更新时间",
"deletedAt":"逻辑删除时间",
"deletedAtPlaceholder":"请输入逻辑删除时间",
"addCampusPersonRole":"添加角色关系", "addCampusPersonRole":"添加角色关系",
"updateCampusPersonRole":"编辑角色关系", "updateCampusPersonRole":"编辑角色关系",
"campusPersonRoleDeleteTips":"确定要删除该数据吗?", "campusPersonRoleDeleteTips":"确定要删除该数据吗?",

21
admin/src/app/lang/zh-cn/customer_resources.customer_resources.json

@ -1,22 +1,15 @@
{ {
"id":"编号",
"idPlaceholder":"请输入编号",
"createYearMonth":"创建年月",
"createYearMonthPlaceholder":"请输入创建年月",
"createDate":"创建日期",
"createDatePlaceholder":"请输入创建日期",
"sourceChannel":"来源渠道",
"sourceChannelPlaceholder":"请输入来源渠道",
"source":"来源", "source":"来源",
"sourcePlaceholder":"请输入来源", "sourcePlaceholder":"请输入来源",
"sourceChannel":"来源渠道",
"sourceChannelPlaceholder":"请输入来源渠道",
"consultant":"顾问", "consultant":"顾问",
"consultantPlaceholder":"请输入顾问",
"name":"姓名", "name":"姓名",
"namePlaceholder":"请输入姓名", "namePlaceholder":"请输入姓名",
"age":"年龄", "age":"年龄",
"agePlaceholder":"请输入年龄", "agePlaceholder":"请输入年龄",
"gender":"性别: male-男性, female-女性, other-其他", "gender":"性别",
"genderPlaceholder":"请输入性别: male-男性, female-女性, other-其他", "genderPlaceholder":"请输入性别",
"phoneNumber":"联系电话", "phoneNumber":"联系电话",
"phoneNumberPlaceholder":"请输入联系电话", "phoneNumberPlaceholder":"请输入联系电话",
"demand":"需求", "demand":"需求",
@ -31,10 +24,12 @@
"distancePlaceholder":"请输入距离", "distancePlaceholder":"请输入距离",
"decisionMaker":"决策人", "decisionMaker":"决策人",
"decisionMakerPlaceholder":"请输入决策人", "decisionMakerPlaceholder":"请输入决策人",
"initialIntent":"客户初步意向度: high-高, medium-中, low-低", "initialIntent":"客户初步意向度",
"initialIntentPlaceholder":"请输入客户初步意向度: high-高, medium-中, low-低", "initialIntentPlaceholder":"请输入客户初步意向度",
"campus":"所属校区", "campus":"所属校区",
"campusPlaceholder":"请输入所属校区", "campusPlaceholder":"请输入所属校区",
"status":"客户状态",
"statusPlaceholder":"请输入客户状态",
"addCustomerResources":"添加客户资源", "addCustomerResources":"添加客户资源",
"updateCustomerResources":"编辑客户资源", "updateCustomerResources":"编辑客户资源",
"customerResourcesDeleteTips":"确定要删除该数据吗?", "customerResourcesDeleteTips":"确定要删除该数据吗?",

4
admin/src/app/lang/zh-cn/departments.departments.json

@ -3,8 +3,8 @@
"idPlaceholder":"请输入部门编号", "idPlaceholder":"请输入部门编号",
"departmentName":"部门名称", "departmentName":"部门名称",
"departmentNamePlaceholder":"请输入部门名称", "departmentNamePlaceholder":"请输入部门名称",
"parentDepartmentId":"上级部门", "parentDepartmentId":"上级部门ID",
"parentDepartmentIdPlaceholder":"请输入上级部门", "parentDepartmentIdPlaceholder":"全部",
"addDepartments":"添加部门", "addDepartments":"添加部门",
"updateDepartments":"编辑部门", "updateDepartments":"编辑部门",
"departmentsDeleteTips":"确定要删除该数据吗?", "departmentsDeleteTips":"确定要删除该数据吗?",

13
admin/src/app/lang/zh-cn/market_performance.market_performance.json

@ -0,0 +1,13 @@
{
"personnelId":"人员",
"personnelIdPlaceholder":"请输入人员",
"campusId":"校区",
"campusIdPlaceholder":"全部",
"performanceAmount":"绩效金额",
"performanceAmountPlaceholder":"请输入绩效金额",
"addMarketPerformance":"添加市场绩效",
"updateMarketPerformance":"编辑市场绩效",
"marketPerformanceDeleteTips":"确定要删除该数据吗?",
"startDate":"请选择开始时间",
"endDate":"请选择结束时间"
}

8
admin/src/app/lang/zh-cn/six_speed_modification_log.six_speed_modification_log.json

@ -1,10 +1,10 @@
{ {
"id":"编号", "id":"编号",
"idPlaceholder":"请输入编号", "idPlaceholder":"请输入编号",
"campusId":"校区ID", "campusId":"校区",
"campusIdPlaceholder":"请输入校区ID", "campusIdPlaceholder":"全部",
"staffId":"人员ID", "staffId":"人员",
"staffIdPlaceholder":"请输入人员ID", "staffIdPlaceholder":"请输入人员",
"modifiedField":"修改的字段", "modifiedField":"修改的字段",
"modifiedFieldPlaceholder":"请输入修改的字段", "modifiedFieldPlaceholder":"请输入修改的字段",
"oldValue":"修改前的值", "oldValue":"修改前的值",

324
admin/src/app/views/campus/campus.vue

@ -1,138 +1,79 @@
<template> <template>
<div class="main-container"> <div class="main-container">
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span> <div class="flex justify-between items-center">
<el-button type="primary" @click="addEvent"> <span class="text-lg">{{pageName}}</span>
{{ t('addCampus') }} <el-button type="primary" @click="addEvent">
</el-button> {{ t('addCampus') }}
</div> </el-button>
</div>
<el-card
class="box-card !border-none my-[10px] table-search-wrap" <el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
shadow="never" <el-form :inline="true" :model="campusTable.searchParam" ref="searchFormRef">
> <el-form-item :label="t('campusName')" prop="campus_name">
<el-form <el-input v-model="campusTable.searchParam.campus_name" :placeholder="t('campusNamePlaceholder')" />
:inline="true" </el-form-item>
:model="campusTable.searchParam" <el-form-item :label="t('campusAddress')" prop="campus_address">
ref="searchFormRef" <el-input v-model="campusTable.searchParam.campus_address" :placeholder="t('campusAddressPlaceholder')" />
> </el-form-item>
<el-form-item :label="t('campusName')" prop="campus_name">
<el-input <el-form-item :label="t('campusStatus')" prop="campus_status">
v-model="campusTable.searchParam.campus_name" <el-select class="w-[280px]" v-model="campusTable.searchParam.campus_status" clearable :placeholder="t('campusStatusPlaceholder')">
:placeholder="t('campusNamePlaceholder')" <el-option label="全部" value=""></el-option>
/> <el-option
</el-form-item> v-for="(item, index) in campus_statusList"
<el-form-item :label="t('campusAddress')" prop="campus_address"> :key="index"
<el-input :label="item.name"
v-model="campusTable.searchParam.campus_address" :value="item.value"
:placeholder="t('campusAddressPlaceholder')" />
/> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('campusStatus')" prop="campus_status"> <el-form-item>
<el-select <el-button type="primary" @click="loadCampusList()">{{ t('search') }}</el-button>
class="w-[280px]" <el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
v-model="campusTable.searchParam.campus_status" </el-form-item>
clearable </el-form>
:placeholder="t('campusStatusPlaceholder')" </el-card>
>
<el-option label="全部" value=""></el-option> <div class="mt-[10px]">
<el-option <el-table :data="campusTable.data" size="large" v-loading="campusTable.loading">
v-for="(item, index) in campus_statusList" <template #empty>
:key="index" <span>{{ !campusTable.loading ? t('emptyData') : '' }}</span>
:label="item.name" </template>
:value="item.value" <el-table-column prop="campus_name" :label="t('campusName')" min-width="120" :show-overflow-tooltip="true"/>
/>
</el-select> <el-table-column prop="campus_address" :label="t('campusAddress')" min-width="120" :show-overflow-tooltip="true"/>
</el-form-item>
<el-table-column :label="t('campusStatus')" min-width="180" align="center" :show-overflow-tooltip="true">
<el-form-item> <template #default="{ row }">
<el-button type="primary" @click="loadCampusList()">{{ <div v-for="(item, index) in campus_statusList">
t('search') <div v-if="item.value == row.campus_status">{{ item.name }}</div>
}}</el-button> </div>
<el-button @click="resetForm(searchFormRef)">{{ </template>
t('reset') </el-table-column>
}}</el-button>
</el-form-item> <el-table-column prop="create_time" :label="t('createTime')" min-width="120" :show-overflow-tooltip="true"/>
</el-form>
</el-card> <el-table-column :label="t('operation')" fixed="right" min-width="120">
<template #default="{ row }">
<div class="mt-[10px]"> <el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-table <el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
:data="campusTable.data" </template>
size="large" </el-table-column>
v-loading="campusTable.loading"
> </el-table>
<template #empty> <div class="mt-[16px] flex justify-end">
<span>{{ !campusTable.loading ? t('emptyData') : '' }}</span> <el-pagination v-model:current-page="campusTable.page" v-model:page-size="campusTable.limit"
</template> layout="total, sizes, prev, pager, next, jumper" :total="campusTable.total"
<el-table-column @size-change="loadCampusList()" @current-change="loadCampusList" />
prop="campus_name"
:label="t('campusName')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="campus_address"
:label="t('campusAddress')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
:label="t('campusStatus')"
min-width="180"
align="center"
:show-overflow-tooltip="true"
>
<template #default="{ row }">
<div v-for="(item, index) in campus_statusList">
<div v-if="item.value == row.campus_status">
{{ item.name }}
</div> </div>
</div> </div>
</template>
</el-table-column> <edit ref="editCampusDialog" @complete="loadCampusList" />
</el-card>
<el-table-column </div>
prop="create_time"
:label="t('createTime')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination
v-model:current-page="campusTable.page"
v-model:page-size="campusTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="campusTable.total"
@size-change="loadCampusList()"
@current-change="loadCampusList"
/>
</div>
</div>
<edit ref="editCampusDialog" @complete="loadCampusList" />
</el-card>
</div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
@ -141,23 +82,23 @@ import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { getCampusList, deleteCampus } from '@/app/api/campus' import { getCampusList, deleteCampus } from '@/app/api/campus'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox, FormInstance } from 'element-plus' import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/campus/components/campus-edit.vue' import Edit from '@/app/views/campus/components/campus-edit.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const pageName = route.meta.title const pageName = route.meta.title;
let campusTable = reactive({ let campusTable = reactive({
page: 1, page: 1,
limit: 10, limit: 10,
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam: { searchParam:{
campus_name: '', "campus_name":"",
campus_address: '', "campus_address":"",
campus_status: '', "campus_status":""
}, }
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -166,33 +107,29 @@ const searchFormRef = ref<FormInstance>()
const selectData = ref<any[]>([]) const selectData = ref<any[]>([])
// //
const campus_statusList = ref([] as any[]) const campus_statusList = ref([] as any[])
const campus_statusDictList = async () => { const campus_statusDictList = async () => {
campus_statusList.value = await ( campus_statusList.value = await (await useDictionary('campus_status')).data.dictionary
await useDictionary('campus_status') }
).data.dictionary campus_statusDictList();
}
campus_statusDictList()
/** /**
* 获取校区列表 * 获取校区列表
*/ */
const loadCampusList = (page: number = 1) => { const loadCampusList = (page: number = 1) => {
campusTable.loading = true campusTable.loading = true
campusTable.page = page campusTable.page = page
getCampusList({ getCampusList({
page: campusTable.page, page: campusTable.page,
limit: campusTable.limit, limit: campusTable.limit,
...campusTable.searchParam, ...campusTable.searchParam
}) }).then(res => {
.then((res) => { campusTable.loading = false
campusTable.loading = false campusTable.data = res.data.data
campusTable.data = res.data.data campusTable.total = res.data.total
campusTable.total = res.data.total }).catch(() => {
}) campusTable.loading = false
.catch(() => {
campusTable.loading = false
}) })
} }
loadCampusList() loadCampusList()
@ -203,8 +140,8 @@ const editCampusDialog: Record<string, any> | null = ref(null)
* 添加校区 * 添加校区
*/ */
const addEvent = () => { const addEvent = () => {
editCampusDialog.value.setFormData() editCampusDialog.value.setFormData()
editCampusDialog.value.showDialog = true editCampusDialog.value.showDialog = true
} }
/** /**
@ -212,42 +149,45 @@ const addEvent = () => {
* @param data * @param data
*/ */
const editEvent = (data: any) => { const editEvent = (data: any) => {
editCampusDialog.value.setFormData(data) editCampusDialog.value.setFormData(data)
editCampusDialog.value.showDialog = true editCampusDialog.value.showDialog = true
} }
/** /**
* 删除校区 * 删除校区
*/ */
const deleteEvent = (id: number) => { const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('campusDeleteTips'), t('warning'), { ElMessageBox.confirm(t('campusDeleteTips'), t('warning'),
confirmButtonText: t('confirm'), {
cancelButtonText: t('cancel'), confirmButtonText: t('confirm'),
type: 'warning', cancelButtonText: t('cancel'),
}).then(() => { type: 'warning',
deleteCampus(id) }
.then(() => { ).then(() => {
loadCampusList() deleteCampus(id).then(() => {
}) loadCampusList()
.catch(() => {}) }).catch(() => {
}) })
})
} }
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
formEl.resetFields() formEl.resetFields()
loadCampusList() loadCampusList()
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
/* 多行超出隐藏 */ /* 多行超出隐藏 */
.multi-hidden { .multi-hidden {
word-break: break-all; word-break: break-all;
text-overflow: ellipsis; text-overflow: ellipsis;
overflow: hidden; overflow: hidden;
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
} }
</style> </style>

8
admin/src/app/views/campus/components/campus-edit.vue

@ -37,12 +37,7 @@
</el-form-item> </el-form-item>
<el-form-item :label="t('campusCoordinates')"> <el-form-item :label="t('campusCoordinates')">
<el-input <TencentMapPicker v-model="formData.campus_coordinates" />
v-model="formData.campus_coordinates"
clearable
:placeholder="t('campusCoordinatesPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('campusIntroduction')"> <el-form-item :label="t('campusIntroduction')">
@ -84,6 +79,7 @@ import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang' import { t } from '@/lang'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { addCampus, editCampus, getCampusInfo } from '@/app/api/campus' import { addCampus, editCampus, getCampusInfo } from '@/app/api/campus'
import TencentMapPicker from '@/components/TencentMapPicker.vue'
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)

94
admin/src/app/views/campus_person_role/campus_person_role.vue

@ -11,27 +11,54 @@
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="campusPersonRoleTable.searchParam" ref="searchFormRef"> <el-form :inline="true" :model="campusPersonRoleTable.searchParam" ref="searchFormRef">
<el-form-item :label="t('campusId')" prop="campus_id"> <el-form-item :label="t('campusId')" prop="campus_id">
<el-input v-model="campusPersonRoleTable.searchParam.campus_id" :placeholder="t('campusIdPlaceholder')" /> <el-select class="w-[280px]" v-model="campusPersonRoleTable.searchParam.campus_id" clearable :placeholder="t('campusIdPlaceholder')">
<el-option
v-for="(item, index) in campusIdList"
:key="index"
:label="item['campus_name']"
:value="item['id']"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('personId')" prop="person_id"> <el-form-item :label="t('personId')" prop="person_id">
<el-input v-model="campusPersonRoleTable.searchParam.person_id" :placeholder="t('personIdPlaceholder')" /> <el-select class="w-[280px]" v-model="campusPersonRoleTable.searchParam.person_id" clearable :placeholder="t('personIdPlaceholder')">
<el-option
v-for="(item, index) in personIdList"
:key="index"
:label="item['name']"
:value="item['id']"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('roleId')" prop="role_id"> <el-form-item :label="t('roleId')" prop="role_id">
<el-input v-model="campusPersonRoleTable.searchParam.role_id" :placeholder="t('roleIdPlaceholder')" /> <el-select class="w-[280px]" v-model="campusPersonRoleTable.searchParam.role_id" clearable :placeholder="t('roleIdPlaceholder')">
<el-option
v-for="(item, index) in roleIdList"
:key="index"
:label="item['role_name']"
:value="item['role_id']"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('deptId')" prop="dept_id"> <el-form-item :label="t('deptId')" prop="dept_id">
<el-input v-model="campusPersonRoleTable.searchParam.dept_id" :placeholder="t('deptIdPlaceholder')" /> <el-select class="w-[280px]" v-model="campusPersonRoleTable.searchParam.dept_id" clearable :placeholder="t('deptIdPlaceholder')">
</el-form-item> <el-option
<el-form-item :label="t('createdAt')" prop="created_at"> v-for="(item, index) in deptIdList"
<el-input v-model="campusPersonRoleTable.searchParam.created_at" :placeholder="t('createdAtPlaceholder')" /> :key="index"
</el-form-item> :label="item['department_name']"
<el-form-item :label="t('updatedAt')" prop="updated_at"> :value="item['id']"
<el-input v-model="campusPersonRoleTable.searchParam.updated_at" :placeholder="t('updatedAtPlaceholder')" /> />
</el-form-item> </el-select>
<el-form-item :label="t('deletedAt')" prop="deleted_at">
<el-input v-model="campusPersonRoleTable.searchParam.deleted_at" :placeholder="t('deletedAtPlaceholder')" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadCampusPersonRoleList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadCampusPersonRoleList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> <el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
@ -44,19 +71,13 @@
<template #empty> <template #empty>
<span>{{ !campusPersonRoleTable.loading ? t('emptyData') : '' }}</span> <span>{{ !campusPersonRoleTable.loading ? t('emptyData') : '' }}</span>
</template> </template>
<el-table-column prop="campus_id" :label="t('campusId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column prop="campus_id_name" :label="t('campusId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="person_id" :label="t('personId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="role_id" :label="t('roleId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="dept_id" :label="t('deptId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="created_at" :label="t('createdAt')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column prop="person_id_name" :label="t('personId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="updated_at" :label="t('updatedAt')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column prop="role_id_name" :label="t('roleId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="deleted_at" :label="t('deletedAt')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column prop="dept_id_name" :label="t('deptId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column :label="t('operation')" fixed="right" min-width="120"> <el-table-column :label="t('operation')" fixed="right" min-width="120">
<template #default="{ row }"> <template #default="{ row }">
@ -82,7 +103,7 @@
import { reactive, ref, watch } from 'vue' import { reactive, ref, watch } from 'vue'
import { t } from '@/lang' import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { getCampusPersonRoleList, deleteCampusPersonRole } from '@/app/api/campus_person_role' import { getCampusPersonRoleList, deleteCampusPersonRole, getWithCampusList, getWithPersonnelList, getWithSysRoleList, getWithDepartmentsList } from '@/app/api/campus_person_role'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus' import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/campus_person_role/components/campus-person-role-edit.vue' import Edit from '@/app/views/campus_person_role/components/campus-person-role-edit.vue'
@ -100,10 +121,7 @@ let campusPersonRoleTable = reactive({
"campus_id":"", "campus_id":"",
"person_id":"", "person_id":"",
"role_id":"", "role_id":"",
"dept_id":"", "dept_id":""
"created_at":"",
"updated_at":"",
"deleted_at":""
} }
}) })
@ -174,6 +192,26 @@ const deleteEvent = (id: number) => {
} }
const campusIdList = ref([])
const setCampusIdList = async () => {
campusIdList.value = await (await getWithCampusList({})).data
}
setCampusIdList()
const personIdList = ref([])
const setPersonIdList = async () => {
personIdList.value = await (await getWithPersonnelList({})).data
}
setPersonIdList()
const roleIdList = ref([])
const setRoleIdList = async () => {
roleIdList.value = await (await getWithSysRoleList({})).data
}
setRoleIdList()
const deptIdList = ref([])
const setDeptIdList = async () => {
deptIdList.value = await (await getWithDepartmentsList({})).data
}
setDeptIdList()
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return

92
admin/src/app/views/campus_person_role/components/campus-person-role-edit.vue

@ -2,31 +2,51 @@
<el-dialog v-model="showDialog" :title="formData.id ? t('updateCampusPersonRole') : t('addCampusPersonRole')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true"> <el-dialog v-model="showDialog" :title="formData.id ? t('updateCampusPersonRole') : t('addCampusPersonRole')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true">
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading"> <el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
<el-form-item :label="t('campusId')" prop="campus_id"> <el-form-item :label="t('campusId')" prop="campus_id">
<el-input v-model="formData.campus_id" clearable :placeholder="t('campusIdPlaceholder')" class="input-width" /> <el-select class="input-width" v-model="formData.campus_id" clearable :placeholder="t('campusIdPlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in campusIdList"
:key="index"
:label="item['campus_name']"
:value="item['id']"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('personId')" prop="person_id"> <el-form-item :label="t('personId')" prop="person_id">
<el-input v-model="formData.person_id" clearable :placeholder="t('personIdPlaceholder')" class="input-width" /> <el-select class="input-width" v-model="formData.person_id" clearable :placeholder="t('personIdPlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in personIdList"
:key="index"
:label="item['name']"
:value="item['id']"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('roleId')" prop="role_id"> <el-form-item :label="t('roleId')" prop="role_id">
<el-input v-model="formData.role_id" clearable :placeholder="t('roleIdPlaceholder')" class="input-width" /> <el-select class="input-width" v-model="formData.role_id" clearable :placeholder="t('roleIdPlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in roleIdList"
:key="index"
:label="item['role_name']"
:value="item['role_id']"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('deptId')" > <el-form-item :label="t('deptId')" >
<el-input v-model="formData.dept_id" clearable :placeholder="t('deptIdPlaceholder')" class="input-width" /> <el-select class="input-width" v-model="formData.dept_id" clearable :placeholder="t('deptIdPlaceholder')">
</el-form-item> <el-option label="请选择" value=""></el-option>
<el-option
<el-form-item :label="t('createdAt')" > v-for="(item, index) in deptIdList"
<el-input v-model="formData.created_at" clearable :placeholder="t('createdAtPlaceholder')" class="input-width" /> :key="index"
</el-form-item> :label="item['department_name']"
:value="item['id']"
<el-form-item :label="t('updatedAt')" > />
<el-input v-model="formData.updated_at" clearable :placeholder="t('updatedAtPlaceholder')" class="input-width" /> </el-select>
</el-form-item>
<el-form-item :label="t('deletedAt')" >
<el-input v-model="formData.deleted_at" clearable :placeholder="t('deletedAtPlaceholder')" class="input-width" />
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -47,7 +67,7 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang' import { t } from '@/lang'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { addCampusPersonRole, editCampusPersonRole, getCampusPersonRoleInfo } from '@/app/api/campus_person_role' import { addCampusPersonRole, editCampusPersonRole, getCampusPersonRoleInfo, getWithCampusList, getWithPersonnelList, getWithSysRoleList, getWithDepartmentsList } from '@/app/api/campus_person_role'
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -61,9 +81,6 @@ const initialFormData = {
person_id: '', person_id: '',
role_id: '', role_id: '',
dept_id: '', dept_id: '',
created_at: '',
updated_at: '',
deleted_at: '',
} }
const formData: Record<string, any> = reactive({ ...initialFormData }) const formData: Record<string, any> = reactive({ ...initialFormData })
@ -90,21 +107,6 @@ const formRules = computed(() => {
dept_id: [ dept_id: [
{ required: true, message: t('deptIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('deptIdPlaceholder'), trigger: 'blur' },
]
,
created_at: [
{ required: true, message: t('createdAtPlaceholder'), trigger: 'blur' },
]
,
updated_at: [
{ required: true, message: t('updatedAtPlaceholder'), trigger: 'blur' },
]
,
deleted_at: [
{ required: true, message: t('deletedAtPlaceholder'), trigger: 'blur' },
] ]
, ,
} }
@ -141,6 +143,26 @@ const confirm = async (formEl: FormInstance | undefined) => {
const campusIdList = ref([] as any[])
const setCampusIdList = async () => {
campusIdList.value = await (await getWithCampusList({})).data
}
setCampusIdList()
const personIdList = ref([] as any[])
const setPersonIdList = async () => {
personIdList.value = await (await getWithPersonnelList({})).data
}
setPersonIdList()
const roleIdList = ref([] as any[])
const setRoleIdList = async () => {
roleIdList.value = await (await getWithSysRoleList({})).data
}
setRoleIdList()
const deptIdList = ref([] as any[])
const setDeptIdList = async () => {
deptIdList.value = await (await getWithDepartmentsList({})).data
}
setDeptIdList()
const setFormData = async (row: any = null) => { const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
loading.value = true loading.value = true

212
admin/src/app/views/customer_resources/components/customer-resources-edit.vue

@ -1,24 +1,28 @@
<template> <template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateCustomerResources') : t('addCustomerResources')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true"> <el-dialog v-model="showDialog" :title="formData.id ? t('updateCustomerResources') : t('addCustomerResources')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true">
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading"> <el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
<el-form-item :label="t('createYearMonth')" prop="create_year_month">
<el-input v-model="formData.create_year_month" clearable :placeholder="t('createYearMonthPlaceholder')" class="input-width" />
</el-form-item>
<el-form-item :label="t('createDate')" prop="create_date">
<el-input v-model="formData.create_date" clearable :placeholder="t('createDatePlaceholder')" class="input-width" />
</el-form-item>
<el-form-item :label="t('sourceChannel')" prop="source_channel">
<el-input v-model="formData.source_channel" clearable :placeholder="t('sourceChannelPlaceholder')" class="input-width" />
</el-form-item>
<el-form-item :label="t('source')" prop="source"> <el-form-item :label="t('source')" prop="source">
<el-input v-model="formData.source" clearable :placeholder="t('sourcePlaceholder')" class="input-width" /> <el-select class="input-width" v-model="formData.source" clearable :placeholder="t('sourcePlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in sourceList"
:key="index"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('consultant')" prop="consultant"> <el-form-item :label="t('sourceChannel')" v-if="formData.source == 1">
<el-input v-model="formData.consultant" clearable :placeholder="t('consultantPlaceholder')" class="input-width" /> <el-select class="input-width" v-model="formData.source_channel" clearable :placeholder="t('sourceChannelPlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in source_channelList"
:key="index"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('name')" prop="name"> <el-form-item :label="t('name')" prop="name">
@ -26,11 +30,19 @@
</el-form-item> </el-form-item>
<el-form-item :label="t('age')" prop="age"> <el-form-item :label="t('age')" prop="age">
<el-input v-model="formData.age" clearable :placeholder="t('agePlaceholder')" class="input-width" /> <el-input-number v-model="formData.age" clearable :placeholder="t('agePlaceholder')" class="input-width" :min = "3" :max = "80" />
</el-form-item> </el-form-item>
<el-form-item :label="t('gender')" prop="gender"> <el-form-item :label="t('gender')" prop="gender">
<el-input v-model="formData.gender" clearable :placeholder="t('genderPlaceholder')" class="input-width" /> <el-select class="input-width" v-model="formData.gender" clearable :placeholder="t('genderPlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in genderList"
:key="index"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('phoneNumber')" prop="phone_number"> <el-form-item :label="t('phoneNumber')" prop="phone_number">
@ -38,21 +50,42 @@
</el-form-item> </el-form-item>
<el-form-item :label="t('demand')" prop="demand"> <el-form-item :label="t('demand')" prop="demand">
<el-input v-model="formData.demand" clearable :placeholder="t('demandPlaceholder')" class="input-width" /> <el-input v-model="formData.demand" type="textarea" rows="4" clearable :placeholder="t('demandPlaceholder')" class="input-width"/>
</el-form-item> </el-form-item>
<el-form-item :label="t('purchasingPower')" prop="purchasing_power"> <el-form-item :label="t('purchasingPower')" prop="purchasing_power">
<el-input v-model="formData.purchasing_power" clearable :placeholder="t('purchasingPowerPlaceholder')" class="input-width" /> <el-select class="input-width" v-model="formData.purchasing_power" clearable :placeholder="t('purchasingPowerPlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in purchasing_powerList"
:key="index"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('cognitiveIdea')" prop="cognitive_idea"> <el-form-item :label="t('cognitiveIdea')" prop="cognitive_idea">
<el-input v-model="formData.cognitive_idea" clearable :placeholder="t('cognitiveIdeaPlaceholder')" class="input-width" /> <el-select class="input-width" v-model="formData.cognitive_idea" clearable :placeholder="t('cognitiveIdeaPlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in cognitive_ideaList"
:key="index"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('optionalClassTime')" prop="optional_class_time"> <el-form-item :label="t('optionalClassTime')" prop="optional_class_time" class="input-width">
<el-input v-model="formData.optional_class_time" clearable :placeholder="t('optionalClassTimePlaceholder')" class="input-width" /> <el-date-picker
class="flex-1 !flex"
v-model="formData.optional_class_time"
clearable
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
:placeholder="t('optionalClassTimePlaceholder')">
</el-date-picker>
</el-form-item> </el-form-item>
<el-form-item :label="t('distance')" prop="distance"> <el-form-item :label="t('distance')" prop="distance">
<el-input v-model="formData.distance" clearable :placeholder="t('distancePlaceholder')" class="input-width" /> <el-input v-model="formData.distance" clearable :placeholder="t('distancePlaceholder')" class="input-width" />
</el-form-item> </el-form-item>
@ -62,11 +95,39 @@
</el-form-item> </el-form-item>
<el-form-item :label="t('initialIntent')" prop="initial_intent"> <el-form-item :label="t('initialIntent')" prop="initial_intent">
<el-input v-model="formData.initial_intent" clearable :placeholder="t('initialIntentPlaceholder')" class="input-width" /> <el-select class="input-width" v-model="formData.initial_intent" clearable :placeholder="t('initialIntentPlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in initial_intentList"
:key="index"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('campus')" prop="campus"> <el-form-item :label="t('campus')" prop="campus">
<el-input v-model="formData.campus" clearable :placeholder="t('campusPlaceholder')" class="input-width" /> <el-select class="input-width" v-model="formData.campus" clearable :placeholder="t('campusPlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in campusList"
:key="index"
:label="item['campus_name']"
:value="item['campus_name']"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('status')" prop="status">
<el-select class="input-width" v-model="formData.status" clearable :placeholder="t('statusPlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in statusList"
:key="index"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -87,7 +148,7 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang' import { t } from '@/lang'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { addCustomerResources, editCustomerResources, getCustomerResourcesInfo } from '@/app/api/customer_resources' import { addCustomerResources, editCustomerResources, getCustomerResourcesInfo, getWithCampusList } from '@/app/api/customer_resources'
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -97,11 +158,8 @@ const loading = ref(false)
*/ */
const initialFormData = { const initialFormData = {
id: '', id: '',
create_year_month: '',
create_date: '',
source_channel: '',
source: '', source: '',
consultant: '', source_channel: '',
name: '', name: '',
age: '', age: '',
gender: '', gender: '',
@ -114,6 +172,7 @@ const initialFormData = {
decision_maker: '', decision_maker: '',
initial_intent: '', initial_intent: '',
campus: '', campus: '',
status: '',
} }
const formData: Record<string, any> = reactive({ ...initialFormData }) const formData: Record<string, any> = reactive({ ...initialFormData })
@ -122,28 +181,13 @@ const formRef = ref<FormInstance>()
// //
const formRules = computed(() => { const formRules = computed(() => {
return { return {
create_year_month: [
{ required: true, message: t('createYearMonthPlaceholder'), trigger: 'blur' },
]
,
create_date: [
{ required: true, message: t('createDatePlaceholder'), trigger: 'blur' },
]
,
source_channel: [
{ required: true, message: t('sourceChannelPlaceholder'), trigger: 'blur' },
]
,
source: [ source: [
{ required: true, message: t('sourcePlaceholder'), trigger: 'blur' }, { required: true, message: t('sourcePlaceholder'), trigger: 'blur' },
] ]
, ,
consultant: [ source_channel: [
{ required: true, message: t('consultantPlaceholder'), trigger: 'blur' }, { required: true, message: t('sourceChannelPlaceholder'), trigger: 'blur' },
] ]
, ,
@ -152,10 +196,21 @@ const formRules = computed(() => {
] ]
, ,
age: [ age: [
{ required: true, message: t('agePlaceholder'), trigger: 'blur' }, { required: true, message: t('agePlaceholder'), trigger: 'blur' },
{
] validator: (rule: any, value: number, callback: any) => {
if (value === undefined || value === null || value === '') {
callback();
} else if (value < 3 || value > 80) {
callback(new Error(t('generateBetween')));
} else {
callback();
}
},
trigger: 'blur'
}
]
, ,
gender: [ gender: [
{ required: true, message: t('genderPlaceholder'), trigger: 'blur' }, { required: true, message: t('genderPlaceholder'), trigger: 'blur' },
@ -205,6 +260,11 @@ const formRules = computed(() => {
campus: [ campus: [
{ required: true, message: t('campusPlaceholder'), trigger: 'blur' }, { required: true, message: t('campusPlaceholder'), trigger: 'blur' },
]
,
status: [
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' },
] ]
, ,
} }
@ -238,9 +298,55 @@ const confirm = async (formEl: FormInstance | undefined) => {
} }
// //
let sourceList = ref([])
const sourceDictList = async () => {
sourceList.value = await (await useDictionary('source')).data.dictionary
}
sourceDictList();
watch(() => sourceList.value, () => { formData.source = sourceList.value[0].value })
let source_channelList = ref([])
const source_channelDictList = async () => {
source_channelList.value = await (await useDictionary('SourceChannel')).data.dictionary
}
source_channelDictList();
watch(() => source_channelList.value, () => { formData.source_channel = source_channelList.value[0].value })
let genderList = ref([])
const genderDictList = async () => {
genderList.value = await (await useDictionary('zy_sex')).data.dictionary
}
genderDictList();
watch(() => genderList.value, () => { formData.gender = genderList.value[0].value })
let purchasing_powerList = ref([])
const purchasing_powerDictList = async () => {
purchasing_powerList.value = await (await useDictionary('customer_purchasing_power')).data.dictionary
}
purchasing_powerDictList();
watch(() => purchasing_powerList.value, () => { formData.purchasing_power = purchasing_powerList.value[0].value })
let cognitive_ideaList = ref([])
const cognitive_ideaDictList = async () => {
cognitive_ideaList.value = await (await useDictionary('cognitive_concept')).data.dictionary
}
cognitive_ideaDictList();
watch(() => cognitive_ideaList.value, () => { formData.cognitive_idea = cognitive_ideaList.value[0].value })
let initial_intentList = ref([])
const initial_intentDictList = async () => {
initial_intentList.value = await (await useDictionary('preliminarycustomerintention')).data.dictionary
}
initial_intentDictList();
watch(() => initial_intentList.value, () => { formData.initial_intent = initial_intentList.value[0].value })
let statusList = ref([])
const statusDictList = async () => {
statusList.value = await (await useDictionary('kh_status')).data.dictionary
}
statusDictList();
watch(() => statusList.value, () => { formData.status = statusList.value[0].value })
const campusList = ref([] as any[])
const setCampusList = async () => {
campusList.value = await (await getWithCampusList({})).data
}
setCampusList()
const setFormData = async (row: any = null) => { const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
loading.value = true loading.value = true

141
admin/src/app/views/customer_resources/customer_resources.vue

@ -11,57 +11,12 @@
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="customerResourcesTable.searchParam" ref="searchFormRef"> <el-form :inline="true" :model="customerResourcesTable.searchParam" ref="searchFormRef">
<el-form-item :label="t('createYearMonth')" prop="create_year_month">
<el-input v-model="customerResourcesTable.searchParam.create_year_month" :placeholder="t('createYearMonthPlaceholder')" />
</el-form-item>
<el-form-item :label="t('createDate')" prop="create_date">
<el-input v-model="customerResourcesTable.searchParam.create_date" :placeholder="t('createDatePlaceholder')" />
</el-form-item>
<el-form-item :label="t('sourceChannel')" prop="source_channel">
<el-input v-model="customerResourcesTable.searchParam.source_channel" :placeholder="t('sourceChannelPlaceholder')" />
</el-form-item>
<el-form-item :label="t('source')" prop="source">
<el-input v-model="customerResourcesTable.searchParam.source" :placeholder="t('sourcePlaceholder')" />
</el-form-item>
<el-form-item :label="t('consultant')" prop="consultant">
<el-input v-model="customerResourcesTable.searchParam.consultant" :placeholder="t('consultantPlaceholder')" />
</el-form-item>
<el-form-item :label="t('name')" prop="name"> <el-form-item :label="t('name')" prop="name">
<el-input v-model="customerResourcesTable.searchParam.name" :placeholder="t('namePlaceholder')" /> <el-input v-model="customerResourcesTable.searchParam.name" :placeholder="t('namePlaceholder')" />
</el-form-item> </el-form-item>
<el-form-item :label="t('age')" prop="age">
<el-input v-model="customerResourcesTable.searchParam.age" :placeholder="t('agePlaceholder')" />
</el-form-item>
<el-form-item :label="t('gender')" prop="gender">
<el-input v-model="customerResourcesTable.searchParam.gender" :placeholder="t('genderPlaceholder')" />
</el-form-item>
<el-form-item :label="t('phoneNumber')" prop="phone_number"> <el-form-item :label="t('phoneNumber')" prop="phone_number">
<el-input v-model="customerResourcesTable.searchParam.phone_number" :placeholder="t('phoneNumberPlaceholder')" /> <el-input v-model="customerResourcesTable.searchParam.phone_number" :placeholder="t('phoneNumberPlaceholder')" />
</el-form-item> </el-form-item>
<el-form-item :label="t('demand')" prop="demand">
<el-input v-model="customerResourcesTable.searchParam.demand" :placeholder="t('demandPlaceholder')" />
</el-form-item>
<el-form-item :label="t('purchasingPower')" prop="purchasing_power">
<el-input v-model="customerResourcesTable.searchParam.purchasing_power" :placeholder="t('purchasingPowerPlaceholder')" />
</el-form-item>
<el-form-item :label="t('cognitiveIdea')" prop="cognitive_idea">
<el-input v-model="customerResourcesTable.searchParam.cognitive_idea" :placeholder="t('cognitiveIdeaPlaceholder')" />
</el-form-item>
<el-form-item :label="t('optionalClassTime')" prop="optional_class_time">
<el-input v-model="customerResourcesTable.searchParam.optional_class_time" :placeholder="t('optionalClassTimePlaceholder')" />
</el-form-item>
<el-form-item :label="t('distance')" prop="distance">
<el-input v-model="customerResourcesTable.searchParam.distance" :placeholder="t('distancePlaceholder')" />
</el-form-item>
<el-form-item :label="t('decisionMaker')" prop="decision_maker">
<el-input v-model="customerResourcesTable.searchParam.decision_maker" :placeholder="t('decisionMakerPlaceholder')" />
</el-form-item>
<el-form-item :label="t('initialIntent')" prop="initial_intent">
<el-input v-model="customerResourcesTable.searchParam.initial_intent" :placeholder="t('initialIntentPlaceholder')" />
</el-form-item>
<el-form-item :label="t('campus')" prop="campus">
<el-input v-model="customerResourcesTable.searchParam.campus" :placeholder="t('campusPlaceholder')" />
</el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadCustomerResourcesList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadCustomerResourcesList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> <el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
@ -74,13 +29,13 @@
<template #empty> <template #empty>
<span>{{ !customerResourcesTable.loading ? t('emptyData') : '' }}</span> <span>{{ !customerResourcesTable.loading ? t('emptyData') : '' }}</span>
</template> </template>
<el-table-column prop="create_year_month" :label="t('createYearMonth')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column :label="t('source')" min-width="180" align="center" :show-overflow-tooltip="true">
<template #default="{ row }">
<el-table-column prop="create_date" :label="t('createDate')" min-width="120" :show-overflow-tooltip="true"/> <div v-for="(item, index) in sourceList">
<div v-if="item.value == row.source">{{ item.name }}</div>
<el-table-column prop="source_channel" :label="t('sourceChannel')" min-width="120" :show-overflow-tooltip="true"/> </div>
</template>
<el-table-column prop="source" :label="t('source')" min-width="120" :show-overflow-tooltip="true"/> </el-table-column>
<el-table-column prop="consultant" :label="t('consultant')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column prop="consultant" :label="t('consultant')" min-width="120" :show-overflow-tooltip="true"/>
@ -88,26 +43,18 @@
<el-table-column prop="age" :label="t('age')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column prop="age" :label="t('age')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="gender" :label="t('gender')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column :label="t('gender')" min-width="180" align="center" :show-overflow-tooltip="true">
<template #default="{ row }">
<div v-for="(item, index) in genderList">
<div v-if="item.value == row.gender">{{ item.name }}</div>
</div>
</template>
</el-table-column>
<el-table-column prop="phone_number" :label="t('phoneNumber')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column prop="phone_number" :label="t('phoneNumber')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="demand" :label="t('demand')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="purchasing_power" :label="t('purchasingPower')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="cognitive_idea" :label="t('cognitiveIdea')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="optional_class_time" :label="t('optionalClassTime')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="distance" :label="t('distance')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="decision_maker" :label="t('decisionMaker')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column prop="decision_maker" :label="t('decisionMaker')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="initial_intent" :label="t('initialIntent')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="campus" :label="t('campus')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column :label="t('operation')" fixed="right" min-width="120"> <el-table-column :label="t('operation')" fixed="right" min-width="120">
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button> <el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
@ -132,7 +79,7 @@
import { reactive, ref, watch } from 'vue' import { reactive, ref, watch } from 'vue'
import { t } from '@/lang' import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { getCustomerResourcesList, deleteCustomerResources } from '@/app/api/customer_resources' import { getCustomerResourcesList, deleteCustomerResources, getWithCampusList } from '@/app/api/customer_resources'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus' import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/customer_resources/components/customer-resources-edit.vue' import Edit from '@/app/views/customer_resources/components/customer-resources-edit.vue'
@ -147,23 +94,8 @@ let customerResourcesTable = reactive({
loading: true, loading: true,
data: [], data: [],
searchParam:{ searchParam:{
"create_year_month":"",
"create_date":"",
"source_channel":"",
"source":"",
"consultant":"",
"name":"", "name":"",
"age":"", "phone_number":""
"gender":"",
"phone_number":"",
"demand":"",
"purchasing_power":"",
"cognitive_idea":"",
"optional_class_time":"",
"distance":"",
"decision_maker":"",
"initial_intent":"",
"campus":""
} }
}) })
@ -173,7 +105,41 @@ const searchFormRef = ref<FormInstance>()
const selectData = ref<any[]>([]) const selectData = ref<any[]>([])
// //
const sourceList = ref([] as any[])
const sourceDictList = async () => {
sourceList.value = await (await useDictionary('source')).data.dictionary
}
sourceDictList();
const source_channelList = ref([] as any[])
const source_channelDictList = async () => {
source_channelList.value = await (await useDictionary('SourceChannel')).data.dictionary
}
source_channelDictList();
const genderList = ref([] as any[])
const genderDictList = async () => {
genderList.value = await (await useDictionary('zy_sex')).data.dictionary
}
genderDictList();
const purchasing_powerList = ref([] as any[])
const purchasing_powerDictList = async () => {
purchasing_powerList.value = await (await useDictionary('customer_purchasing_power')).data.dictionary
}
purchasing_powerDictList();
const cognitive_ideaList = ref([] as any[])
const cognitive_ideaDictList = async () => {
cognitive_ideaList.value = await (await useDictionary('cognitive_concept')).data.dictionary
}
cognitive_ideaDictList();
const initial_intentList = ref([] as any[])
const initial_intentDictList = async () => {
initial_intentList.value = await (await useDictionary('preliminarycustomerintention')).data.dictionary
}
initial_intentDictList();
const statusList = ref([] as any[])
const statusDictList = async () => {
statusList.value = await (await useDictionary('kh_status')).data.dictionary
}
statusDictList();
/** /**
* 获取客户资源列表 * 获取客户资源列表
@ -234,6 +200,11 @@ const deleteEvent = (id: number) => {
} }
const campusList = ref([])
const setCampusList = async () => {
campusList.value = await (await getWithCampusList({})).data
}
setCampusList()
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return

17
admin/src/app/views/departments/components/departments-edit.vue

@ -6,7 +6,15 @@
</el-form-item> </el-form-item>
<el-form-item :label="t('parentDepartmentId')" > <el-form-item :label="t('parentDepartmentId')" >
<el-input v-model="formData.parent_department_id" clearable :placeholder="t('parentDepartmentIdPlaceholder')" class="input-width" /> <el-select class="input-width" v-model="formData.parent_department_id" clearable :placeholder="t('parentDepartmentIdPlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in parentDepartmentIdList"
:key="index"
:label="item['department_name']"
:value="item['id']"
/>
</el-select>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -27,7 +35,7 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang' import { t } from '@/lang'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { addDepartments, editDepartments, getDepartmentsInfo } from '@/app/api/departments' import { addDepartments, editDepartments, getDepartmentsInfo, getWithDepartmentsList } from '@/app/api/departments'
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -91,6 +99,11 @@ const confirm = async (formEl: FormInstance | undefined) => {
const parentDepartmentIdList = ref([] as any[])
const setParentDepartmentIdList = async () => {
parentDepartmentIdList.value = await (await getWithDepartmentsList({})).data
}
setParentDepartmentIdList()
const setFormData = async (row: any = null) => { const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
loading.value = true loading.value = true

20
admin/src/app/views/departments/departments.vue

@ -14,9 +14,18 @@
<el-form-item :label="t('departmentName')" prop="department_name"> <el-form-item :label="t('departmentName')" prop="department_name">
<el-input v-model="departmentsTable.searchParam.department_name" :placeholder="t('departmentNamePlaceholder')" /> <el-input v-model="departmentsTable.searchParam.department_name" :placeholder="t('departmentNamePlaceholder')" />
</el-form-item> </el-form-item>
<el-form-item :label="t('parentDepartmentId')" prop="parent_department_id"> <el-form-item :label="t('parentDepartmentId')" prop="parent_department_id">
<el-input v-model="departmentsTable.searchParam.parent_department_id" :placeholder="t('parentDepartmentIdPlaceholder')" /> <el-select class="w-[280px]" v-model="departmentsTable.searchParam.parent_department_id" clearable :placeholder="t('parentDepartmentIdPlaceholder')">
<el-option
v-for="(item, index) in parentDepartmentIdList"
:key="index"
:label="item['department_name']"
:value="item['id']"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadDepartmentsList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadDepartmentsList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> <el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
@ -31,7 +40,7 @@
</template> </template>
<el-table-column prop="department_name" :label="t('departmentName')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column prop="department_name" :label="t('departmentName')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="parent_department_id" :label="t('parentDepartmentId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column prop="parent_department_id_name" :label="t('parentDepartmentId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column :label="t('operation')" fixed="right" min-width="120"> <el-table-column :label="t('operation')" fixed="right" min-width="120">
<template #default="{ row }"> <template #default="{ row }">
@ -57,7 +66,7 @@
import { reactive, ref, watch } from 'vue' import { reactive, ref, watch } from 'vue'
import { t } from '@/lang' import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { getDepartmentsList, deleteDepartments } from '@/app/api/departments' import { getDepartmentsList, deleteDepartments, getWithDepartmentsList } from '@/app/api/departments'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus' import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/departments/components/departments-edit.vue' import Edit from '@/app/views/departments/components/departments-edit.vue'
@ -144,6 +153,11 @@ const deleteEvent = (id: number) => {
} }
const parentDepartmentIdList = ref([])
const setParentDepartmentIdList = async () => {
parentDepartmentIdList.value = await (await getWithDepartmentsList({})).data
}
setParentDepartmentIdList()
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return

189
admin/src/app/views/market_performance/components/market-performance-edit.vue

@ -0,0 +1,189 @@
<template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateMarketPerformance') : t('addMarketPerformance')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true">
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
<el-form-item :label="t('personnelId')" >
<el-select class="input-width" v-model="formData.personnel_id" clearable :placeholder="t('personnelIdPlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in personnelIdList"
:key="index"
:label="item['name']"
:value="item['id']"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('campusId')" >
<el-select class="input-width" v-model="formData.campus_id" clearable :placeholder="t('campusIdPlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in campusIdList"
:key="index"
:label="item['campus_name']"
:value="item['id']"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('performanceAmount')" >
<el-input v-model="formData.performance_amount" clearable :placeholder="t('performanceAmountPlaceholder')" class="input-width" />
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
</span>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
import type { FormInstance } from 'element-plus'
import { addMarketPerformance, editMarketPerformance, getMarketPerformanceInfo, getWithPersonnelList, getWithCampusList } from '@/app/api/market_performance'
let showDialog = ref(false)
const loading = ref(false)
/**
* 表单数据
*/
const initialFormData = {
id: '',
personnel_id: '',
campus_id: '',
performance_amount: '',
}
const formData: Record<string, any> = reactive({ ...initialFormData })
const formRef = ref<FormInstance>()
//
const formRules = computed(() => {
return {
personnel_id: [
{ required: true, message: t('personnelIdPlaceholder'), trigger: 'blur' },
]
,
campus_id: [
{ required: true, message: t('campusIdPlaceholder'), trigger: 'blur' },
]
,
performance_amount: [
{ required: true, message: t('performanceAmountPlaceholder'), trigger: 'blur' },
]
,
}
})
const emit = defineEmits(['complete'])
/**
* 确认
* @param formEl
*/
const confirm = async (formEl: FormInstance | undefined) => {
if (loading.value || !formEl) return
let save = formData.id ? editMarketPerformance : addMarketPerformance
await formEl.validate(async (valid) => {
if (valid) {
loading.value = true
let data = formData
save(data).then(res => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
loading.value = false
})
}
})
}
//
const personnelIdList = ref([] as any[])
const setPersonnelIdList = async () => {
personnelIdList.value = await (await getWithPersonnelList({})).data
}
setPersonnelIdList()
const campusIdList = ref([] as any[])
const setCampusIdList = async () => {
campusIdList.value = await (await getWithCampusList({})).data
}
setCampusIdList()
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if(row){
const data = await (await getMarketPerformanceInfo(row.id)).data
if (data) Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key]
})
}
loading.value = false
}
//
const mobileVerify = (rule: any, value: any, callback: any) => {
if (value && !/^1[3-9]\d{9}$/.test(value)) {
callback(new Error(t('generateMobile')))
} else {
callback()
}
}
//
const idCardVerify = (rule: any, value: any, callback: any) => {
if (value && !/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value)) {
callback(new Error(t('generateIdCard')))
} else {
callback()
}
}
//
const emailVerify = (rule: any, value: any, callback: any) => {
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) {
callback(new Error(t('generateEmail')))
} else {
callback()
}
}
//
const numberVerify = (rule: any, value: any, callback: any) => {
if (!Number.isInteger(value)) {
callback(new Error(t('generateNumber')))
} else {
callback()
}
}
defineExpose({
showDialog,
setFormData
})
</script>
<style lang="scss" scoped></style>
<style lang="scss">
.diy-dialog-wrap .el-form-item__label{
height: auto !important;
}
</style>

186
admin/src/app/views/market_performance/market_performance.vue

@ -0,0 +1,186 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{pageName}}</span>
<!-- <el-button type="primary" @click="addEvent">
{{ t('addMarketPerformance') }}
</el-button> -->
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="marketPerformanceTable.searchParam" ref="searchFormRef">
<el-form-item :label="t('campusId')" prop="campus_id">
<el-select class="w-[280px]" v-model="marketPerformanceTable.searchParam.campus_id" clearable :placeholder="t('campusIdPlaceholder')">
<el-option
v-for="(item, index) in campusIdList"
:key="index"
:label="item['campus_name']"
:value="item['id']"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('performanceAmount')" prop="performance_amount">
<el-input v-model="marketPerformanceTable.searchParam.performance_amount" :placeholder="t('performanceAmountPlaceholder')" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadMarketPerformanceList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
</el-form-item>
</el-form>
</el-card>
<div class="mt-[10px]">
<el-table :data="marketPerformanceTable.data" size="large" v-loading="marketPerformanceTable.loading">
<template #empty>
<span>{{ !marketPerformanceTable.loading ? t('emptyData') : '' }}</span>
</template>
<el-table-column prop="personnel_id_name" :label="t('personnelId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="campus_id_name" :label="t('campusId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="performance_amount" :label="t('performanceAmount')" min-width="120" :show-overflow-tooltip="true"/>
<!--
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
</template>
</el-table-column> -->
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="marketPerformanceTable.page" v-model:page-size="marketPerformanceTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="marketPerformanceTable.total"
@size-change="loadMarketPerformanceList()" @current-change="loadMarketPerformanceList" />
</div>
</div>
<edit ref="editMarketPerformanceDialog" @complete="loadMarketPerformanceList" />
</el-card>
</div>
</template>
<script lang="ts" setup>
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict'
import { getMarketPerformanceList, deleteMarketPerformance, getWithPersonnelList, getWithCampusList } from '@/app/api/market_performance'
import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/market_performance/components/market-performance-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
let marketPerformanceTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam:{
"campus_id":"",
"performance_amount":""
}
})
const searchFormRef = ref<FormInstance>()
//
const selectData = ref<any[]>([])
//
/**
* 获取市场绩效列表
*/
const loadMarketPerformanceList = (page: number = 1) => {
marketPerformanceTable.loading = true
marketPerformanceTable.page = page
getMarketPerformanceList({
page: marketPerformanceTable.page,
limit: marketPerformanceTable.limit,
...marketPerformanceTable.searchParam
}).then(res => {
marketPerformanceTable.loading = false
marketPerformanceTable.data = res.data.data
marketPerformanceTable.total = res.data.total
}).catch(() => {
marketPerformanceTable.loading = false
})
}
loadMarketPerformanceList()
const editMarketPerformanceDialog: Record<string, any> | null = ref(null)
/**
* 添加市场绩效
*/
const addEvent = () => {
editMarketPerformanceDialog.value.setFormData()
editMarketPerformanceDialog.value.showDialog = true
}
/**
* 编辑市场绩效
* @param data
*/
const editEvent = (data: any) => {
editMarketPerformanceDialog.value.setFormData(data)
editMarketPerformanceDialog.value.showDialog = true
}
/**
* 删除市场绩效
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('marketPerformanceDeleteTips'), t('warning'),
{
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteMarketPerformance(id).then(() => {
loadMarketPerformanceList()
}).catch(() => {
})
})
}
const personnelIdList = ref([])
const setPersonnelIdList = async () => {
personnelIdList.value = await (await getWithPersonnelList({})).data
}
setPersonnelIdList()
const campusIdList = ref([])
const setCampusIdList = async () => {
campusIdList.value = await (await getWithCampusList({})).data
}
setCampusIdList()
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()
loadMarketPerformanceList()
}
</script>
<style lang="scss" scoped>
/* 多行超出隐藏 */
.multi-hidden {
word-break: break-all;
text-overflow: ellipsis;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
</style>

32
admin/src/app/views/six_speed_modification_log/components/six-speed-modification-log-edit.vue

@ -2,11 +2,27 @@
<el-dialog v-model="showDialog" :title="formData.id ? t('updateSixSpeedModificationLog') : t('addSixSpeedModificationLog')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true"> <el-dialog v-model="showDialog" :title="formData.id ? t('updateSixSpeedModificationLog') : t('addSixSpeedModificationLog')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true">
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading"> <el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
<el-form-item :label="t('campusId')" prop="campus_id"> <el-form-item :label="t('campusId')" prop="campus_id">
<el-input v-model="formData.campus_id" clearable :placeholder="t('campusIdPlaceholder')" class="input-width" /> <el-select class="input-width" v-model="formData.campus_id" clearable :placeholder="t('campusIdPlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in campusIdList"
:key="index"
:label="item['campus_name']"
:value="item['id']"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('staffId')" prop="staff_id"> <el-form-item :label="t('staffId')" prop="staff_id">
<el-input v-model="formData.staff_id" clearable :placeholder="t('staffIdPlaceholder')" class="input-width" /> <el-select class="input-width" v-model="formData.staff_id" clearable :placeholder="t('staffIdPlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in staffIdList"
:key="index"
:label="item['name']"
:value="item['id']"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('modifiedField')" prop="modified_field"> <el-form-item :label="t('modifiedField')" prop="modified_field">
@ -39,7 +55,7 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang' import { t } from '@/lang'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { addSixSpeedModificationLog, editSixSpeedModificationLog, getSixSpeedModificationLogInfo } from '@/app/api/six_speed_modification_log' import { addSixSpeedModificationLog, editSixSpeedModificationLog, getSixSpeedModificationLogInfo, getWithCampusList, getWithPersonnelList } from '@/app/api/six_speed_modification_log'
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -121,6 +137,16 @@ const confirm = async (formEl: FormInstance | undefined) => {
const campusIdList = ref([] as any[])
const setCampusIdList = async () => {
campusIdList.value = await (await getWithCampusList({})).data
}
setCampusIdList()
const staffIdList = ref([] as any[])
const setStaffIdList = async () => {
staffIdList.value = await (await getWithPersonnelList({})).data
}
setStaffIdList()
const setFormData = async (row: any = null) => { const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
loading.value = true loading.value = true

45
admin/src/app/views/six_speed_modification_log/six_speed_modification_log.vue

@ -11,21 +11,18 @@
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="sixSpeedModificationLogTable.searchParam" ref="searchFormRef"> <el-form :inline="true" :model="sixSpeedModificationLogTable.searchParam" ref="searchFormRef">
<el-form-item :label="t('campusId')" prop="campus_id"> <el-form-item :label="t('campusId')" prop="campus_id">
<el-input v-model="sixSpeedModificationLogTable.searchParam.campus_id" :placeholder="t('campusIdPlaceholder')" /> <el-select class="w-[280px]" v-model="sixSpeedModificationLogTable.searchParam.campus_id" clearable :placeholder="t('campusIdPlaceholder')">
</el-form-item> <el-option
<el-form-item :label="t('staffId')" prop="staff_id"> v-for="(item, index) in campusIdList"
<el-input v-model="sixSpeedModificationLogTable.searchParam.staff_id" :placeholder="t('staffIdPlaceholder')" /> :key="index"
</el-form-item> :label="item['campus_name']"
<el-form-item :label="t('modifiedField')" prop="modified_field"> :value="item['id']"
<el-input v-model="sixSpeedModificationLogTable.searchParam.modified_field" :placeholder="t('modifiedFieldPlaceholder')" /> />
</el-form-item> </el-select>
<el-form-item :label="t('oldValue')" prop="old_value">
<el-input v-model="sixSpeedModificationLogTable.searchParam.old_value" :placeholder="t('oldValuePlaceholder')" />
</el-form-item>
<el-form-item :label="t('newValue')" prop="new_value">
<el-input v-model="sixSpeedModificationLogTable.searchParam.new_value" :placeholder="t('newValuePlaceholder')" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadSixSpeedModificationLogList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadSixSpeedModificationLogList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> <el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
@ -38,9 +35,9 @@
<template #empty> <template #empty>
<span>{{ !sixSpeedModificationLogTable.loading ? t('emptyData') : '' }}</span> <span>{{ !sixSpeedModificationLogTable.loading ? t('emptyData') : '' }}</span>
</template> </template>
<el-table-column prop="campus_id" :label="t('campusId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column prop="campus_id_name" :label="t('campusId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="staff_id" :label="t('staffId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column prop="staff_id_name" :label="t('staffId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="modified_field" :label="t('modifiedField')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column prop="modified_field" :label="t('modifiedField')" min-width="120" :show-overflow-tooltip="true"/>
@ -72,7 +69,7 @@
import { reactive, ref, watch } from 'vue' import { reactive, ref, watch } from 'vue'
import { t } from '@/lang' import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { getSixSpeedModificationLogList, deleteSixSpeedModificationLog } from '@/app/api/six_speed_modification_log' import { getSixSpeedModificationLogList, deleteSixSpeedModificationLog, getWithCampusList, getWithPersonnelList } from '@/app/api/six_speed_modification_log'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus' import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/six_speed_modification_log/components/six-speed-modification-log-edit.vue' import Edit from '@/app/views/six_speed_modification_log/components/six-speed-modification-log-edit.vue'
@ -87,11 +84,7 @@ let sixSpeedModificationLogTable = reactive({
loading: true, loading: true,
data: [], data: [],
searchParam:{ searchParam:{
"campus_id":"", "campus_id":""
"staff_id":"",
"modified_field":"",
"old_value":"",
"new_value":""
} }
}) })
@ -162,6 +155,16 @@ const deleteEvent = (id: number) => {
} }
const campusIdList = ref([])
const setCampusIdList = async () => {
campusIdList.value = await (await getWithCampusList({})).data
}
setCampusIdList()
const staffIdList = ref([])
const setStaffIdList = async () => {
staffIdList.value = await (await getWithPersonnelList({})).data
}
setStaffIdList()
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return

107
admin/src/app/views/yjpz_config/yjpz_config.vue

@ -0,0 +1,107 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<el-form
class="page-form"
:model="formData"
label-width="150px"
ref="ruleFormRef"
:rules="formRules"
v-loading="loading"
>
<el-form-item
v-for="day in weekDays"
:key="day.key"
:label="day.label"
:prop="`priceRules.${day.key}`"
>
<span style="margin: 0 8px;">每个</span>
<el-input
v-model.number="formData.priceRules[day.key].basePrice"
placeholder="请输入"
class="input-width"
clearable
/>
<span style="margin: 0 8px;"> 超过</span>
<el-input
v-model.number="formData.priceRules[day.key].limitCount"
placeholder="请输入"
class="input-width"
clearable
/>
<span style="margin: 0 8px;"></span>
<el-input
v-model.number="formData.priceRules[day.key].extraPrice"
placeholder="请输入"
class="input-width"
clearable
/>
<span style="margin-left: 4px;"></span>
</el-form-item>
</el-form>
</el-card>
<div class="fixed-footer-wrap">
<div class="fixed-footer">
<el-button type="primary" @click="onSave()">提交</el-button>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { reactive, ref } from 'vue'
import { t } from '@/lang'
import { FormInstance, FormRules } from 'element-plus'
import { yjpzConfig,getYjpzConfig} from '@/app/api/sys'
const loading = ref(true)
const formData = reactive({
priceRules: {
mon: { basePrice: 0, limitCount: 0, extraPrice: 0 },
tue: { basePrice: 0, limitCount: 0, extraPrice: 0 },
wed: { basePrice: 0, limitCount: 0, extraPrice: 0 },
thu: { basePrice: 0, limitCount: 0, extraPrice: 0 },
fri: { basePrice: 0, limitCount: 0, extraPrice: 0 },
sat: { basePrice: 0, limitCount: 0, extraPrice: 0 },
sun: { basePrice: 0, limitCount: 0, extraPrice: 0 },
}
})
const weekDays = [
{ key: 'mon', label: '周一' },
{ key: 'tue', label: '周二' },
{ key: 'wed', label: '周三' },
{ key: 'thu', label: '周四' },
{ key: 'fri', label: '周五' },
{ key: 'sat', label: '周六' },
{ key: 'sun', label: '周日' },
]
const formRules = reactive<FormRules>({})
const setFormData = async () => {
const data = await (await getYjpzConfig()).data
formData['priceRules'] = data;
loading.value = false
}
setFormData();
const onSave = async () => {
yjpzConfig(formData)
.then(() => {
loading.value = true
setFormData();
})
.catch(() => {
loading.value = false
})
}
</script>
<style lang="scss" scoped></style>

248
admin/src/components/TencentMapPicker.vue

@ -0,0 +1,248 @@
<template>
<el-dialog
v-model="dialogVisible"
:title="t('mapPickerTitle')"
width="800px"
:before-close="handleClose"
>
<div class="map-container" id="container"></div>
<div class="address-search">
<el-select
v-model="province"
:placeholder="t('provincePlaceholder')"
@change="handleProvinceChange"
>
<el-option
v-for="item in provinceList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
<el-select
v-model="city"
:placeholder="t('cityPlaceholder')"
@change="handleCityChange"
:disabled="!province"
>
<el-option
v-for="item in cityList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
<el-select
v-model="district"
:placeholder="t('districtPlaceholder')"
@change="handleDistrictChange"
:disabled="!province || !city"
>
<el-option
v-for="item in districtList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
<el-input
v-model="detailAddress"
:placeholder="t('detailAddressPlaceholder')"
/>
<el-button type="primary" @click="handleAddressSearch">{{ t('search') }}</el-button>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="dialogVisible = false">{{ t('cancel') }}</el-button>
<el-button type="primary" @click="handleConfirm">
{{ t('confirm') }}
</el-button>
</span>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
import { ref, onMounted, watch } from 'vue'
import { getAreaListByPid, getAreaByCode } from '@/app/api/sys'
import { createMarker, latLngToAddress, addressToLatLng } from '@/utils/qqmap'
import { t } from '@/lang'
const props = defineProps({
modelValue: {
type: Object,
default: () => ({
lat: null,
lng: null,
address: '',
}),
},
})
const emit = defineEmits(['update:modelValue', 'confirm'])
const dialogVisible = ref(false)
const handleClose = (done: () => void) => {
done()
}
const handleConfirm = () => {
emit('confirm', {
lat: props.modelValue.lat,
lng: props.modelValue.lng,
address: detailAddress.value
})
dialogVisible.value = false
}
//
let map: any
let marker: any
const mapKey = ref('')
//
const province = ref('')
const city = ref('')
const district = ref('')
const detailAddress = ref('')
const provinceList = ref<any[]>([])
const cityList = ref<any[]>([])
const districtList = ref<any[]>([])
//
onMounted(() => {
const mapScript = document.createElement('script')
mapKey.value = 'IZQBZ-3UHEU-WTCVD-2464U-I5N4V-ZFFU3'
mapScript.type = 'text/javascript'
mapScript.src =
'https://map.qq.com/api/gljs?libraries=tools,service&v=1.exp&key=IZQBZ-3UHEU-WTCVD-2464U-I5N4V-ZFFU3'
document.body.appendChild(mapScript)
mapScript.onload = () => {
setTimeout(() => {
initMap()
}, 500)
}
//
getAreaListByPid(0).then((res) => {
provinceList.value = res.data
})
})
const initMap = () => {
const TMap = (window as any).TMap
const center = new TMap.LatLng(39.90403, 116.407526)
map = new TMap.Map('container', {
center,
zoom: 12,
})
marker = createMarker(map)
map.on('click', (evt: any) => {
map.setCenter(evt.latLng)
marker.updateGeometries({
id: 'center',
position: evt.latLng,
})
emit('update:modelValue', {
lat: evt.latLng.lat,
lng: evt.latLng.lng,
address: detailAddress.value,
})
})
}
//
const handleProvinceChange = (val: string) => {
getAreaListByPid(val).then((res) => {
cityList.value = res.data
city.value = ''
district.value = ''
})
}
const handleCityChange = (val: string) => {
getAreaListByPid(val).then((res) => {
districtList.value = res.data
district.value = ''
})
}
const handleDistrictChange = (val: string) => {
// TODO:
}
//
const handleAddressSearch = () => {
const address = [
province.value
? provinceList.value.find((p) => p.id === province.value)?.name
: '',
city.value ? cityList.value.find((c) => c.id === city.value)?.name : '',
district.value
? districtList.value.find((d) => d.id === district.value)?.name
: '',
detailAddress.value,
].join('')
addressToLatLng({ mapKey: mapKey.value, address }).then(
({ message, result }) => {
if (message == 'Success' || message == 'query ok') {
const latLng = new (window as any).TMap.LatLng(
result.location.lat,
result.location.lng
)
map.setCenter(latLng)
marker.updateGeometries({
id: 'center',
position: latLng,
})
emit('update:modelValue', {
lat: result.location.lat,
lng: result.location.lng,
address: detailAddress.value,
})
}
}
)
}
//
watch(
() => props.modelValue,
(newVal) => {
if (newVal.lat && newVal.lng) {
const latLng = new (window as any).TMap.LatLng(newVal.lat, newVal.lng)
map?.setCenter(latLng)
marker?.updateGeometries({
id: 'center',
position: latLng,
})
}
},
{ immediate: true }
)
</script>
<style scoped>
.map-picker {
display: flex;
flex-direction: column;
gap: 16px;
}
.map-container {
width: 100%;
height: 400px;
border: 1px solid #dcdfe6;
border-radius: 4px;
}
.address-search {
display: flex;
gap: 8px;
}
</style>

97
niucloud/app/adminapi/controller/campus/Campus.php

@ -0,0 +1,97 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\adminapi\controller\campus;
use core\base\BaseAdminController;
use app\service\admin\campus\CampusService;
/**
* 校区控制器
* Class Campus
* @package app\adminapi\controller\campus
*/
class Campus extends BaseAdminController
{
/**
* 获取校区列表
* @return \think\Response
*/
public function lists(){
$data = $this->request->params([
["campus_name",""],
["campus_address",""],
["campus_status",""]
]);
return success((new CampusService())->getPage($data));
}
/**
* 校区详情
* @param int $id
* @return \think\Response
*/
public function info(int $id){
return success((new CampusService())->getInfo($id));
}
/**
* 添加校区
* @return \think\Response
*/
public function add(){
$data = $this->request->params([
["campus_name",""],
["campus_address",""],
["campus_preview_image",""],
["campus_coordinates",""],
["campus_introduction",""],
["campus_status",0],
]);
$this->validate($data, 'app\validate\campus\Campus.add');
$id = (new CampusService())->add($data);
return success('ADD_SUCCESS', ['id' => $id]);
}
/**
* 校区编辑
* @param $id 校区id
* @return \think\Response
*/
public function edit(int $id){
$data = $this->request->params([
["campus_name",""],
["campus_address",""],
["campus_preview_image",""],
["campus_coordinates",""],
["campus_introduction",""],
["campus_status",0],
]);
$this->validate($data, 'app\validate\campus\Campus.edit');
(new CampusService())->edit($id, $data);
return success('EDIT_SUCCESS');
}
/**
* 校区删除
* @param $id 校区id
* @return \think\Response
*/
public function del(int $id){
(new CampusService())->del($id);
return success('DELETE_SUCCESS');
}
}

29
niucloud/app/adminapi/controller/campus_person_role/CampusPersonRole.php

@ -31,10 +31,7 @@ class CampusPersonRole extends BaseAdminController
["campus_id",""], ["campus_id",""],
["person_id",""], ["person_id",""],
["role_id",""], ["role_id",""],
["dept_id",""], ["dept_id",""]
["created_at",""],
["updated_at",""],
["deleted_at",""]
]); ]);
return success((new CampusPersonRoleService())->getPage($data)); return success((new CampusPersonRoleService())->getPage($data));
} }
@ -58,9 +55,7 @@ class CampusPersonRole extends BaseAdminController
["person_id",0], ["person_id",0],
["role_id",0], ["role_id",0],
["dept_id",0], ["dept_id",0],
["created_at",1747386167],
["updated_at",1747386167],
["deleted_at",1747386167]
]); ]);
$this->validate($data, 'app\validate\campus_person_role\CampusPersonRole.add'); $this->validate($data, 'app\validate\campus_person_role\CampusPersonRole.add');
$id = (new CampusPersonRoleService())->add($data); $id = (new CampusPersonRoleService())->add($data);
@ -78,9 +73,7 @@ class CampusPersonRole extends BaseAdminController
["person_id",0], ["person_id",0],
["role_id",0], ["role_id",0],
["dept_id",0], ["dept_id",0],
["created_at",1747386167],
["updated_at",1747386167],
["deleted_at",1747386167]
]); ]);
$this->validate($data, 'app\validate\campus_person_role\CampusPersonRole.edit'); $this->validate($data, 'app\validate\campus_person_role\CampusPersonRole.edit');
(new CampusPersonRoleService())->edit($id, $data); (new CampusPersonRoleService())->edit($id, $data);
@ -98,4 +91,20 @@ class CampusPersonRole extends BaseAdminController
} }
public function getCampusAll(){
return success(( new CampusPersonRoleService())->getCampusAll());
}
public function getPersonnelAll(){
return success(( new CampusPersonRoleService())->getPersonnelAll());
}
public function getSysRoleAll(){
return success(( new CampusPersonRoleService())->getSysRoleAll());
}
public function getDepartmentsAll(){
return success(( new CampusPersonRoleService())->getDepartmentsAll());
}
} }

38
niucloud/app/adminapi/controller/customer_resources/CustomerResources.php

@ -28,23 +28,8 @@ class CustomerResources extends BaseAdminController
*/ */
public function lists(){ public function lists(){
$data = $this->request->params([ $data = $this->request->params([
["create_year_month",""],
["create_date",""],
["source_channel",""],
["source",""],
["consultant",""],
["name",""], ["name",""],
["age",""], ["phone_number",""]
["gender",""],
["phone_number",""],
["demand",""],
["purchasing_power",""],
["cognitive_idea",""],
["optional_class_time",""],
["distance",""],
["decision_maker",""],
["initial_intent",""],
["campus",""]
]); ]);
return success((new CustomerResourcesService())->getPage($data)); return success((new CustomerResourcesService())->getPage($data));
} }
@ -64,11 +49,8 @@ class CustomerResources extends BaseAdminController
*/ */
public function add(){ public function add(){
$data = $this->request->params([ $data = $this->request->params([
["create_year_month",""],
["create_date","2025-05-16 17:34:54"],
["source_channel",""],
["source",""], ["source",""],
["consultant",""], ["source_channel",""],
["name",""], ["name",""],
["age",0], ["age",0],
["gender",""], ["gender",""],
@ -81,8 +63,11 @@ class CustomerResources extends BaseAdminController
["decision_maker",""], ["decision_maker",""],
["initial_intent",""], ["initial_intent",""],
["campus",""], ["campus",""],
["status",""],
["create_year_month",date("Y-m")],
["create_date",date("Y-m-d")]
]); ]);
$this->validate($data, 'app\validate\customer_resources\CustomerResources.add'); $this->validate($data, 'app\validate\customer_resources\CustomerResources.add');
$id = (new CustomerResourcesService())->add($data); $id = (new CustomerResourcesService())->add($data);
return success('ADD_SUCCESS', ['id' => $id]); return success('ADD_SUCCESS', ['id' => $id]);
@ -95,11 +80,8 @@ class CustomerResources extends BaseAdminController
*/ */
public function edit(int $id){ public function edit(int $id){
$data = $this->request->params([ $data = $this->request->params([
["create_year_month",""],
["create_date","2025-05-16 17:34:54"],
["source_channel",""],
["source",""], ["source",""],
["consultant",""], ["source_channel",""],
["name",""], ["name",""],
["age",0], ["age",0],
["gender",""], ["gender",""],
@ -112,7 +94,7 @@ class CustomerResources extends BaseAdminController
["decision_maker",""], ["decision_maker",""],
["initial_intent",""], ["initial_intent",""],
["campus",""], ["campus",""],
["status",""]
]); ]);
$this->validate($data, 'app\validate\customer_resources\CustomerResources.edit'); $this->validate($data, 'app\validate\customer_resources\CustomerResources.edit');
(new CustomerResourcesService())->edit($id, $data); (new CustomerResourcesService())->edit($id, $data);
@ -130,4 +112,8 @@ class CustomerResources extends BaseAdminController
} }
public function getCampusAll(){
return success(( new CustomerResourcesService())->getCampusAll());
}
} }

99
niucloud/app/adminapi/controller/market_performance/MarketPerformance.php

@ -0,0 +1,99 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\adminapi\controller\market_performance;
use core\base\BaseAdminController;
use app\service\admin\market_performance\MarketPerformanceService;
/**
* 市场绩效控制器
* Class MarketPerformance
* @package app\adminapi\controller\market_performance
*/
class MarketPerformance extends BaseAdminController
{
/**
* 获取市场绩效列表
* @return \think\Response
*/
public function lists(){
$data = $this->request->params([
["campus_id",""],
["performance_amount",""]
]);
return success((new MarketPerformanceService())->getPage($data));
}
/**
* 市场绩效详情
* @param int $id
* @return \think\Response
*/
public function info(int $id){
return success((new MarketPerformanceService())->getInfo($id));
}
/**
* 添加市场绩效
* @return \think\Response
*/
public function add(){
$data = $this->request->params([
["personnel_id",0],
["campus_id",0],
["performance_amount",0.00],
]);
$this->validate($data, 'app\validate\market_performance\MarketPerformance.add');
$id = (new MarketPerformanceService())->add($data);
return success('ADD_SUCCESS', ['id' => $id]);
}
/**
* 市场绩效编辑
* @param $id 市场绩效id
* @return \think\Response
*/
public function edit(int $id){
$data = $this->request->params([
["personnel_id",0],
["campus_id",0],
["performance_amount",0.00],
]);
$this->validate($data, 'app\validate\market_performance\MarketPerformance.edit');
(new MarketPerformanceService())->edit($id, $data);
return success('EDIT_SUCCESS');
}
/**
* 市场绩效删除
* @param $id 市场绩效id
* @return \think\Response
*/
public function del(int $id){
(new MarketPerformanceService())->del($id);
return success('DELETE_SUCCESS');
}
public function getPersonnelAll(){
return success(( new MarketPerformanceService())->getPersonnelAll());
}
public function getCampusAll(){
return success(( new MarketPerformanceService())->getCampusAll());
}
}

3
niucloud/app/adminapi/controller/member/Config.php

@ -93,7 +93,8 @@ class Config extends BaseAdminController
{ {
$data = $this->request->params([ $data = $this->request->params([
[ 'prefix', '' ], [ 'prefix', '' ],
[ 'length', 10 ] [ 'length', 10 ],
[ 'member_headimg', '']
]); ]);
$this->validate($data, 'app\validate\member\MemberConfig.set'); $this->validate($data, 'app\validate\member\MemberConfig.set');
( new MemberConfigService() )->setMemberConfig($data); ( new MemberConfigService() )->setMemberConfig($data);

116
niucloud/app/adminapi/controller/personnel/Personnel.php

@ -0,0 +1,116 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\adminapi\controller\personnel;
use core\base\BaseAdminController;
use app\service\admin\personnel\PersonnelService;
/**
* 人力资源-人员控制器
* Class Personnel
* @package app\adminapi\controller\personnel
*/
class Personnel extends BaseAdminController
{
/**
* 获取人力资源-人员列表
* @return \think\Response
*/
public function lists(){
$data = $this->request->params([
["name",""],
["gender",""],
["phone",""],
["address",""],
["education",""],
["employee_number",""],
["status",""],
["create_time",""]
]);
return success((new PersonnelService())->getPage($data));
}
/**
* 人力资源-人员详情
* @param int $id
* @return \think\Response
*/
public function info(int $id){
return success((new PersonnelService())->getInfo($id));
}
/**
* 添加人力资源-人员
* @return \think\Response
*/
public function add(){
$data = $this->request->params([
["name",""],
["gender",0],
["phone",""],
["head_img",""],
["address",""],
["native_place",""],
["education",""],
["profile",""],
["emergency_contact_phone",""],
["id_card_front",""],
["id_card_back",""],
["status",0],
["is_sys_user",0],
]);
$this->validate($data, 'app\validate\personnel\Personnel.add');
$id = (new PersonnelService())->add($data);
return success('ADD_SUCCESS', ['id' => $id]);
}
/**
* 人力资源-人员编辑
* @param $id 人力资源-人员id
* @return \think\Response
*/
public function edit(int $id){
$data = $this->request->params([
["name",""],
["gender",0],
["phone",""],
["head_img",""],
["address",""],
["native_place",""],
["education",""],
["profile",""],
["emergency_contact_phone",""],
["id_card_front",""],
["id_card_back",""],
["status",0],
["is_sys_user",0],
]);
$this->validate($data, 'app\validate\personnel\Personnel.edit');
(new PersonnelService())->edit($id, $data);
return success('EDIT_SUCCESS');
}
/**
* 人力资源-人员删除
* @param $id 人力资源-人员id
* @return \think\Response
*/
public function del(int $id){
(new PersonnelService())->del($id);
return success('DELETE_SUCCESS');
}
}

14
niucloud/app/adminapi/controller/six_speed_modification_log/SixSpeedModificationLog.php

@ -28,11 +28,7 @@ class SixSpeedModificationLog extends BaseAdminController
*/ */
public function lists(){ public function lists(){
$data = $this->request->params([ $data = $this->request->params([
["campus_id",""], ["campus_id",""]
["staff_id",""],
["modified_field",""],
["old_value",""],
["new_value",""]
]); ]);
return success((new SixSpeedModificationLogService())->getPage($data)); return success((new SixSpeedModificationLogService())->getPage($data));
} }
@ -94,4 +90,12 @@ class SixSpeedModificationLog extends BaseAdminController
} }
public function getCampusAll(){
return success(( new SixSpeedModificationLogService())->getCampusAll());
}
public function getPersonnelAll(){
return success(( new SixSpeedModificationLogService())->getPersonnelAll());
}
} }

18
niucloud/app/adminapi/controller/sys/System.php

@ -106,4 +106,22 @@ class System extends BaseAdminController
{ {
return success(['app_debug' => env('app_debug', false)]); return success(['app_debug' => env('app_debug', false)]);
} }
public function get_yjpz_config(){
return success(data: (new SystemService())->get_yjpz_config());
}
public function yjpz_config(){
$data = $this->request->params([
['priceRules', []],
]);
return success(data: (new SystemService())->yjpz_config($data));
}
} }

37
niucloud/app/adminapi/route/campus.php

@ -0,0 +1,37 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
use think\facade\Route;
use app\adminapi\middleware\AdminCheckRole;
use app\adminapi\middleware\AdminCheckToken;
use app\adminapi\middleware\AdminLog;
// USER_CODE_BEGIN -- campus
Route::group('campus', function () {
//校区列表
Route::get('campus', 'campus.Campus/lists');
//校区详情
Route::get('campus/:id', 'campus.Campus/info');
//添加校区
Route::post('campus', 'campus.Campus/add');
//编辑校区
Route::put('campus/:id', 'campus.Campus/edit');
//删除校区
Route::delete('campus/:id', 'campus.Campus/del');
})->middleware([
AdminCheckToken::class,
AdminCheckRole::class,
AdminLog::class
]);
// USER_CODE_END -- campus

9
niucloud/app/adminapi/route/campus_person_role.php

@ -15,6 +15,7 @@ use app\adminapi\middleware\AdminCheckRole;
use app\adminapi\middleware\AdminCheckToken; use app\adminapi\middleware\AdminCheckToken;
use app\adminapi\middleware\AdminLog; use app\adminapi\middleware\AdminLog;
// USER_CODE_BEGIN -- campus_person_role // USER_CODE_BEGIN -- campus_person_role
Route::group('campus_person_role', function () { Route::group('campus_person_role', function () {
@ -30,6 +31,14 @@ Route::group('campus_person_role', function () {
//删除角色关系 //删除角色关系
Route::delete('campus_person_role/:id', 'campus_person_role.CampusPersonRole/del'); Route::delete('campus_person_role/:id', 'campus_person_role.CampusPersonRole/del');
Route::get('campus_all','campus_person_role.CampusPersonRole/getCampusAll');
Route::get('personnel_all','campus_person_role.CampusPersonRole/getPersonnelAll');
Route::get('sys_role_all','campus_person_role.CampusPersonRole/getSysRoleAll');
Route::get('departments_all','campus_person_role.CampusPersonRole/getDepartmentsAll');
})->middleware([ })->middleware([
AdminCheckToken::class, AdminCheckToken::class,
AdminCheckRole::class, AdminCheckRole::class,

28
niucloud/app/adminapi/route/class.php

@ -14,24 +14,26 @@ use think\facade\Route;
use app\adminapi\middleware\AdminCheckRole; use app\adminapi\middleware\AdminCheckRole;
use app\adminapi\middleware\AdminCheckToken; use app\adminapi\middleware\AdminCheckToken;
use app\adminapi\middleware\AdminLog; use app\adminapi\middleware\AdminLog;
// USER_CODE_BEGIN -- class
Route::group('class', function () {
//班级列表 // USER_CODE_BEGIN -- campus
Route::get('class', 'class.Class/lists');
//班级详情 Route::group('campus', function () {
Route::get('class/:id', 'class.Class/info');
//添加班级 //校区列表
Route::post('class', 'class.Class/add'); Route::get('campus', 'campus.Campus/lists');
//编辑班级 //校区详情
Route::put('class/:id', 'class.Class/edit'); Route::get('campus/:id', 'campus.Campus/info');
//删除班级 //添加校区
Route::delete('class/:id', 'class.Class/del'); Route::post('campus', 'campus.Campus/add');
//编辑校区
Route::put('campus/:id', 'campus.Campus/edit');
//删除校区
Route::delete('campus/:id', 'campus.Campus/del');
})->middleware([ })->middleware([
AdminCheckToken::class, AdminCheckToken::class,
AdminCheckRole::class, AdminCheckRole::class,
AdminLog::class AdminLog::class
]); ]);
// USER_CODE_END -- class // USER_CODE_END -- campus

6
niucloud/app/adminapi/route/customer_resources.php

@ -14,6 +14,10 @@ use think\facade\Route;
use app\adminapi\middleware\AdminCheckRole; use app\adminapi\middleware\AdminCheckRole;
use app\adminapi\middleware\AdminCheckToken; use app\adminapi\middleware\AdminCheckToken;
use app\adminapi\middleware\AdminLog; use app\adminapi\middleware\AdminLog;
// USER_CODE_BEGIN -- customer_resources // USER_CODE_BEGIN -- customer_resources
Route::group('customer_resources', function () { Route::group('customer_resources', function () {
@ -29,6 +33,8 @@ Route::group('customer_resources', function () {
//删除客户资源 //删除客户资源
Route::delete('customer_resources/:id', 'customer_resources.CustomerResources/del'); Route::delete('customer_resources/:id', 'customer_resources.CustomerResources/del');
Route::get('campus_all','customer_resources.CustomerResources/getCampusAll');
})->middleware([ })->middleware([
AdminCheckToken::class, AdminCheckToken::class,
AdminCheckRole::class, AdminCheckRole::class,

3
niucloud/app/adminapi/route/departments.php

@ -14,6 +14,7 @@ use think\facade\Route;
use app\adminapi\middleware\AdminCheckRole; use app\adminapi\middleware\AdminCheckRole;
use app\adminapi\middleware\AdminCheckToken; use app\adminapi\middleware\AdminCheckToken;
use app\adminapi\middleware\AdminLog; use app\adminapi\middleware\AdminLog;
// USER_CODE_BEGIN -- departments // USER_CODE_BEGIN -- departments
Route::group('departments', function () { Route::group('departments', function () {
@ -29,6 +30,8 @@ Route::group('departments', function () {
//删除部门 //删除部门
Route::delete('departments/:id', 'departments.Departments/del'); Route::delete('departments/:id', 'departments.Departments/del');
Route::get('departments_all','departments.Departments/getDepartmentsAll');
})->middleware([ })->middleware([
AdminCheckToken::class, AdminCheckToken::class,
AdminCheckRole::class, AdminCheckRole::class,

41
niucloud/app/adminapi/route/market_performance.php

@ -0,0 +1,41 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
use think\facade\Route;
use app\adminapi\middleware\AdminCheckRole;
use app\adminapi\middleware\AdminCheckToken;
use app\adminapi\middleware\AdminLog;
// USER_CODE_BEGIN -- market_performance
Route::group('market_performance', function () {
//市场绩效列表
Route::get('market_performance', 'market_performance.MarketPerformance/lists');
//市场绩效详情
Route::get('market_performance/:id', 'market_performance.MarketPerformance/info');
//添加市场绩效
Route::post('market_performance', 'market_performance.MarketPerformance/add');
//编辑市场绩效
Route::put('market_performance/:id', 'market_performance.MarketPerformance/edit');
//删除市场绩效
Route::delete('market_performance/:id', 'market_performance.MarketPerformance/del');
Route::get('personnel_all','market_performance.MarketPerformance/getPersonnelAll');
Route::get('campus_all','market_performance.MarketPerformance/getCampusAll');
})->middleware([
AdminCheckToken::class,
AdminCheckRole::class,
AdminLog::class
]);
// USER_CODE_END -- market_performance

37
niucloud/app/adminapi/route/personnel.php

@ -0,0 +1,37 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
use think\facade\Route;
use app\adminapi\middleware\AdminCheckRole;
use app\adminapi\middleware\AdminCheckToken;
use app\adminapi\middleware\AdminLog;
// USER_CODE_BEGIN -- personnel
Route::group('personnel', function () {
//人力资源-人员列表
Route::get('personnel', 'personnel.Personnel/lists');
//人力资源-人员详情
Route::get('personnel/:id', 'personnel.Personnel/info');
//添加人力资源-人员
Route::post('personnel', 'personnel.Personnel/add');
//编辑人力资源-人员
Route::put('personnel/:id', 'personnel.Personnel/edit');
//删除人力资源-人员
Route::delete('personnel/:id', 'personnel.Personnel/del');
})->middleware([
AdminCheckToken::class,
AdminCheckRole::class,
AdminLog::class
]);
// USER_CODE_END -- personnel

6
niucloud/app/adminapi/route/six_speed_modification_log.php

@ -14,6 +14,8 @@ use think\facade\Route;
use app\adminapi\middleware\AdminCheckRole; use app\adminapi\middleware\AdminCheckRole;
use app\adminapi\middleware\AdminCheckToken; use app\adminapi\middleware\AdminCheckToken;
use app\adminapi\middleware\AdminLog; use app\adminapi\middleware\AdminLog;
// USER_CODE_BEGIN -- six_speed_modification_log // USER_CODE_BEGIN -- six_speed_modification_log
Route::group('six_speed_modification_log', function () { Route::group('six_speed_modification_log', function () {
@ -29,6 +31,10 @@ Route::group('six_speed_modification_log', function () {
//删除六一速修改记录 //删除六一速修改记录
Route::delete('six_speed_modification_log/:id', 'six_speed_modification_log.SixSpeedModificationLog/del'); Route::delete('six_speed_modification_log/:id', 'six_speed_modification_log.SixSpeedModificationLog/del');
Route::get('campus_all','six_speed_modification_log.SixSpeedModificationLog/getCampusAll');
Route::get('personnel_all','six_speed_modification_log.SixSpeedModificationLog/getPersonnelAll');
})->middleware([ })->middleware([
AdminCheckToken::class, AdminCheckToken::class,
AdminCheckRole::class, AdminCheckRole::class,

4
niucloud/app/adminapi/route/sys.php

@ -326,6 +326,10 @@ Route::group('sys', function() {
// 打印小票内容 // 打印小票内容
Route::post('printer/printticket', 'sys.Printer/printTicket'); Route::post('printer/printticket', 'sys.Printer/printTicket');
//业绩配置
Route::get('get_yjpz_config', 'sys.System/get_yjpz_config');
Route::post('yjpz_config', 'sys.System/yjpz_config');
})->middleware([ })->middleware([
AdminCheckToken::class, AdminCheckToken::class,
AdminCheckRole::class, AdminCheckRole::class,

45
niucloud/app/api/controller/login/Login.php

@ -28,14 +28,14 @@ class Login extends BaseController
public function login() public function login()
{ {
$data = $this->request->params([ $data = $this->request->params([
[ 'username', '' ], ['username', ''],
[ 'password', '' ], ['password', ''],
]); ]);
//校验登录注册配置 //校验登录注册配置
( new ConfigService() )->checkLoginConfig(MemberLoginTypeDict::USERNAME); (new ConfigService())->checkLoginConfig(MemberLoginTypeDict::USERNAME);
//参数验证 //参数验证
//验证码验证 //验证码验证
$result = ( new LoginService() )->account($data[ 'username' ], $data[ 'password' ]); $result = (new LoginService())->account($data['username'], $data['password']);
if (!$result) { if (!$result) {
//账号密码错误, 重置验证码 //账号密码错误, 重置验证码
return fail('ACCOUNT_OR_PASSWORD_ERROR'); return fail('ACCOUNT_OR_PASSWORD_ERROR');
@ -49,7 +49,7 @@ class Login extends BaseController
*/ */
public function logout() public function logout()
{ {
( new LoginService )->logout(); (new LoginService)->logout();
return success('MEMBER_LOGOUT'); return success('MEMBER_LOGOUT');
} }
@ -59,7 +59,7 @@ class Login extends BaseController
*/ */
public function captcha() public function captcha()
{ {
return success(( new CaptchaService() )->create()); return success((new CaptchaService())->create());
} }
/** /**
@ -71,9 +71,9 @@ class Login extends BaseController
public function sendMobileCode($type) public function sendMobileCode($type)
{ {
$data = $this->request->params([ $data = $this->request->params([
[ 'mobile', '' ], ['mobile', ''],
]); ]);
return success(( new LoginService() )->sendMobileCode($data[ 'mobile' ], $type)); return success((new LoginService())->sendMobileCode($data['mobile'], $type));
} }
/** /**
@ -83,14 +83,14 @@ class Login extends BaseController
public function mobile() public function mobile()
{ {
$data = $this->request->params([ $data = $this->request->params([
[ 'mobile', '' ], ['mobile', ''],
[ 'nickname', '' ], ['nickname', ''],
[ 'headimg', '' ], ['headimg', ''],
[ 'mobile', '' ] ['mobile', '']
]); ]);
//校验登录注册配置 //校验登录注册配置
( new ConfigService() )->checkLoginConfig(MemberLoginTypeDict::MOBILE); (new ConfigService())->checkLoginConfig(MemberLoginTypeDict::MOBILE);
return success(( new LoginService() )->mobile($data)); return success((new LoginService())->mobile($data));
} }
/** /**
@ -100,12 +100,23 @@ class Login extends BaseController
public function resetPassword() public function resetPassword()
{ {
$data = $this->request->params([ $data = $this->request->params([
[ 'mobile', '' ], ['mobile', ''],
[ 'password', '' ] ['password', '']
]); ]);
//参数验证 //参数验证
$this->validate($data, 'app\validate\member\Member.reset_password'); $this->validate($data, 'app\validate\member\Member.reset_password');
( new LoginService() )->resetPassword($data[ 'mobile' ], $data[ 'password' ]); (new LoginService())->resetPassword($data['mobile'], $data['password']);
return success('PASSWORD_RESET_SUCCESS'); return success('PASSWORD_RESET_SUCCESS');
} }
public function personnelLogin()
{
$data = $this->request->params([
['phone', ''],
['password', ''],
]);
//验证码验证
$result = (new LoginService())->loginByPersonnel($data);
return success($result);
}
} }

3
niucloud/app/api/route/route.php

@ -74,6 +74,9 @@ Route::group(function() {
//登录 //登录
Route::get('login', 'login.Login/login'); Route::get('login', 'login.Login/login');
//员工登录
Route::post('personnelLogin', 'login.Login/personnelLogin');
//第三方绑定 //第三方绑定
Route::post('bind', BindDispatch::class); Route::post('bind', BindDispatch::class);
//密码重置 //密码重置

21
niucloud/app/common.php

@ -1,5 +1,7 @@
<?php <?php
use app\model\campus_person_role\CampusPersonRole;
use app\model\personnel\Personnel;
use think\Container; use think\Container;
use think\Response; use think\Response;
use think\facade\Lang; use think\facade\Lang;
@ -1025,3 +1027,22 @@ function get_last_time($time = null)
} }
return $text; return $text;
} }
function get_campus_where($user_id){
$where = [];
if($user_id == 1){
return $where;
}
$personnel = new Personnel();
$role = new CampusPersonRole();
$personnel_id = $personnel->where(['sys_user_id' => $user_id])->value('id');
if(!$personnel_id){
$where[] = ['campus_id','in',[]];
}
$campus_ids = $role->where(['person_id' => $personnel_id])->column('campus_id');
$where[] = ['campus_id','in',$campus_ids];
return $where;
}

3
niucloud/app/dict/sys/AppTypeDict.php

@ -18,6 +18,8 @@ class AppTypeDict
public const API = 'api';//手机网页端 public const API = 'api';//手机网页端
public const PERSONNEL = 'personnel';//员工端
/** /**
* 附件类型 * 附件类型
* @return array * @return array
@ -27,6 +29,7 @@ class AppTypeDict
return [ return [
self::ADMIN => get_lang('dict_app.type_admin'),//平台管理端 self::ADMIN => get_lang('dict_app.type_admin'),//平台管理端
self::API => get_lang('dict_app.type_api'),//客户端 self::API => get_lang('dict_app.type_api'),//客户端
self::PERSONNEL => get_lang('dict_app.type_personnel'),//员工端
]; ];
} }

136
niucloud/app/model/attendance/Attendance.php

@ -9,7 +9,7 @@
// | Author: Niucloud Team // | Author: Niucloud Team
// +---------------------------------------------------------------------- // +----------------------------------------------------------------------
namespace app\model\attendance; namespace app\model\campus;
use core\base\BaseModel; use core\base\BaseModel;
use think\model\concern\SoftDelete; use think\model\concern\SoftDelete;
@ -17,14 +17,14 @@ use think\model\relation\HasMany;
use think\model\relation\HasOne; use think\model\relation\HasOne;
/** /**
* 考勤模型 * 校区模型
* Class Attendance * Class Campus
* @package app\model\attendance * @package app\model\campus
*/ */
class Attendance extends BaseModel class Campus extends BaseModel
{ {
use SoftDelete;
/** /**
* 数据表主键 * 数据表主键
@ -36,141 +36,53 @@ class Attendance extends BaseModel
* 模型名称 * 模型名称
* @var string * @var string
*/ */
protected $name = 'attendance'; protected $name = 'campus';
/** /**
* 搜索器:考勤考勤编号 * 定义软删除标记字段.
* @param $value * @var string
* @param $data */
*/ protected $deleteTime = 'delete_time';
public function searchIdAttr($query, $value, $data)
{
if ($value) {
$query->where("id", $value);
}
}
/** /**
* 搜索器:考勤校区ID * 定义软删除字段的默认值.
* @param $value * @var int
* @param $data */
*/ protected $defaultSoftDelete = 0;
public function searchCampusIdAttr($query, $value, $data)
{
if ($value) {
$query->where("campus_id", $value);
}
}
/**
* 搜索器:考勤人员ID
* @param $value
* @param $data
*/
public function searchStaffIdAttr($query, $value, $data)
{
if ($value) {
$query->where("staff_id", $value);
}
}
/**
* 搜索器:考勤考勤日期
* @param $value
* @param $data
*/
public function searchAttendanceDateAttr($query, $value, $data)
{
if ($value) {
$query->where("attendance_date", $value);
}
}
/**
* 搜索器:考勤签到时间
* @param $value
* @param $data
*/
public function searchCheckInTimeAttr($query, $value, $data)
{
if ($value) {
$query->where("check_in_time", $value);
}
}
/**
* 搜索器:考勤签退时间
* @param $value
* @param $data
*/
public function searchCheckOutTimeAttr($query, $value, $data)
{
if ($value) {
$query->where("check_out_time", $value);
}
}
/**
* 搜索器:考勤考勤状态
* @param $value
* @param $data
*/
public function searchStatusAttr($query, $value, $data)
{
if ($value) {
$query->where("status", $value);
}
}
/**
* 搜索器:考勤备注
* @param $value
* @param $data
*/
public function searchRemarksAttr($query, $value, $data)
{
if ($value) {
$query->where("remarks", $value);
}
}
/** /**
* 搜索器:考勤创建时间 * 搜索器:校区校区名称
* @param $value * @param $value
* @param $data * @param $data
*/ */
public function searchCreatedAtAttr($query, $value, $data) public function searchCampusNameAttr($query, $value, $data)
{ {
if ($value) { if ($value) {
$query->where("created_at", $value); $query->where("campus_name", "like", "%".$value."%");
} }
} }
/** /**
* 搜索器:考勤修改时间 * 搜索器:校区校区地址
* @param $value * @param $value
* @param $data * @param $data
*/ */
public function searchUpdatedAtAttr($query, $value, $data) public function searchCampusAddressAttr($query, $value, $data)
{ {
if ($value) { if ($value) {
$query->where("updated_at", $value); $query->where("campus_address", $value);
} }
} }
/** /**
* 搜索器:考勤坐标 * 搜索器:校区校区状态
* @param $value * @param $value
* @param $data * @param $data
*/ */
public function searchCoordinateAttr($query, $value, $data) public function searchCampusStatusAttr($query, $value, $data)
{ {
if ($value) { if ($value) {
$query->where("coordinate", $value); $query->where("campus_status", $value);
} }
} }

94
niucloud/app/model/campus/Campus.php

@ -0,0 +1,94 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\model\campus;
use core\base\BaseModel;
use think\model\concern\SoftDelete;
use think\model\relation\HasMany;
use think\model\relation\HasOne;
/**
* 校区模型
* Class Campus
* @package app\model\campus
*/
class Campus extends BaseModel
{
use SoftDelete;
/**
* 数据表主键
* @var string
*/
protected $pk = 'id';
/**
* 模型名称
* @var string
*/
protected $name = 'campus';
/**
* 定义软删除标记字段.
* @var string
*/
protected $deleteTime = 'delete_time';
/**
* 定义软删除字段的默认值.
* @var int
*/
protected $defaultSoftDelete = 0;
/**
* 搜索器:校区校区名称
* @param $value
* @param $data
*/
public function searchCampusNameAttr($query, $value, $data)
{
if ($value) {
$query->where("campus_name", "like", "%".$value."%");
}
}
/**
* 搜索器:校区校区地址
* @param $value
* @param $data
*/
public function searchCampusAddressAttr($query, $value, $data)
{
if ($value) {
$query->where("campus_address", $value);
}
}
/**
* 搜索器:校区校区状态
* @param $value
* @param $data
*/
public function searchCampusStatusAttr($query, $value, $data)
{
if ($value) {
$query->where("campus_status", $value);
}
}
}

60
niucloud/app/model/campus_person_role/CampusPersonRole.php

@ -16,6 +16,14 @@ use think\model\concern\SoftDelete;
use think\model\relation\HasMany; use think\model\relation\HasMany;
use think\model\relation\HasOne; use think\model\relation\HasOne;
use app\model\campus\Campus;
use app\model\personnel\Personnel;
use app\model\sys\SysRole;
use app\model\departments\Departments;
/** /**
* 角色关系模型 * 角色关系模型
* Class CampusPersonRole * Class CampusPersonRole
@ -63,7 +71,7 @@ class CampusPersonRole extends BaseModel
} }
/** /**
* 搜索器:角色关系校区ID * 搜索器:角色关系校区
* @param $value * @param $value
* @param $data * @param $data
*/ */
@ -75,7 +83,7 @@ class CampusPersonRole extends BaseModel
} }
/** /**
* 搜索器:角色关系人员ID * 搜索器:角色关系人员
* @param $value * @param $value
* @param $data * @param $data
*/ */
@ -87,7 +95,7 @@ class CampusPersonRole extends BaseModel
} }
/** /**
* 搜索器:角色关系角色ID * 搜索器:角色关系角色
* @param $value * @param $value
* @param $data * @param $data
*/ */
@ -110,45 +118,25 @@ class CampusPersonRole extends BaseModel
} }
} }
/**
* 搜索器:角色关系创建时间
* @param $value
* @param $data
*/
public function searchCreatedAtAttr($query, $value, $data)
{
if ($value) {
$query->where("created_at", $value);
}
}
/**
* 搜索器:角色关系更新时间
* @param $value
* @param $data
*/
public function searchUpdatedAtAttr($query, $value, $data)
{
if ($value) {
$query->where("updated_at", $value);
}
}
/**
* 搜索器:角色关系逻辑删除时间
* @param $value
* @param $data
*/
public function searchDeletedAtAttr($query, $value, $data)
{
if ($value) {
$query->where("deleted_at", $value);
}
}
public function campus(){
return $this->hasOne(Campus::class, 'id', 'campus_id')->joinType('left')->withField('campus_name,id')->bind(['campus_id_name'=>'campus_name']);
}
public function personnel(){
return $this->hasOne(Personnel::class, 'id', 'person_id')->joinType('left')->withField('name,id')->bind(['person_id_name'=>'name']);
}
public function sysRole(){
return $this->hasOne(SysRole::class, 'role_id', 'role_id')->joinType('left')->withField('role_name,role_id')->bind(['role_id_name'=>'role_name']);
}
public function departments(){
return $this->hasOne(Departments::class, 'id', 'dept_id')->joinType('left')->withField('department_name,id')->bind(['dept_id_name'=>'department_name']);
}
} }

88
niucloud/app/model/contract/Contract.php

@ -9,7 +9,7 @@
// | Author: Niucloud Team // | Author: Niucloud Team
// +---------------------------------------------------------------------- // +----------------------------------------------------------------------
namespace app\model\contract; namespace app\model\campus;
use core\base\BaseModel; use core\base\BaseModel;
use think\model\concern\SoftDelete; use think\model\concern\SoftDelete;
@ -17,14 +17,14 @@ use think\model\relation\HasMany;
use think\model\relation\HasOne; use think\model\relation\HasOne;
/** /**
* 合同模型 * 校区模型
* Class Contract * Class Campus
* @package app\model\contract * @package app\model\campus
*/ */
class Contract extends BaseModel class Campus extends BaseModel
{ {
use SoftDelete;
/** /**
* 数据表主键 * 数据表主键
@ -36,22 +36,14 @@ class Contract extends BaseModel
* 模型名称 * 模型名称
* @var string * @var string
*/ */
protected $name = 'contract'; protected $name = 'campus';
/**
* 定义软删除标记字段.
* @var string
*/
protected $deleteTime = 'deleted_at';
/**
* 定义软删除字段的默认值.
* @var int
*/
protected $defaultSoftDelete = 0;
/** /**
* 搜索器:合同合同编号 * 搜索器:校区主键ID
* @param $value * @param $value
* @param $data * @param $data
*/ */
@ -63,98 +55,110 @@ class Contract extends BaseModel
} }
/** /**
* 搜索器:合同合同名称 * 搜索器:校区校区名称
* @param $value
* @param $data
*/
public function searchCampusNameAttr($query, $value, $data)
{
if ($value) {
$query->where("campus_name", $value);
}
}
/**
* 搜索器:校区校区地址
* @param $value * @param $value
* @param $data * @param $data
*/ */
public function searchContractNameAttr($query, $value, $data) public function searchCampusAddressAttr($query, $value, $data)
{ {
if ($value) { if ($value) {
$query->where("contract_name", $value); $query->where("campus_address", $value);
} }
} }
/** /**
* 搜索器:合同合同模板 * 搜索器:校区校区预览图,存储图片路径
* @param $value * @param $value
* @param $data * @param $data
*/ */
public function searchContractTemplateAttr($query, $value, $data) public function searchCampusPreviewImageAttr($query, $value, $data)
{ {
if ($value) { if ($value) {
$query->where("contract_template", $value); $query->where("campus_preview_image", $value);
} }
} }
/** /**
* 搜索器:合同合同状态 * 搜索器:校区校区坐标,格式为经度,纬度
* @param $value * @param $value
* @param $data * @param $data
*/ */
public function searchContractStatusAttr($query, $value, $data) public function searchCampusCoordinatesAttr($query, $value, $data)
{ {
if ($value) { if ($value) {
$query->where("contract_status", $value); $query->where("campus_coordinates", $value);
} }
} }
/** /**
* 搜索器:合同合同类型 * 搜索器:校区校区介绍
* @param $value * @param $value
* @param $data * @param $data
*/ */
public function searchContractTypeAttr($query, $value, $data) public function searchCampusIntroductionAttr($query, $value, $data)
{ {
if ($value) { if ($value) {
$query->where("contract_type", $value); $query->where("campus_introduction", $value);
} }
} }
/** /**
* 搜索器:合同合同备注 * 搜索器:校区校区状态:0-禁用,1-启用
* @param $value * @param $value
* @param $data * @param $data
*/ */
public function searchRemarksAttr($query, $value, $data) public function searchCampusStatusAttr($query, $value, $data)
{ {
if ($value) { if ($value) {
$query->where("remarks", $value); $query->where("campus_status", $value);
} }
} }
/** /**
* 搜索器:合同创建时间 * 搜索器:校区校区创建时间
* @param $value * @param $value
* @param $data * @param $data
*/ */
public function searchCreatedAtAttr($query, $value, $data) public function searchCreateTimeAttr($query, $value, $data)
{ {
if ($value) { if ($value) {
$query->where("created_at", $value); $query->where("create_time", $value);
} }
} }
/** /**
* 搜索器:合同修改时间 * 搜索器:校区校区更新时间
* @param $value * @param $value
* @param $data * @param $data
*/ */
public function searchUpdatedAtAttr($query, $value, $data) public function searchUpdateTimeAttr($query, $value, $data)
{ {
if ($value) { if ($value) {
$query->where("updated_at", $value); $query->where("update_time", $value);
} }
} }
/** /**
* 搜索器:合同逻辑删除时间 * 搜索器:校区逻辑删除字段,NULL表示未删除,非空表示已删除
* @param $value * @param $value
* @param $data * @param $data
*/ */
public function searchDeletedAtAttr($query, $value, $data) public function searchDeleteTimeAttr($query, $value, $data)
{ {
if ($value) { if ($value) {
$query->where("deleted_at", $value); $query->where("delete_time", $value);
} }
} }

116
niucloud/app/model/course/Course.php

@ -9,7 +9,7 @@
// | Author: Niucloud Team // | Author: Niucloud Team
// +---------------------------------------------------------------------- // +----------------------------------------------------------------------
namespace app\model\course; namespace app\model\campus;
use core\base\BaseModel; use core\base\BaseModel;
use think\model\concern\SoftDelete; use think\model\concern\SoftDelete;
@ -17,11 +17,11 @@ use think\model\relation\HasMany;
use think\model\relation\HasOne; use think\model\relation\HasOne;
/** /**
* 课程模型 * 校区模型
* Class Course * Class Campus
* @package app\model\course * @package app\model\campus
*/ */
class Course extends BaseModel class Campus extends BaseModel
{ {
use SoftDelete; use SoftDelete;
@ -36,13 +36,13 @@ class Course extends BaseModel
* 模型名称 * 模型名称
* @var string * @var string
*/ */
protected $name = 'course'; protected $name = 'campus';
/** /**
* 定义软删除标记字段. * 定义软删除标记字段.
* @var string * @var string
*/ */
protected $deleteTime = 'deleted_at'; protected $deleteTime = 'delete_time';
/** /**
* 定义软删除字段的默认值. * 定义软删除字段的默认值.
@ -51,122 +51,38 @@ class Course extends BaseModel
protected $defaultSoftDelete = 0; protected $defaultSoftDelete = 0;
/** /**
* 搜索器:课程课程编号 * 搜索器:校区校区名称
* @param $value * @param $value
* @param $data * @param $data
*/ */
public function searchIdAttr($query, $value, $data) public function searchCampusNameAttr($query, $value, $data)
{ {
if ($value) { if ($value) {
$query->where("id", $value); $query->where("campus_name", "like", "%".$value."%");
} }
} }
/** /**
* 搜索器:课程课程名称 * 搜索器:校区校区地址
* @param $value * @param $value
* @param $data * @param $data
*/ */
public function searchCourseNameAttr($query, $value, $data) public function searchCampusAddressAttr($query, $value, $data)
{ {
if ($value) { if ($value) {
$query->where("course_name", $value); $query->where("campus_address", $value);
} }
} }
/** /**
* 搜索器:课程课程类型 * 搜索器:校区校区状态
* @param $value * @param $value
* @param $data * @param $data
*/ */
public function searchCourseTypeAttr($query, $value, $data) public function searchCampusStatusAttr($query, $value, $data)
{ {
if ($value) { if ($value) {
$query->where("course_type", $value); $query->where("campus_status", $value);
}
}
/**
* 搜索器:课程课程时长
* @param $value
* @param $data
*/
public function searchDurationAttr($query, $value, $data)
{
if ($value) {
$query->where("duration", $value);
}
}
/**
* 搜索器:课程课时数量
* @param $value
* @param $data
*/
public function searchSessionCountAttr($query, $value, $data)
{
if ($value) {
$query->where("session_count", $value);
}
}
/**
* 搜索器:课程单次逍客数量
* @param $value
* @param $data
*/
public function searchSingleSessionCountAttr($query, $value, $data)
{
if ($value) {
$query->where("single_session_count", $value);
}
}
/**
* 搜索器:课程课程价格
* @param $value
* @param $data
*/
public function searchPriceAttr($query, $value, $data)
{
if ($value) {
$query->where("price", $value);
}
}
/**
* 搜索器:课程内部提醒课时
* @param $value
* @param $data
*/
public function searchInternalReminderAttr($query, $value, $data)
{
if ($value) {
$query->where("internal_reminder", $value);
}
}
/**
* 搜索器:课程客户提醒课时
* @param $value
* @param $data
*/
public function searchCustomerReminderAttr($query, $value, $data)
{
if ($value) {
$query->where("customer_reminder", $value);
}
}
/**
* 搜索器:课程课程备注
* @param $value
* @param $data
*/
public function searchRemarksAttr($query, $value, $data)
{
if ($value) {
$query->where("remarks", $value);
} }
} }

194
niucloud/app/model/customer_resources/CustomerResources.php

@ -16,6 +16,8 @@ use think\model\concern\SoftDelete;
use think\model\relation\HasMany; use think\model\relation\HasMany;
use think\model\relation\HasOne; use think\model\relation\HasOne;
use app\model\campus\Campus;
/** /**
* 客户资源模型 * 客户资源模型
* Class CustomerResources * Class CustomerResources
@ -50,78 +52,6 @@ class CustomerResources extends BaseModel
*/ */
protected $defaultSoftDelete = 0; protected $defaultSoftDelete = 0;
/**
* 搜索器:客户资源编号
* @param $value
* @param $data
*/
public function searchIdAttr($query, $value, $data)
{
if ($value) {
$query->where("id", $value);
}
}
/**
* 搜索器:客户资源创建年月
* @param $value
* @param $data
*/
public function searchCreateYearMonthAttr($query, $value, $data)
{
if ($value) {
$query->where("create_year_month", $value);
}
}
/**
* 搜索器:客户资源创建日期
* @param $value
* @param $data
*/
public function searchCreateDateAttr($query, $value, $data)
{
if ($value) {
$query->where("create_date", $value);
}
}
/**
* 搜索器:客户资源来源渠道
* @param $value
* @param $data
*/
public function searchSourceChannelAttr($query, $value, $data)
{
if ($value) {
$query->where("source_channel", $value);
}
}
/**
* 搜索器:客户资源来源
* @param $value
* @param $data
*/
public function searchSourceAttr($query, $value, $data)
{
if ($value) {
$query->where("source", $value);
}
}
/**
* 搜索器:客户资源顾问
* @param $value
* @param $data
*/
public function searchConsultantAttr($query, $value, $data)
{
if ($value) {
$query->where("consultant", $value);
}
}
/** /**
* 搜索器:客户资源姓名 * 搜索器:客户资源姓名
* @param $value * @param $value
@ -134,30 +64,6 @@ class CustomerResources extends BaseModel
} }
} }
/**
* 搜索器:客户资源年龄
* @param $value
* @param $data
*/
public function searchAgeAttr($query, $value, $data)
{
if ($value) {
$query->where("age", $value);
}
}
/**
* 搜索器:客户资源性别: male-男性, female-女性, other-其他
* @param $value
* @param $data
*/
public function searchGenderAttr($query, $value, $data)
{
if ($value) {
$query->where("gender", $value);
}
}
/** /**
* 搜索器:客户资源联系电话 * 搜索器:客户资源联系电话
* @param $value * @param $value
@ -170,105 +76,13 @@ class CustomerResources extends BaseModel
} }
} }
/**
* 搜索器:客户资源需求
* @param $value
* @param $data
*/
public function searchDemandAttr($query, $value, $data)
{
if ($value) {
$query->where("demand", $value);
}
}
/**
* 搜索器:客户资源购买力
* @param $value
* @param $data
*/
public function searchPurchasingPowerAttr($query, $value, $data)
{
if ($value) {
$query->where("purchasing_power", $value);
}
}
/**
* 搜索器:客户资源认知理念
* @param $value
* @param $data
*/
public function searchCognitiveIdeaAttr($query, $value, $data)
{
if ($value) {
$query->where("cognitive_idea", $value);
}
}
/**
* 搜索器:客户资源可选上课时间
* @param $value
* @param $data
*/
public function searchOptionalClassTimeAttr($query, $value, $data)
{
if ($value) {
$query->where("optional_class_time", $value);
}
}
/**
* 搜索器:客户资源距离
* @param $value
* @param $data
*/
public function searchDistanceAttr($query, $value, $data)
{
if ($value) {
$query->where("distance", $value);
}
}
/** public function campus(){
* 搜索器:客户资源决策人 return $this->hasOne(Campus::class, 'id', 'campus')->joinType('left')->withField('campus_name,id')->bind(['campus_name'=>'campus_name']);
* @param $value
* @param $data
*/
public function searchDecisionMakerAttr($query, $value, $data)
{
if ($value) {
$query->where("decision_maker", $value);
}
} }
/**
* 搜索器:客户资源客户初步意向度: high-高, medium-中, low-低
* @param $value
* @param $data
*/
public function searchInitialIntentAttr($query, $value, $data)
{
if ($value) {
$query->where("initial_intent", $value);
}
}
/**
* 搜索器:客户资源所属校区
* @param $value
* @param $data
*/
public function searchCampusAttr($query, $value, $data)
{
if ($value) {
$query->where("campus", $value);
}
}
} }

86
niucloud/app/model/market_performance/MarketPerformance.php

@ -0,0 +1,86 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\model\market_performance;
use core\base\BaseModel;
use think\model\concern\SoftDelete;
use think\model\relation\HasMany;
use think\model\relation\HasOne;
use app\model\personnel\Personnel;
use app\model\campus\Campus;
/**
* 市场绩效模型
* Class MarketPerformance
* @package app\model\market_performance
*/
class MarketPerformance extends BaseModel
{
/**
* 数据表主键
* @var string
*/
protected $pk = 'id';
/**
* 模型名称
* @var string
*/
protected $name = 'market_performance';
/**
* 搜索器:市场绩效校区
* @param $value
* @param $data
*/
public function searchCampusIdAttr($query, $value, $data)
{
if ($value) {
$query->where("campus_id", $value);
}
}
/**
* 搜索器:市场绩效绩效金额
* @param $value
* @param $data
*/
public function searchPerformanceAmountAttr($query, $value, $data)
{
if ($value) {
$query->where("performance_amount", $value);
}
}
public function personnel(){
return $this->hasOne(Personnel::class, 'id', 'personnel_id')->joinType('left')->withField('name,id')->bind(['personnel_id_name'=>'name']);
}
public function campus(){
return $this->hasOne(Campus::class, 'id', 'campus_id')->joinType('left')->withField('campus_name,id')->bind(['campus_id_name'=>'campus_name']);
}
}

159
niucloud/app/model/personnel/Personnel.php

@ -0,0 +1,159 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\model\personnel;
use core\base\BaseModel;
use think\model\concern\SoftDelete;
use think\model\relation\HasMany;
use think\model\relation\HasOne;
/**
* 人力资源-人员模型
* Class Personnel
* @package app\model\personnel
*/
class Personnel extends BaseModel
{
use SoftDelete;
/**
* 数据表主键
* @var string
*/
protected $pk = 'id';
/**
* 模型名称
* @var string
*/
protected $name = 'personnel';
/**
* 定义软删除标记字段.
* @var string
*/
protected $deleteTime = 'delete_time';
/**
* 定义软删除字段的默认值.
* @var int
*/
protected $defaultSoftDelete = 0;
/**
* 搜索器:人力资源-人员姓名
* @param $value
* @param $data
*/
public function searchNameAttr($query, $value, $data)
{
if ($value) {
$query->where("name", "like", "%".$value."%");
}
}
/**
* 搜索器:人力资源-人员性别
* @param $value
* @param $data
*/
public function searchGenderAttr($query, $value, $data)
{
if ($value) {
$query->where("gender", $value);
}
}
/**
* 搜索器:人力资源-人员电话
* @param $value
* @param $data
*/
public function searchPhoneAttr($query, $value, $data)
{
if ($value) {
$query->where("phone", $value);
}
}
/**
* 搜索器:人力资源-人员家庭住址
* @param $value
* @param $data
*/
public function searchAddressAttr($query, $value, $data)
{
if ($value) {
$query->where("address", $value);
}
}
/**
* 搜索器:人力资源-人员学历
* @param $value
* @param $data
*/
public function searchEducationAttr($query, $value, $data)
{
if ($value) {
$query->where("education", $value);
}
}
/**
* 搜索器:人力资源-人员员工编号
* @param $value
* @param $data
*/
public function searchEmployeeNumberAttr($query, $value, $data)
{
if ($value) {
$query->where("employee_number", $value);
}
}
/**
* 搜索器:人力资源-人员员工状态
* @param $value
* @param $data
*/
public function searchStatusAttr($query, $value, $data)
{
if ($value) {
$query->where("status", $value);
}
}
/**
* 搜索器:人力资源-人员创建时间
* @param $value
* @param $data
*/
public function searchCreateTimeAttr($query, $value, $data)
{
if ($value) {
$query->where("create_time", $value);
}
}
public function sys_user()
{
return $this->hasOne(\app\model\sys\SysUser::class, 'uid', 'sys_user_id');
}
}

58
niucloud/app/model/six_speed_modification_log/SixSpeedModificationLog.php

@ -16,6 +16,10 @@ use think\model\concern\SoftDelete;
use think\model\relation\HasMany; use think\model\relation\HasMany;
use think\model\relation\HasOne; use think\model\relation\HasOne;
use app\model\campus\Campus;
use app\model\personnel\Personnel;
/** /**
* 六一速修改记录模型 * 六一速修改记录模型
* Class SixSpeedModificationLog * Class SixSpeedModificationLog
@ -55,7 +59,7 @@ class SixSpeedModificationLog extends BaseModel
} }
/** /**
* 搜索器:六一速修改记录校区ID * 搜索器:六一速修改记录校区
* @param $value * @param $value
* @param $data * @param $data
*/ */
@ -66,57 +70,17 @@ class SixSpeedModificationLog extends BaseModel
} }
} }
/**
* 搜索器:六一速修改记录人员ID
* @param $value
* @param $data
*/
public function searchStaffIdAttr($query, $value, $data)
{
if ($value) {
$query->where("staff_id", $value);
}
}
/**
* 搜索器:六一速修改记录修改的字段
* @param $value
* @param $data
*/
public function searchModifiedFieldAttr($query, $value, $data)
{
if ($value) {
$query->where("modified_field", $value);
}
}
/**
* 搜索器:六一速修改记录修改前的值
* @param $value
* @param $data
*/
public function searchOldValueAttr($query, $value, $data)
{
if ($value) {
$query->where("old_value", $value);
}
}
/**
* 搜索器:六一速修改记录修改后的值
* @param $value
* @param $data
*/
public function searchNewValueAttr($query, $value, $data)
{
if ($value) {
$query->where("new_value", $value);
}
}
public function campus(){
return $this->hasOne(Campus::class, 'id', 'campus_id')->joinType('left')->withField('campus_name,id')->bind(['campus_id_name'=>'campus_name']);
}
public function personnel(){
return $this->hasOne(Personnel::class, 'id', 'staff_id')->joinType('left')->withField('name,id')->bind(['staff_id_name'=>'name']);
}
} }

112
niucloud/app/model/venue/Venue.php

@ -9,7 +9,7 @@
// | Author: Niucloud Team // | Author: Niucloud Team
// +---------------------------------------------------------------------- // +----------------------------------------------------------------------
namespace app\model\venue; namespace app\model\campus;
use core\base\BaseModel; use core\base\BaseModel;
use think\model\concern\SoftDelete; use think\model\concern\SoftDelete;
@ -17,14 +17,14 @@ use think\model\relation\HasMany;
use think\model\relation\HasOne; use think\model\relation\HasOne;
/** /**
* 场地模型 * 校区模型
* Class Venue * Class Campus
* @package app\model\venue * @package app\model\campus
*/ */
class Venue extends BaseModel class Campus extends BaseModel
{ {
use SoftDelete;
/** /**
* 数据表主键 * 数据表主键
@ -36,117 +36,53 @@ class Venue extends BaseModel
* 模型名称 * 模型名称
* @var string * @var string
*/ */
protected $name = 'venue'; protected $name = 'campus';
/**
* 搜索器:场地场地编号
* @param $value
* @param $data
*/
public function searchIdAttr($query, $value, $data)
{
if ($value) {
$query->where("id", $value);
}
}
/** /**
* 搜索器:场地校区ID * 定义软删除标记字段.
* @param $value * @var string
* @param $data */
*/ protected $deleteTime = 'delete_time';
public function searchCampusIdAttr($query, $value, $data)
{
if ($value) {
$query->where("campus_id", $value);
}
}
/** /**
* 搜索器:场地场地名称 * 定义软删除字段的默认值.
* @param $value * @var int
* @param $data */
*/ protected $defaultSoftDelete = 0;
public function searchVenueNameAttr($query, $value, $data)
{
if ($value) {
$query->where("venue_name", $value);
}
}
/**
* 搜索器:场地场地可容纳人数上限
* @param $value
* @param $data
*/
public function searchCapacityAttr($query, $value, $data)
{
if ($value) {
$query->where("capacity", $value);
}
}
/**
* 搜索器:场地场地可用状态
* @param $value
* @param $data
*/
public function searchAvailabilityStatusAttr($query, $value, $data)
{
if ($value) {
$query->where("availability_status", $value);
}
}
/**
* 搜索器:场地场地可用时间范围类型
* @param $value
* @param $data
*/
public function searchTimeRangeTypeAttr($query, $value, $data)
{
if ($value) {
$query->where("time_range_type", $value);
}
}
/** /**
* 搜索器:场地范围类型的开始时间 * 搜索器:校区校区名称
* @param $value * @param $value
* @param $data * @param $data
*/ */
public function searchTimeRangeStartAttr($query, $value, $data) public function searchCampusNameAttr($query, $value, $data)
{ {
if ($value) { if ($value) {
$query->where("time_range_start", $value); $query->where("campus_name", "like", "%".$value."%");
} }
} }
/** /**
* 搜索器:场地范围类型的结束时间 * 搜索器:校区校区地址
* @param $value * @param $value
* @param $data * @param $data
*/ */
public function searchTimeRangeEndAttr($query, $value, $data) public function searchCampusAddressAttr($query, $value, $data)
{ {
if ($value) { if ($value) {
$query->where("time_range_end", $value); $query->where("campus_address", $value);
} }
} }
/** /**
* 搜索器:场地固定时间范围类型的可用时间, 存储为JSON数组 * 搜索器:校区校区状态
* @param $value * @param $value
* @param $data * @param $data
*/ */
public function searchFixedTimeRangesAttr($query, $value, $data) public function searchCampusStatusAttr($query, $value, $data)
{ {
if ($value) { if ($value) {
$query->where("fixed_time_ranges", $value); $query->where("campus_status", $value);
} }
} }

100
niucloud/app/service/admin/campus/CampusService.php

@ -0,0 +1,100 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\service\admin\campus;
use app\model\campus\Campus;
use core\base\BaseAdminService;
/**
* 校区服务层
* Class CampusService
* @package app\service\admin\campus
*/
class CampusService extends BaseAdminService
{
public function __construct()
{
parent::__construct();
$this->model = new Campus();
}
/**
* 获取校区列表
* @param array $where
* @return array
*/
public function getPage(array $where = [])
{
$field = 'id,campus_name,campus_address,campus_preview_image,campus_coordinates,campus_introduction,campus_status,create_time,update_time,delete_time';
$order = '';
$search_model = $this->model->withSearch(["campus_name","campus_address","campus_status"], $where)->field($field)->order($order);
$list = $this->pageQuery($search_model);
return $list;
}
/**
* 获取校区信息
* @param int $id
* @return array
*/
public function getInfo(int $id)
{
$field = 'id,campus_name,campus_address,campus_preview_image,campus_coordinates,campus_introduction,campus_status,create_time,update_time,delete_time';
$info = $this->model->field($field)->where([['id', "=", $id]])->findOrEmpty()->toArray();
$info['campus_status'] = strval($info['campus_status']);
return $info;
}
/**
* 添加校区
* @param array $data
* @return mixed
*/
public function add(array $data)
{
$res = $this->model->create($data);
return $res->id;
}
/**
* 校区编辑
* @param int $id
* @param array $data
* @return bool
*/
public function edit(int $id, array $data)
{
$this->model->where([['id', '=', $id]])->update($data);
return true;
}
/**
* 删除校区
* @param int $id
* @return bool
*/
public function del(int $id)
{
$model = $this->model->where([['id', '=', $id]])->find();
$res = $model->delete();
return $res;
}
}

28
niucloud/app/service/admin/campus_person_role/CampusPersonRoleService.php

@ -12,6 +12,10 @@
namespace app\service\admin\campus_person_role; namespace app\service\admin\campus_person_role;
use app\model\campus_person_role\CampusPersonRole; use app\model\campus_person_role\CampusPersonRole;
use app\model\campus\Campus;
use app\model\personnel\Personnel;
use app\model\sys\SysRole;
use app\model\departments\Departments;
use core\base\BaseAdminService; use core\base\BaseAdminService;
@ -39,7 +43,7 @@ class CampusPersonRoleService extends BaseAdminService
$field = 'id,campus_id,person_id,role_id,dept_id,created_at,updated_at,deleted_at'; $field = 'id,campus_id,person_id,role_id,dept_id,created_at,updated_at,deleted_at';
$order = 'id desc'; $order = 'id desc';
$search_model = $this->model->withSearch(["id","campus_id","person_id","role_id","dept_id","created_at","updated_at","deleted_at"], $where)->field($field)->order($order); $search_model = $this->model->withSearch(["id","campus_id","person_id","role_id","dept_id"], $where)->with(['campus','personnel','sysRole','departments'])->field($field)->order($order);
$list = $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
return $list; return $list;
} }
@ -53,7 +57,7 @@ class CampusPersonRoleService extends BaseAdminService
{ {
$field = 'id,campus_id,person_id,role_id,dept_id,created_at,updated_at,deleted_at'; $field = 'id,campus_id,person_id,role_id,dept_id,created_at,updated_at,deleted_at';
$info = $this->model->field($field)->where([['id', "=", $id]])->findOrEmpty()->toArray(); $info = $this->model->field($field)->where([['id', "=", $id]])->with(['campus','personnel','sysRole','departments'])->findOrEmpty()->toArray();
return $info; return $info;
} }
@ -95,5 +99,25 @@ class CampusPersonRoleService extends BaseAdminService
} }
public function getCampusAll(){
$campusModel = new Campus();
return $campusModel->select()->toArray();
}
public function getPersonnelAll(){
$personnelModel = new Personnel();
return $personnelModel->select()->toArray();
}
public function getSysRoleAll(){
$sysRoleModel = new SysRole();
return $sysRoleModel->select()->toArray();
}
public function getDepartmentsAll(){
$departmentsModel = new Departments();
return $departmentsModel->select()->toArray();
}
} }

14
niucloud/app/service/admin/customer_resources/CustomerResourcesService.php

@ -12,6 +12,7 @@
namespace app\service\admin\customer_resources; namespace app\service\admin\customer_resources;
use app\model\customer_resources\CustomerResources; use app\model\customer_resources\CustomerResources;
use app\model\campus\Campus;
use core\base\BaseAdminService; use core\base\BaseAdminService;
@ -36,10 +37,10 @@ class CustomerResourcesService extends BaseAdminService
*/ */
public function getPage(array $where = []) public function getPage(array $where = [])
{ {
$field = 'id,create_year_month,create_date,source_channel,source,consultant,name,age,gender,phone_number,demand,purchasing_power,cognitive_idea,optional_class_time,distance,decision_maker,initial_intent,campus,created_at,updated_at,deleted_at,status'; $field = 'id,create_year_month,create_date,source,source_channel,consultant,name,age,gender,phone_number,demand,purchasing_power,cognitive_idea,optional_class_time,distance,decision_maker,initial_intent,campus,created_at,updated_at,deleted_at,status';
$order = 'id desc'; $order = 'id desc';
$search_model = $this->model->withSearch(["id","create_year_month","create_date","source_channel","source","consultant","name","age","gender","phone_number","demand","purchasing_power","cognitive_idea","optional_class_time","distance","decision_maker","initial_intent","campus"], $where)->field($field)->order($order); $search_model = $this->model->where(get_campus_where($this->uid))->withSearch(["name","phone_number"], $where)->with(['campus'])->field($field)->order($order);
$list = $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
return $list; return $list;
} }
@ -51,7 +52,7 @@ class CustomerResourcesService extends BaseAdminService
*/ */
public function getInfo(int $id) public function getInfo(int $id)
{ {
$field = 'id,create_year_month,create_date,source_channel,source,consultant,name,age,gender,phone_number,demand,purchasing_power,cognitive_idea,optional_class_time,distance,decision_maker,initial_intent,campus,created_at,updated_at,deleted_at,status'; $field = 'id,create_year_month,create_date,source,source_channel,consultant,name,age,gender,phone_number,demand,purchasing_power,cognitive_idea,optional_class_time,distance,decision_maker,initial_intent,campus,created_at,updated_at,deleted_at,status';
$info = $this->model->field($field)->where([['id', "=", $id]])->findOrEmpty()->toArray(); $info = $this->model->field($field)->where([['id', "=", $id]])->findOrEmpty()->toArray();
return $info; return $info;
@ -64,6 +65,7 @@ class CustomerResourcesService extends BaseAdminService
*/ */
public function add(array $data) public function add(array $data)
{ {
$data['consultant'] = $this->username;
$res = $this->model->create($data); $res = $this->model->create($data);
return $res->id; return $res->id;
@ -78,6 +80,7 @@ class CustomerResourcesService extends BaseAdminService
public function edit(int $id, array $data) public function edit(int $id, array $data)
{ {
$data['consultant'] = $this->username;
$this->model->where([['id', '=', $id]])->update($data); $this->model->where([['id', '=', $id]])->update($data);
return true; return true;
} }
@ -95,5 +98,10 @@ class CustomerResourcesService extends BaseAdminService
} }
public function getCampusAll(){
$campusModel = new Campus();
return $campusModel->select()->toArray();
}
} }

4
niucloud/app/service/admin/departments/DepartmentsService.php

@ -12,7 +12,7 @@
namespace app\service\admin\departments; namespace app\service\admin\departments;
use app\model\departments\Departments; use app\model\departments\Departments;
use app\model\departments\Departments; use app\model\departments\Departments as Departments_copy;
use core\base\BaseAdminService; use core\base\BaseAdminService;
@ -97,7 +97,7 @@ class DepartmentsService extends BaseAdminService
public function getDepartmentsAll(){ public function getDepartmentsAll(){
$departmentsModel = new Departments(); $departmentsModel = new Departments_copy();
return $departmentsModel->select()->toArray(); return $departmentsModel->select()->toArray();
} }

111
niucloud/app/service/admin/market_performance/MarketPerformanceService.php

@ -0,0 +1,111 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\service\admin\market_performance;
use app\model\market_performance\MarketPerformance;
use app\model\personnel\Personnel;
use app\model\campus\Campus;
use core\base\BaseAdminService;
/**
* 市场绩效服务层
* Class MarketPerformanceService
* @package app\service\admin\market_performance
*/
class MarketPerformanceService extends BaseAdminService
{
public function __construct()
{
parent::__construct();
$this->model = new MarketPerformance();
}
/**
* 获取市场绩效列表
* @param array $where
* @return array
*/
public function getPage(array $where = [])
{
$field = 'id,personnel_id,campus_id,performance_amount,resource_count,performance_date,performance_config,performance_algorithm,status,created_at,updated_at';
$order = 'id desc';
$search_model = $this->model->where(get_campus_where($this->uid))->withSearch(["campus_id","performance_amount"], $where)->with(['personnel','campus'])->field($field)->order($order);
$list = $this->pageQuery($search_model);
return $list;
}
/**
* 获取市场绩效信息
* @param int $id
* @return array
*/
public function getInfo(int $id)
{
$field = 'id,personnel_id,campus_id,performance_amount,resource_count,performance_date,performance_config,performance_algorithm,status,created_at,updated_at';
$info = $this->model->field($field)->where([['id', "=", $id]])->with(['personnel','campus'])->findOrEmpty()->toArray();
return $info;
}
/**
* 添加市场绩效
* @param array $data
* @return mixed
*/
public function add(array $data)
{
$res = $this->model->create($data);
return $res->id;
}
/**
* 市场绩效编辑
* @param int $id
* @param array $data
* @return bool
*/
public function edit(int $id, array $data)
{
$this->model->where([['id', '=', $id]])->update($data);
return true;
}
/**
* 删除市场绩效
* @param int $id
* @return bool
*/
public function del(int $id)
{
$model = $this->model->where([['id', '=', $id]])->find();
$res = $model->delete();
return $res;
}
public function getPersonnelAll(){
$personnelModel = new Personnel();
return $personnelModel->select()->toArray();
}
public function getCampusAll(){
$campusModel = new Campus();
return $campusModel->select()->toArray();
}
}

151
niucloud/app/service/admin/personnel/PersonnelService.php

@ -0,0 +1,151 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\service\admin\personnel;
use app\dict\sys\UserDict;
use app\model\personnel\Personnel;
use app\model\sys\SysUser;
use app\service\admin\user\UserService;
use core\base\BaseAdminService;
use think\facade\Db;
/**
* 人力资源-人员服务层
* Class PersonnelService
* @package app\service\admin\personnel
*/
class PersonnelService extends BaseAdminService
{
public function __construct()
{
parent::__construct();
$this->model = new Personnel();
}
/**
* 获取人力资源-人员列表
* @param array $where
* @return array
*/
public function getPage(array $where = [])
{
$field = 'id,name,head_img,gender,birthday,phone,address,native_place,education,profile,emergency_contact_phone,id_card_front,id_card_back,employee_number,status,is_sys_user,sys_user_id,create_time,update_time,delete_time';
$order = 'create_time desc';
$search_model = $this->model->withSearch(["name", "gender", "phone", "address", "education", "employee_number", "status", "create_time"], $where)->field($field)->order($order);
$list = $this->pageQuery($search_model);
return $list;
}
/**
* 获取人力资源-人员信息
* @param int $id
* @return array
*/
public function getInfo(int $id)
{
$field = 'id,name,gender,head_img,birthday,phone,address,native_place,education,profile,emergency_contact_phone,id_card_front,id_card_back,employee_number,status,is_sys_user,sys_user_id,create_time,update_time,delete_time';
$info = $this->model->field($field)->where([['id', "=", $id]])->findOrEmpty()->toArray();
$info['gender'] = strval($info['gender']);
$info['status'] = strval($info['status']);
$info['is_sys_user'] = strval($info['is_sys_user']);
return $info;
}
/**
* 添加人力资源-人员
* @param array $data
* @return mixed
*/
public function add(array $data)
{
$status = $this->model->where('phone', $data['phone'])->value('id');
if ($status) {
throw new \Exception('手机号已存在');
}
try {
Db::startTrans();
if ($data['is_sys_user'] === '1') {
$uid = (new UserService())->addUser([
'username' => $data['phone'],
'password' => $data['phone'],
'real_name' => $data['name'],
'head_img' => $data['head_img'],
'status' => UserDict::ON,
'role_ids' => []
]);
$data['sys_user_id'] = $uid;
}
$res = $this->model->create($data);
Db::commit();
return $res->id;
} catch (\Exception $e) {
Db::rollback();
throw new \Exception($e->getMessage());
}
}
/**
* 人力资源-人员编辑
* @param int $id
* @param array $data
* @return bool
*/
public function edit(int $id, array $data)
{
$status = $this->model->where('phone', $data['phone'])->value('id');
if ($status && $status != $id) {
throw new \Exception('手机号已存在');
}
try {
Db::startTrans();
if ($data['is_sys_user'] === '1') {
$uid = (new SysUser())->where(['username' => $data['phone']])->value('uid');
if (!$uid) {
$uid = (new UserService())->addUser([
'username' => $data['phone'],
'password' => $data['phone'],
'real_name' => $data['name'],
'head_img' => $data['head_img'],
'status' => UserDict::ON,
'role_ids' => []
]);
$data['sys_user_id'] = $uid;
}
}
$this->model->where([['id', '=', $id]])->update($data);
Db::commit();
} catch (\Exception $e) {
Db::rollback();
throw new \Exception($e->getMessage());
}
return true;
}
/**
* 删除人力资源-人员
* @param int $id
* @return bool
*/
public function del(int $id)
{
$model = $this->model->where([['id', '=', $id]])->find();
$res = $model->delete();
return $res;
}
}

16
niucloud/app/service/admin/six_speed_modification_log/SixSpeedModificationLogService.php

@ -12,6 +12,8 @@
namespace app\service\admin\six_speed_modification_log; namespace app\service\admin\six_speed_modification_log;
use app\model\six_speed_modification_log\SixSpeedModificationLog; use app\model\six_speed_modification_log\SixSpeedModificationLog;
use app\model\campus\Campus;
use app\model\personnel\Personnel;
use core\base\BaseAdminService; use core\base\BaseAdminService;
@ -39,7 +41,7 @@ class SixSpeedModificationLogService extends BaseAdminService
$field = 'id,campus_id,staff_id,modified_field,old_value,new_value,is_rollback,rollback_time,created_at,updated_at'; $field = 'id,campus_id,staff_id,modified_field,old_value,new_value,is_rollback,rollback_time,created_at,updated_at';
$order = 'id desc'; $order = 'id desc';
$search_model = $this->model->withSearch(["id","campus_id","staff_id","modified_field","old_value","new_value"], $where)->field($field)->order($order); $search_model = $this->model->withSearch(["id","campus_id"], $where)->with(['campus','personnel'])->field($field)->order($order);
$list = $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
return $list; return $list;
} }
@ -53,7 +55,7 @@ class SixSpeedModificationLogService extends BaseAdminService
{ {
$field = 'id,campus_id,staff_id,modified_field,old_value,new_value,is_rollback,rollback_time,created_at,updated_at'; $field = 'id,campus_id,staff_id,modified_field,old_value,new_value,is_rollback,rollback_time,created_at,updated_at';
$info = $this->model->field($field)->where([['id', "=", $id]])->findOrEmpty()->toArray(); $info = $this->model->field($field)->where([['id', "=", $id]])->with(['campus','personnel'])->findOrEmpty()->toArray();
return $info; return $info;
} }
@ -95,5 +97,15 @@ class SixSpeedModificationLogService extends BaseAdminService
} }
public function getCampusAll(){
$campusModel = new Campus();
return $campusModel->select()->toArray();
}
public function getPersonnelAll(){
$personnelModel = new Personnel();
return $personnelModel->select()->toArray();
}
} }

33
niucloud/app/service/admin/student_courses/StudentCoursesService.php

@ -9,56 +9,57 @@
// | Author: Niucloud Team // | Author: Niucloud Team
// +---------------------------------------------------------------------- // +----------------------------------------------------------------------
namespace app\service\admin\student_courses; namespace app\service\admin\campus;
use app\model\student_courses\StudentCourses; use app\model\campus\Campus;
use core\base\BaseAdminService; use core\base\BaseAdminService;
/** /**
* 学员课程服务层 * 校区服务层
* Class StudentCoursesService * Class CampusService
* @package app\service\admin\student_courses * @package app\service\admin\campus
*/ */
class StudentCoursesService extends BaseAdminService class CampusService extends BaseAdminService
{ {
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
$this->model = new StudentCourses(); $this->model = new Campus();
} }
/** /**
* 获取学员课程列表 * 获取校区列表
* @param array $where * @param array $where
* @return array * @return array
*/ */
public function getPage(array $where = []) public function getPage(array $where = [])
{ {
$field = 'id,student_id,course_id,total_hours,gift_hours,start_date,end_date,created_at,updated_at'; $field = 'id,campus_name,campus_address,campus_preview_image,campus_coordinates,campus_introduction,campus_status,create_time,update_time,delete_time';
$order = 'id desc'; $order = '';
$search_model = $this->model->withSearch(["id","student_id","course_id","total_hours","gift_hours","start_date","end_date"], $where)->field($field)->order($order); $search_model = $this->model->withSearch(["campus_name","campus_address","campus_status"], $where)->field($field)->order($order);
$list = $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
return $list; return $list;
} }
/** /**
* 获取学员课程信息 * 获取校区信息
* @param int $id * @param int $id
* @return array * @return array
*/ */
public function getInfo(int $id) public function getInfo(int $id)
{ {
$field = 'id,student_id,course_id,total_hours,gift_hours,start_date,end_date,created_at,updated_at'; $field = 'id,campus_name,campus_address,campus_preview_image,campus_coordinates,campus_introduction,campus_status,create_time,update_time,delete_time';
$info = $this->model->field($field)->where([['id', "=", $id]])->findOrEmpty()->toArray(); $info = $this->model->field($field)->where([['id', "=", $id]])->findOrEmpty()->toArray();
$info['campus_status'] = strval($info['campus_status']);
return $info; return $info;
} }
/** /**
* 添加学员课程 * 添加校区
* @param array $data * @param array $data
* @return mixed * @return mixed
*/ */
@ -70,7 +71,7 @@ class StudentCoursesService extends BaseAdminService
} }
/** /**
* 学员课程编辑 * 校区编辑
* @param int $id * @param int $id
* @param array $data * @param array $data
* @return bool * @return bool
@ -83,7 +84,7 @@ class StudentCoursesService extends BaseAdminService
} }
/** /**
* 删除学员课程 * 删除校区
* @param int $id * @param int $id
* @return bool * @return bool
*/ */

19
niucloud/app/service/admin/sys/SystemService.php

@ -12,6 +12,7 @@
namespace app\service\admin\sys; namespace app\service\admin\sys;
use app\job\sys\CheckJob; use app\job\sys\CheckJob;
use app\model\sys\SysConfig;
use app\service\core\sys\CoreSysConfigService; use app\service\core\sys\CoreSysConfigService;
use core\base\BaseAdminService; use core\base\BaseAdminService;
use think\facade\Db; use think\facade\Db;
@ -169,4 +170,22 @@ class SystemService extends BaseAdminService
} }
return false; return false;
} }
public function get_yjpz_config(){
$config = new SysConfig();
$data = $config->where(['config_key' => 'priceRules'])->value("value");
return $data;
}
public function yjpz_config(array $data){
$config = new SysConfig();
$config->where(['config_key' => 'priceRules'])->update([
'value' => json_encode($data['priceRules'])
]);
return true;
}
} }

77
niucloud/app/service/api/login/LoginService.php

@ -16,6 +16,8 @@ use app\dict\member\MemberRegisterTypeDict;
use app\dict\sys\AppTypeDict; use app\dict\sys\AppTypeDict;
use app\dict\sys\SmsDict; use app\dict\sys\SmsDict;
use app\model\member\Member; use app\model\member\Member;
use app\model\personnel\Personnel;
use app\model\sys\SysUser;
use app\service\api\captcha\CaptchaService; use app\service\api\captcha\CaptchaService;
use app\service\api\member\MemberConfigService; use app\service\api\member\MemberConfigService;
use app\service\api\member\MemberService; use app\service\api\member\MemberService;
@ -75,8 +77,8 @@ class LoginService extends BaseApiService
$token_info = $this->createToken($member_info); $token_info = $this->createToken($member_info);
event("MemberLogin", $member_info); event("MemberLogin", $member_info);
return [ return [
'token' => $token_info[ 'token' ], 'token' => $token_info['token'],
'expires_time' => $token_info[ 'params' ][ 'exp' ], 'expires_time' => $token_info['params']['exp'],
'mobile' => $member_info->mobile 'mobile' => $member_info->mobile
]; ];
} }
@ -90,7 +92,7 @@ class LoginService extends BaseApiService
public function account(string $username, string $password) public function account(string $username, string $password)
{ {
$member_service = new MemberService(); $member_service = new MemberService();
$member_info = $member_service->findMemberInfo([ 'username|mobile' => $username ]); $member_info = $member_service->findMemberInfo(['username|mobile' => $username]);
if ($member_info->isEmpty()) throw new AuthException('MEMBER_NOT_EXIST');//账号不存在 if ($member_info->isEmpty()) throw new AuthException('MEMBER_NOT_EXIST');//账号不存在
if (!check_password($password, $member_info->password)) return false;//密码与账号不匹配 if (!check_password($password, $member_info->password)) return false;//密码与账号不匹配
return $this->login($member_info, MemberLoginTypeDict::USERNAME); return $this->login($member_info, MemberLoginTypeDict::USERNAME);
@ -104,23 +106,23 @@ class LoginService extends BaseApiService
public function mobile($params) public function mobile($params)
{ {
//校验手机验证码 //校验手机验证码
$this->checkMobileCode($params[ 'mobile' ]); $this->checkMobileCode($params['mobile']);
//登录注册配置 //登录注册配置
$config = ( new MemberConfigService() )->getLoginConfig(); $config = (new MemberConfigService())->getLoginConfig();
$is_mobile = $config[ 'is_mobile' ]; $is_mobile = $config['is_mobile'];
$is_bind_mobile = $config[ 'is_bind_mobile' ]; $is_bind_mobile = $config['is_bind_mobile'];
if ($is_mobile != 1 && $is_bind_mobile != 1) throw new AuthException('MOBILE_LOGIN_UNOPENED'); if ($is_mobile != 1 && $is_bind_mobile != 1) throw new AuthException('MOBILE_LOGIN_UNOPENED');
$member_service = new MemberService(); $member_service = new MemberService();
$member_info = $member_service->findMemberInfo([ 'mobile' => $params[ 'mobile' ] ]); $member_info = $member_service->findMemberInfo(['mobile' => $params['mobile']]);
if ($member_info->isEmpty()) { if ($member_info->isEmpty()) {
//开启强制绑定手机号,登录会自动注册并绑定手机号 //开启强制绑定手机号,登录会自动注册并绑定手机号
if ($is_bind_mobile == 1) { if ($is_bind_mobile == 1) {
$data = array( $data = array(
'mobile' => $params[ 'mobile' ], 'mobile' => $params['mobile'],
'nickname' => $params[ 'nickname' ], 'nickname' => $params['nickname'],
'headimg' => $params[ 'headimg' ] 'headimg' => $params['headimg']
); );
return ( new RegisterService() )->register($params[ 'mobile' ], $data, MemberRegisterTypeDict::MOBILE, false); return (new RegisterService())->register($params['mobile'], $data, MemberRegisterTypeDict::MOBILE, false);
} else { } else {
throw new AuthException('MEMBER_NOT_EXIST');//账号不存在 throw new AuthException('MEMBER_NOT_EXIST');//账号不存在
} }
@ -133,16 +135,16 @@ class LoginService extends BaseApiService
* @param $member_info * @param $member_info
* @return array|null * @return array|null
*/ */
public function createToken($member_info) : ?array public function createToken($member_info): ?array
{ {
$expire_time = env('system.api_token_expire_time') ?? 3600;//todo 不一定和管理端合用这个token时限 $expire_time = env('system.api_token_expire_time') ?? 3600;//todo 不一定和管理端合用这个token时限
return TokenAuth::createToken($member_info->member_id, AppTypeDict::API, [ 'member_id' => $member_info->member_id, 'username' => $member_info->username ], $expire_time); return TokenAuth::createToken($member_info->member_id, AppTypeDict::API, ['member_id' => $member_info->member_id, 'username' => $member_info->username], $expire_time);
} }
/** /**
* 登陆退出(当前账户) * 登陆退出(当前账户)
*/ */
public function logout() : ?bool public function logout(): ?bool
{ {
self::clearToken($this->member_id, $this->request->apiToken()); self::clearToken($this->member_id, $this->request->apiToken());
return true; return true;
@ -154,7 +156,7 @@ class LoginService extends BaseApiService
* @param string|null $token * @param string|null $token
* @return bool|null * @return bool|null
*/ */
public static function clearToken(int $member_id, ?string $token = '') : ?bool public static function clearToken(int $member_id, ?string $token = ''): ?bool
{ {
TokenAuth::clearToken($member_id, AppTypeDict::API, $token); TokenAuth::clearToken($member_id, AppTypeDict::API, $token);
return true; return true;
@ -197,18 +199,18 @@ class LoginService extends BaseApiService
*/ */
public function sendMobileCode($mobile, string $type = '') public function sendMobileCode($mobile, string $type = '')
{ {
( new CaptchaService() )->check(); (new CaptchaService())->check();
if (empty($mobile)) throw new AuthException('MOBILE_NEEDED'); if (empty($mobile)) throw new AuthException('MOBILE_NEEDED');
//发送 //发送
if (!in_array($type, SmsDict::SCENE_TYPE)) throw new AuthException('MEMBER_MOBILE_CAPTCHA_ERROR'); if (!in_array($type, SmsDict::SCENE_TYPE)) throw new AuthException('MEMBER_MOBILE_CAPTCHA_ERROR');
$code = str_pad(random_int(1, 9999), 4, 0, STR_PAD_LEFT);// 生成4位随机数,左侧补0 $code = str_pad(random_int(1, 9999), 4, 0, STR_PAD_LEFT);// 生成4位随机数,左侧补0
( new NoticeService() )->send('member_verify_code', [ 'code' => $code, 'mobile' => $mobile ]); (new NoticeService())->send('member_verify_code', ['code' => $code, 'mobile' => $mobile]);
//将验证码存入缓存 //将验证码存入缓存
$key = md5(uniqid('', true)); $key = md5(uniqid('', true));
$cache_tag_name = "mobile_key" . $mobile . $type; $cache_tag_name = "mobile_key" . $mobile . $type;
$this->clearMobileCode($mobile, $type); $this->clearMobileCode($mobile, $type);
Cache::tag($cache_tag_name)->set($key, [ 'mobile' => $mobile, 'code' => $code, 'type' => $type ], 600); Cache::tag($cache_tag_name)->set($key, ['mobile' => $mobile, 'code' => $code, 'type' => $type], 600);
return [ 'key' => $key ]; return ['key' => $key];
} }
public function getMobileCodeCacheName() public function getMobileCodeCacheName()
@ -235,9 +237,9 @@ class LoginService extends BaseApiService
if (empty($mobile_key) || empty($mobile_code)) throw new AuthException('MOBILE_CAPTCHA_ERROR'); if (empty($mobile_key) || empty($mobile_code)) throw new AuthException('MOBILE_CAPTCHA_ERROR');
$cache = Cache::get($mobile_key); $cache = Cache::get($mobile_key);
if (empty($cache)) throw new AuthException('MOBILE_CAPTCHA_ERROR'); if (empty($cache)) throw new AuthException('MOBILE_CAPTCHA_ERROR');
$temp_mobile = $cache[ 'mobile' ]; $temp_mobile = $cache['mobile'];
$temp_code = $cache[ 'code' ]; $temp_code = $cache['code'];
$temp_type = $cache[ 'type' ]; $temp_type = $cache['type'];
if ($temp_mobile != $mobile || $temp_code != $mobile_code) throw new AuthException('MOBILE_CAPTCHA_ERROR'); if ($temp_mobile != $mobile || $temp_code != $mobile_code) throw new AuthException('MOBILE_CAPTCHA_ERROR');
$this->clearMobileCode($temp_mobile, $temp_type); $this->clearMobileCode($temp_mobile, $temp_type);
return true; return true;
@ -255,8 +257,8 @@ class LoginService extends BaseApiService
if (!empty($open_id)) { if (!empty($open_id)) {
Log::write('channel_1' . $this->channel); Log::write('channel_1' . $this->channel);
if (!empty($this->channel)) { if (!empty($this->channel)) {
$openid_field = match($this->channel){ $openid_field = match ($this->channel) {
'wechat' => 'wx_openid', 'wechat' => 'wx_openid',
'weapp' => 'weapp_openid', 'weapp' => 'weapp_openid',
default => '' default => ''
}; };
@ -291,7 +293,7 @@ class LoginService extends BaseApiService
$member_service = new MemberService(); $member_service = new MemberService();
//校验手机验证码 //校验手机验证码
$this->checkMobileCode($mobile); $this->checkMobileCode($mobile);
$member_info = $member_service->findMemberInfo([ 'mobile' => $mobile ]); $member_info = $member_service->findMemberInfo(['mobile' => $mobile]);
if ($member_info->isEmpty()) throw new AuthException('MOBILE_NOT_EXIST_MEMBER');//账号不存在 if ($member_info->isEmpty()) throw new AuthException('MOBILE_NOT_EXIST_MEMBER');//账号不存在
//todo 需要考虑一下,新的密码和原密码一样能否通过验证 //todo 需要考虑一下,新的密码和原密码一样能否通过验证
$password_hash = create_password($password); $password_hash = create_password($password);
@ -299,7 +301,7 @@ class LoginService extends BaseApiService
'password' => $password_hash, 'password' => $password_hash,
); );
$member_service->editByFind($member_info, $data); $member_service->editByFind($member_info, $data);
self::clearToken($member_info[ 'member_id' ], $this->request->apiToken()); self::clearToken($member_info['member_id'], $this->request->apiToken());
return true; return true;
} }
@ -318,4 +320,25 @@ class LoginService extends BaseApiService
} }
public function loginByPersonnel($params)
{
$member_info = (new Personnel())->where('phone', $params['phone'])->find();
if ($member_info->status != 2) throw new ApiException('账号状态异常禁止登录');
$user = (new SysUser())->where('username', $params['phone'])->find();
if (!check_password($params['password'], $user->password)) throw new ApiException('账号或密码错误');
$user->login_time = time();
$user->last_ip = $this->request->ip();
$user->login_type = 'mini';
$user->login_count++;
$user->last_time = time();
$user->save();
$expire_time = env('system.api_token_expire_time') ?? 3600;
$token_info = TokenAuth::createToken($member_info->id, AppTypeDict::PERSONNEL, ['id' => $member_info->id, 'phone' => $member_info->phone], $expire_time);;
event("PersonnelLogin", $member_info);
return [
'token' => $token_info['token'],
'expires_time' => $token_info['params']['exp']
];
}
} }

31
niucloud/app/service/core/member/CoreMemberConfigService.php

@ -72,6 +72,7 @@ class CoreMemberConfigService extends BaseCoreService
{ {
$info = ( new CoreConfigService() )->getConfig('MEMBER')[ 'value' ] ?? []; $info = ( new CoreConfigService() )->getConfig('MEMBER')[ 'value' ] ?? [];
return [ return [
'member_headimg' => $info[ 'member_headimg' ] ?? '',// 会员默认头像
'prefix' => $info[ 'prefix' ] ?? '',// 会员编码前缀 'prefix' => $info[ 'prefix' ] ?? '',// 会员编码前缀
'length' => $info[ 'length' ] ?? 4, // 会员编码长度 'length' => $info[ 'length' ] ?? 4, // 会员编码长度
]; ];
@ -85,6 +86,7 @@ class CoreMemberConfigService extends BaseCoreService
public function setMemberConfig(array $data) public function setMemberConfig(array $data)
{ {
$config = [ $config = [
'member_headimg' => $data[ 'member_headimg' ] ?? '',// 会员默认头像
'prefix' => $data[ 'prefix' ] ?? '',// 会员编码前缀 'prefix' => $data[ 'prefix' ] ?? '',// 会员编码前缀
'length' => $data[ 'length' ] ?? 4,// 会员编码长度 'length' => $data[ 'length' ] ?? 4,// 会员编码长度
]; ];
@ -174,4 +176,33 @@ class CoreMemberConfigService extends BaseCoreService
} }
/**
* 获取员工设置
* @return array
*/
public function getPersonnelConfig()
{
$info = ( new CoreConfigService() )->getConfig('Personnel')[ 'value' ] ?? [];
return [
'head_img' => $info[ 'head_img' ] ?? '',// 员工默认头像
'prefix' => $info[ 'prefix' ] ?? '',// 员工编码前缀
'length' => $info[ 'length' ] ?? 4, // 员工编码长度
];
}
/**
* 员工设置
* @param array $data
* @return true
*/
public function setPersonnelConfig(array $data)
{
$config = [
'head_img' => $info[ 'head_img' ] ?? '',// 会员默认头像
'prefix' => $data[ 'prefix' ] ?? '',// 会员编码前缀
'length' => $data[ 'length' ] ?? 4,// 会员编码长度
];
( new CoreConfigService() )->setConfig('Personnel', $config);
return true;
}
} }

35
niucloud/app/validate/campus/Campus.php

@ -0,0 +1,35 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\validate\campus;
use core\base\BaseValidate;
/**
* 校区验证器
* Class Campus
* @package addon\app\validate\campus
*/
class Campus extends BaseValidate
{
protected $rule = [
'campus_name' => 'require',
];
protected $message = [
'campus_name.require' => ['common_validate.require', ['campus_name']],
];
protected $scene = [
"add" => ['campus_name', 'campus_address', 'campus_preview_image', 'campus_coordinates', 'campus_introduction', 'campus_status'],
"edit" => ['campus_name', 'campus_address', 'campus_preview_image', 'campus_coordinates', 'campus_introduction', 'campus_status']
];
}

4
niucloud/app/validate/campus_person_role/CampusPersonRole.php

@ -32,8 +32,8 @@ class CampusPersonRole extends BaseValidate
]; ];
protected $scene = [ protected $scene = [
"add" => ['campus_id', 'person_id', 'role_id', 'dept_id', 'created_at', 'updated_at', 'deleted_at'], "add" => ['campus_id', 'person_id', 'role_id', 'dept_id'],
"edit" => ['campus_id', 'person_id', 'role_id', 'dept_id', 'created_at', 'updated_at', 'deleted_at'] "edit" => ['campus_id', 'person_id', 'role_id', 'dept_id']
]; ];
} }

20
niucloud/app/validate/customer_resources/CustomerResources.php

@ -20,15 +20,11 @@ class CustomerResources extends BaseValidate
{ {
protected $rule = [ protected $rule = [
'create_year_month' => 'require',
'create_date' => 'require',
'source_channel' => 'require',
'source' => 'require', 'source' => 'require',
'consultant' => 'require',
'name' => 'require', 'name' => 'require',
'age' => 'require', 'age' => 'require|between:3,80',
'gender' => 'require', 'gender' => 'require',
'phone_number' => 'require', 'phone_number' => 'require|mobile',
'demand' => 'require', 'demand' => 'require',
'purchasing_power' => 'require', 'purchasing_power' => 'require',
'cognitive_idea' => 'require', 'cognitive_idea' => 'require',
@ -37,18 +33,17 @@ class CustomerResources extends BaseValidate
'decision_maker' => 'require', 'decision_maker' => 'require',
'initial_intent' => 'require', 'initial_intent' => 'require',
'campus' => 'require', 'campus' => 'require',
'status' => 'require',
]; ];
protected $message = [ protected $message = [
'create_year_month.require' => ['common_validate.require', ['create_year_month']],
'create_date.require' => ['common_validate.require', ['create_date']],
'source_channel.require' => ['common_validate.require', ['source_channel']],
'source.require' => ['common_validate.require', ['source']], 'source.require' => ['common_validate.require', ['source']],
'consultant.require' => ['common_validate.require', ['consultant']],
'name.require' => ['common_validate.require', ['name']], 'name.require' => ['common_validate.require', ['name']],
'age.require' => ['common_validate.require', ['age']], 'age.require' => ['common_validate.require', ['age']],
'age.between' => ['common_validate.between', ['age','3','80']],
'gender.require' => ['common_validate.require', ['gender']], 'gender.require' => ['common_validate.require', ['gender']],
'phone_number.require' => ['common_validate.require', ['phone_number']], 'phone_number.require' => ['common_validate.require', ['phone_number']],
'phone_number.mobile' => ['common_validate.mobile', ['phone_number']],
'demand.require' => ['common_validate.require', ['demand']], 'demand.require' => ['common_validate.require', ['demand']],
'purchasing_power.require' => ['common_validate.require', ['purchasing_power']], 'purchasing_power.require' => ['common_validate.require', ['purchasing_power']],
'cognitive_idea.require' => ['common_validate.require', ['cognitive_idea']], 'cognitive_idea.require' => ['common_validate.require', ['cognitive_idea']],
@ -57,11 +52,12 @@ class CustomerResources extends BaseValidate
'decision_maker.require' => ['common_validate.require', ['decision_maker']], 'decision_maker.require' => ['common_validate.require', ['decision_maker']],
'initial_intent.require' => ['common_validate.require', ['initial_intent']], 'initial_intent.require' => ['common_validate.require', ['initial_intent']],
'campus.require' => ['common_validate.require', ['campus']], 'campus.require' => ['common_validate.require', ['campus']],
'status.require' => ['common_validate.require', ['status']],
]; ];
protected $scene = [ protected $scene = [
"add" => ['create_year_month', 'create_date', 'source_channel', 'source', 'consultant', 'name', 'age', 'gender', 'phone_number', 'demand', 'purchasing_power', 'cognitive_idea', 'optional_class_time', 'distance', 'decision_maker', 'initial_intent', 'campus'], "add" => ['source', 'source_channel', 'name', 'age', 'gender', 'phone_number', 'demand', 'purchasing_power', 'cognitive_idea', 'optional_class_time', 'distance', 'decision_maker', 'initial_intent', 'campus', 'status'],
"edit" => ['create_year_month', 'create_date', 'source_channel', 'source', 'consultant', 'name', 'age', 'gender', 'phone_number', 'demand', 'purchasing_power', 'cognitive_idea', 'optional_class_time', 'distance', 'decision_maker', 'initial_intent', 'campus'] "edit" => ['source', 'source_channel', 'name', 'age', 'gender', 'phone_number', 'demand', 'purchasing_power', 'cognitive_idea', 'optional_class_time', 'distance', 'decision_maker', 'initial_intent', 'campus', 'status']
]; ];
} }

35
niucloud/app/validate/market_performance/MarketPerformance.php

@ -0,0 +1,35 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\validate\market_performance;
use core\base\BaseValidate;
/**
* 市场绩效验证器
* Class MarketPerformance
* @package addon\app\validate\market_performance
*/
class MarketPerformance extends BaseValidate
{
protected $rule = [
];
protected $message = [
];
protected $scene = [
"add" => ['personnel_id', 'campus_id', 'performance_amount'],
"edit" => ['personnel_id', 'campus_id', 'performance_amount']
];
}

44
niucloud/app/validate/personnel/Personnel.php

@ -0,0 +1,44 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\validate\personnel;
use core\base\BaseValidate;
/**
* 人力资源-人员验证器
* Class Personnel
* @package addon\app\validate\personnel
*/
class Personnel extends BaseValidate
{
protected $rule = [
'name' => 'require',
'phone' => 'require|mobile',
'emergency_contact_phone' => 'mobile',
'status' => 'require',
'is_sys_user' => 'require',
];
protected $message = [
'name.require' => ['common_validate.require', ['name']],
'phone.require' => ['common_validate.require', ['phone']],
'phone.mobile' => ['common_validate.mobile', ['phone']],
'emergency_contact_phone.mobile' => ['common_validate.mobile', ['emergency_contact_phone']],
'status.require' => ['common_validate.require', ['status']],
'is_sys_user.require' => ['common_validate.require', ['is_sys_user']],
];
protected $scene = [
"add" => ['name', 'gender', 'phone', 'address', 'native_place', 'education', 'profile', 'emergency_contact_phone', 'id_card_front', 'id_card_back', 'status', 'is_sys_user'],
"edit" => ['name', 'gender', 'phone', 'address', 'native_place', 'education', 'profile', 'emergency_contact_phone', 'id_card_front', 'id_card_back', 'status', 'is_sys_user']
];
}

20
niucloud/app/validate/resource_sharing/ResourceSharing.php

@ -9,29 +9,27 @@
// | Author: Niucloud Team // | Author: Niucloud Team
// +---------------------------------------------------------------------- // +----------------------------------------------------------------------
namespace app\validate\resource_sharing; namespace app\validate\campus;
use core\base\BaseValidate; use core\base\BaseValidate;
/** /**
* 资源共享验证器 * 校区验证器
* Class ResourceSharing * Class Campus
* @package addon\app\validate\resource_sharing * @package addon\app\validate\campus
*/ */
class ResourceSharing extends BaseValidate class Campus extends BaseValidate
{ {
protected $rule = [ protected $rule = [
'resource_id' => 'require', 'campus_name' => 'require',
'shared_by' => 'require',
]; ];
protected $message = [ protected $message = [
'resource_id.require' => ['common_validate.require', ['resource_id']], 'campus_name.require' => ['common_validate.require', ['campus_name']],
'shared_by.require' => ['common_validate.require', ['shared_by']],
]; ];
protected $scene = [ protected $scene = [
"add" => ['resource_id', 'user_id', 'role_id', 'shared_by', 'shared_at'], "add" => ['campus_name', 'campus_address', 'campus_preview_image', 'campus_coordinates', 'campus_introduction', 'campus_status'],
"edit" => ['resource_id', 'user_id', 'role_id', 'shared_by', 'shared_at'] "edit" => ['campus_name', 'campus_address', 'campus_preview_image', 'campus_coordinates', 'campus_introduction', 'campus_status']
]; ];
} }

3
niucloud/public/index.php

@ -11,6 +11,8 @@
// [ 应用入口文件 ] // [ 应用入口文件 ]
namespace think; namespace think;
if (PHP_VERSION_ID < 80000) if (PHP_VERSION_ID < 80000)
die('require PHP > 8.0.0 !'); die('require PHP > 8.0.0 !');
require __DIR__ . '/../vendor/autoload.php'; require __DIR__ . '/../vendor/autoload.php';
@ -20,6 +22,7 @@ if (!file_exists(__DIR__ .'/../install.lock')) {
} }
// 执行HTTP应用并响应 // 执行HTTP应用并响应
$http = (new App())->http; $http = (new App())->http;

Loading…
Cancel
Save