Browse Source

合并代码

master
王泽彦 10 months ago
parent
commit
cc8233659e
  1. 4
      admin/components.d.ts
  2. 9
      admin/src/app/api/course_schedule.ts
  3. 33
      admin/src/app/api/order_table.ts
  4. 33
      admin/src/app/api/physical_test.ts
  5. 3
      admin/src/app/lang/zh-cn/customer_resource_changes.customer_resource_changes.json
  6. 141
      admin/src/app/lang/zh-cn/customer_resources.customer_resources.json
  7. 52
      admin/src/app/lang/zh-cn/order_table.order_table.json
  8. 50
      admin/src/app/lang/zh-cn/physical_test.physical_test.json
  9. 74
      admin/src/app/lang/zh-cn/physical_test.physical_test_edit.json
  10. 37
      admin/src/app/lang/zh-cn/tc_dialog.physical_test_edit.json
  11. 35
      admin/src/app/views/classroom/classroom.vue
  12. 1
      admin/src/app/views/classroom/components/classroom-edit.vue
  13. 492
      admin/src/app/views/customer_resources/customer_resources.vue
  14. 312
      admin/src/app/views/order_table/components/order-table-edit.vue
  15. 339
      admin/src/app/views/order_table/order_table.vue
  16. 339
      admin/src/app/views/physical_test/components/physical-test-edit.vue
  17. 201
      admin/src/app/views/physical_test/physical_test.vue
  18. 326
      admin/src/app/views/physical_test/physical_test_edit.vue
  19. 239
      admin/src/app/views/tc_dialog/tc_dialog.vue
  20. 204
      admin/src/app/views/timetables/timetables.vue
  21. 20
      niucloud/app/adminapi/controller/course_schedule/CourseSchedule.php
  22. 160
      niucloud/app/adminapi/controller/customer_resources/CustomerResources.php
  23. 49
      niucloud/app/adminapi/controller/order_table/OrderTable.php
  24. 21
      niucloud/app/adminapi/controller/physical_test/PhysicalTest.php
  25. 10
      niucloud/app/adminapi/route/order_table.php
  26. 8
      niucloud/app/adminapi/route/physical_test.php
  27. 226
      niucloud/app/model/class_grade/ClassGrade.php
  28. 156
      niucloud/app/model/order_table/OrderTable.php
  29. 48
      niucloud/app/model/physical_test/PhysicalTest.php
  30. 185
      niucloud/app/service/admin/course_schedule/CourseScheduleService.php
  31. 40
      niucloud/app/service/admin/customer_resources/CustomerResourcesService.php
  32. 40
      niucloud/app/service/admin/order_table/OrderTableService.php
  33. 22
      niucloud/app/service/admin/physical_test/PhysicalTestService.php
  34. 12
      niucloud/app/validate/order_table/OrderTable.php
  35. 4
      niucloud/app/validate/physical_test/PhysicalTest.php

4
admin/components.d.ts

@ -41,6 +41,8 @@ declare module '@vue/runtime-core' {
ElOption: typeof import('element-plus/es')['ElOption'] ElOption: typeof import('element-plus/es')['ElOption']
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']
ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
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']
@ -50,7 +52,9 @@ declare module '@vue/runtime-core' {
ElTableColumn: typeof import('element-plus/es')['ElTableColumn'] ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
ElTabPane: typeof import('element-plus/es')['ElTabPane'] ElTabPane: typeof import('element-plus/es')['ElTabPane']
ElTabs: typeof import('element-plus/es')['ElTabs'] ElTabs: typeof import('element-plus/es')['ElTabs']
ElTag: typeof import('element-plus/es')['ElTag']
ElTooltip: typeof import('element-plus/es')['ElTooltip'] ElTooltip: typeof import('element-plus/es')['ElTooltip']
ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']
ElUpload: typeof import('element-plus/es')['ElUpload'] ElUpload: typeof import('element-plus/es')['ElUpload']
ExportSure: typeof import('./src/components/export-sure/index.vue')['default'] ExportSure: typeof import('./src/components/export-sure/index.vue')['default']
HeatMap: typeof import('./src/components/heat-map/index.vue')['default'] HeatMap: typeof import('./src/components/heat-map/index.vue')['default']

9
admin/src/app/api/course_schedule.ts

@ -56,4 +56,13 @@ export function deleteCourseSchedule(id: number) {
}) })
} }
/**
*
* @param params
* @returns
*/
export function getTimetables(params: Record<string, any>) {
return request.get(`course_schedule/course_schedule/timetables`, { params })
}
// USER_CODE_END -- course_schedule // USER_CODE_END -- course_schedule

33
admin/src/app/api/order_table.ts

@ -1,5 +1,9 @@
import request from '@/utils/request' import request from '@/utils/request'
// USER_CODE_BEGIN -- order_table // USER_CODE_BEGIN -- order_table
/** /**
* *
@ -7,7 +11,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getOrderTableList(params: Record<string, any>) { export function getOrderTableList(params: Record<string, any>) {
return request.get(`order_table/order_table`, { params }) return request.get(`order_table/order_table`, {params})
} }
/** /**
@ -16,7 +20,7 @@ export function getOrderTableList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getOrderTableInfo(id: number) { export function getOrderTableInfo(id: number) {
return request.get(`order_table/order_table/${id}`) return request.get(`order_table/order_table/${id}`);
} }
/** /**
@ -25,10 +29,7 @@ export function getOrderTableInfo(id: number) {
* @returns * @returns
*/ */
export function addOrderTable(params: Record<string, any>) { export function addOrderTable(params: Record<string, any>) {
return request.post('order_table/order_table', params, { return request.post('order_table/order_table', params, { showErrorMessage: true, showSuccessMessage: true })
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -38,10 +39,7 @@ export function addOrderTable(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editOrderTable(params: Record<string, any>) { export function editOrderTable(params: Record<string, any>) {
return request.put(`order_table/order_table/${params.id}`, params, { return request.put(`order_table/order_table/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true })
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -50,10 +48,17 @@ export function editOrderTable(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteOrderTable(id: number) { export function deleteOrderTable(id: number) {
return request.delete(`order_table/order_table/${id}`, { return request.delete(`order_table/order_table/${id}`, { showErrorMessage: true, showSuccessMessage: true })
showErrorMessage: true, }
showSuccessMessage: true,
}) export function getWithCustomerResourcesList(params: Record<string,any>){
return request.get('order_table/customer_resources_all', {params})
}export function getWithCourseList(params: Record<string,any>){
return request.get('order_table/course_all', {params})
}export function getWithClassGradeList(params: Record<string,any>){
return request.get('order_table/class_grade_all', {params})
}export function getWithPersonnelList(params: Record<string,any>){
return request.get('order_table/personnel_all', {params})
} }
// USER_CODE_END -- order_table // USER_CODE_END -- order_table

33
admin/src/app/api/physical_test.ts

@ -1,5 +1,11 @@
import request from '@/utils/request' import request from '@/utils/request'
// USER_CODE_BEGIN -- physical_test // USER_CODE_BEGIN -- physical_test
/** /**
* *
@ -7,7 +13,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getPhysicalTestList(params: Record<string, any>) { export function getPhysicalTestList(params: Record<string, any>) {
return request.get(`physical_test/physical_test`, { params }) return request.get(`physical_test/physical_test`, {params})
} }
/** /**
@ -16,7 +22,7 @@ export function getPhysicalTestList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getPhysicalTestInfo(id: number) { export function getPhysicalTestInfo(id: number) {
return request.get(`physical_test/physical_test/${id}`) return request.get(`physical_test/physical_test/${id}`);
} }
/** /**
@ -25,10 +31,7 @@ export function getPhysicalTestInfo(id: number) {
* @returns * @returns
*/ */
export function addPhysicalTest(params: Record<string, any>) { export function addPhysicalTest(params: Record<string, any>) {
return request.post('physical_test/physical_test', params, { return request.post('physical_test/physical_test', params, { showErrorMessage: true, showSuccessMessage: true })
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -38,10 +41,7 @@ export function addPhysicalTest(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editPhysicalTest(params: Record<string, any>) { export function editPhysicalTest(params: Record<string, any>) {
return request.put(`physical_test/physical_test/${params.id}`, params, { return request.put(`physical_test/physical_test/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true })
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -50,10 +50,15 @@ export function editPhysicalTest(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deletePhysicalTest(id: number) { export function deletePhysicalTest(id: number) {
return request.delete(`physical_test/physical_test/${id}`, { return request.delete(`physical_test/physical_test/${id}`, { showErrorMessage: true, showSuccessMessage: true })
showErrorMessage: true, }
showSuccessMessage: true,
}) export function getWithCustomerResourcesList(params: Record<string,any>){
return request.get('physical_test/customer_resources_all', {params})
}export function getWithStudentList(params: Record<string,any>){
return request.get('physical_test/student_all', {params})
}export function getWithPersonnelList(params: Record<string,any>){
return request.get('physical_test/personnel_all', {params})
} }
// USER_CODE_END -- physical_test // USER_CODE_END -- physical_test

3
admin/src/app/lang/zh-cn/customer_resource_changes.customer_resource_changes.json

@ -18,4 +18,7 @@
"customerResourceChangesDeleteTips": "确定要删除该数据吗?", "customerResourceChangesDeleteTips": "确定要删除该数据吗?",
"startDate": "请选择开始时间", "startDate": "请选择开始时间",
"endDate": "请选择结束时间" "endDate": "请选择结束时间"
} }

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

@ -1,38 +1,107 @@
{ {
"source": "来源", "source":"来源",
"sourcePlaceholder": "请输入来源", "sourcePlaceholder":"请输入来源",
"sourceChannel": "来源渠道", "sourceChannel":"来源渠道",
"sourceChannelPlaceholder": "请输入来源渠道", "sourceChannelPlaceholder":"请输入来源渠道",
"consultant": "顾问", "consultant":"顾问",
"name": "姓名", "name":"姓名",
"namePlaceholder": "请输入姓名", "namePlaceholder":"请输入姓名",
"age": "年龄", "age":"年龄",
"agePlaceholder": "请输入年龄", "agePlaceholder":"请输入年龄",
"gender": "性别", "gender":"性别",
"genderPlaceholder": "请输入性别", "genderPlaceholder":"请输入性别",
"phoneNumber": "联系电话", "phoneNumber":"联系电话",
"phoneNumberPlaceholder": "请输入联系电话", "phoneNumberPlaceholder":"请输入联系电话",
"demand": "需求", "demand":"需求",
"demandPlaceholder": "请输入需求", "demandPlaceholder":"请输入需求",
"purchasingPower": "购买力", "purchasingPower":"购买力",
"purchasingPowerPlaceholder": "请输入购买力", "purchasingPowerPlaceholder":"请输入购买力",
"cognitiveIdea": "认知理念", "cognitiveIdea":"认知理念",
"cognitiveIdeaPlaceholder": "请输入认知理念", "cognitiveIdeaPlaceholder":"请输入认知理念",
"optionalClassTime": "可选上课时间", "optionalClassTime":"可选上课时间",
"optionalClassTimePlaceholder": "请输入可选上课时间", "optionalClassTimePlaceholder":"请输入可选上课时间",
"distance": "距离", "distance":"距离",
"distancePlaceholder": "请输入距离", "distancePlaceholder":"请输入距离",
"decisionMaker": "决策人", "decisionMaker":"决策人",
"decisionMakerPlaceholder": "请输入决策人", "decisionMakerPlaceholder":"请输入决策人",
"initialIntent": "客户初步意向度", "initialIntent":"客户初步意向度",
"initialIntentPlaceholder": "请输入客户初步意向度", "initialIntentPlaceholder":"请输入客户初步意向度",
"campus": "所属校区", "campus":"所属校区",
"campusPlaceholder": "请输入所属校区", "campusPlaceholder":"请输入所属校区",
"status": "客户状态", "status":"客户状态",
"statusPlaceholder": "请输入客户状态", "statusPlaceholder":"请输入客户状态",
"addCustomerResources": "添加客户资源", "addCustomerResources":"添加客户资源",
"updateCustomerResources": "编辑客户资源", "updateCustomerResources":"编辑客户资源",
"customerResourcesDeleteTips": "确定要删除该数据吗?", "customerResourcesDeleteTips":"确定要删除该数据吗?",
"startDate": "请选择开始时间", "startDate":"请选择开始时间",
"endDate": "请选择结束时间" "endDate":"请选择结束时间",
"resourceId":"资源",
"resourceIdPlaceholder":"请输入资源",
"orderStatus":"订单状态",
"orderStatusPlaceholder":"请输入订单状态",
"paymentType":"付款类型",
"paymentTypePlaceholder":"请输入付款类型",
"orderAmount":"订单金额",
"orderAmountPlaceholder":"请输入订单金额",
"courseId":"课程",
"courseIdPlaceholder":"请输入课程",
"classId":"班级",
"classIdPlaceholder":"请输入班级",
"staffId":"人员",
"paymentTime":"支付时间",
"addOrderTable":"添加订单",
"updateOrderTable":"编辑订单",
"resourceId":"客户姓名",
"resourceIdPlaceholder":"全部",
"studentId":"学员姓名",
"studentIdPlaceholder":"全部",
"height":"身高",
"heightPlaceholder":"请输入身高",
"createdAt":"创建时间",
"updatedAt":"修改时间",
"addPhysicalTest":"添加体测",
"updatePhysicalTest":"编辑体测",
"physicalTestDeleteTips":"确定要删除该数据吗?",
"startDate":"请选择开始时间",
"endDate":"请选择结束时间",
"resourceId":"客户姓名",
"resourceIdPlaceholder":"全部",
"studentId":"学员姓名",
"studentIdPlaceholder":"全部",
"height":"身高",
"heightPlaceholder":"请输入身高",
"weight":"体重",
"weightPlaceholder":"请输入体重",
"coachId":"教练",
"coachIdPlaceholder":"请输入教练",
"seatedForwardBend":"坐位体前屈",
"seatedForwardBendPlaceholder":"请输入坐位体前屈",
"sitUps":"仰卧卷腹",
"sitUpsPlaceholder":"请输入仰卧卷腹",
"pushUps":"九十度仰卧撑",
"pushUpsPlaceholder":"请输入九十度仰卧撑",
"flamingoBalance":"火烈鸟平衡测试",
"flamingoBalancePlaceholder":"请输入火烈鸟平衡测试",
"thirtySecJump":"三十秒双脚连续跳",
"thirtySecJumpPlaceholder":"请输入三十秒双脚连续跳",
"standingLongJump":"立定跳远",
"standingLongJumpPlaceholder":"请输入立定跳远",
"agilityRun":"4乘10m灵敏折返跑",
"agilityRunPlaceholder":"请输入4乘10m灵敏折返跑",
"balanceBeam":"走平衡木",
"balanceBeamPlaceholder":"请输入走平衡木",
"tennisThrow":"网球掷远",
"tennisThrowPlaceholder":"请输入网球掷远",
"tenMeterShuttleRun":"十米往返跑",
"tenMeterShuttleRunPlaceholder":"请输入十米往返跑",
"addPhysicalTest":"添加体测",
"updatePhysicalTest":"编辑体测",
"physicalTestDeleteTips":"确定要删除该数据吗?",
"startDate":"请选择开始时间",
"endDate":"请选择结束时间"
} }

52
admin/src/app/lang/zh-cn/order_table.order_table.json

@ -1,35 +1,21 @@
{ {
"id": "订单编号", "resourceId":"资源",
"idPlaceholder": "请输入订单编号", "resourceIdPlaceholder":"请输入资源",
"paymentId": "支付编号", "orderStatus":"订单状态",
"paymentIdPlaceholder": "请输入支付编号", "orderStatusPlaceholder":"请输入订单状态",
"orderStatus": "订单状态: pending-待支付, paid-已支付", "paymentType":"付款类型",
"orderStatusPlaceholder": "请输入订单状态: pending-待支付, paid-已支付", "paymentTypePlaceholder":"请输入付款类型",
"paymentType": "付款类型: cash-现金支付, scan_code-扫码支付, subscription-订阅支付", "orderAmount":"订单金额",
"paymentTypePlaceholder": "请输入付款类型: cash-现金支付, scan_code-扫码支付, subscription-订阅支付", "orderAmountPlaceholder":"请输入订单金额",
"orderAmount": "订单金额", "courseId":"课程",
"orderAmountPlaceholder": "请输入订单金额", "courseIdPlaceholder":"请输入课程",
"courseId": "课程ID", "classId":"班级",
"courseIdPlaceholder": "请输入课程ID", "classIdPlaceholder":"请输入班级",
"classId": "班级ID", "staffId":"人员",
"classIdPlaceholder": "请输入班级ID", "paymentTime":"支付时间",
"staffId": "人员ID", "addOrderTable":"添加订单",
"staffIdPlaceholder": "请输入人员ID", "updateOrderTable":"编辑订单",
"resourceId": "资源ID", "orderTableDeleteTips":"确定要删除该数据吗?",
"resourceIdPlaceholder": "请输入资源ID", "startDate":"请选择开始时间",
"afterSalesStatus": "售后状态", "endDate":"请选择结束时间"
"afterSalesStatusPlaceholder": "请输入售后状态",
"afterSalesReason": "售后原因",
"afterSalesReasonPlaceholder": "请输入售后原因",
"afterSalesTime": "售后时间",
"afterSalesTimePlaceholder": "请输入售后时间",
"paymentTime": "支付时间",
"paymentTimePlaceholder": "请输入支付时间",
"subscriptionPaymentTime": "订阅支付生成时间",
"subscriptionPaymentTimePlaceholder": "请输入订阅支付生成时间",
"addOrderTable": "添加订单",
"updateOrderTable": "编辑订单",
"orderTableDeleteTips": "确定要删除该数据吗?",
"startDate": "请选择开始时间",
"endDate": "请选择结束时间"
} }

50
admin/src/app/lang/zh-cn/physical_test.physical_test.json

@ -1,17 +1,37 @@
{ {
"resourceId": "客户姓名", "resourceId":"客户姓名",
"resourceIdPlaceholder": "请输入客户姓名", "resourceIdPlaceholder":"全部",
"studentId": "学员姓名", "studentId":"学员姓名",
"studentIdPlaceholder": "请输入学员姓名", "studentIdPlaceholder":"全部",
"height": "身高", "height":"身高",
"heightPlaceholder": "请输入身高", "heightPlaceholder":"请输入身高",
"createdAt": "创建时间", "weight":"体重",
"createdAtPlaceholder": "请输入创建时间", "weightPlaceholder":"请输入体重",
"updatedAt": "修改时间", "coachId":"教练",
"updatedAtPlaceholder": "请输入修改时间", "coachIdPlaceholder":"请输入教练",
"addPhysicalTest": "添加体测", "seatedForwardBend":"坐位体前屈",
"updatePhysicalTest": "编辑体测", "seatedForwardBendPlaceholder":"请输入坐位体前屈",
"physicalTestDeleteTips": "确定要删除该数据吗?", "sitUps":"仰卧卷腹",
"startDate": "请选择开始时间", "sitUpsPlaceholder":"请输入仰卧卷腹",
"endDate": "请选择结束时间" "pushUps":"九十度仰卧撑",
"pushUpsPlaceholder":"请输入九十度仰卧撑",
"flamingoBalance":"火烈鸟平衡测试",
"flamingoBalancePlaceholder":"请输入火烈鸟平衡测试",
"thirtySecJump":"三十秒双脚连续跳",
"thirtySecJumpPlaceholder":"请输入三十秒双脚连续跳",
"standingLongJump":"立定跳远",
"standingLongJumpPlaceholder":"请输入立定跳远",
"agilityRun":"4乘10m灵敏折返跑",
"agilityRunPlaceholder":"请输入4乘10m灵敏折返跑",
"balanceBeam":"走平衡木",
"balanceBeamPlaceholder":"请输入走平衡木",
"tennisThrow":"网球掷远",
"tennisThrowPlaceholder":"请输入网球掷远",
"tenMeterShuttleRun":"十米往返跑",
"tenMeterShuttleRunPlaceholder":"请输入十米往返跑",
"addPhysicalTest":"添加体测",
"updatePhysicalTest":"编辑体测",
"physicalTestDeleteTips":"确定要删除该数据吗?",
"startDate":"请选择开始时间",
"endDate":"请选择结束时间"
} }

74
admin/src/app/lang/zh-cn/physical_test.physical_test_edit.json

@ -1,39 +1,39 @@
{ {
"resourceId": "客户姓名", "resourceId":"客户姓名",
"studentId": "学员姓名", "studentId":"学员姓名",
"height": "身高", "height":"身高",
"weight": "体重", "weight":"体重",
"coachId": "教练", "coachId":"教练",
"createdAt": "创建时间", "createdAt":"创建时间",
"updatedAt": "修改时间", "updatedAt":"修改时间",
"seatedForwardBend": "坐位体前屈", "seatedForwardBend":"坐位体前屈",
"sitUps": "仰卧卷腹", "sitUps":"仰卧卷腹",
"pushUps": "九十度仰卧撑", "pushUps":"九十度仰卧撑",
"flamingoBalance": "火烈鸟平衡测试", "flamingoBalance":"火烈鸟平衡测试",
"thirtySecJump": "三十秒双脚连续跳", "thirtySecJump":"三十秒双脚连续跳",
"standingLongJump": "立定跳远", "standingLongJump":"立定跳远",
"agilityRun": "4乘10m灵敏折返跑", "agilityRun":"4乘10m灵敏折返跑",
"balanceBeam": "走平衡木", "balanceBeam":"走平衡木",
"tennisThrow": "网球掷远", "tennisThrow":"网球掷远",
"tenMeterShuttleRun": "十米往返跑", "tenMeterShuttleRun":"十米往返跑",
"resourceIdPlaceholder": "请输入客户姓名", "resourceIdPlaceholder":"请选择客户姓名",
"studentIdPlaceholder": "请输入学员姓名", "studentIdPlaceholder":"请选择学员姓名",
"heightPlaceholder": "请输入身高", "heightPlaceholder":"请输入身高",
"weightPlaceholder": "请输入体重", "weightPlaceholder":"请输入体重",
"coachIdPlaceholder": "请输入教练", "coachIdPlaceholder":"请选择教练",
"createdAtPlaceholder": "请输入创建时间", "createdAtPlaceholder":"请输入创建时间",
"updatedAtPlaceholder": "请输入修改时间", "updatedAtPlaceholder":"请输入修改时间",
"seatedForwardBendPlaceholder": "请输入坐位体前屈", "seatedForwardBendPlaceholder":"请输入坐位体前屈",
"sitUpsPlaceholder": "请输入仰卧卷腹", "sitUpsPlaceholder":"请输入仰卧卷腹",
"pushUpsPlaceholder": "请输入九十度仰卧撑", "pushUpsPlaceholder":"请输入九十度仰卧撑",
"flamingoBalancePlaceholder": "请输入火烈鸟平衡测试", "flamingoBalancePlaceholder":"请输入火烈鸟平衡测试",
"thirtySecJumpPlaceholder": "请输入三十秒双脚连续跳", "thirtySecJumpPlaceholder":"请输入三十秒双脚连续跳",
"standingLongJumpPlaceholder": "请输入立定跳远", "standingLongJumpPlaceholder":"请输入立定跳远",
"agilityRunPlaceholder": "请输入4乘10m灵敏折返跑", "agilityRunPlaceholder":"请输入4乘10m灵敏折返跑",
"balanceBeamPlaceholder": "请输入走平衡木", "balanceBeamPlaceholder":"请输入走平衡木",
"tennisThrowPlaceholder": "请输入网球掷远", "tennisThrowPlaceholder":"请输入网球掷远",
"tenMeterShuttleRunPlaceholder": "请输入十米往返跑", "tenMeterShuttleRunPlaceholder":"请输入十米往返跑",
"addPhysicalTest": "添加体测", "addPhysicalTest":"添加体测",
"updatePhysicalTest": "编辑体测", "updatePhysicalTest":"编辑体测",
"physicalTestDeleteTips": "确定要删除该体测吗?" "physicalTestDeleteTips":"确定要删除该体测吗?"
} }

37
admin/src/app/lang/zh-cn/tc_dialog.physical_test_edit.json

@ -0,0 +1,37 @@
{
"resourceId":"客户姓名",
"resourceIdPlaceholder":"全部",
"studentId":"学员姓名",
"studentIdPlaceholder":"全部",
"height":"身高",
"heightPlaceholder":"请输入身高",
"weight":"体重",
"weightPlaceholder":"请输入体重",
"coachId":"教练",
"coachIdPlaceholder":"请输入教练",
"seatedForwardBend":"坐位体前屈",
"seatedForwardBendPlaceholder":"请输入坐位体前屈",
"sitUps":"仰卧卷腹",
"sitUpsPlaceholder":"请输入仰卧卷腹",
"pushUps":"九十度仰卧撑",
"pushUpsPlaceholder":"请输入九十度仰卧撑",
"flamingoBalance":"火烈鸟平衡测试",
"flamingoBalancePlaceholder":"请输入火烈鸟平衡测试",
"thirtySecJump":"三十秒双脚连续跳",
"thirtySecJumpPlaceholder":"请输入三十秒双脚连续跳",
"standingLongJump":"立定跳远",
"standingLongJumpPlaceholder":"请输入立定跳远",
"agilityRun":"4乘10m灵敏折返跑",
"agilityRunPlaceholder":"请输入4乘10m灵敏折返跑",
"balanceBeam":"走平衡木",
"balanceBeamPlaceholder":"请输入走平衡木",
"tennisThrow":"网球掷远",
"tennisThrowPlaceholder":"请输入网球掷远",
"tenMeterShuttleRun":"十米往返跑",
"tenMeterShuttleRunPlaceholder":"请输入十米往返跑",
"addPhysicalTest":"添加体测",
"updatePhysicalTest":"编辑体测",
"physicalTestDeleteTips":"确定要删除该数据吗?",
"startDate":"请选择开始时间",
"endDate":"请选择结束时间"
}

35
admin/src/app/views/classroom/classroom.vue

@ -114,12 +114,12 @@
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadClassroomList()">{{ <el-button type="primary" @click="loadClassroomList()"
t('search') >{{ t('search') }}
}}</el-button> </el-button>
<el-button @click="resetForm(searchFormRef)">{{ <el-button @click="resetForm(searchFormRef)"
t('reset') >{{ t('reset') }}
}}</el-button> </el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
@ -158,6 +158,7 @@
prop="age_group" prop="age_group"
:label="t('ageGroup')" :label="t('ageGroup')"
min-width="120" min-width="120"
align="center"
:show-overflow-tooltip="true" :show-overflow-tooltip="true"
/> />
@ -179,7 +180,13 @@
:label="t('assistantCoach')" :label="t('assistantCoach')"
min-width="120" min-width="120"
:show-overflow-tooltip="true" :show-overflow-tooltip="true"
/> >
<template #default="{ row }">
<div v-for="(item, index) in assistantCoachList">
<div v-if="item.id == row.assistant_coach">{{ item.name }}</div>
</div>
</template>
</el-table-column>
<el-table-column <el-table-column
:label="t('status')" :label="t('status')"
@ -198,6 +205,7 @@
prop="sort_order" prop="sort_order"
:label="t('sortOrder')" :label="t('sortOrder')"
min-width="120" min-width="120"
align="center"
:show-overflow-tooltip="true" :show-overflow-tooltip="true"
/> />
@ -207,12 +215,12 @@
min-width="120" min-width="120"
> >
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ <el-button type="primary" link @click="editEvent(row)"
t('edit') >{{ t('edit') }}
}}</el-button> </el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ <el-button type="primary" link @click="deleteEvent(row.id)"
t('delete') >{{ t('delete') }}
}}</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -246,6 +254,7 @@ import {
import { ElMessageBox, FormInstance } from 'element-plus' import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/classroom/components/classroom-edit.vue' import Edit from '@/app/views/classroom/components/classroom-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

1
admin/src/app/views/classroom/components/classroom-edit.vue

@ -60,6 +60,7 @@
<el-form-item :label="t('ageGroup')"> <el-form-item :label="t('ageGroup')">
<el-input <el-input
v-model="formData.age_group" v-model="formData.age_group"
type="number"
clearable clearable
:placeholder="t('ageGroupPlaceholder')" :placeholder="t('ageGroupPlaceholder')"
class="input-width" class="input-width"

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

@ -1,63 +1,69 @@
<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"> <div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span> <span class="text-lg">{{pageName}}</span>
<el-button type="primary" @click="addEvent" v-if="type == 'khzy'"> <el-button type="primary" @click="addEvent" v-if="customerResourcesTable.searchParam.type == 'khzy'">
{{ t('addCustomerResources') }} {{ t('addCustomerResources') }}
</el-button> </el-button>
</div> </div>
<el-card <el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
class="box-card !border-none my-[10px] table-search-wrap" <el-form :inline="true" :model="customerResourcesTable.searchParam" ref="searchFormRef">
shadow="never"
>
<el-form
:inline="true"
:model="customerResourcesTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('name')" prop="name"> <el-form-item :label="t('name')" prop="name">
<el-input <el-input v-model="customerResourcesTable.searchParam.name"
v-model="customerResourcesTable.searchParam.name" :placeholder="t('namePlaceholder')" />
:placeholder="t('namePlaceholder')" </el-form-item>
/>
<el-form-item label="年龄" prop="age">
<el-input v-model="customerResourcesTable.searchParam.age" placeholder="请输入年龄" />
</el-form-item>
<el-form-item label="性别" prop="gender">
<el-select v-model="customerResourcesTable.searchParam.gender" placeholder="请选择性别">
<el-option label="男性" value="male" />
<el-option label="女性" value="female" />
<el-option label="其他" value="other" />
</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">
<el-input <el-input v-model="customerResourcesTable.searchParam.phone_number"
v-model="customerResourcesTable.searchParam.phone_number" :placeholder="t('phoneNumberPlaceholder')" />
:placeholder="t('phoneNumberPlaceholder')" </el-form-item>
/>
<el-form-item label="创建时间">
<el-date-picker v-model="customerResourcesTable.searchParam.created_at" type="daterange" range-separator=""
start-placeholder="开始日期" end-placeholder="结束日期" format="YYYY-MM-DD"
value-format="YYYY-MM-DD" />
</el-form-item> </el-form-item>
<!-- 更新时间 -->
<el-form-item label="更新时间">
<el-date-picker v-model="customerResourcesTable.searchParam.updated_at" type="daterange" range-separator=""
start-placeholder="开始日期" end-placeholder="结束日期" format="YYYY-MM-DD"
value-format="YYYY-MM-DD" />
</el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadCustomerResourcesList()">{{ <el-button type="primary" @click="loadCustomerResourcesList()">{{ t('search') }}</el-button>
t('search') <el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<div class="mt-[10px]"> <div class="mt-[10px]">
<el-table <el-table :data="customerResourcesTable.data" size="large" v-loading="customerResourcesTable.loading">
:data="customerResourcesTable.data"
size="large"
v-loading="customerResourcesTable.loading"
>
<template #empty> <template #empty>
<span>{{ <span>{{ !customerResourcesTable.loading ? t('emptyData') : '' }}</span>
!customerResourcesTable.loading ? t('emptyData') : ''
}}</span>
</template> </template>
<el-table-column <el-table-column :label="t('source')" min-width="180" align="center" :show-overflow-tooltip="true">
:label="t('source')"
min-width="180"
align="center"
:show-overflow-tooltip="true"
>
<template #default="{ row }"> <template #default="{ row }">
<div v-for="(item, index) in sourceList"> <div v-for="(item, index) in sourceList">
<div v-if="item.value == row.source">{{ item.name }}</div> <div v-if="item.value == row.source">{{ item.name }}</div>
@ -65,33 +71,14 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column prop="consultant_name" :label="t('consultant')" min-width="120"
prop="consultant_name" :show-overflow-tooltip="true" />
:label="t('consultant')"
min-width="120" <el-table-column prop="name" :label="t('name')" min-width="120" :show-overflow-tooltip="true" />
:show-overflow-tooltip="true"
/> <el-table-column prop="age" :label="t('age')" min-width="50" :show-overflow-tooltip="true" />
<el-table-column <el-table-column :label="t('gender')" min-width="60" align="center" :show-overflow-tooltip="true">
prop="name"
:label="t('name')"
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
:label="t('gender')"
min-width="180"
align="center"
:show-overflow-tooltip="true"
>
<template #default="{ row }"> <template #default="{ row }">
<div v-for="(item, index) in genderList"> <div v-for="(item, index) in genderList">
<div v-if="item.value == row.gender">{{ item.name }}</div> <div v-if="item.value == row.gender">{{ item.name }}</div>
@ -99,270 +86,283 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column prop="phone_number" :label="t('phoneNumber')" min-width="120"
prop="phone_number" :show-overflow-tooltip="true" />
:label="t('phoneNumber')"
min-width="120" <el-table-column prop="decision_maker" :label="t('decisionMaker')" min-width="120"
:show-overflow-tooltip="true" :show-overflow-tooltip="true" />
/>
<el-table-column <el-table-column prop="created_at" label="添加时间" min-width="120" :show-overflow-tooltip="true" />
prop="decision_maker"
:label="t('decisionMaker')" <el-table-column prop="updated_at" label="修改时间" min-width="120" :show-overflow-tooltip="true" />
min-width="120"
:show-overflow-tooltip="true"
/> <el-table-column :label="t('operation')" fixed="right" min-width="200" v-if="customerResourcesTable.searchParam.type == 'khzy'">
<template #default="{ row }">
<el-table-column <el-button type="primary" link @click="modificationLog(row.id)">六要素修改记录</el-button>
:label="t('operation')" <el-button type="primary" link @click="resourceChanges(row.id)">客户信息修改记录</el-button>
fixed="right" <el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
min-width="200" <el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
v-if="type == 'khzy'"
> </template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="200"
v-if="customerResourcesTable.searchParam.type == 'yjfp'">
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="modificationLog(row.id)" <el-button type="primary" link @click="fpEvent(row)">分配</el-button>
>六要素修改记录</el-button
>
<el-button type="primary" link @click="resourceChanges(row.id)"
>客户信息修改记录</el-button
>
<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> </template>
</el-table-column> </el-table-column>
<el-table-column
:label="t('operation')" <el-table-column :label="t('operation')" fixed="right" min-width="200"
fixed="right" v-if="customerResourcesTable.searchParam.type == 'zylb'">
min-width="200"
v-if="type == 'yjfp'"
>
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="fpEvent(row)" <el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
>分配</el-button
> <el-button type="primary" link @click="addOrder({'resource_id':row.id})">添加订单</el-button>
<el-button type="primary" link @click="tcEvent({'resource_id':row.id})">体测</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="mt-[16px] flex justify-end"> <div class="mt-[16px] flex justify-end">
<el-pagination <el-pagination v-model:current-page="customerResourcesTable.page"
v-model:current-page="customerResourcesTable.page"
v-model:page-size="customerResourcesTable.limit" v-model:page-size="customerResourcesTable.limit"
layout="total, sizes, prev, pager, next, jumper" layout="total, sizes, prev, pager, next, jumper" :total="customerResourcesTable.total"
:total="customerResourcesTable.total" @size-change="loadCustomerResourcesList()" @current-change="loadCustomerResourcesList" />
@size-change="loadCustomerResourcesList()"
@current-change="loadCustomerResourcesList"
/>
</div> </div>
</div> </div>
<edit <edit ref="editCustomerResourcesDialog" @complete="loadCustomerResourcesList" />
ref="editCustomerResourcesDialog"
@complete="loadCustomerResourcesList" <fp ref="fpCustomerResourcesDialog" @complete="loadCustomerResourcesList" />
/>
<Order ref="editOrderTableDialog" @complete="loadCustomerResourcesList" />
<tc ref="TcCustomerResourcesDialog" @complete="loadCustomerResourcesList" />
<fp
ref="fpCustomerResourcesDialog"
@complete="loadCustomerResourcesList"
/>
</el-card> </el-card>
</div> </div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
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 { import { getCustomerResourcesList, deleteCustomerResources, getWithPersonnelList, getWithCampusList } from '@/app/api/customer_resources'
getCustomerResourcesList, import { img } from '@/utils/common'
deleteCustomerResources, import { ElMessageBox, FormInstance } from 'element-plus'
getWithPersonnelList, import Edit from '@/app/views/customer_resources/components/customer-resources-edit.vue'
getWithCampusList, import Fp from '@/app/views/customer_resources/components/fp.vue'
} from '@/app/api/customer_resources' import Order from '@/app/views/order_table/components/order-table-edit.vue'
import { img } from '@/utils/common'
import { ElMessageBox, FormInstance } from 'element-plus' import Tc from '@/app/views/tc_dialog/tc_dialog.vue'
import Edit from '@/app/views/customer_resources/components/customer-resources-edit.vue'
import Fp from '@/app/views/customer_resources/components/fp.vue' import { useRouter, useRoute } from 'vue-router'
import { useRouter, useRoute } from 'vue-router' const route = useRoute()
const route = useRoute() const pageName = route.meta.title;
const pageName = route.meta.title const router = useRouter()
const router = useRouter()
let customerResourcesTable = reactive({
const type = pageName == '业绩分配' ? 'yjfp' : 'khzy'
const modificationLog = (id: number) => {
router.push({
path: '/six_speed_modification_log/six_speed_modification_log',
query: { id: id },
})
}
const resourceChanges = (id: number) => {
router.push({
path: '/customer_resource_changes/customer_resource_changes',
query: { id: id },
})
}
let customerResourcesTable = reactive({
page: 1, page: 1,
limit: 10, limit: 10,
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam: { searchParam: {
name: '', "name": "",
phone_number: '', "age": "",
type: type, "gender": "",
}, "phone_number": "",
}) 'type': '',
"created_at" : "",
"updated_at" : ""
}
})
if (pageName == '业绩分配') {
customerResourcesTable.searchParam.type = 'yjfp';
} else if (pageName == '客户资源列表') {
customerResourcesTable.searchParam.type = 'khzy';
} else if (pageName == '资源列表') {
customerResourcesTable.searchParam.type = 'zylb';
}
// const type = pageName == '' ? 'yjfp' : 'khzy';
const modificationLog = (id : number) => {
router.push({ path: '/six_speed_modification_log/six_speed_modification_log', query: { id: id } })
}
const searchFormRef = ref<FormInstance>() const resourceChanges = (id : number) => {
router.push({ path: '/customer_resource_changes/customer_resource_changes', query: { id: id } })
}
//
const selectData = ref<any[]>([])
// /**
const sourceList = ref([] as any[]) * 添加订单
const sourceDictList = async () => { */
const editOrderTableDialog : Record<string, any> | null = ref(null)
const addOrder = (row : any) => {
console.log(row);
editOrderTableDialog.value.setFormData(row)
editOrderTableDialog.value.showDialog = true
}
const TcCustomerResourcesDialog : Record<string, any> | null = ref(null)
const tcEvent = (row : any) => {
TcCustomerResourcesDialog.value.setFormData(row)
TcCustomerResourcesDialog.value.showDialog = true
}
const searchFormRef = ref<FormInstance>()
//
const selectData = ref<any[]>([])
//
const sourceList = ref([] as any[])
const sourceDictList = async () => {
sourceList.value = await (await useDictionary('source')).data.dictionary sourceList.value = await (await useDictionary('source')).data.dictionary
} }
sourceDictList() sourceDictList();
const source_channelList = ref([] as any[]) const source_channelList = ref([] as any[])
const source_channelDictList = async () => { const source_channelDictList = async () => {
source_channelList.value = await ( source_channelList.value = await (await useDictionary('SourceChannel')).data.dictionary
await useDictionary('SourceChannel') }
).data.dictionary source_channelDictList();
} const genderList = ref([] as any[])
source_channelDictList() const genderDictList = async () => {
const genderList = ref([] as any[])
const genderDictList = async () => {
genderList.value = await (await useDictionary('zy_sex')).data.dictionary genderList.value = await (await useDictionary('zy_sex')).data.dictionary
} }
genderDictList() genderDictList();
const purchasing_powerList = ref([] as any[]) const purchasing_powerList = ref([] as any[])
const purchasing_powerDictList = async () => { const purchasing_powerDictList = async () => {
purchasing_powerList.value = await ( purchasing_powerList.value = await (await useDictionary('customer_purchasing_power')).data.dictionary
await useDictionary('customer_purchasing_power') }
).data.dictionary purchasing_powerDictList();
} const cognitive_ideaList = ref([] as any[])
purchasing_powerDictList() const cognitive_ideaDictList = async () => {
const cognitive_ideaList = ref([] as any[]) cognitive_ideaList.value = await (await useDictionary('cognitive_concept')).data.dictionary
const cognitive_ideaDictList = async () => { }
cognitive_ideaList.value = await ( cognitive_ideaDictList();
await useDictionary('cognitive_concept') const initial_intentList = ref([] as any[])
).data.dictionary const initial_intentDictList = async () => {
} initial_intentList.value = await (await useDictionary('preliminarycustomerintention')).data.dictionary
cognitive_ideaDictList() }
const initial_intentList = ref([] as any[]) initial_intentDictList();
const initial_intentDictList = async () => { const statusList = ref([] as any[])
initial_intentList.value = await ( const statusDictList = async () => {
await useDictionary('preliminarycustomerintention')
).data.dictionary
}
initial_intentDictList()
const statusList = ref([] as any[])
const statusDictList = async () => {
statusList.value = await (await useDictionary('kh_status')).data.dictionary statusList.value = await (await useDictionary('kh_status')).data.dictionary
} }
statusDictList() statusDictList();
/**
/**
* 获取客户资源列表 * 获取客户资源列表
*/ */
const loadCustomerResourcesList = (page: number = 1) => { const loadCustomerResourcesList = (page : number = 1) => {
customerResourcesTable.loading = true customerResourcesTable.loading = true
customerResourcesTable.page = page customerResourcesTable.page = page
getCustomerResourcesList({ getCustomerResourcesList({
page: customerResourcesTable.page, page: customerResourcesTable.page,
limit: customerResourcesTable.limit, limit: customerResourcesTable.limit,
...customerResourcesTable.searchParam, ...customerResourcesTable.searchParam
}) }).then(res => {
.then((res) => {
customerResourcesTable.loading = false customerResourcesTable.loading = false
customerResourcesTable.data = res.data.data customerResourcesTable.data = res.data.data
customerResourcesTable.total = res.data.total customerResourcesTable.total = res.data.total
}) }).catch(() => {
.catch(() => {
customerResourcesTable.loading = false customerResourcesTable.loading = false
}) })
} }
loadCustomerResourcesList() loadCustomerResourcesList()
const editCustomerResourcesDialog: Record<string, any> | null = ref(null) const editCustomerResourcesDialog : Record<string, any> | null = ref(null)
const fpCustomerResourcesDialog: Record<string, any> | null = ref(null) const fpCustomerResourcesDialog : Record<string, any> | null = ref(null)
/** /**
* 添加客户资源 * 添加客户资源
*/ */
const addEvent = () => { const addEvent = () => {
editCustomerResourcesDialog.value.setFormData() editCustomerResourcesDialog.value.setFormData()
editCustomerResourcesDialog.value.showDialog = true editCustomerResourcesDialog.value.showDialog = true
} }
/** /**
* 编辑客户资源 * 编辑客户资源
* @param data * @param data
*/ */
const editEvent = (data: any) => { const editEvent = (data : any) => {
editCustomerResourcesDialog.value.setFormData(data) editCustomerResourcesDialog.value.setFormData(data)
editCustomerResourcesDialog.value.showDialog = true editCustomerResourcesDialog.value.showDialog = true
} }
const fpEvent = (data: any) => { const fpEvent = (data : any) => {
fpCustomerResourcesDialog.value.setFormData(data) fpCustomerResourcesDialog.value.setFormData(data)
fpCustomerResourcesDialog.value.showDialog = true fpCustomerResourcesDialog.value.showDialog = true
} }
/**
/**
* 删除客户资源 * 删除客户资源
*/ */
const deleteEvent = (id: number) => { const deleteEvent = (id : number) => {
ElMessageBox.confirm(t('customerResourcesDeleteTips'), t('warning'), { ElMessageBox.confirm(t('customerResourcesDeleteTips'), t('warning'),
{
confirmButtonText: t('confirm'), confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'), cancelButtonText: t('cancel'),
type: 'warning', type: 'warning',
}).then(() => { }
deleteCustomerResources(id) ).then(() => {
.then(() => { deleteCustomerResources(id).then(() => {
loadCustomerResourcesList() loadCustomerResourcesList()
}).catch(() => {
}) })
.catch(() => {})
}) })
} }
const consultantList = ref([]) const consultantList = ref([])
const setConsultantList = async () => { const setConsultantList = async () => {
consultantList.value = await (await getWithPersonnelList({})).data consultantList.value = await (await getWithPersonnelList({})).data
} }
setConsultantList() setConsultantList()
const campusList = ref([]) const campusList = ref([])
const setCampusList = async () => { const setCampusList = async () => {
campusList.value = await (await getWithCampusList({})).data campusList.value = await (await getWithCampusList({})).data
} }
setCampusList() setCampusList()
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl : FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
formEl.resetFields() formEl.resetFields()
loadCustomerResourcesList() loadCustomerResourcesList()
} }
</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>

312
admin/src/app/views/order_table/components/order-table-edit.vue

@ -1,146 +1,78 @@
<template> <template>
<el-dialog <el-dialog v-model="showDialog" :title="formData.id ? t('updateOrderTable') : t('addOrderTable')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true">
v-model="showDialog" <el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
:title="formData.id ? t('updateOrderTable') : t('addOrderTable')" <el-form-item :label="t('resourceId')" prop="resource_id">
width="50%" <el-select class="input-width" v-model="formData.resource_id" clearable :placeholder="t('resourceIdPlaceholder')">
class="diy-dialog-wrap" <el-option label="请选择" value=""></el-option>
:destroy-on-close="true" <el-option
> v-for="(item, index) in resourceIdList"
<el-form :key="index"
:model="formData" :label="item['name']"
label-width="120px" :value="item['id']"
ref="formRef"
:rules="formRules"
class="page-form"
v-loading="loading"
>
<el-form-item :label="t('paymentId')" prop="payment_id">
<el-input
v-model="formData.payment_id"
clearable
:placeholder="t('paymentIdPlaceholder')"
class="input-width"
/> />
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('orderStatus')" prop="order_status"> <el-form-item :label="t('orderStatus')" prop="order_status">
<el-input <el-select class="input-width" v-model="formData.order_status" clearable :placeholder="t('orderStatusPlaceholder')">
v-model="formData.order_status" <el-option label="请选择" value=""></el-option>
clearable <el-option
:placeholder="t('orderStatusPlaceholder')" v-for="(item, index) in order_statusList"
class="input-width" :key="index"
:label="item.name"
:value="item.value"
/> />
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('paymentType')" prop="payment_type"> <el-form-item :label="t('paymentType')" prop="payment_type">
<el-input <el-select class="input-width" v-model="formData.payment_type" clearable :placeholder="t('paymentTypePlaceholder')">
v-model="formData.payment_type" <el-option label="请选择" value=""></el-option>
clearable <el-option
:placeholder="t('paymentTypePlaceholder')" v-for="(item, index) in payment_typeList"
class="input-width" :key="index"
:label="item.name"
:value="item.value"
/> />
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('orderAmount')" prop="order_amount"> <el-form-item :label="t('orderAmount')" prop="order_amount">
<el-input <el-input v-model="formData.order_amount" clearable :placeholder="t('orderAmountPlaceholder')" class="input-width" />
v-model="formData.order_amount"
clearable
:placeholder="t('orderAmountPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('courseId')" prop="course_id"> <el-form-item :label="t('courseId')" prop="course_id">
<el-input <el-select class="input-width" v-model="formData.course_id" clearable :placeholder="t('courseIdPlaceholder')">
v-model="formData.course_id" <el-option label="请选择" value=""></el-option>
clearable <el-option
:placeholder="t('courseIdPlaceholder')" v-for="(item, index) in courseIdList"
class="input-width" :key="index"
:label="item['course_name']"
:value="item['id']"
/> />
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('classId')" prop="class_id"> <el-form-item :label="t('classId')" prop="class_id">
<el-input <el-select class="input-width" v-model="formData.class_id" clearable :placeholder="t('classIdPlaceholder')">
v-model="formData.class_id" <el-option label="请选择" value=""></el-option>
clearable <el-option
:placeholder="t('classIdPlaceholder')" v-for="(item, index) in classIdList"
class="input-width" :key="index"
/> :label="item['class_name']"
</el-form-item> :value="item['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-form-item>
<el-form-item :label="t('resourceId')" prop="resource_id">
<el-input
v-model="formData.resource_id"
clearable
:placeholder="t('resourceIdPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('afterSalesStatus')">
<el-input
v-model="formData.after_sales_status"
clearable
:placeholder="t('afterSalesStatusPlaceholder')"
class="input-width"
/> />
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('afterSalesReason')">
<el-input
v-model="formData.after_sales_reason"
clearable
:placeholder="t('afterSalesReasonPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('afterSalesTime')">
<el-input
v-model="formData.after_sales_time"
clearable
:placeholder="t('afterSalesTimePlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('paymentTime')">
<el-input
v-model="formData.payment_time"
clearable
:placeholder="t('paymentTimePlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('subscriptionPaymentTime')">
<el-input
v-model="formData.subscription_payment_time"
clearable
:placeholder="t('subscriptionPaymentTimePlaceholder')"
class="input-width"
/>
</el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> <el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button <el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
type="primary" t('confirm')
:loading="loading" }}</el-button>
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -151,11 +83,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 { import { addOrderTable, editOrderTable, getOrderTableInfo, getWithCustomerResourcesList, getWithCourseList, getWithClassGradeList, getWithPersonnelList } from '@/app/api/order_table'
addOrderTable,
editOrderTable,
getOrderTableInfo,
} from '@/app/api/order_table'
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -165,19 +93,12 @@ const loading = ref(false)
*/ */
const initialFormData = { const initialFormData = {
id: '', id: '',
payment_id: '', resource_id: '',
order_status: '', order_status: '',
payment_type: '', payment_type: '',
order_amount: '', order_amount: '',
course_id: '', course_id: '',
class_id: '', class_id: '',
staff_id: '',
resource_id: '',
after_sales_status: '',
after_sales_reason: '',
after_sales_time: '',
payment_time: '',
subscription_payment_time: '',
} }
const formData: Record<string, any> = reactive({ ...initialFormData }) const formData: Record<string, any> = reactive({ ...initialFormData })
@ -186,61 +107,36 @@ const formRef = ref<FormInstance>()
// //
const formRules = computed(() => { const formRules = computed(() => {
return { return {
payment_id: [ resource_id: [
{ required: true, message: t('paymentIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('resourceIdPlaceholder'), trigger: 'blur' },
],
]
,
order_status: [ order_status: [
{ required: true, message: t('orderStatusPlaceholder'), trigger: 'blur' }, { required: true, message: t('orderStatusPlaceholder'), trigger: 'blur' },
],
]
,
payment_type: [ payment_type: [
{ required: true, message: t('paymentTypePlaceholder'), trigger: 'blur' }, { required: true, message: t('paymentTypePlaceholder'), trigger: 'blur' },
],
]
,
order_amount: [ order_amount: [
{ required: true, message: t('orderAmountPlaceholder'), trigger: 'blur' }, { required: true, message: t('orderAmountPlaceholder'), trigger: 'blur' },
],
]
,
course_id: [ course_id: [
{ required: true, message: t('courseIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('courseIdPlaceholder'), trigger: 'blur' },
],
]
,
class_id: [ class_id: [
{ required: true, message: t('classIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('classIdPlaceholder'), trigger: 'blur' },
],
staff_id: [ ]
{ required: true, message: t('staffIdPlaceholder'), trigger: 'blur' }, ,
],
resource_id: [
{ required: true, message: t('resourceIdPlaceholder'), trigger: 'blur' },
],
after_sales_status: [
{
required: true,
message: t('afterSalesStatusPlaceholder'),
trigger: 'blur',
},
],
after_sales_reason: [
{
required: true,
message: t('afterSalesReasonPlaceholder'),
trigger: 'blur',
},
],
after_sales_time: [
{
required: true,
message: t('afterSalesTimePlaceholder'),
trigger: 'blur',
},
],
payment_time: [
{ required: true, message: t('paymentTimePlaceholder'), trigger: 'blur' },
],
subscription_payment_time: [
{
required: true,
message: t('subscriptionPaymentTimePlaceholder'),
trigger: 'blur',
},
],
} }
}) })
@ -260,13 +156,11 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData let data = formData
save(data) save(data).then(res => {
.then((res) => {
loading.value = false loading.value = false
showDialog.value = false showDialog.value = false
emit('complete') emit('complete')
}) }).catch(err => {
.catch((err) => {
loading.value = false loading.value = false
}) })
} }
@ -274,18 +168,53 @@ const confirm = async (formEl: FormInstance | undefined) => {
} }
// //
let order_statusList = ref([])
const order_statusDictList = async () => {
order_statusList.value = await (await useDictionary('order_status')).data.dictionary
}
order_statusDictList();
watch(() => order_statusList.value, () => { formData.order_status = order_statusList.value[0].value })
let payment_typeList = ref([])
const payment_typeDictList = async () => {
payment_typeList.value = await (await useDictionary('payment_type')).data.dictionary
}
payment_typeDictList();
watch(() => payment_typeList.value, () => { formData.payment_type = payment_typeList.value[0].value })
const resourceIdList = ref([] as any[])
const setResourceIdList = async () => {
resourceIdList.value = await (await getWithCustomerResourcesList({})).data
}
setResourceIdList()
const courseIdList = ref([] as any[])
const setCourseIdList = async () => {
courseIdList.value = await (await getWithCourseList({})).data
}
setCourseIdList()
const classIdList = ref([] as any[])
const setClassIdList = async () => {
classIdList.value = await (await getWithClassGradeList({})).data
}
setClassIdList()
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 Object.assign(formData, row)
if (row) { // formData.resource_id = row.resource_id;
const data = await (await getOrderTableInfo(row.id)).data // console.log(0)
if (data) // loading.value = true
Object.keys(formData).forEach((key: string) => { // if(row){
if (data[key] != undefined) formData[key] = data[key] // const data = await (await getOrderTableInfo(row.id)).data
}) // if (data) Object.keys(formData).forEach((key: string) => {
} // if (data[key] != undefined) formData[key] = data[key]
loading.value = false // })
// }
// loading.value = false
} }
// //
@ -299,12 +228,7 @@ const mobileVerify = (rule: any, value: any, callback: any) => {
// //
const idCardVerify = (rule: any, value: any, callback: any) => { const idCardVerify = (rule: any, value: any, callback: any) => {
if ( 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)) {
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'))) callback(new Error(t('generateIdCard')))
} else { } else {
callback() callback()
@ -331,13 +255,13 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({ defineExpose({
showDialog, showDialog,
setFormData, setFormData
}) })
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>
<style lang="scss"> <style lang="scss">
.diy-dialog-wrap .el-form-item__label { .diy-dialog-wrap .el-form-item__label{
height: auto !important; height: auto !important;
} }
</style> </style>

339
admin/src/app/views/order_table/order_table.vue

@ -1,245 +1,94 @@
<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"> <div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span> <span class="text-lg">{{pageName}}</span>
<el-button type="primary" @click="addEvent"> <el-button type="primary" @click="addEvent">
{{ t('addOrderTable') }} {{ t('addOrderTable') }}
</el-button> </el-button>
</div> </div>
<el-card <el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
class="box-card !border-none my-[10px] table-search-wrap" <el-form :inline="true" :model="orderTableTable.searchParam" ref="searchFormRef">
shadow="never"
>
<el-form
:inline="true"
:model="orderTableTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('paymentId')" prop="payment_id">
<el-input
v-model="orderTableTable.searchParam.payment_id"
:placeholder="t('paymentIdPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('orderStatus')" prop="order_status"> <el-form-item :label="t('orderStatus')" prop="order_status">
<el-input <el-select class="w-[280px]" v-model="orderTableTable.searchParam.order_status" clearable :placeholder="t('orderStatusPlaceholder')">
v-model="orderTableTable.searchParam.order_status" <el-option label="全部" value=""></el-option>
:placeholder="t('orderStatusPlaceholder')" <el-option
/> v-for="(item, index) in order_statusList"
:key="index"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('paymentType')" prop="payment_type"> <el-form-item :label="t('paymentType')" prop="payment_type">
<el-input <el-select class="w-[280px]" v-model="orderTableTable.searchParam.payment_type" clearable :placeholder="t('paymentTypePlaceholder')">
v-model="orderTableTable.searchParam.payment_type" <el-option label="全部" value=""></el-option>
:placeholder="t('paymentTypePlaceholder')" <el-option
/> v-for="(item, index) in payment_typeList"
</el-form-item> :key="index"
<el-form-item :label="t('orderAmount')" prop="order_amount"> :label="item.name"
<el-input :value="item.value"
v-model="orderTableTable.searchParam.order_amount" />
:placeholder="t('orderAmountPlaceholder')" </el-select>
/>
</el-form-item>
<el-form-item :label="t('courseId')" prop="course_id">
<el-input
v-model="orderTableTable.searchParam.course_id"
:placeholder="t('courseIdPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('classId')" prop="class_id">
<el-input
v-model="orderTableTable.searchParam.class_id"
:placeholder="t('classIdPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('staffId')" prop="staff_id">
<el-input
v-model="orderTableTable.searchParam.staff_id"
:placeholder="t('staffIdPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('resourceId')" prop="resource_id">
<el-input
v-model="orderTableTable.searchParam.resource_id"
:placeholder="t('resourceIdPlaceholder')"
/>
</el-form-item>
<el-form-item
:label="t('afterSalesStatus')"
prop="after_sales_status"
>
<el-input
v-model="orderTableTable.searchParam.after_sales_status"
:placeholder="t('afterSalesStatusPlaceholder')"
/>
</el-form-item>
<el-form-item
:label="t('afterSalesReason')"
prop="after_sales_reason"
>
<el-input
v-model="orderTableTable.searchParam.after_sales_reason"
:placeholder="t('afterSalesReasonPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('afterSalesTime')" prop="after_sales_time">
<el-input
v-model="orderTableTable.searchParam.after_sales_time"
:placeholder="t('afterSalesTimePlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('paymentTime')" prop="payment_time">
<el-input
v-model="orderTableTable.searchParam.payment_time"
:placeholder="t('paymentTimePlaceholder')"
/>
</el-form-item>
<el-form-item
:label="t('subscriptionPaymentTime')"
prop="subscription_payment_time"
>
<el-input
v-model="orderTableTable.searchParam.subscription_payment_time"
:placeholder="t('subscriptionPaymentTimePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadOrderTableList()">{{ <el-button type="primary" @click="loadOrderTableList()">{{ t('search') }}</el-button>
t('search') <el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<div class="mt-[10px]"> <div class="mt-[10px]">
<el-table <el-table :data="orderTableTable.data" size="large" v-loading="orderTableTable.loading">
:data="orderTableTable.data"
size="large"
v-loading="orderTableTable.loading"
>
<template #empty> <template #empty>
<span>{{ !orderTableTable.loading ? t('emptyData') : '' }}</span> <span>{{ !orderTableTable.loading ? t('emptyData') : '' }}</span>
</template> </template>
<el-table-column <el-table-column prop="resource_id_name" :label="t('resourceId')" min-width="120" :show-overflow-tooltip="true"/>
prop="payment_id"
:label="t('paymentId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="order_status"
:label="t('orderStatus')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column <el-table-column :label="t('orderStatus')" min-width="180" align="center" :show-overflow-tooltip="true">
prop="payment_type" <template #default="{ row }">
:label="t('paymentType')" <div v-for="(item, index) in order_statusList">
min-width="120" <div v-if="item.value == row.order_status">{{ item.name }}</div>
:show-overflow-tooltip="true" </div>
/> </template>
</el-table-column>
<el-table-column
prop="order_amount"
:label="t('orderAmount')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="course_id"
:label="t('courseId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="class_id"
:label="t('classId')"
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 <el-table-column :label="t('paymentType')" min-width="180" align="center" :show-overflow-tooltip="true">
prop="resource_id" <template #default="{ row }">
:label="t('resourceId')" <div v-for="(item, index) in payment_typeList">
min-width="120" <div v-if="item.value == row.payment_type">{{ item.name }}</div>
:show-overflow-tooltip="true" </div>
/> </template>
</el-table-column>
<el-table-column <el-table-column prop="order_amount" :label="t('orderAmount')" min-width="120" :show-overflow-tooltip="true"/>
prop="after_sales_status"
:label="t('afterSalesStatus')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column <el-table-column prop="course_id_name" :label="t('courseId')" min-width="120" :show-overflow-tooltip="true"/>
prop="after_sales_reason"
:label="t('afterSalesReason')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column <el-table-column prop="class_id_name" :label="t('classId')" min-width="120" :show-overflow-tooltip="true"/>
prop="after_sales_time"
:label="t('afterSalesTime')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column <el-table-column prop="staff_id_name" :label="t('staffId')" min-width="120" :show-overflow-tooltip="true"/>
prop="payment_time"
:label="t('paymentTime')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column <el-table-column prop="payment_time" :label="t('paymentTime')" min-width="120" :show-overflow-tooltip="true"/>
prop="subscription_payment_time"
:label="t('subscriptionPaymentTime')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column <el-table-column :label="t('operation')" fixed="right" min-width="120">
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ <el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
t('edit') <el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="mt-[16px] flex justify-end"> <div class="mt-[16px] flex justify-end">
<el-pagination <el-pagination v-model:current-page="orderTableTable.page" v-model:page-size="orderTableTable.limit"
v-model:current-page="orderTableTable.page" layout="total, sizes, prev, pager, next, jumper" :total="orderTableTable.total"
v-model:page-size="orderTableTable.limit" @size-change="loadOrderTableList()" @current-change="loadOrderTableList" />
layout="total, sizes, prev, pager, next, jumper"
:total="orderTableTable.total"
@size-change="loadOrderTableList()"
@current-change="loadOrderTableList"
/>
</div> </div>
</div> </div>
@ -252,13 +101,13 @@
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 { getOrderTableList, deleteOrderTable } from '@/app/api/order_table' import { getOrderTableList, deleteOrderTable, getWithCustomerResourcesList, getWithCourseList, getWithClassGradeList, getWithPersonnelList } from '@/app/api/order_table'
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/order_table/components/order-table-edit.vue' import Edit from '@/app/views/order_table/components/order-table-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 orderTableTable = reactive({ let orderTableTable = reactive({
page: 1, page: 1,
@ -266,21 +115,10 @@ let orderTableTable = reactive({
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam: { searchParam:{
payment_id: '', "order_status":"",
order_status: '', "payment_type":""
payment_type: '', }
order_amount: '',
course_id: '',
class_id: '',
staff_id: '',
resource_id: '',
after_sales_status: '',
after_sales_reason: '',
after_sales_time: '',
payment_time: '',
subscription_payment_time: '',
},
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -289,6 +127,16 @@ const searchFormRef = ref<FormInstance>()
const selectData = ref<any[]>([]) const selectData = ref<any[]>([])
// //
const order_statusList = ref([] as any[])
const order_statusDictList = async () => {
order_statusList.value = await (await useDictionary('order_status')).data.dictionary
}
order_statusDictList();
const payment_typeList = ref([] as any[])
const payment_typeDictList = async () => {
payment_typeList.value = await (await useDictionary('payment_type')).data.dictionary
}
payment_typeDictList();
/** /**
* 获取订单列表 * 获取订单列表
@ -300,14 +148,12 @@ const loadOrderTableList = (page: number = 1) => {
getOrderTableList({ getOrderTableList({
page: orderTableTable.page, page: orderTableTable.page,
limit: orderTableTable.limit, limit: orderTableTable.limit,
...orderTableTable.searchParam, ...orderTableTable.searchParam
}) }).then(res => {
.then((res) => {
orderTableTable.loading = false orderTableTable.loading = false
orderTableTable.data = res.data.data orderTableTable.data = res.data.data
orderTableTable.total = res.data.total orderTableTable.total = res.data.total
}) }).catch(() => {
.catch(() => {
orderTableTable.loading = false orderTableTable.loading = false
}) })
} }
@ -336,19 +182,42 @@ const editEvent = (data: any) => {
* 删除订单 * 删除订单
*/ */
const deleteEvent = (id: number) => { const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('orderTableDeleteTips'), t('warning'), { ElMessageBox.confirm(t('orderTableDeleteTips'), t('warning'),
{
confirmButtonText: t('confirm'), confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'), cancelButtonText: t('cancel'),
type: 'warning', type: 'warning',
}).then(() => { }
deleteOrderTable(id) ).then(() => {
.then(() => { deleteOrderTable(id).then(() => {
loadOrderTableList() loadOrderTableList()
}).catch(() => {
}) })
.catch(() => {})
}) })
} }
const resourceIdList = ref([])
const setResourceIdList = async () => {
resourceIdList.value = await (await getWithCustomerResourcesList({})).data
}
setResourceIdList()
const courseIdList = ref([])
const setCourseIdList = async () => {
courseIdList.value = await (await getWithCourseList({})).data
}
setCourseIdList()
const classIdList = ref([])
const setClassIdList = async () => {
classIdList.value = await (await getWithClassGradeList({})).data
}
setClassIdList()
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
formEl.resetFields() formEl.resetFields()
@ -365,5 +234,5 @@ const resetForm = (formEl: FormInstance | undefined) => {
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
} }
</style> </style>

339
admin/src/app/views/physical_test/components/physical-test-edit.vue

@ -1,182 +1,98 @@
<template> <template>
<el-dialog <el-dialog v-model="showDialog" :title="formData.id ? t('updatePhysicalTest') : t('addPhysicalTest')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true">
v-model="showDialog" <el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
:title="formData.id ? t('updatePhysicalTest') : t('addPhysicalTest')"
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('resourceId')" prop="resource_id"> <el-form-item :label="t('resourceId')" prop="resource_id">
<el-input <el-select class="input-width" v-model="formData.resource_id" clearable :placeholder="t('resourceIdPlaceholder')">
v-model="formData.resource_id" <el-option label="请选择" value=""></el-option>
clearable <el-option
:placeholder="t('resourceIdPlaceholder')" v-for="(item, index) in resourceIdList"
class="input-width" :key="index"
:label="item['name']"
:value="item['id']"
/> />
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('studentId')" prop="student_id"> <el-form-item :label="t('studentId')" prop="student_id">
<el-input <el-select class="input-width" v-model="formData.student_id" clearable :placeholder="t('studentIdPlaceholder')">
v-model="formData.student_id" <el-option label="请选择" value=""></el-option>
clearable <el-option
:placeholder="t('studentIdPlaceholder')" v-for="(item, index) in studentIdList"
class="input-width" :key="index"
:label="item['name']"
:value="item['id']"
/> />
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('height')" prop="height"> <el-form-item :label="t('height')" prop="height">
<el-input <el-input v-model="formData.height" clearable :placeholder="t('heightPlaceholder')" class="input-width" />
v-model="formData.height"
clearable
:placeholder="t('heightPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('weight')" prop="weight"> <el-form-item :label="t('weight')" prop="weight">
<el-input <el-input v-model="formData.weight" clearable :placeholder="t('weightPlaceholder')" class="input-width" />
v-model="formData.weight"
clearable
:placeholder="t('weightPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('coachId')" prop="coach_id"> <el-form-item :label="t('coachId')" prop="coach_id">
<el-input <el-select class="input-width" v-model="formData.coach_id" clearable :placeholder="t('coachIdPlaceholder')">
v-model="formData.coach_id" <el-option label="请选择" value=""></el-option>
clearable <el-option
:placeholder="t('coachIdPlaceholder')" v-for="(item, index) in coachIdList"
class="input-width" :key="index"
:label="item['name']"
:value="item['id']"
/> />
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('createdAt')"> <el-form-item :label="t('seatedForwardBend')" >
<el-input <el-input v-model="formData.seated_forward_bend" clearable :placeholder="t('seatedForwardBendPlaceholder')" class="input-width" />
v-model="formData.created_at"
clearable
:placeholder="t('createdAtPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('updatedAt')"> <el-form-item :label="t('sitUps')" >
<el-input <el-input v-model="formData.sit_ups" clearable :placeholder="t('sitUpsPlaceholder')" class="input-width" />
v-model="formData.updated_at"
clearable
:placeholder="t('updatedAtPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('seatedForwardBend')"> <el-form-item :label="t('pushUps')" >
<el-input <el-input v-model="formData.push_ups" clearable :placeholder="t('pushUpsPlaceholder')" class="input-width" />
v-model="formData.seated_forward_bend"
clearable
:placeholder="t('seatedForwardBendPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('sitUps')"> <el-form-item :label="t('flamingoBalance')" >
<el-input <el-input v-model="formData.flamingo_balance" clearable :placeholder="t('flamingoBalancePlaceholder')" class="input-width" />
v-model="formData.sit_ups"
clearable
:placeholder="t('sitUpsPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('pushUps')"> <el-form-item :label="t('thirtySecJump')" >
<el-input <el-input v-model="formData.thirty_sec_jump" clearable :placeholder="t('thirtySecJumpPlaceholder')" class="input-width" />
v-model="formData.push_ups"
clearable
:placeholder="t('pushUpsPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('flamingoBalance')"> <el-form-item :label="t('standingLongJump')" >
<el-input <el-input v-model="formData.standing_long_jump" clearable :placeholder="t('standingLongJumpPlaceholder')" class="input-width" />
v-model="formData.flamingo_balance"
clearable
:placeholder="t('flamingoBalancePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('thirtySecJump')"> <el-form-item :label="t('agilityRun')" >
<el-input <el-input v-model="formData.agility_run" clearable :placeholder="t('agilityRunPlaceholder')" class="input-width" />
v-model="formData.thirty_sec_jump"
clearable
:placeholder="t('thirtySecJumpPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('standingLongJump')"> <el-form-item :label="t('balanceBeam')" >
<el-input <el-input v-model="formData.balance_beam" clearable :placeholder="t('balanceBeamPlaceholder')" class="input-width" />
v-model="formData.standing_long_jump"
clearable
:placeholder="t('standingLongJumpPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('agilityRun')"> <el-form-item :label="t('tennisThrow')" >
<el-input <el-input v-model="formData.tennis_throw" clearable :placeholder="t('tennisThrowPlaceholder')" class="input-width" />
v-model="formData.agility_run"
clearable
:placeholder="t('agilityRunPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('balanceBeam')"> <el-form-item :label="t('tenMeterShuttleRun')" >
<el-input <el-input v-model="formData.ten_meter_shuttle_run" clearable :placeholder="t('tenMeterShuttleRunPlaceholder')" class="input-width" />
v-model="formData.balance_beam"
clearable
:placeholder="t('balanceBeamPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('tennisThrow')">
<el-input
v-model="formData.tennis_throw"
clearable
:placeholder="t('tennisThrowPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('tenMeterShuttleRun')">
<el-input
v-model="formData.ten_meter_shuttle_run"
clearable
:placeholder="t('tenMeterShuttleRunPlaceholder')"
class="input-width"
/>
</el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> <el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button <el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
type="primary" t('confirm')
:loading="loading" }}</el-button>
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -187,11 +103,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 { import { addPhysicalTest, editPhysicalTest, getPhysicalTestInfo, getWithCustomerResourcesList, getWithStudentList, getWithPersonnelList } from '@/app/api/physical_test'
addPhysicalTest,
editPhysicalTest,
getPhysicalTestInfo,
} from '@/app/api/physical_test'
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -206,8 +118,6 @@ const initialFormData = {
height: '', height: '',
weight: '', weight: '',
coach_id: '', coach_id: '',
created_at: '',
updated_at: '',
seated_forward_bend: '', seated_forward_bend: '',
sit_ups: '', sit_ups: '',
push_ups: '', push_ups: '',
@ -228,75 +138,79 @@ const formRules = computed(() => {
return { return {
resource_id: [ resource_id: [
{ required: true, message: t('resourceIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('resourceIdPlaceholder'), trigger: 'blur' },
],
]
,
student_id: [ student_id: [
{ required: true, message: t('studentIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('studentIdPlaceholder'), trigger: 'blur' },
],
]
,
height: [ height: [
{ required: true, message: t('heightPlaceholder'), trigger: 'blur' }, { required: true, message: t('heightPlaceholder'), trigger: 'blur' },
],
]
,
weight: [ weight: [
{ required: true, message: t('weightPlaceholder'), trigger: 'blur' }, { required: true, message: t('weightPlaceholder'), trigger: 'blur' },
],
]
,
coach_id: [ coach_id: [
{ required: true, message: t('coachIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('coachIdPlaceholder'), trigger: 'blur' },
],
created_at: [ ]
{ required: true, message: t('createdAtPlaceholder'), trigger: 'blur' }, ,
],
updated_at: [
{ required: true, message: t('updatedAtPlaceholder'), trigger: 'blur' },
],
seated_forward_bend: [ seated_forward_bend: [
{ { required: true, message: t('seatedForwardBendPlaceholder'), trigger: 'blur' },
required: true,
message: t('seatedForwardBendPlaceholder'), ]
trigger: 'blur', ,
},
],
sit_ups: [ sit_ups: [
{ required: true, message: t('sitUpsPlaceholder'), trigger: 'blur' }, { required: true, message: t('sitUpsPlaceholder'), trigger: 'blur' },
],
]
,
push_ups: [ push_ups: [
{ required: true, message: t('pushUpsPlaceholder'), trigger: 'blur' }, { required: true, message: t('pushUpsPlaceholder'), trigger: 'blur' },
],
]
,
flamingo_balance: [ flamingo_balance: [
{ { required: true, message: t('flamingoBalancePlaceholder'), trigger: 'blur' },
required: true,
message: t('flamingoBalancePlaceholder'), ]
trigger: 'blur', ,
},
],
thirty_sec_jump: [ thirty_sec_jump: [
{ { required: true, message: t('thirtySecJumpPlaceholder'), trigger: 'blur' },
required: true,
message: t('thirtySecJumpPlaceholder'), ]
trigger: 'blur', ,
},
],
standing_long_jump: [ standing_long_jump: [
{ { required: true, message: t('standingLongJumpPlaceholder'), trigger: 'blur' },
required: true,
message: t('standingLongJumpPlaceholder'), ]
trigger: 'blur', ,
},
],
agility_run: [ agility_run: [
{ required: true, message: t('agilityRunPlaceholder'), trigger: 'blur' }, { required: true, message: t('agilityRunPlaceholder'), trigger: 'blur' },
],
]
,
balance_beam: [ balance_beam: [
{ required: true, message: t('balanceBeamPlaceholder'), trigger: 'blur' }, { required: true, message: t('balanceBeamPlaceholder'), trigger: 'blur' },
],
]
,
tennis_throw: [ tennis_throw: [
{ required: true, message: t('tennisThrowPlaceholder'), trigger: 'blur' }, { required: true, message: t('tennisThrowPlaceholder'), trigger: 'blur' },
],
]
,
ten_meter_shuttle_run: [ ten_meter_shuttle_run: [
{ { required: true, message: t('tenMeterShuttleRunPlaceholder'), trigger: 'blur' },
required: true,
message: t('tenMeterShuttleRunPlaceholder'), ]
trigger: 'blur', ,
},
],
} }
}) })
@ -316,13 +230,11 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData let data = formData
save(data) save(data).then(res => {
.then((res) => {
loading.value = false loading.value = false
showDialog.value = false showDialog.value = false
emit('complete') emit('complete')
}) }).catch(err => {
.catch((err) => {
loading.value = false loading.value = false
}) })
} }
@ -331,16 +243,34 @@ const confirm = async (formEl: FormInstance | undefined) => {
// //
const resourceIdList = ref([] as any[])
const setResourceIdList = async () => {
resourceIdList.value = await (await getWithCustomerResourcesList({})).data
}
setResourceIdList()
const studentIdList = ref([] as any[])
const setStudentIdList = async () => {
studentIdList.value = await (await getWithStudentList({})).data
}
setStudentIdList()
const coachIdList = ref([] as any[])
const setCoachIdList = async () => {
coachIdList.value = await (await getWithPersonnelList({})).data
}
setCoachIdList()
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
if (row) {
const data = await (await getPhysicalTestInfo(row.id)).data Object.assign(formData, row)
if (data) // if(row){
Object.keys(formData).forEach((key: string) => { // const data = await (await getPhysicalTestInfo(row.id)).data
if (data[key] != undefined) formData[key] = data[key] // if (data) Object.keys(formData).forEach((key: string) => {
}) // if (data[key] != undefined) formData[key] = data[key]
} // })
// }
loading.value = false loading.value = false
} }
@ -355,12 +285,7 @@ const mobileVerify = (rule: any, value: any, callback: any) => {
// //
const idCardVerify = (rule: any, value: any, callback: any) => { const idCardVerify = (rule: any, value: any, callback: any) => {
if ( 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)) {
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'))) callback(new Error(t('generateIdCard')))
} else { } else {
callback() callback()
@ -387,13 +312,13 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({ defineExpose({
showDialog, showDialog,
setFormData, setFormData
}) })
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>
<style lang="scss"> <style lang="scss">
.diy-dialog-wrap .el-form-item__label { .diy-dialog-wrap .el-form-item__label{
height: auto !important; height: auto !important;
} }
</style> </style>

201
admin/src/app/views/physical_test/physical_test.vue

@ -1,134 +1,78 @@
<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"> <div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span> <span class="text-lg">{{pageName}}</span>
<el-button type="primary" @click="addEvent"> <el-button type="primary" @click="addEvent">
{{ t('addPhysicalTest') }} {{ t('addPhysicalTest') }}
</el-button> </el-button>
</div> </div>
<el-card <el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
class="box-card !border-none my-[10px] table-search-wrap" <el-form :inline="true" :model="physicalTestTable.searchParam" ref="searchFormRef">
shadow="never"
>
<el-form
:inline="true"
:model="physicalTestTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('resourceId')" prop="resource_id"> <el-form-item :label="t('resourceId')" prop="resource_id">
<el-input <el-select class="w-[280px]" v-model="physicalTestTable.searchParam.resource_id" clearable :placeholder="t('resourceIdPlaceholder')">
v-model="physicalTestTable.searchParam.resource_id" <el-option
:placeholder="t('resourceIdPlaceholder')" v-for="(item, index) in resourceIdList"
:key="index"
:label="item['name']"
:value="item['id']"
/> />
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('studentId')" prop="student_id"> <el-form-item :label="t('studentId')" prop="student_id">
<el-input <el-select class="w-[280px]" v-model="physicalTestTable.searchParam.student_id" clearable :placeholder="t('studentIdPlaceholder')">
v-model="physicalTestTable.searchParam.student_id" <el-option
:placeholder="t('studentIdPlaceholder')" v-for="(item, index) in studentIdList"
/> :key="index"
</el-form-item> :label="item['name']"
<el-form-item :label="t('height')" prop="height"> :value="item['id']"
<el-input
v-model="physicalTestTable.searchParam.height"
:placeholder="t('heightPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('createdAt')" prop="created_at">
<el-input
v-model="physicalTestTable.searchParam.created_at"
:placeholder="t('createdAtPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('updatedAt')" prop="updated_at">
<el-input
v-model="physicalTestTable.searchParam.updated_at"
:placeholder="t('updatedAtPlaceholder')"
/> />
</el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadPhysicalTestList()">{{ <el-button type="primary" @click="loadPhysicalTestList()">{{ t('search') }}</el-button>
t('search') <el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<div class="mt-[10px]"> <div class="mt-[10px]">
<el-table <el-table :data="physicalTestTable.data" size="large" v-loading="physicalTestTable.loading">
:data="physicalTestTable.data"
size="large"
v-loading="physicalTestTable.loading"
>
<template #empty> <template #empty>
<span>{{ !physicalTestTable.loading ? t('emptyData') : '' }}</span> <span>{{ !physicalTestTable.loading ? t('emptyData') : '' }}</span>
</template> </template>
<el-table-column <el-table-column prop="resource_id_name" :label="t('resourceId')" min-width="120" :show-overflow-tooltip="true"/>
prop="resource_id"
:label="t('resourceId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column <el-table-column prop="student_id_name" :label="t('studentId')" min-width="120" :show-overflow-tooltip="true"/>
prop="student_id"
:label="t('studentId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column <el-table-column prop="height" :label="t('height')" min-width="120" :show-overflow-tooltip="true"/>
prop="height"
:label="t('height')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column <el-table-column prop="weight" :label="t('weight')" min-width="120" :show-overflow-tooltip="true"/>
prop="created_at"
:label="t('createdAt')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column <el-table-column prop="coach_id_name" :label="t('coachId')" min-width="120" :show-overflow-tooltip="true"/>
prop="updated_at"
:label="t('updatedAt')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column <el-table-column :label="t('operation')" fixed="right" min-width="120">
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ <el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
t('edit') <el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="mt-[16px] flex justify-end"> <div class="mt-[16px] flex justify-end">
<el-pagination <el-pagination v-model:current-page="physicalTestTable.page" v-model:page-size="physicalTestTable.limit"
v-model:current-page="physicalTestTable.page" layout="total, sizes, prev, pager, next, jumper" :total="physicalTestTable.total"
v-model:page-size="physicalTestTable.limit" @size-change="loadPhysicalTestList()" @current-change="loadPhysicalTestList" />
layout="total, sizes, prev, pager, next, jumper"
:total="physicalTestTable.total"
@size-change="loadPhysicalTestList()"
@current-change="loadPhysicalTestList"
/>
</div> </div>
</div> </div>
<edit ref="editPhysicalTestDialog" @complete="loadPhysicalTestList" />
</el-card> </el-card>
</div> </div>
</template> </template>
@ -137,16 +81,13 @@
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 { import { getPhysicalTestList, deletePhysicalTest, getWithCustomerResourcesList, getWithStudentList, getWithPersonnelList } from '@/app/api/physical_test'
getPhysicalTestList,
deletePhysicalTest,
} from '@/app/api/physical_test'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox, FormInstance } from 'element-plus' import { ElMessageBox,FormInstance } from 'element-plus'
import { useRouter } from 'vue-router' import Edit from '@/app/views/physical_test/components/physical-test-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 physicalTestTable = reactive({ let physicalTestTable = reactive({
page: 1, page: 1,
@ -154,13 +95,10 @@ let physicalTestTable = reactive({
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam: { searchParam:{
resource_id: '', "resource_id":"",
student_id: '', "student_id":""
height: '', }
created_at: '',
updated_at: '',
},
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -170,6 +108,7 @@ const selectData = ref<any[]>([])
// //
/** /**
* 获取体测列表 * 获取体测列表
*/ */
@ -180,26 +119,25 @@ const loadPhysicalTestList = (page: number = 1) => {
getPhysicalTestList({ getPhysicalTestList({
page: physicalTestTable.page, page: physicalTestTable.page,
limit: physicalTestTable.limit, limit: physicalTestTable.limit,
...physicalTestTable.searchParam, ...physicalTestTable.searchParam
}) }).then(res => {
.then((res) => {
physicalTestTable.loading = false physicalTestTable.loading = false
physicalTestTable.data = res.data.data physicalTestTable.data = res.data.data
physicalTestTable.total = res.data.total physicalTestTable.total = res.data.total
}) }).catch(() => {
.catch(() => {
physicalTestTable.loading = false physicalTestTable.loading = false
}) })
} }
loadPhysicalTestList() loadPhysicalTestList()
const router = useRouter() const editPhysicalTestDialog: Record<string, any> | null = ref(null)
/** /**
* 添加体测 * 添加体测
*/ */
const addEvent = () => { const addEvent = () => {
router.push('/physical_test/physical_test_edit') editPhysicalTestDialog.value.setFormData()
editPhysicalTestDialog.value.showDialog = true
} }
/** /**
@ -207,26 +145,45 @@ const addEvent = () => {
* @param data * @param data
*/ */
const editEvent = (data: any) => { const editEvent = (data: any) => {
router.push('/physical_test/physical_test_edit?id=' + data.id) editPhysicalTestDialog.value.setFormData(data)
editPhysicalTestDialog.value.showDialog = true
} }
/** /**
* 删除体测 * 删除体测
*/ */
const deleteEvent = (id: number) => { const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('physicalTestDeleteTips'), t('warning'), { ElMessageBox.confirm(t('physicalTestDeleteTips'), t('warning'),
{
confirmButtonText: t('confirm'), confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'), cancelButtonText: t('cancel'),
type: 'warning', type: 'warning',
}).then(() => { }
deletePhysicalTest(id) ).then(() => {
.then(() => { deletePhysicalTest(id).then(() => {
loadPhysicalTestList() loadPhysicalTestList()
}).catch(() => {
}) })
.catch(() => {})
}) })
} }
const resourceIdList = ref([])
const setResourceIdList = async () => {
resourceIdList.value = await (await getWithCustomerResourcesList({})).data
}
setResourceIdList()
const studentIdList = ref([])
const setStudentIdList = async () => {
studentIdList.value = await (await getWithStudentList({})).data
}
setStudentIdList()
const coachIdList = ref([])
const setCoachIdList = async () => {
coachIdList.value = await (await getWithPersonnelList({})).data
}
setCoachIdList()
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
formEl.resetFields() formEl.resetFields()
@ -243,5 +200,5 @@ const resetForm = (formEl: FormInstance | undefined) => {
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
} }
</style> </style>

326
admin/src/app/views/physical_test/physical_test_edit.vue

@ -3,178 +3,110 @@
<div class="detail-head"> <div class="detail-head">
<div class="left" @click="back()"> <div class="left" @click="back()">
<span class="iconfont iconxiangzuojiantou !text-xs"></span> <span class="iconfont iconxiangzuojiantou !text-xs"></span>
<span class="ml-[1px]">{{ t('returnToPreviousPage') }}</span> <span class="ml-[1px]">{{t('returnToPreviousPage')}}</span>
</div> </div>
<span class="adorn">|</span> <span class="adorn">|</span>
<span class="right">{{ pageName }}</span> <span class="right">{{ pageName }}</span>
</div> </div>
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<el-form <el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form">
:model="formData"
label-width="90px"
ref="formRef"
:rules="formRules"
class="page-form"
>
<el-form-item :label="t('resourceId')" prop="resource_id"> <el-form-item :label="t('resourceId')" prop="resource_id">
<el-input <el-select class="input-width" v-model="formData.resource_id" clearable :placeholder="t('resourceIdPlaceholder')">
v-model="formData.resource_id" <el-option label="请选择" value=""></el-option>
clearable <el-option
:placeholder="t('resourceIdPlaceholder')" v-for="(item, index) in resourceIdList"
class="input-width" :key="index"
:label="item['name']"
:value="item['id']"
/> />
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('studentId')" prop="student_id"> <el-form-item :label="t('studentId')" prop="student_id">
<el-input <el-select class="input-width" v-model="formData.student_id" clearable :placeholder="t('studentIdPlaceholder')">
v-model="formData.student_id" <el-option label="请选择" value=""></el-option>
clearable <el-option
:placeholder="t('studentIdPlaceholder')" v-for="(item, index) in studentIdList"
class="input-width" :key="index"
:label="item['name']"
:value="item['id']"
/> />
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('height')" prop="height"> <el-form-item :label="t('height')" prop="height">
<el-input <el-input v-model="formData.height" clearable :placeholder="t('heightPlaceholder')" class="input-width" />
v-model="formData.height"
clearable
:placeholder="t('heightPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('weight')" prop="weight"> <el-form-item :label="t('weight')" prop="weight">
<el-input <el-input v-model="formData.weight" clearable :placeholder="t('weightPlaceholder')" class="input-width" />
v-model="formData.weight"
clearable
:placeholder="t('weightPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('coachId')" prop="coach_id"> <el-form-item :label="t('coachId')" prop="coach_id">
<el-input <el-select class="input-width" v-model="formData.coach_id" clearable :placeholder="t('coachIdPlaceholder')">
v-model="formData.coach_id" <el-option label="请选择" value=""></el-option>
clearable <el-option
:placeholder="t('coachIdPlaceholder')" v-for="(item, index) in coachIdList"
class="input-width" :key="index"
:label="item['name']"
:value="item['id']"
/> />
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('createdAt')"> <el-form-item :label="t('createdAt')" >
<el-input <el-input v-model="formData.created_at" clearable :placeholder="t('createdAtPlaceholder')" class="input-width" />
v-model="formData.created_at"
clearable
:placeholder="t('createdAtPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('updatedAt')"> <el-form-item :label="t('updatedAt')" >
<el-input <el-input v-model="formData.updated_at" clearable :placeholder="t('updatedAtPlaceholder')" class="input-width" />
v-model="formData.updated_at"
clearable
:placeholder="t('updatedAtPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('seatedForwardBend')"> <el-form-item :label="t('seatedForwardBend')" >
<el-input <el-input v-model="formData.seated_forward_bend" clearable :placeholder="t('seatedForwardBendPlaceholder')" class="input-width" />
v-model="formData.seated_forward_bend"
clearable
:placeholder="t('seatedForwardBendPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('sitUps')"> <el-form-item :label="t('sitUps')" >
<el-input <el-input v-model="formData.sit_ups" clearable :placeholder="t('sitUpsPlaceholder')" class="input-width" />
v-model="formData.sit_ups"
clearable
:placeholder="t('sitUpsPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('pushUps')"> <el-form-item :label="t('pushUps')" >
<el-input <el-input v-model="formData.push_ups" clearable :placeholder="t('pushUpsPlaceholder')" class="input-width" />
v-model="formData.push_ups"
clearable
:placeholder="t('pushUpsPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('flamingoBalance')"> <el-form-item :label="t('flamingoBalance')" >
<el-input <el-input v-model="formData.flamingo_balance" clearable :placeholder="t('flamingoBalancePlaceholder')" class="input-width" />
v-model="formData.flamingo_balance"
clearable
:placeholder="t('flamingoBalancePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('thirtySecJump')"> <el-form-item :label="t('thirtySecJump')" >
<el-input <el-input v-model="formData.thirty_sec_jump" clearable :placeholder="t('thirtySecJumpPlaceholder')" class="input-width" />
v-model="formData.thirty_sec_jump"
clearable
:placeholder="t('thirtySecJumpPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('standingLongJump')"> <el-form-item :label="t('standingLongJump')" >
<el-input <el-input v-model="formData.standing_long_jump" clearable :placeholder="t('standingLongJumpPlaceholder')" class="input-width" />
v-model="formData.standing_long_jump"
clearable
:placeholder="t('standingLongJumpPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('agilityRun')"> <el-form-item :label="t('agilityRun')" >
<el-input <el-input v-model="formData.agility_run" clearable :placeholder="t('agilityRunPlaceholder')" class="input-width" />
v-model="formData.agility_run"
clearable
:placeholder="t('agilityRunPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('balanceBeam')"> <el-form-item :label="t('balanceBeam')" >
<el-input <el-input v-model="formData.balance_beam" clearable :placeholder="t('balanceBeamPlaceholder')" class="input-width" />
v-model="formData.balance_beam"
clearable
:placeholder="t('balanceBeamPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('tennisThrow')"> <el-form-item :label="t('tennisThrow')" >
<el-input <el-input v-model="formData.tennis_throw" clearable :placeholder="t('tennisThrowPlaceholder')" class="input-width" />
v-model="formData.tennis_throw"
clearable
:placeholder="t('tennisThrowPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('tenMeterShuttleRun')"> <el-form-item :label="t('tenMeterShuttleRun')" >
<el-input <el-input v-model="formData.ten_meter_shuttle_run" clearable :placeholder="t('tenMeterShuttleRunPlaceholder')" class="input-width" />
v-model="formData.ten_meter_shuttle_run"
clearable
:placeholder="t('tenMeterShuttleRunPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<div class="fixed-footer-wrap"> <div class="fixed-footer-wrap">
<div class="fixed-footer"> <div class="fixed-footer">
<el-button type="primary" @click="onSave(formRef)">{{ <el-button type="primary" @click="onSave(formRef)">{{ t('save') }}</el-button>
t('save')
}}</el-button>
<el-button @click="back()">{{ t('cancel') }}</el-button> <el-button @click="back()">{{ t('cancel') }}</el-button>
</div> </div>
</div> </div>
@ -186,28 +118,26 @@ import { ref, reactive, computed, watch } from 'vue'
import { t } from '@/lang' import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { import { getPhysicalTestInfo,addPhysicalTest,editPhysicalTest, getWithCustomerResourcesList, getWithStudentList, getWithPersonnelList } from '@/app/api/physical_test';
getPhysicalTestInfo,
addPhysicalTest,
editPhysicalTest,
} from '@/app/api/physical_test'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const id: number = parseInt(route.query.id) const id:number = parseInt(route.query.id);
const loading = ref(false) const loading = ref(false)
const pageName = route.meta.title const pageName = route.meta.title
/** /**
* 表单数据 * 表单数据
*/ */
const initialFormData = { const initialFormData = {
id: 0, id: 0,
resource_id: 0, resource_id: '',
student_id: 0, student_id: '',
height: '', height: '',
weight: '', weight: '',
coach_id: 0, coach_id: '',
created_at: '', created_at: '',
updated_at: '', updated_at: '',
seated_forward_bend: '', seated_forward_bend: '',
@ -223,14 +153,14 @@ const initialFormData = {
} }
const formData: Record<string, any> = reactive({ ...initialFormData }) const formData: Record<string, any> = reactive({ ...initialFormData })
const setFormData = async (id: number = 0) => { const setFormData = async (id:number = 0) => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
const data = await (await getPhysicalTestInfo(id)).data const data = await (await getPhysicalTestInfo(id)).data
Object.keys(formData).forEach((key: string) => { Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key] if (data[key] != undefined) formData[key] = data[key]
}) })
} }
if (id) setFormData(id) if(id) setFormData(id);
const formRef = ref<FormInstance>() const formRef = ref<FormInstance>()
// //
@ -238,80 +168,111 @@ const selectData = ref<any[]>([])
// //
const resourceIdList = ref([] as any[])
const setResourceIdList = async () => {
resourceIdList.value = await (await getWithCustomerResourcesList({})).data
}
setResourceIdList()
const studentIdList = ref([] as any[])
const setStudentIdList = async () => {
studentIdList.value = await (await getWithStudentList({})).data
}
setStudentIdList()
const coachIdList = ref([] as any[])
const setCoachIdList = async () => {
coachIdList.value = await (await getWithPersonnelList({})).data
}
setCoachIdList()
// //
const formRules = computed(() => { const formRules = computed(() => {
return { return {
resource_id: [ resource_id: [
{ required: true, message: t('resourceIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('resourceIdPlaceholder'), trigger: 'blur' },
],
]
,
student_id: [ student_id: [
{ required: true, message: t('studentIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('studentIdPlaceholder'), trigger: 'blur' },
],
]
,
height: [ height: [
{ required: true, message: t('heightPlaceholder'), trigger: 'blur' }, { required: true, message: t('heightPlaceholder'), trigger: 'blur' },
],
]
,
weight: [ weight: [
{ required: true, message: t('weightPlaceholder'), trigger: 'blur' }, { required: true, message: t('weightPlaceholder'), trigger: 'blur' },
],
]
,
coach_id: [ coach_id: [
{ required: true, message: t('coachIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('coachIdPlaceholder'), trigger: 'blur' },
],
]
,
created_at: [ created_at: [
{ required: true, message: t('createdAtPlaceholder'), trigger: 'blur' }, { required: true, message: t('createdAtPlaceholder'), trigger: 'blur' },
],
]
,
updated_at: [ updated_at: [
{ required: true, message: t('updatedAtPlaceholder'), trigger: 'blur' }, { required: true, message: t('updatedAtPlaceholder'), trigger: 'blur' },
],
]
,
seated_forward_bend: [ seated_forward_bend: [
{ { required: true, message: t('seatedForwardBendPlaceholder'), trigger: 'blur' },
required: true,
message: t('seatedForwardBendPlaceholder'), ]
trigger: 'blur', ,
},
],
sit_ups: [ sit_ups: [
{ required: true, message: t('sitUpsPlaceholder'), trigger: 'blur' }, { required: true, message: t('sitUpsPlaceholder'), trigger: 'blur' },
],
]
,
push_ups: [ push_ups: [
{ required: true, message: t('pushUpsPlaceholder'), trigger: 'blur' }, { required: true, message: t('pushUpsPlaceholder'), trigger: 'blur' },
],
]
,
flamingo_balance: [ flamingo_balance: [
{ { required: true, message: t('flamingoBalancePlaceholder'), trigger: 'blur' },
required: true,
message: t('flamingoBalancePlaceholder'), ]
trigger: 'blur', ,
},
],
thirty_sec_jump: [ thirty_sec_jump: [
{ { required: true, message: t('thirtySecJumpPlaceholder'), trigger: 'blur' },
required: true,
message: t('thirtySecJumpPlaceholder'), ]
trigger: 'blur', ,
},
],
standing_long_jump: [ standing_long_jump: [
{ { required: true, message: t('standingLongJumpPlaceholder'), trigger: 'blur' },
required: true,
message: t('standingLongJumpPlaceholder'), ]
trigger: 'blur', ,
},
],
agility_run: [ agility_run: [
{ required: true, message: t('agilityRunPlaceholder'), trigger: 'blur' }, { required: true, message: t('agilityRunPlaceholder'), trigger: 'blur' },
],
]
,
balance_beam: [ balance_beam: [
{ required: true, message: t('balanceBeamPlaceholder'), trigger: 'blur' }, { required: true, message: t('balanceBeamPlaceholder'), trigger: 'blur' },
],
]
,
tennis_throw: [ tennis_throw: [
{ required: true, message: t('tennisThrowPlaceholder'), trigger: 'blur' }, { required: true, message: t('tennisThrowPlaceholder'), trigger: 'blur' },
],
]
,
ten_meter_shuttle_run: [ ten_meter_shuttle_run: [
{ { required: true, message: t('tenMeterShuttleRunPlaceholder'), trigger: 'blur' },
required: true,
message: t('tenMeterShuttleRunPlaceholder'), ]
trigger: 'blur', ,
},
],
} }
}) })
@ -323,14 +284,13 @@ const onSave = async (formEl: FormInstance | undefined) => {
let data = formData let data = formData
const save = id ? editPhysicalTest : addPhysicalTest const save = id ? editPhysicalTest : addPhysicalTest
save(data) save(data).then(res => {
.then((res) => {
loading.value = false loading.value = false
history.back() history.back()
}) }).catch(err => {
.catch((err) => {
loading.value = false loading.value = false
}) })
} }
}) })
} }
@ -346,12 +306,7 @@ const mobileVerify = (rule: any, value: any, callback: any) => {
// //
const idCardVerify = (rule: any, value: any, callback: any) => { const idCardVerify = (rule: any, value: any, callback: any) => {
if ( 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)) {
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'))) callback(new Error(t('generateIdCard')))
} else { } else {
callback() callback()
@ -367,6 +322,7 @@ const emailVerify = (rule: any, value: any, callback: any) => {
} }
} }
// //
const numberVerify = (rule: any, value: any, callback: any) => { const numberVerify = (rule: any, value: any, callback: any) => {
if (!Number.isInteger(value)) { if (!Number.isInteger(value)) {

239
admin/src/app/views/tc_dialog/tc_dialog.vue

@ -0,0 +1,239 @@
<template>
<el-dialog
v-model="showDialog"
title="体测列表"
width="80%"
class="diy-dialog-wrap"
:destroy-on-close="true"
>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">体测列表</span>
<el-button type="primary" @click="addEvent">
{{ t('addPhysicalTest') }}
</el-button>
</div>
<!-- <el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="physicalTestTable.searchParam" ref="searchFormRef">
<el-form-item :label="t('resourceId')" prop="resource_id">
<el-select class="w-[280px]" v-model="physicalTestTable.searchParam.resource_id" clearable :placeholder="t('resourceIdPlaceholder')">
<el-option
v-for="(item, index) in resourceIdList"
:key="index"
:label="item['name']"
:value="item['id']"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('studentId')" prop="student_id">
<el-select class="w-[280px]" v-model="physicalTestTable.searchParam.student_id" clearable :placeholder="t('studentIdPlaceholder')">
<el-option
v-for="(item, index) in studentIdList"
:key="index"
:label="item['name']"
:value="item['id']"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('height')" prop="height">
<el-input v-model="physicalTestTable.searchParam.height" :placeholder="t('heightPlaceholder')" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadPhysicalTestList()">{{ 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="physicalTestTable.data" size="large" v-loading="physicalTestTable.loading">
<template #empty>
<span>{{ !physicalTestTable.loading ? t('emptyData') : '' }}</span>
</template>
<el-table-column prop="resource_id_name" :label="t('resourceId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="student_id_name" :label="t('studentId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="height" :label="t('height')" 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="updated_at" :label="t('updatedAt')" 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="physicalTestTable.page" v-model:page-size="physicalTestTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="physicalTestTable.total"
@size-change="loadPhysicalTestList()" @current-change="loadPhysicalTestList" />
</div>
</div>
<edit ref="editPhysicalTestDialog" @complete="loadPhysicalTestList" />
</el-card>
</div>
</el-dialog>
</template>
<script lang="ts" setup>
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict'
import { getPhysicalTestList, deletePhysicalTest, getWithCustomerResourcesList, getWithStudentList, getWithPersonnelList } from '@/app/api/physical_test'
import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/physical_test/components/physical-test-edit.vue'
import { useRouter } from 'vue-router'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
let showDialog = ref(false)
let physicalTestTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam:{
"resource_id":"",
"student_id":"",
"height":""
}
})
const searchFormRef = ref<FormInstance>()
//
const selectData = ref<any[]>([])
//
/**
* 获取体测列表
*/
const loadPhysicalTestList = (page: number = 1) => {
physicalTestTable.loading = true
physicalTestTable.page = page
getPhysicalTestList({
page: physicalTestTable.page,
limit: physicalTestTable.limit,
...physicalTestTable.searchParam
}).then(res => {
physicalTestTable.loading = false
physicalTestTable.data = res.data.data
physicalTestTable.total = res.data.total
}).catch(() => {
physicalTestTable.loading = false
})
}
const router = useRouter()
const editPhysicalTestDialog: Record<string, any> | null = ref(null)
/**
* 添加体测
*/
const addEvent = () => {
editPhysicalTestDialog.value.setFormData({'resource_id':physicalTestTable.searchParam.resource_id})
editPhysicalTestDialog.value.showDialog = true
}
/**
* 编辑体测
* @param data
*/
const editEvent = (data: any) => {
// router.push('/physical_test/physical_test_edit?id='+data.id)
editPhysicalTestDialog.value.setFormData(data)
editPhysicalTestDialog.value.showDialog = true
}
/**
* 删除体测
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('physicalTestDeleteTips'), t('warning'),
{
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deletePhysicalTest(id).then(() => {
loadPhysicalTestList()
}).catch(() => {
})
})
}
const resourceIdList = ref([])
const setResourceIdList = async () => {
resourceIdList.value = await (await getWithCustomerResourcesList({})).data
}
setResourceIdList()
const studentIdList = ref([])
const setStudentIdList = async () => {
studentIdList.value = await (await getWithStudentList({})).data
}
setStudentIdList()
const coachIdList = ref([])
const setCoachIdList = async () => {
coachIdList.value = await (await getWithPersonnelList({})).data
}
setCoachIdList()
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()
loadPhysicalTestList()
}
const setFormData = async (row: any = null) => {
// Object.assign(formData, initialFormData)
physicalTestTable.searchParam.resource_id = row.resource_id
console.log(physicalTestTable.searchParam.resource_id);
loadPhysicalTestList()
}
defineExpose({
showDialog,
setFormData
})
</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>

204
admin/src/app/views/timetables/timetables.vue

@ -1,6 +1,36 @@
<template> <template>
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<el-button @click="addDict">添加</el-button> <div class="mb-4 flex items-center justify-between">
<div class="flex items-center">
<el-select
v-model="selectedCampus"
placeholder="请选择校区"
clearable
class="mr-2"
@change="handleCampusChange"
>
<el-option
v-for="item in campusList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
<el-date-picker
v-model="dateRange"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
@change="handleDateRangeChange"
/>
<el-button type="primary" class="ml-2" @click="fetchData">查询</el-button>
</div>
<el-button @click="addSchedule">添加课程</el-button>
</div>
<div class="schedule-container"> <div class="schedule-container">
<!-- 周一到周日的布局 --> <!-- 周一到周日的布局 -->
<div v-for="(day, index) in days" :key="index" class="day-column"> <div v-for="(day, index) in days" :key="index" class="day-column">
@ -30,13 +60,13 @@
<el-table-column <el-table-column
v-for="(classroom, idx) in day.classrooms" v-for="(classroom, idx) in day.classrooms"
:key="idx" :key="idx"
:label="`教室${idx + 1}`" :label="`教室${classroom}`"
:prop="`classroom${idx + 1}`" :prop="`classroom${classroom}`"
align="center" align="center"
> >
<template #default="{ row }"> <template #default="{ row }">
<div v-if="row.course && row.course.classroom === classroom"> <div v-if="row.course && row.course.classroom == classroom">
<div class="teacher-name">{{ row.course.teacher }}</div> <div class="teacher-name">{{ getTeacherName(row.course.teacher) }}</div>
<div class="student-list"> <div class="student-list">
<el-tag <el-tag
v-for="student in row.course.students" v-for="student in row.course.students"
@ -44,7 +74,7 @@
size="small" size="small"
effect="plain" effect="plain"
> >
{{ student }} {{ getStudentName(student) }}
</el-tag> </el-tag>
</div> </div>
<div class="classroom-name"> <div class="classroom-name">
@ -58,67 +88,117 @@
<!-- 详情弹窗 --> <!-- 详情弹窗 -->
<el-dialog v-model="dialogVisible" title="课程详情"> <el-dialog v-model="dialogVisible" title="课程详情">
<p><strong>教师:</strong> {{ selectedCourse?.teacher }}</p> <p><strong>教师:</strong> {{ getTeacherName(selectedCourse?.teacher) }}</p>
<p><strong>学员:</strong> {{ selectedCourse?.students.join(', ') }}</p> <p><strong>学员:</strong> {{ selectedCourse?.students.map(id => getStudentName(id)).join(', ') }}</p>
</el-dialog> </el-dialog>
</div> </div>
</el-card> </el-card>
</template> </template>
<script setup> <script setup>
import { ref } from 'vue' import { ref, onMounted } from 'vue'
import { getTimetables } from '@/app/api/course_schedule'
const days = [ import { getCampusList } from '@/app/api/campus'
//
{ //
date: '周一', const campusList = ref([])
timeSlots: [ const selectedCampus = ref('')
{
timeRange: '9:00-10:00',
color: '#FFA07A',
course: {
teacher: '',
students: [],
classroom: '教室1',
hasnumber: 5,
},
},
// ...
],
classrooms: ['教室1'], //
},
{
date: '周二',
timeSlots: [
{
timeRange: '9:00-10:00',
color: '#FFA07A',
course: {
teacher: '张老师',
students: ['小明', '小红'],
classroom: '教室1',
hasnumber: 5,
},
},
{
timeRange: '11:00-12:00',
color: '#712e13',
course: {
teacher: '张老师',
students: ['小明', '小红'],
classroom: '教室2',
hasnumber: 5,
},
},
// ...
],
classrooms: ['教室1', '教室2'], //
},
]
//
const dateRange = ref([
getMonday(new Date()).toISOString().split('T')[0],
getSunday(new Date()).toISOString().split('T')[0]
])
//
const days = ref([])
const dialogVisible = ref(false) const dialogVisible = ref(false)
const selectedCourse = ref(null) const selectedCourse = ref(null)
//
function getMonday(date) {
const day = date.getDay() || 7
if (day !== 1) {
date.setHours(-24 * (day - 1))
}
return date
}
//
function getSunday(date) {
const day = date.getDay() || 7
if (day !== 0) {
date.setHours(24 * (7 - day))
}
return date
}
//
const fetchCampusList = async () => {
try {
const response = await getCampusList({})
if (response.data && response.data.list) {
campusList.value = response.data.list
//
if (campusList.value.length > 0) {
selectedCampus.value = campusList.value[0].id
}
}
} catch (error) {
console.error('获取校区列表失败:', error)
}
}
//
const handleCampusChange = (val) => {
selectedCampus.value = val
}
//
const handleDateRangeChange = (val) => {
dateRange.value = val
}
//
const fetchData = async () => {
try {
const params = {}
if (dateRange.value && dateRange.value.length === 2) {
params.start_date = dateRange.value[0]
params.end_date = dateRange.value[1]
}
if (selectedCampus.value) {
params.campus_id = selectedCampus.value
}
const response = await getTimetables(params)
if (response.data) {
days.value = response.data
}
} catch (error) {
console.error('获取课程表数据失败:', error)
}
}
//
const getTeacherName = (teacherId) => {
// teacherId
return teacherId ? `教师${teacherId}` : ''
}
//
const getStudentName = (studentId) => {
// studentId
return studentId ? `学生${studentId}` : ''
}
//
const addSchedule = () => {
//
console.log('添加课程')
}
// //
const objectSpanMethod = (timeSlots, { row, column, rowIndex }) => { const objectSpanMethod = (timeSlots, { row, column, rowIndex }) => {
if (column.property === 'timeRange') { if (column.property === 'timeRange') {
@ -152,18 +232,24 @@ const objectSpanMethod = (timeSlots, { row, column, rowIndex }) => {
// //
const handleCellClick = (row, column, cell, event) => { const handleCellClick = (row, column, cell, event) => {
console.log(row, column, cell, event) if (column.property.startsWith('classroom') && row.course) {
if (column.property.startsWith('classroom')) {
selectedCourse.value = row.course selectedCourse.value = row.course
dialogVisible.value = true dialogVisible.value = true
} }
} }
//
onMounted(() => {
fetchCampusList()
fetchData()
})
</script> </script>
<style scoped> <style scoped>
.schedule-container { .schedule-container {
display: flex; display: flex;
gap: 10px; gap: 10px;
overflow-x: auto;
} }
.day-column { .day-column {

20
niucloud/app/adminapi/controller/course_schedule/CourseSchedule.php

@ -44,10 +44,12 @@ class CourseSchedule extends BaseAdminController
/** /**
* 课程安排详情 * 课程安排详情
* @param int $id * @param mixed $id
* @return \think\Response * @return \think\Response
*/ */
public function info(int $id){ public function info($id){
// 确保 $id 是整数类型
$id = intval($id);
return success((new CourseScheduleService())->getInfo($id)); return success((new CourseScheduleService())->getInfo($id));
} }
@ -108,5 +110,17 @@ class CourseSchedule extends BaseAdminController
return success('DELETE_SUCCESS'); return success('DELETE_SUCCESS');
} }
/**
* 获取课程表数据
* @return \think\Response
*/
public function timetables(){
$data = $this->request->params([
["start_date", ""],
["end_date", ""],
["campus_id", ""],
["venue_id", ""]
]);
return success((new CourseScheduleService())->getTimetables($data));
}
} }

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

@ -26,12 +26,15 @@ class CustomerResources extends BaseAdminController
* 获取客户资源列表 * 获取客户资源列表
* @return \think\Response * @return \think\Response
*/ */
public function lists() public function lists(){
{
$data = $this->request->params([ $data = $this->request->params([
["name", ""], ["name",""],
["phone_number", ""], ["age",""],
["type", "khzy"] ["gender",""],
["phone_number",""],
["type","khzy"],
["created_at",[]],
["updated_at",[]],
]); ]);
return success((new CustomerResourcesService())->getPage($data)); return success((new CustomerResourcesService())->getPage($data));
} }
@ -41,8 +44,7 @@ class CustomerResources extends BaseAdminController
* @param int $id * @param int $id
* @return \think\Response * @return \think\Response
*/ */
public function info(int $id) public function info(int $id){
{
return success((new CustomerResourcesService())->getInfo($id)); return success((new CustomerResourcesService())->getInfo($id));
} }
@ -50,37 +52,36 @@ class CustomerResources extends BaseAdminController
* 添加客户资源 * 添加客户资源
* @return \think\Response * @return \think\Response
*/ */
public function add() public function add(){
{
$data = $this->request->params([ $data = $this->request->params([
["source", ""], ["source",""],
["source_channel", ""], ["source_channel",""],
["name", ""], ["name",""],
["age", 0], ["age",0],
["gender", ""], ["gender",""],
["phone_number", ""], ["phone_number",""],
["demand", ""], ["demand",""],
["purchasing_power", ""], ["purchasing_power",""],
["cognitive_idea", ""], ["cognitive_idea",""],
["optional_class_time", ""], ["optional_class_time",""],
["distance", ""], ["distance",""],
["decision_maker", ""], ["decision_maker",""],
["initial_intent", ""], ["initial_intent",""],
["campus", ""], ["campus",""],
["status", ""], ["status",""],
["create_year_month", date("Y-m")], ["create_year_month",date("Y-m")],
["create_date", date("Y-m-d")], ["create_date",date("Y-m-d")],
["purchase_power", ""], ["purchase_power",""],
["concept_awareness", ""], ["concept_awareness",""],
["preferred_class_time", ""], ["preferred_class_time",""],
["distance_tow", ""], ["distance_tow",""],
["communication", ""], ["communication",""],
["promised_visit_time", ""], ["promised_visit_time",""],
["actual_visit_time", ""], ["actual_visit_time",""],
["call_intent", ""], ["call_intent",""],
["first_visit_status", ""], ["first_visit_status",""],
["second_visit_status", ""], ["second_visit_status",""],
["is_closed", ""] ["is_closed",""]
]); ]);
$this->validate($data, 'app\validate\customer_resources\CustomerResources.add'); $this->validate($data, 'app\validate\customer_resources\CustomerResources.add');
@ -92,38 +93,37 @@ class CustomerResources extends BaseAdminController
* @param $id 客户资源id * @param $id 客户资源id
* @return \think\Response * @return \think\Response
*/ */
public function edit(int $id) public function edit(int $id){
{
$data = $this->request->params([ $data = $this->request->params([
["source", ""], ["source",""],
["source_channel", ""], ["source_channel",""],
["name", ""], ["name",""],
["age", 0], ["age",0],
["gender", ""], ["gender",""],
["phone_number", ""], ["phone_number",""],
["demand", ""], ["demand",""],
["purchasing_power", ""], ["purchasing_power",""],
["cognitive_idea", ""], ["cognitive_idea",""],
["optional_class_time", ""], ["optional_class_time",""],
["distance", ""], ["distance",""],
["decision_maker", ""], ["decision_maker",""],
["initial_intent", ""], ["initial_intent",""],
["campus", ""], ["campus",""],
["status", ""], ["status",""],
["create_year_month", date("Y-m")], ["create_year_month",date("Y-m")],
["create_date", date("Y-m-d")], ["create_date",date("Y-m-d")],
["purchase_power", ""], ["purchase_power",""],
["concept_awareness", ""], ["concept_awareness",""],
["preferred_class_time", ""], ["preferred_class_time",""],
["distance_tow", ""], ["distance_tow",""],
["communication", ""], ["communication",""],
["promised_visit_time", ""], ["promised_visit_time",""],
["actual_visit_time", ""], ["actual_visit_time",""],
["call_intent", ""], ["call_intent",""],
["first_visit_status", ""], ["first_visit_status",""],
["second_visit_status", ""], ["second_visit_status",""],
["is_closed", ""] ["is_closed",""]
]); ]);
$this->validate($data, 'app\validate\customer_resources\CustomerResources.edit'); $this->validate($data, 'app\validate\customer_resources\CustomerResources.edit');
@ -135,35 +135,31 @@ class CustomerResources extends BaseAdminController
* @param $id 客户资源id * @param $id 客户资源id
* @return \think\Response * @return \think\Response
*/ */
public function del(int $id) public function del(int $id){
{
(new CustomerResourcesService())->del($id); (new CustomerResourcesService())->del($id);
return success('DELETE_SUCCESS'); return success('DELETE_SUCCESS');
} }
public function getPersonnelAll() public function getPersonnelAll(){
{
$data = $this->request->params([ $data = $this->request->params([
["role_id", ""], ["role_id",""],
]); ]);
return success((new CustomerResourcesService())->getPersonnelAll($data)); return success(( new CustomerResourcesService())->getPersonnelAll($data));
} }
public function getCampusAll() public function getCampusAll(){
{ return success(( new CustomerResourcesService())->getCampusAll());
return success((new CustomerResourcesService())->getCampusAll());
} }
public function fp_edit() public function fp_edit(){
{
$data = $this->request->params([ $data = $this->request->params([
["shared_id", ""], ["shared_id",""],
["shared_by", ""], ["shared_by",""],
]); ]);
return success((new CustomerResourcesService())->fp_edit($data)); return success(( new CustomerResourcesService())->fp_edit($data));
} }

49
niucloud/app/adminapi/controller/order_table/OrderTable.php

@ -28,19 +28,8 @@ class OrderTable extends BaseAdminController
*/ */
public function lists(){ public function lists(){
$data = $this->request->params([ $data = $this->request->params([
["payment_id",""],
["order_status",""], ["order_status",""],
["payment_type",""], ["payment_type",""]
["order_amount",""],
["course_id",""],
["class_id",""],
["staff_id",""],
["resource_id",""],
["after_sales_status",""],
["after_sales_reason",""],
["after_sales_time",""],
["payment_time",""],
["subscription_payment_time",""]
]); ]);
return success((new OrderTableService())->getPage($data)); return success((new OrderTableService())->getPage($data));
} }
@ -60,19 +49,13 @@ class OrderTable extends BaseAdminController
*/ */
public function add(){ public function add(){
$data = $this->request->params([ $data = $this->request->params([
["payment_id",""], ["resource_id",0],
["order_status",""], ["order_status",""],
["payment_type",""], ["payment_type",""],
["order_amount",0.00], ["order_amount",0.00],
["course_id",0], ["course_id",0],
["class_id",0], ["class_id",0],
["staff_id",0],
["resource_id",0],
["after_sales_status",""],
["after_sales_reason",""],
["after_sales_time",1747388736],
["payment_time",1747388736],
["subscription_payment_time",1747388736]
]); ]);
$this->validate($data, 'app\validate\order_table\OrderTable.add'); $this->validate($data, 'app\validate\order_table\OrderTable.add');
$id = (new OrderTableService())->add($data); $id = (new OrderTableService())->add($data);
@ -86,19 +69,13 @@ class OrderTable extends BaseAdminController
*/ */
public function edit(int $id){ public function edit(int $id){
$data = $this->request->params([ $data = $this->request->params([
["payment_id",""], ["resource_id",0],
["order_status",""], ["order_status",""],
["payment_type",""], ["payment_type",""],
["order_amount",0.00], ["order_amount",0.00],
["course_id",0], ["course_id",0],
["class_id",0], ["class_id",0],
["staff_id",0],
["resource_id",0],
["after_sales_status",""],
["after_sales_reason",""],
["after_sales_time",1747388736],
["payment_time",1747388736],
["subscription_payment_time",1747388736]
]); ]);
$this->validate($data, 'app\validate\order_table\OrderTable.edit'); $this->validate($data, 'app\validate\order_table\OrderTable.edit');
(new OrderTableService())->edit($id, $data); (new OrderTableService())->edit($id, $data);
@ -116,4 +93,20 @@ class OrderTable extends BaseAdminController
} }
public function getCustomerResourcesAll(){
return success(( new OrderTableService())->getCustomerResourcesAll());
}
public function getCourseAll(){
return success(( new OrderTableService())->getCourseAll());
}
public function getClassGradeAll(){
return success(( new OrderTableService())->getClassGradeAll());
}
public function getPersonnelAll(){
return success(( new OrderTableService())->getPersonnelAll());
}
} }

21
niucloud/app/adminapi/controller/physical_test/PhysicalTest.php

@ -29,10 +29,7 @@ class PhysicalTest extends BaseAdminController
public function lists(){ public function lists(){
$data = $this->request->params([ $data = $this->request->params([
["resource_id",""], ["resource_id",""],
["student_id",""], ["student_id",""]
["height",""],
["created_at",""],
["updated_at",""]
]); ]);
return success((new PhysicalTestService())->getPage($data)); return success((new PhysicalTestService())->getPage($data));
} }
@ -57,8 +54,6 @@ class PhysicalTest extends BaseAdminController
["height",0.00], ["height",0.00],
["weight",0.00], ["weight",0.00],
["coach_id",0], ["coach_id",0],
["created_at",1747576653],
["updated_at",1747576653],
["seated_forward_bend",0.00], ["seated_forward_bend",0.00],
["sit_ups",0.00], ["sit_ups",0.00],
["push_ups",0.00], ["push_ups",0.00],
@ -87,8 +82,6 @@ class PhysicalTest extends BaseAdminController
["height",0.00], ["height",0.00],
["weight",0.00], ["weight",0.00],
["coach_id",0], ["coach_id",0],
["created_at",1747576653],
["updated_at",1747576653],
["seated_forward_bend",0.00], ["seated_forward_bend",0.00],
["sit_ups",0.00], ["sit_ups",0.00],
["push_ups",0.00], ["push_ups",0.00],
@ -116,4 +109,16 @@ class PhysicalTest extends BaseAdminController
} }
public function getCustomerResourcesAll(){
return success(( new PhysicalTestService())->getCustomerResourcesAll());
}
public function getStudentAll(){
return success(( new PhysicalTestService())->getStudentAll());
}
public function getPersonnelAll(){
return success(( new PhysicalTestService())->getPersonnelAll());
}
} }

10
niucloud/app/adminapi/route/order_table.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 -- order_table // USER_CODE_BEGIN -- order_table
Route::group('order_table', function () { Route::group('order_table', function () {
@ -29,6 +31,14 @@ Route::group('order_table', function () {
//删除订单 //删除订单
Route::delete('order_table/:id', 'order_table.OrderTable/del'); Route::delete('order_table/:id', 'order_table.OrderTable/del');
Route::get('customer_resources_all','order_table.OrderTable/getCustomerResourcesAll');
Route::get('course_all','order_table.OrderTable/getCourseAll');
Route::get('class_grade_all','order_table.OrderTable/getClassGradeAll');
Route::get('personnel_all','order_table.OrderTable/getPersonnelAll');
})->middleware([ })->middleware([
AdminCheckToken::class, AdminCheckToken::class,
AdminCheckRole::class, AdminCheckRole::class,

8
niucloud/app/adminapi/route/physical_test.php

@ -16,6 +16,8 @@ use app\adminapi\middleware\AdminCheckToken;
use app\adminapi\middleware\AdminLog; use app\adminapi\middleware\AdminLog;
// USER_CODE_BEGIN -- physical_test // USER_CODE_BEGIN -- physical_test
Route::group('physical_test', function () { Route::group('physical_test', function () {
@ -31,6 +33,12 @@ Route::group('physical_test', function () {
//删除体测 //删除体测
Route::delete('physical_test/:id', 'physical_test.PhysicalTest/del'); Route::delete('physical_test/:id', 'physical_test.PhysicalTest/del');
Route::get('customer_resources_all','physical_test.PhysicalTest/getCustomerResourcesAll');
Route::get('student_all','physical_test.PhysicalTest/getStudentAll');
Route::get('personnel_all','physical_test.PhysicalTest/getPersonnelAll');
})->middleware([ })->middleware([
AdminCheckToken::class, AdminCheckToken::class,
AdminCheckRole::class, AdminCheckRole::class,

226
niucloud/app/model/class_grade/ClassGrade.php

@ -0,0 +1,226 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\model\class_grade;
use core\base\BaseModel;
use think\model\concern\SoftDelete;
use think\model\relation\HasMany;
use think\model\relation\HasOne;
/**
* 班级模型
* Class Class
* @package app\model\class
*/
class ClassGrade extends BaseModel
{
use SoftDelete;
/**
* 数据表主键
* @var string
*/
protected $pk = 'id';
/**
* 模型名称
* @var string
*/
protected $name = 'class';
/**
* 定义软删除标记字段.
* @var string
*/
protected $deleteTime = 'deleted_at';
/**
* 定义软删除字段的默认值.
* @var int
*/
protected $defaultSoftDelete = 0;
/**
* 搜索器:班级班级编号
* @param $value
* @param $data
*/
public function searchIdAttr($query, $value, $data)
{
if ($value) {
$query->where("id", $value);
}
}
/**
* 搜索器:班级校区ID
* @param $value
* @param $data
*/
public function searchCampusIdAttr($query, $value, $data)
{
if ($value) {
$query->where("campus_id", $value);
}
}
/**
* 搜索器:班级校区名称
* @param $value
* @param $data
*/
public function searchCampusNameAttr($query, $value, $data)
{
if ($value) {
$query->where("campus_name", $value);
}
}
/**
* 搜索器:班级班级名称
* @param $value
* @param $data
*/
public function searchClassNameAttr($query, $value, $data)
{
if ($value) {
$query->where("class_name", $value);
}
}
/**
* 搜索器:班级班级主教练
* @param $value
* @param $data
*/
public function searchHeadCoachAttr($query, $value, $data)
{
if ($value) {
$query->where("head_coach", $value);
}
}
/**
* 搜索器:班级班级授课年龄段
* @param $value
* @param $data
*/
public function searchAgeGroupAttr($query, $value, $data)
{
if ($value) {
$query->where("age_group", $value);
}
}
/**
* 搜索器:班级班级类型
* @param $value
* @param $data
*/
public function searchClassTypeAttr($query, $value, $data)
{
if ($value) {
$query->where("class_type", $value);
}
}
/**
* 搜索器:班级班级助教
* @param $value
* @param $data
*/
public function searchAssistantCoachAttr($query, $value, $data)
{
if ($value) {
$query->where("assistant_coach", $value);
}
}
/**
* 搜索器:班级创建时间
* @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);
}
}
/**
* 搜索器:班级班级状态
* @param $value
* @param $data
*/
public function searchStatusAttr($query, $value, $data)
{
if ($value) {
$query->where("status", $value);
}
}
/**
* 搜索器:班级班级排序
* @param $value
* @param $data
*/
public function searchSortOrderAttr($query, $value, $data)
{
if ($value) {
$query->where("sort_order", $value);
}
}
/**
* 搜索器:班级班级备注
* @param $value
* @param $data
*/
public function searchRemarksAttr($query, $value, $data)
{
if ($value) {
$query->where("remarks", $value);
}
}
}

156
niucloud/app/model/order_table/OrderTable.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\customer_resources\CustomerResources;
use app\model\course\Course;
use app\model\class_grade\ClassGrade;
use app\model\personnel\Personnel;
/** /**
* 订单模型 * 订单模型
* Class OrderTable * Class OrderTable
@ -43,31 +51,7 @@ class OrderTable extends BaseModel
/** /**
* 搜索器:订单订单编号 * 搜索器:订单订单状态
* @param $value
* @param $data
*/
public function searchIdAttr($query, $value, $data)
{
if ($value) {
$query->where("id", $value);
}
}
/**
* 搜索器:订单支付编号
* @param $value
* @param $data
*/
public function searchPaymentIdAttr($query, $value, $data)
{
if ($value) {
$query->where("payment_id", $value);
}
}
/**
* 搜索器:订单订单状态: pending-待支付, paid-已支付
* @param $value * @param $value
* @param $data * @param $data
*/ */
@ -79,7 +63,7 @@ class OrderTable extends BaseModel
} }
/** /**
* 搜索器:订单付款类型: cash-现金支付, scan_code-扫码支付, subscription-订阅支付 * 搜索器:订单付款类型
* @param $value * @param $value
* @param $data * @param $data
*/ */
@ -90,129 +74,25 @@ class OrderTable extends BaseModel
} }
} }
/**
* 搜索器:订单订单金额
* @param $value
* @param $data
*/
public function searchOrderAmountAttr($query, $value, $data)
{
if ($value) {
$query->where("order_amount", $value);
}
}
/**
* 搜索器:订单课程ID
* @param $value
* @param $data
*/
public function searchCourseIdAttr($query, $value, $data)
{
if ($value) {
$query->where("course_id", $value);
}
}
/**
* 搜索器:订单班级ID
* @param $value
* @param $data
*/
public function searchClassIdAttr($query, $value, $data)
{
if ($value) {
$query->where("class_id", $value);
}
}
/**
* 搜索器:订单人员ID
* @param $value
* @param $data
*/
public function searchStaffIdAttr($query, $value, $data)
{
if ($value) {
$query->where("staff_id", $value);
}
}
/**
* 搜索器:订单资源ID
* @param $value
* @param $data
*/
public function searchResourceIdAttr($query, $value, $data)
{
if ($value) {
$query->where("resource_id", $value);
}
}
/**
* 搜索器:订单售后状态
* @param $value
* @param $data
*/
public function searchAfterSalesStatusAttr($query, $value, $data)
{
if ($value) {
$query->where("after_sales_status", $value);
}
}
/** public function customerResources(){
* 搜索器:订单售后原因 return $this->hasOne(CustomerResources::class, 'id', 'resource_id')->joinType('left')->withField('name,id')->bind(['resource_id_name'=>'name']);
* @param $value
* @param $data
*/
public function searchAfterSalesReasonAttr($query, $value, $data)
{
if ($value) {
$query->where("after_sales_reason", $value);
}
} }
/** public function course(){
* 搜索器:订单售后时间 return $this->hasOne(Course::class, 'id', 'course_id')->joinType('left')->withField('course_name,id')->bind(['course_id_name'=>'course_name']);
* @param $value
* @param $data
*/
public function searchAfterSalesTimeAttr($query, $value, $data)
{
if ($value) {
$query->where("after_sales_time", $value);
}
} }
/** public function classGrade(){
* 搜索器:订单支付时间 return $this->hasOne(ClassGrade::class, 'id', 'class_id')->joinType('left')->withField('class_name,id')->bind(['class_id_name'=>'class_name']);
* @param $value
* @param $data
*/
public function searchPaymentTimeAttr($query, $value, $data)
{
if ($value) {
$query->where("payment_time", $value);
}
} }
/** public function personnel(){
* 搜索器:订单订阅支付生成时间 return $this->hasOne(Personnel::class, 'id', 'staff_id')->joinType('left')->withField('name,id')->bind(['staff_id_name'=>'name']);
* @param $value
* @param $data
*/
public function searchSubscriptionPaymentTimeAttr($query, $value, $data)
{
if ($value) {
$query->where("subscription_payment_time", $value);
} }
}
} }

48
niucloud/app/model/physical_test/PhysicalTest.php

@ -16,6 +16,12 @@ 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\customer_resources\CustomerResources;
use app\model\student\Student;
use app\model\personnel\Personnel;
/** /**
* 体测模型 * 体测模型
* Class PhysicalTest * Class PhysicalTest
@ -66,45 +72,21 @@ class PhysicalTest extends BaseModel
} }
} }
/**
* 搜索器:体测身高
* @param $value
* @param $data
*/
public function searchHeightAttr($query, $value, $data)
{
if ($value) {
$query->where("height", $value);
}
}
/**
* 搜索器:体测创建时间
* @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);
}
}
public function customerResources(){
return $this->hasOne(CustomerResources::class, 'id', 'resource_id')->joinType('left')->withField('name,id')->bind(['resource_id_name'=>'name']);
}
public function student(){
return $this->hasOne(Student::class, 'id', 'student_id')->joinType('left')->withField('name,id')->bind(['student_id_name'=>'name']);
}
public function personnel(){
return $this->hasOne(Personnel::class, 'id', 'coach_id')->joinType('left')->withField('name,id')->bind(['coach_id_name'=>'name']);
}
} }

185
niucloud/app/service/admin/course_schedule/CourseScheduleService.php

@ -12,7 +12,7 @@
namespace app\service\admin\course_schedule; namespace app\service\admin\course_schedule;
use app\model\course_schedule\CourseSchedule; use app\model\course_schedule\CourseSchedule;
use app\model\person_course_schedule\PersonCourseSchedule;
use core\base\BaseAdminService; use core\base\BaseAdminService;
@ -94,6 +94,189 @@ class CourseScheduleService extends BaseAdminService
return $res; return $res;
} }
/**
* 获取课程表数据
* @param array $where
* @return array
*/
public function getTimetables(array $where = [])
{
// 获取日期范围,默认为本周
$start_date = $where['start_date'] ?? date('Y-m-d', strtotime('monday this week'));
$end_date = $where['end_date'] ?? date('Y-m-d', strtotime('sunday this week'));
// 校区ID
$campus_id = isset($where['campus_id']) && !empty($where['campus_id']) ? intval($where['campus_id']) : 0;
// 查询条件
$query_condition = [
['course_date', '>=', $start_date],
['course_date', '<=', $end_date]
];
// 如果指定了校区,添加校区筛选条件
if ($campus_id > 0) {
$query_condition[] = ['campus_id', '=', $campus_id];
}
// 查询指定日期范围内的课程安排
$schedules = $this->model->where($query_condition)->select()->toArray();
// 检查是否需要自动创建课程安排记录
$need_auto_create = empty($schedules) && $campus_id > 0;
// 如果需要自动创建记录
if ($need_auto_create) {
$schedules = $this->autoCreateSchedules($start_date, $end_date, $campus_id);
}
// 获取所有相关的人员课程安排关系
$schedule_ids = array_column($schedules, 'id');
$person_schedules = [];
if (!empty($schedule_ids)) {
$person_schedules = (new PersonCourseSchedule())->where([
['schedule_id', 'in', $schedule_ids]
])->select()->toArray();
}
// 组织数据结构
$days = [];
$weekdays = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'];
// 获取所有时间段和教室
$time_slots = [];
$classrooms = [];
// 如果没有数据,设置默认的时间段和教室
if (empty($schedules)) {
$time_slots = ['9:00-10:00', '10:00-11:00', '11:00-12:00', '14:00-15:00', '15:00-16:00', '16:00-17:00'];
$classrooms = [1, 2]; // 默认教室ID
} else {
foreach ($schedules as $schedule) {
if (!in_array($schedule['time_slot'], $time_slots)) {
$time_slots[] = $schedule['time_slot'];
}
// 假设venue_id代表教室
if (!in_array($schedule['venue_id'], $classrooms)) {
$classrooms[] = $schedule['venue_id'];
}
}
}
// 按日期组织数据
$current_date = $start_date;
$day_index = (int)date('N', strtotime($current_date)) - 1; // 获取周几(1-7),转为索引(0-6)
while (strtotime($current_date) <= strtotime($end_date)) {
$day_schedules = array_filter($schedules, function($schedule) use ($current_date) {
return $schedule['course_date'] == $current_date;
});
$day_classrooms = empty($day_schedules) ? $classrooms : [];
if (!empty($day_schedules)) {
foreach ($day_schedules as $schedule) {
if (!in_array($schedule['venue_id'], $day_classrooms)) {
$day_classrooms[] = $schedule['venue_id'];
}
}
}
// 构建每个时间段的数据
$day_time_slots = [];
foreach ($time_slots as $time_slot) {
$slot_data = [
'timeRange' => $time_slot,
'color' => '#' . dechex(rand(0x000000, 0xFFFFFF)), // 随机颜色
];
// 查找该时间段的课程
$slot_schedule = array_filter($day_schedules, function($schedule) use ($time_slot) {
return $schedule['time_slot'] == $time_slot;
});
if (!empty($slot_schedule)) {
$schedule = reset($slot_schedule);
// 查找该课程的学员
$students = array_filter($person_schedules, function($person) use ($schedule) {
return $person['schedule_id'] == $schedule['id'];
});
$student_names = array_column($students, 'person_id');
$slot_data['course'] = [
'teacher' => $schedule['coach_id'] ?? '',
'students' => $student_names,
'classroom' => $schedule['venue_id'],
'hasnumber' => $schedule['available_capacity'] ?? 0,
];
}
$day_time_slots[] = $slot_data;
}
$days[] = [
'date' => $weekdays[$day_index % 7] . ' (' . $current_date . ')',
'timeSlots' => $day_time_slots,
'classrooms' => $day_classrooms,
];
$current_date = date('Y-m-d', strtotime($current_date . ' +1 day'));
$day_index = ($day_index + 1) % 7;
}
return $days;
}
/**
* 自动创建课程安排记录
* @param string $start_date 开始日期
* @param string $end_date 结束日期
* @param int $campus_id 校区ID
* @return array 创建的课程安排记录
*/
private function autoCreateSchedules(string $start_date, string $end_date, int $campus_id): array
{
$schedules = [];
$default_time_slots = ['9:00-10:00', '10:00-11:00', '11:00-12:00', '14:00-15:00', '15:00-16:00', '16:00-17:00'];
$default_venues = [1, 2]; // 默认教室ID
$current_date = $start_date;
// 遍历日期范围
while (strtotime($current_date) <= strtotime($end_date)) {
foreach ($default_venues as $venue_id) {
foreach ($default_time_slots as $time_slot) {
// 创建课程安排记录
$schedule_data = [
'campus_id' => $campus_id,
'venue_id' => $venue_id,
'course_date' => $current_date,
'time_slot' => $time_slot,
'course_id' => 0, // 默认课程ID
'coach_id' => 0, // 默认教练ID
'participants' => json_encode([]), // 空参与者列表
'student_ids' => json_encode([]), // 空学生列表
'available_capacity' => 10, // 默认容量
'status' => 'pending', // 默认状态
'created_by' => 'system', // 系统创建
];
// 插入数据库
$res = $this->model->create($schedule_data);
// 添加到返回结果
$schedule_data['id'] = $res->id;
$schedules[] = $schedule_data;
}
}
$current_date = date('Y-m-d', strtotime($current_date . ' +1 day'));
}
return $schedules;
}
} }

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

@ -42,6 +42,7 @@ class CustomerResourcesService extends BaseAdminService
*/ */
public function getPage(array $data = []) public function getPage(array $data = [])
{ {
// dump($data);die;
$field = 'a.*,b.id as shared_id'; $field = 'a.*,b.id as shared_id';
$order = 'a.id desc'; $order = 'a.id desc';
$where = []; $where = [];
@ -53,16 +54,39 @@ class CustomerResourcesService extends BaseAdminService
$where[] = ['a.name','=',$data['name']]; $where[] = ['a.name','=',$data['name']];
} }
if($data['age']){
$where[] = ['a.age','=',$data['age']];
}
if($data['gender']){
$where[] = ['a.gender','=',$data['gender']];
}
if($data['type'] == 'yjfp'){ if($data['type'] == 'yjfp'){
$where[] = ['b.shared_by','=',0]; $where[] = ['b.shared_by','=',0];
} }
$search_model = $this->model $search_model = $this->model
->alias("a") ->alias("a")
->join(['school_resource_sharing' => 'b'],'a.id = b.resource_id','left') ->join(['school_resource_sharing' => 'b'],'a.id = b.resource_id','left')
->where($where) ->where($where)
->with(['personnel'])->field($field)->order($order); ->with(['personnel'])->field($field)->order($order);
if (isset($data['created_at'][0]) && isset($data['created_at'][1])) {
$search_model->whereBetweenTime('created_at', $data['created_at'][0]."00:00:00", $data['created_at'][1]."23:59:59");
}
if (isset($data['updated_at'][0]) && isset($data['updated_at'][1])) {
$search_model->whereBetweenTime('updated_at', $data['updated_at'][0]."00:00:00", $data['updated_at'][1]."23:59:59");
}
$list = $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
@ -152,19 +176,19 @@ class CustomerResourcesService extends BaseAdminService
public function edit(int $id, array $data) public function edit(int $id, array $data)
{ {
$personnel = new Personnel(); $personnel = new Personnel();
$data['consultant'] = $personnel->where(['sys_user_id' => $this->uid])->value("id"); // $data['consultant'] = $personnel->where(['sys_user_id' => $this->uid])->value("id");
if(!$data['consultant']){ // if(!$data['consultant']){
return fail("操作失败"); // return fail("操作失败");
} // }
// $data['consultant'] = 1; $data['consultant'] = 1;
$res = $this->model->where([['id', '=', $id]])->findOrEmpty()->toArray(); $res = $this->model->where([['id', '=', $id]])->findOrEmpty()->toArray();
$this->model->where([['id', '=', $id]])->update([ $this->model->where([['id', '=', $id]])->update([
'source' => $data['source'], 'source' => $data['source'],
'source_channel' => $data['source_channel'], 'source_channel' => $data['source_channel'],
'consultant' => $data['consultant'], // 'consultant' => $data['consultant'],
'name' => $data['name'], 'name' => $data['name'],
'age' => $data['age'], 'age' => $data['age'],
'gender' => $data['gender'], 'gender' => $data['gender'],
@ -201,7 +225,7 @@ class CustomerResourcesService extends BaseAdminService
if($data['purchase_power']){ if($data['purchase_power']){
$sixSpeedModificationLog = new SixSpeedModificationLog(); $sixSpeedModificationLog = new SixSpeedModificationLog();
$six_id = $sixSpeed->where(['resource_id' => $id])->value("id"); $six_id = $sixSpeed->where(['resource_id' => $id])->value("id");
$data['staff_id'] = $data['consultant']; // $data['staff_id'] = $data['consultant'];
@ -217,7 +241,7 @@ class CustomerResourcesService extends BaseAdminService
'first_visit_status' => $data['first_visit_status'], 'first_visit_status' => $data['first_visit_status'],
'second_visit_status' => $data['second_visit_status'], 'second_visit_status' => $data['second_visit_status'],
'is_closed' => $data['is_closed'], 'is_closed' => $data['is_closed'],
'staff_id' => $data['staff_id'], // 'staff_id' => $data['staff_id'],
'resource_id' => $id 'resource_id' => $id
]; ];
if($six_id){ if($six_id){

40
niucloud/app/service/admin/order_table/OrderTableService.php

@ -12,6 +12,10 @@
namespace app\service\admin\order_table; namespace app\service\admin\order_table;
use app\model\order_table\OrderTable; use app\model\order_table\OrderTable;
use app\model\customer_resources\CustomerResources;
use app\model\course\Course;
use app\model\class_grade\ClassGrade;
use app\model\personnel\Personnel;
use core\base\BaseAdminService; use core\base\BaseAdminService;
@ -36,10 +40,10 @@ class OrderTableService extends BaseAdminService
*/ */
public function getPage(array $where = []) public function getPage(array $where = [])
{ {
$field = 'id,payment_id,order_status,payment_type,order_amount,course_id,class_id,staff_id,resource_id,after_sales_status,after_sales_reason,after_sales_time,created_at,updated_at,payment_time,subscription_payment_time'; $field = 'id,resource_id,payment_id,order_status,payment_type,order_amount,course_id,class_id,staff_id,after_sales_status,after_sales_reason,after_sales_time,created_at,updated_at,payment_time,subscription_payment_time';
$order = 'id desc'; $order = 'id desc';
$search_model = $this->model->withSearch(["id","payment_id","order_status","payment_type","order_amount","course_id","class_id","staff_id","resource_id","after_sales_status","after_sales_reason","after_sales_time","payment_time","subscription_payment_time"], $where)->field($field)->order($order); $search_model = $this->model->withSearch(["order_status","payment_type"], $where)->with(['customerResources','course','classGrade','personnel'])->field($field)->order($order);
$list = $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
return $list; return $list;
} }
@ -51,9 +55,9 @@ class OrderTableService extends BaseAdminService
*/ */
public function getInfo(int $id) public function getInfo(int $id)
{ {
$field = 'id,payment_id,order_status,payment_type,order_amount,course_id,class_id,staff_id,resource_id,after_sales_status,after_sales_reason,after_sales_time,created_at,updated_at,payment_time,subscription_payment_time'; $field = 'id,resource_id,payment_id,order_status,payment_type,order_amount,course_id,class_id,staff_id,after_sales_status,after_sales_reason,after_sales_time,created_at,updated_at,payment_time,subscription_payment_time';
$info = $this->model->field($field)->where([['id', "=", $id]])->findOrEmpty()->toArray(); $info = $this->model->field($field)->where([['id', "=", $id]])->with(['customerResources','course','classGrade','personnel'])->findOrEmpty()->toArray();
return $info; return $info;
} }
@ -64,6 +68,14 @@ class OrderTableService extends BaseAdminService
*/ */
public function add(array $data) public function add(array $data)
{ {
$personnel = new Personnel();
$data['staff_id'] = $personnel->where(['sys_user_id' => $this->uid])->value("id");
if(!$data['staff_id']){
return fail("操作失败");
}
// $data['staff_id'] = 1;
$res = $this->model->create($data); $res = $this->model->create($data);
return $res->id; return $res->id;
@ -95,5 +107,25 @@ class OrderTableService extends BaseAdminService
} }
public function getCustomerResourcesAll(){
$customerResourcesModel = new CustomerResources();
return $customerResourcesModel->select()->toArray();
}
public function getCourseAll(){
$courseModel = new Course();
return $courseModel->select()->toArray();
}
public function getClassGradeAll(){
$classGradeModel = new ClassGrade();
return $classGradeModel->select()->toArray();
}
public function getPersonnelAll(){
$personnelModel = new Personnel();
return $personnelModel->select()->toArray();
}
} }

22
niucloud/app/service/admin/physical_test/PhysicalTestService.php

@ -12,6 +12,9 @@
namespace app\service\admin\physical_test; namespace app\service\admin\physical_test;
use app\model\physical_test\PhysicalTest; use app\model\physical_test\PhysicalTest;
use app\model\customer_resources\CustomerResources;
use app\model\student\Student;
use app\model\personnel\Personnel;
use core\base\BaseAdminService; use core\base\BaseAdminService;
@ -39,7 +42,7 @@ class PhysicalTestService extends BaseAdminService
$field = 'id,resource_id,student_id,height,weight,coach_id,created_at,updated_at,seated_forward_bend,sit_ups,push_ups,flamingo_balance,thirty_sec_jump,standing_long_jump,agility_run,balance_beam,tennis_throw,ten_meter_shuttle_run'; $field = 'id,resource_id,student_id,height,weight,coach_id,created_at,updated_at,seated_forward_bend,sit_ups,push_ups,flamingo_balance,thirty_sec_jump,standing_long_jump,agility_run,balance_beam,tennis_throw,ten_meter_shuttle_run';
$order = 'id desc'; $order = 'id desc';
$search_model = $this->model->withSearch(["resource_id","student_id","height","created_at","updated_at"], $where)->field($field)->order($order); $search_model = $this->model->withSearch(["resource_id","student_id"], $where)->with(['customerResources','student','personnel'])->field($field)->order($order);
$list = $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
return $list; return $list;
} }
@ -53,7 +56,7 @@ class PhysicalTestService extends BaseAdminService
{ {
$field = 'id,resource_id,student_id,height,weight,coach_id,created_at,updated_at,seated_forward_bend,sit_ups,push_ups,flamingo_balance,thirty_sec_jump,standing_long_jump,agility_run,balance_beam,tennis_throw,ten_meter_shuttle_run'; $field = 'id,resource_id,student_id,height,weight,coach_id,created_at,updated_at,seated_forward_bend,sit_ups,push_ups,flamingo_balance,thirty_sec_jump,standing_long_jump,agility_run,balance_beam,tennis_throw,ten_meter_shuttle_run';
$info = $this->model->field($field)->where([['id', "=", $id]])->findOrEmpty()->toArray(); $info = $this->model->field($field)->where([['id', "=", $id]])->with(['customerResources','student','personnel'])->findOrEmpty()->toArray();
return $info; return $info;
} }
@ -95,5 +98,20 @@ class PhysicalTestService extends BaseAdminService
} }
public function getCustomerResourcesAll(){
$customerResourcesModel = new CustomerResources();
return $customerResourcesModel->select()->toArray();
}
public function getStudentAll(){
$studentModel = new Student();
return $studentModel->select()->toArray();
}
public function getPersonnelAll(){
$personnelModel = new Personnel();
return $personnelModel->select()->toArray();
}
} }

12
niucloud/app/validate/order_table/OrderTable.php

@ -20,30 +20,26 @@ class OrderTable extends BaseValidate
{ {
protected $rule = [ protected $rule = [
'payment_id' => 'require', 'resource_id' => 'require',
'order_status' => 'require', 'order_status' => 'require',
'payment_type' => 'require', 'payment_type' => 'require',
'order_amount' => 'require', 'order_amount' => 'require',
'course_id' => 'require', 'course_id' => 'require',
'class_id' => 'require', 'class_id' => 'require',
'staff_id' => 'require',
'resource_id' => 'require',
]; ];
protected $message = [ protected $message = [
'payment_id.require' => ['common_validate.require', ['payment_id']], 'resource_id.require' => ['common_validate.require', ['resource_id']],
'order_status.require' => ['common_validate.require', ['order_status']], 'order_status.require' => ['common_validate.require', ['order_status']],
'payment_type.require' => ['common_validate.require', ['payment_type']], 'payment_type.require' => ['common_validate.require', ['payment_type']],
'order_amount.require' => ['common_validate.require', ['order_amount']], 'order_amount.require' => ['common_validate.require', ['order_amount']],
'course_id.require' => ['common_validate.require', ['course_id']], 'course_id.require' => ['common_validate.require', ['course_id']],
'class_id.require' => ['common_validate.require', ['class_id']], 'class_id.require' => ['common_validate.require', ['class_id']],
'staff_id.require' => ['common_validate.require', ['staff_id']],
'resource_id.require' => ['common_validate.require', ['resource_id']],
]; ];
protected $scene = [ protected $scene = [
"add" => ['payment_id', 'order_status', 'payment_type', 'order_amount', 'course_id', 'class_id', 'staff_id', 'resource_id', 'after_sales_status', 'after_sales_reason', 'after_sales_time', 'payment_time', 'subscription_payment_time'], "add" => ['resource_id', 'order_status', 'payment_type', 'order_amount', 'course_id', 'class_id'],
"edit" => ['payment_id', 'order_status', 'payment_type', 'order_amount', 'course_id', 'class_id', 'staff_id', 'resource_id', 'after_sales_status', 'after_sales_reason', 'after_sales_time', 'payment_time', 'subscription_payment_time'] "edit" => ['resource_id', 'order_status', 'payment_type', 'order_amount', 'course_id', 'class_id']
]; ];
} }

4
niucloud/app/validate/physical_test/PhysicalTest.php

@ -36,8 +36,8 @@ class PhysicalTest extends BaseValidate
]; ];
protected $scene = [ protected $scene = [
"add" => ['resource_id', 'student_id', 'height', 'weight', 'coach_id', 'created_at', 'updated_at', 'seated_forward_bend', 'sit_ups', 'push_ups', 'flamingo_balance', 'thirty_sec_jump', 'standing_long_jump', 'agility_run', 'balance_beam', 'tennis_throw', 'ten_meter_shuttle_run'], "add" => ['resource_id', 'student_id', 'height', 'weight', 'coach_id', 'seated_forward_bend', 'sit_ups', 'push_ups', 'flamingo_balance', 'thirty_sec_jump', 'standing_long_jump', 'agility_run', 'balance_beam', 'tennis_throw', 'ten_meter_shuttle_run'],
"edit" => ['resource_id', 'student_id', 'height', 'weight', 'coach_id', 'created_at', 'updated_at', 'seated_forward_bend', 'sit_ups', 'push_ups', 'flamingo_balance', 'thirty_sec_jump', 'standing_long_jump', 'agility_run', 'balance_beam', 'tennis_throw', 'ten_meter_shuttle_run'] "edit" => ['resource_id', 'student_id', 'height', 'weight', 'coach_id', 'seated_forward_bend', 'sit_ups', 'push_ups', 'flamingo_balance', 'thirty_sec_jump', 'standing_long_jump', 'agility_run', 'balance_beam', 'tennis_throw', 'ten_meter_shuttle_run']
]; ];
} }

Loading…
Cancel
Save