Browse Source

代码格式化

master
王泽彦 11 months ago
parent
commit
adf2ea85a9
  1. 4
      admin/components.d.ts
  2. 26
      admin/src/app/api/communication_records.ts
  3. 42
      admin/src/app/api/order_table.ts
  4. 39
      admin/src/app/api/physical_test.ts
  5. 32
      admin/src/app/api/student_courses.ts
  6. 3
      admin/src/app/api/sys.ts
  7. 38
      admin/src/app/lang/zh-cn/communication_records.communication_records.json
  8. 3
      admin/src/app/lang/zh-cn/customer_resource_changes.customer_resource_changes.json
  9. 202
      admin/src/app/lang/zh-cn/customer_resources.customer_resources.json
  10. 26
      admin/src/app/lang/zh-cn/exam_questions.exam_questions_edit.json
  11. 38
      admin/src/app/lang/zh-cn/order_table.order_table.json
  12. 70
      admin/src/app/lang/zh-cn/physical_test.physical_test.json
  13. 74
      admin/src/app/lang/zh-cn/physical_test.physical_test_edit.json
  14. 34
      admin/src/app/lang/zh-cn/student_courses.student_courses.json
  15. 70
      admin/src/app/lang/zh-cn/tc_dialog.physical_test_edit.json
  16. 2
      admin/src/app/views/campus_person_role/campus_person_role.vue
  17. 221
      admin/src/app/views/communication_records/communication_records.vue
  18. 232
      admin/src/app/views/communication_records/components/communication-records-edit.vue
  19. 550
      admin/src/app/views/customer_resources/customer_resources.vue
  20. 187
      admin/src/app/views/order_table/components/order-table-edit.vue
  21. 225
      admin/src/app/views/order_table/order_table.vue
  22. 294
      admin/src/app/views/physical_test/components/physical-test-edit.vue
  23. 172
      admin/src/app/views/physical_test/physical_test.vue
  24. 314
      admin/src/app/views/physical_test/physical_test_edit.vue
  25. 123
      admin/src/app/views/setting/pay.vue
  26. 140
      admin/src/app/views/student_courses/components/student-courses-edit.vue
  27. 174
      admin/src/app/views/student_courses/student_courses.vue
  28. 154
      admin/src/app/views/tc_dialog/tc_dialog.vue
  29. 21
      admin/src/app/views/timetables/timetables.vue
  30. 136
      admin/src/app/views/xsyj/xsyj.vue

4
admin/components.d.ts

@ -41,8 +41,6 @@ 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']
@ -52,9 +50,7 @@ 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']

26
admin/src/app/api/communication_records.ts

@ -1,7 +1,5 @@
import request from '@/utils/request' import request from '@/utils/request'
// USER_CODE_BEGIN -- communication_records // USER_CODE_BEGIN -- communication_records
/** /**
* *
@ -9,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getCommunicationRecordsList(params: Record<string, any>) { export function getCommunicationRecordsList(params: Record<string, any>) {
return request.get(`communication_records/communication_records`, {params}) return request.get(`communication_records/communication_records`, { params })
} }
/** /**
@ -18,7 +16,7 @@ export function getCommunicationRecordsList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getCommunicationRecordsInfo(id: number) { export function getCommunicationRecordsInfo(id: number) {
return request.get(`communication_records/communication_records/${id}`); return request.get(`communication_records/communication_records/${id}`)
} }
/** /**
@ -27,7 +25,10 @@ export function getCommunicationRecordsInfo(id: number) {
* @returns * @returns
*/ */
export function addCommunicationRecords(params: Record<string, any>) { export function addCommunicationRecords(params: Record<string, any>) {
return request.post('communication_records/communication_records', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('communication_records/communication_records', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -37,7 +38,11 @@ export function addCommunicationRecords(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editCommunicationRecords(params: Record<string, any>) { export function editCommunicationRecords(params: Record<string, any>) {
return request.put(`communication_records/communication_records/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(
`communication_records/communication_records/${params.id}`,
params,
{ showErrorMessage: true, showSuccessMessage: true }
)
} }
/** /**
@ -46,11 +51,14 @@ export function editCommunicationRecords(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteCommunicationRecords(id: number) { export function deleteCommunicationRecords(id: number) {
return request.delete(`communication_records/communication_records/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`communication_records/communication_records/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
export function getWithCustomerResourcesList(params: Record<string,any>){ export function getWithCustomerResourcesList(params: Record<string, any>) {
return request.get('communication_records/customer_resources_all', {params}) return request.get('communication_records/customer_resources_all', { params })
} }
// USER_CODE_END -- communication_records // USER_CODE_END -- communication_records

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

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

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

@ -1,11 +1,5 @@
import request from '@/utils/request' import request from '@/utils/request'
// USER_CODE_BEGIN -- physical_test // USER_CODE_BEGIN -- physical_test
/** /**
* *
@ -13,7 +7,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 })
} }
/** /**
@ -22,7 +16,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}`)
} }
/** /**
@ -31,7 +25,10 @@ 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, { showErrorMessage: true, showSuccessMessage: true }) return request.post('physical_test/physical_test', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -41,7 +38,10 @@ 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, { showErrorMessage: true, showSuccessMessage: true }) return request.put(`physical_test/physical_test/${params.id}`, params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -50,15 +50,20 @@ 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}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`physical_test/physical_test/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
export function getWithCustomerResourcesList(params: Record<string,any>){ export function getWithCustomerResourcesList(params: Record<string, any>) {
return request.get('physical_test/customer_resources_all', {params}) 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 getWithStudentList(params: Record<string, any>) {
}export function getWithPersonnelList(params: Record<string,any>){ return request.get('physical_test/student_all', { params })
return request.get('physical_test/personnel_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

32
admin/src/app/api/student_courses.ts

@ -1,9 +1,5 @@
import request from '@/utils/request' import request from '@/utils/request'
// USER_CODE_BEGIN -- student_courses // USER_CODE_BEGIN -- student_courses
/** /**
* *
@ -11,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getStudentCoursesList(params: Record<string, any>) { export function getStudentCoursesList(params: Record<string, any>) {
return request.get(`student_courses/student_courses`, {params}) return request.get(`student_courses/student_courses`, { params })
} }
/** /**
@ -20,7 +16,7 @@ export function getStudentCoursesList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getStudentCoursesInfo(id: number) { export function getStudentCoursesInfo(id: number) {
return request.get(`student_courses/student_courses/${id}`); return request.get(`student_courses/student_courses/${id}`)
} }
/** /**
@ -29,7 +25,10 @@ export function getStudentCoursesInfo(id: number) {
* @returns * @returns
*/ */
export function addStudentCourses(params: Record<string, any>) { export function addStudentCourses(params: Record<string, any>) {
return request.post('student_courses/student_courses', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('student_courses/student_courses', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -39,7 +38,10 @@ export function addStudentCourses(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editStudentCourses(params: Record<string, any>) { export function editStudentCourses(params: Record<string, any>) {
return request.put(`student_courses/student_courses/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(`student_courses/student_courses/${params.id}`, params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -48,13 +50,17 @@ export function editStudentCourses(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteStudentCourses(id: number) { export function deleteStudentCourses(id: number) {
return request.delete(`student_courses/student_courses/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`student_courses/student_courses/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
export function getWithStudentList(params: Record<string,any>){ export function getWithStudentList(params: Record<string, any>) {
return request.get('student_courses/student_all', {params}) return request.get('student_courses/student_all', { params })
}export function getWithCourseList(params: Record<string,any>){ }
return request.get('student_courses/course_all', {params}) export function getWithCourseList(params: Record<string, any>) {
return request.get('student_courses/course_all', { params })
} }
// USER_CODE_END -- student_courses // USER_CODE_END -- student_courses

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

@ -765,7 +765,6 @@ export function yjpzConfig(params: Record<string, any>) {
return request.post(`sys/yjpz_config`, params) return request.post(`sys/yjpz_config`, params)
} }
export function xsyjConfig(params: Record<string, any>) { export function xsyjConfig(params: Record<string, any>) {
return request.post(`sys/xsyj_config`, params) return request.post(`sys/xsyj_config`, params)
} }
@ -773,5 +772,3 @@ export function xsyjConfig(params: Record<string, any>) {
export function getXsyjConfig() { export function getXsyjConfig() {
return request.get('sys/get_xsyj_config') return request.get('sys/get_xsyj_config')
} }

38
admin/src/app/lang/zh-cn/communication_records.communication_records.json

@ -1,21 +1,21 @@
{ {
"resourceId":"资源", "resourceId": "资源",
"resourceIdPlaceholder":"全部", "resourceIdPlaceholder": "全部",
"resourceType":"资源类型", "resourceType": "资源类型",
"resourceTypePlaceholder":"请输入资源类型", "resourceTypePlaceholder": "请输入资源类型",
"communicationType":"沟通类型", "communicationType": "沟通类型",
"communicationTypePlaceholder":"请输入沟通类型", "communicationTypePlaceholder": "请输入沟通类型",
"communicationResult":"沟通结果", "communicationResult": "沟通结果",
"communicationResultPlaceholder":"请输入沟通结果", "communicationResultPlaceholder": "请输入沟通结果",
"communicationTime":"沟通时间", "communicationTime": "沟通时间",
"communicationTimePlaceholder":"请输入沟通时间", "communicationTimePlaceholder": "请输入沟通时间",
"remarks":"备注", "remarks": "备注",
"remarksPlaceholder":"请输入备注", "remarksPlaceholder": "请输入备注",
"tag":"标签", "tag": "标签",
"tagPlaceholder":"请输入标签", "tagPlaceholder": "请输入标签",
"addCommunicationRecords":"添加沟通记录", "addCommunicationRecords": "添加沟通记录",
"updateCommunicationRecords":"编辑沟通记录", "updateCommunicationRecords": "编辑沟通记录",
"communicationRecordsDeleteTips":"确定要删除该数据吗?", "communicationRecordsDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

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

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

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

@ -1,107 +1,105 @@
{ {
"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":"资源", "resourceId": "客户姓名",
"resourceIdPlaceholder":"请输入资源", "resourceIdPlaceholder": "全部",
"orderStatus":"订单状态", "studentId": "学员姓名",
"orderStatusPlaceholder":"请输入订单状态", "studentIdPlaceholder": "全部",
"paymentType":"付款类型", "height": "身高",
"paymentTypePlaceholder":"请输入付款类型", "heightPlaceholder": "请输入身高",
"orderAmount":"订单金额", "createdAt": "创建时间",
"orderAmountPlaceholder":"请输入订单金额", "updatedAt": "修改时间",
"courseId":"课程", "addPhysicalTest": "添加体测",
"courseIdPlaceholder":"请输入课程", "updatePhysicalTest": "编辑体测",
"classId":"班级", "physicalTestDeleteTips": "确定要删除该数据吗?",
"classIdPlaceholder":"请输入班级", "startDate": "请选择开始时间",
"staffId":"人员", "endDate": "请选择结束时间",
"paymentTime":"支付时间",
"addOrderTable":"添加订单",
"updateOrderTable":"编辑订单",
"resourceId": "客户姓名",
"resourceId":"客户姓名", "resourceIdPlaceholder": "全部",
"resourceIdPlaceholder":"全部", "studentId": "学员姓名",
"studentId":"学员姓名", "studentIdPlaceholder": "全部",
"studentIdPlaceholder":"全部", "height": "身高",
"height":"身高", "heightPlaceholder": "请输入身高",
"heightPlaceholder":"请输入身高", "weight": "体重",
"createdAt":"创建时间", "weightPlaceholder": "请输入体重",
"updatedAt":"修改时间", "coachId": "教练",
"addPhysicalTest":"添加体测", "coachIdPlaceholder": "请输入教练",
"updatePhysicalTest":"编辑体测", "seatedForwardBend": "坐位体前屈",
"physicalTestDeleteTips":"确定要删除该数据吗?", "seatedForwardBendPlaceholder": "请输入坐位体前屈",
"startDate":"请选择开始时间", "sitUps": "仰卧卷腹",
"endDate":"请选择结束时间", "sitUpsPlaceholder": "请输入仰卧卷腹",
"pushUps": "九十度仰卧撑",
"resourceId":"客户姓名", "pushUpsPlaceholder": "请输入九十度仰卧撑",
"resourceIdPlaceholder":"全部", "flamingoBalance": "火烈鸟平衡测试",
"studentId":"学员姓名", "flamingoBalancePlaceholder": "请输入火烈鸟平衡测试",
"studentIdPlaceholder":"全部", "thirtySecJump": "三十秒双脚连续跳",
"height":"身高", "thirtySecJumpPlaceholder": "请输入三十秒双脚连续跳",
"heightPlaceholder":"请输入身高", "standingLongJump": "立定跳远",
"weight":"体重", "standingLongJumpPlaceholder": "请输入立定跳远",
"weightPlaceholder":"请输入体重", "agilityRun": "4乘10m灵敏折返跑",
"coachId":"教练", "agilityRunPlaceholder": "请输入4乘10m灵敏折返跑",
"coachIdPlaceholder":"请输入教练", "balanceBeam": "走平衡木",
"seatedForwardBend":"坐位体前屈", "balanceBeamPlaceholder": "请输入走平衡木",
"seatedForwardBendPlaceholder":"请输入坐位体前屈", "tennisThrow": "网球掷远",
"sitUps":"仰卧卷腹", "tennisThrowPlaceholder": "请输入网球掷远",
"sitUpsPlaceholder":"请输入仰卧卷腹", "tenMeterShuttleRun": "十米往返跑",
"pushUps":"九十度仰卧撑", "tenMeterShuttleRunPlaceholder": "请输入十米往返跑",
"pushUpsPlaceholder":"请输入九十度仰卧撑", "addPhysicalTest": "添加体测",
"flamingoBalance":"火烈鸟平衡测试", "updatePhysicalTest": "编辑体测",
"flamingoBalancePlaceholder":"请输入火烈鸟平衡测试", "physicalTestDeleteTips": "确定要删除该数据吗?",
"thirtySecJump":"三十秒双脚连续跳", "startDate": "请选择开始时间",
"thirtySecJumpPlaceholder":"请输入三十秒双脚连续跳", "endDate": "请选择结束时间"
"standingLongJump":"立定跳远",
"standingLongJumpPlaceholder":"请输入立定跳远",
"agilityRun":"4乘10m灵敏折返跑",
"agilityRunPlaceholder":"请输入4乘10m灵敏折返跑",
"balanceBeam":"走平衡木",
"balanceBeamPlaceholder":"请输入走平衡木",
"tennisThrow":"网球掷远",
"tennisThrowPlaceholder":"请输入网球掷远",
"tenMeterShuttleRun":"十米往返跑",
"tenMeterShuttleRunPlaceholder":"请输入十米往返跑",
"addPhysicalTest":"添加体测",
"updatePhysicalTest":"编辑体测",
"physicalTestDeleteTips":"确定要删除该数据吗?",
"startDate":"请选择开始时间",
"endDate":"请选择结束时间"
} }

26
admin/src/app/lang/zh-cn/exam_questions.exam_questions_edit.json

@ -1,15 +1,15 @@
{ {
"questionType":"题型", "questionType": "题型",
"questionContentType":"题干", "questionContentType": "题干",
"questionContent":"题干内容", "questionContent": "题干内容",
"optionAContentType":"选项类型", "optionAContentType": "选项类型",
"optionAContent":"选项内容", "optionAContent": "选项内容",
"correctAnswer":"正确答案", "correctAnswer": "正确答案",
"questionTypePlaceholder":"请选择题型", "questionTypePlaceholder": "请选择题型",
"questionContentTypePlaceholder":"请选择题干类型", "questionContentTypePlaceholder": "请选择题干类型",
"questionContentPlaceholder":"请输入题干内容", "questionContentPlaceholder": "请输入题干内容",
"correctAnswerPlaceholder":"请输入正确答案", "correctAnswerPlaceholder": "请输入正确答案",
"addExamQuestions":"添加试题", "addExamQuestions": "添加试题",
"updateExamQuestions":"编辑试题", "updateExamQuestions": "编辑试题",
"examQuestionsDeleteTips":"确定要删除该试题吗?" "examQuestionsDeleteTips": "确定要删除该试题吗?"
} }

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

@ -1,21 +1,21 @@
{ {
"resourceId":"资源", "resourceId": "资源",
"resourceIdPlaceholder":"请输入资源", "resourceIdPlaceholder": "请输入资源",
"orderStatus":"订单状态", "orderStatus": "订单状态",
"orderStatusPlaceholder":"请输入订单状态", "orderStatusPlaceholder": "请输入订单状态",
"paymentType":"付款类型", "paymentType": "付款类型",
"paymentTypePlaceholder":"请输入付款类型", "paymentTypePlaceholder": "请输入付款类型",
"orderAmount":"订单金额", "orderAmount": "订单金额",
"orderAmountPlaceholder":"请输入订单金额", "orderAmountPlaceholder": "请输入订单金额",
"courseId":"课程", "courseId": "课程",
"courseIdPlaceholder":"请输入课程", "courseIdPlaceholder": "请输入课程",
"classId":"班级", "classId": "班级",
"classIdPlaceholder":"请输入班级", "classIdPlaceholder": "请输入班级",
"staffId":"人员", "staffId": "人员",
"paymentTime":"支付时间", "paymentTime": "支付时间",
"addOrderTable":"添加订单", "addOrderTable": "添加订单",
"updateOrderTable":"编辑订单", "updateOrderTable": "编辑订单",
"orderTableDeleteTips":"确定要删除该数据吗?", "orderTableDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

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

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

34
admin/src/app/lang/zh-cn/student_courses.student_courses.json

@ -1,19 +1,19 @@
{ {
"studentId":"学员", "studentId": "学员",
"studentIdPlaceholder":"全部", "studentIdPlaceholder": "全部",
"courseId":"课程", "courseId": "课程",
"courseIdPlaceholder":"全部", "courseIdPlaceholder": "全部",
"totalHours":"总正式课时数", "totalHours": "总正式课时数",
"totalHoursPlaceholder":"请输入总正式课时数", "totalHoursPlaceholder": "请输入总正式课时数",
"giftHours":"赠送课时数", "giftHours": "赠送课时数",
"giftHoursPlaceholder":"请输入赠送课时数", "giftHoursPlaceholder": "请输入赠送课时数",
"startDate":"课程开始日期", "startDate": "课程开始日期",
"startDatePlaceholder":"请输入课程开始日期", "startDatePlaceholder": "请输入课程开始日期",
"endDate":"课程结束日期", "endDate": "课程结束日期",
"endDatePlaceholder":"请输入课程结束日期", "endDatePlaceholder": "请输入课程结束日期",
"addStudentCourses":"添加学员课程", "addStudentCourses": "添加学员课程",
"updateStudentCourses":"编辑学员课程", "updateStudentCourses": "编辑学员课程",
"studentCoursesDeleteTips":"确定要删除该数据吗?", "studentCoursesDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

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

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

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

@ -186,7 +186,7 @@ const route = useRoute()
const pageName = route.meta.title const pageName = route.meta.title
// ?dept_id=1 // ?dept_id=1
const dept_id = pageName == '市场人员列表' ? 1 : 2; const dept_id = pageName == '市场人员列表' ? 1 : 2
let campusPersonRoleTable = reactive({ let campusPersonRoleTable = reactive({
page: 1, page: 1,
limit: 10, limit: 10,

221
admin/src/app/views/communication_records/communication_records.vue

@ -1,19 +1,29 @@
<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('addCommunicationRecords') }} {{ t('addCommunicationRecords') }}
</el-button> </el-button>
</div> </div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card
<el-form :inline="true" :model="communicationRecordsTable.searchParam" ref="searchFormRef"> class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="communicationRecordsTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('resourceId')" prop="resource_id"> <el-form-item :label="t('resourceId')" prop="resource_id">
<el-select class="w-[280px]" v-model="communicationRecordsTable.searchParam.resource_id" clearable :placeholder="t('resourceIdPlaceholder')"> <el-select
class="w-[280px]"
v-model="communicationRecordsTable.searchParam.resource_id"
clearable
:placeholder="t('resourceIdPlaceholder')"
>
<el-option <el-option
v-for="(item, index) in resourceIdList" v-for="(item, index) in resourceIdList"
:key="index" :key="index"
@ -23,9 +33,16 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item
<el-form-item :label="t('communicationType')" prop="communication_type"> :label="t('communicationType')"
<el-select class="w-[280px]" v-model="communicationRecordsTable.searchParam.communication_type" clearable :placeholder="t('communicationTypePlaceholder')"> prop="communication_type"
>
<el-select
class="w-[280px]"
v-model="communicationRecordsTable.searchParam.communication_type"
clearable
:placeholder="t('communicationTypePlaceholder')"
>
<el-option label="全部" value=""></el-option> <el-option label="全部" value=""></el-option>
<el-option <el-option
v-for="(item, index) in communication_typeList" v-for="(item, index) in communication_typeList"
@ -37,42 +54,91 @@
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadCommunicationRecordsList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadCommunicationRecordsList()">{{
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> t('search')
}}</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 :data="communicationRecordsTable.data" size="large" v-loading="communicationRecordsTable.loading"> <el-table
:data="communicationRecordsTable.data"
size="large"
v-loading="communicationRecordsTable.loading"
>
<template #empty> <template #empty>
<span>{{ !communicationRecordsTable.loading ? t('emptyData') : '' }}</span> <span>{{
!communicationRecordsTable.loading ? t('emptyData') : ''
}}</span>
</template> </template>
<el-table-column prop="resource_id_name" :label="t('resourceId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="resource_id_name"
:label="t('resourceId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="resource_type" :label="t('resourceType')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="resource_type"
:label="t('resourceType')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column :label="t('communicationType')" min-width="180" align="center" :show-overflow-tooltip="true"> <el-table-column
:label="t('communicationType')"
min-width="180"
align="center"
:show-overflow-tooltip="true"
>
<template #default="{ row }"> <template #default="{ row }">
<div v-for="(item, index) in communication_typeList"> <div v-for="(item, index) in communication_typeList">
<div v-if="item.value == row.communication_type">{{ item.name }}</div> <div v-if="item.value == row.communication_type">
{{ item.name }}
</div>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="t('communicationResult')" min-width="180" align="center" :show-overflow-tooltip="true"> <el-table-column
:label="t('communicationResult')"
min-width="180"
align="center"
:show-overflow-tooltip="true"
>
<template #default="{ row }"> <template #default="{ row }">
<div v-for="(item, index) in communication_resultList"> <div v-for="(item, index) in communication_resultList">
<div v-if="item.value == row.communication_result">{{ item.name }}</div> <div v-if="item.value == row.communication_result">
{{ item.name }}
</div>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="communication_time" :label="t('communicationTime')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="communication_time"
:label="t('communicationTime')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="remarks" :label="t('remarks')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="remarks"
:label="t('remarks')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column :label="t('tag')" min-width="180" align="center" :show-overflow-tooltip="true"> <el-table-column
:label="t('tag')"
min-width="180"
align="center"
:show-overflow-tooltip="true"
>
<template #default="{ row }"> <template #default="{ row }">
<div v-for="(item, index) in tagList"> <div v-for="(item, index) in tagList">
<div v-if="item.value == row.tag">{{ item.name }}</div> <div v-if="item.value == row.tag">{{ item.name }}</div>
@ -80,22 +146,37 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120"> <el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button> <el-button type="primary" link @click="editEvent(row)">{{
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button> 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> </el-table>
<div class="mt-[16px] flex justify-end"> <div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="communicationRecordsTable.page" v-model:page-size="communicationRecordsTable.limit" <el-pagination
layout="total, sizes, prev, pager, next, jumper" :total="communicationRecordsTable.total" v-model:current-page="communicationRecordsTable.page"
@size-change="loadCommunicationRecordsList()" @current-change="loadCommunicationRecordsList" /> v-model:page-size="communicationRecordsTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="communicationRecordsTable.total"
@size-change="loadCommunicationRecordsList()"
@current-change="loadCommunicationRecordsList"
/>
</div> </div>
</div> </div>
<edit ref="editCommunicationRecordsDialog" @complete="loadCommunicationRecordsList" /> <edit
ref="editCommunicationRecordsDialog"
@complete="loadCommunicationRecordsList"
/>
</el-card> </el-card>
</div> </div>
</template> </template>
@ -104,13 +185,17 @@
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 { getCommunicationRecordsList, deleteCommunicationRecords, getWithCustomerResourcesList } from '@/app/api/communication_records' import {
getCommunicationRecordsList,
deleteCommunicationRecords,
getWithCustomerResourcesList,
} from '@/app/api/communication_records'
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/communication_records/components/communication-records-edit.vue' import Edit from '@/app/views/communication_records/components/communication-records-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 communicationRecordsTable = reactive({ let communicationRecordsTable = reactive({
page: 1, page: 1,
@ -118,10 +203,10 @@ let communicationRecordsTable = reactive({
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam:{ searchParam: {
"resource_id":"", resource_id: '',
"communication_type":"" communication_type: '',
} },
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -130,21 +215,25 @@ const searchFormRef = ref<FormInstance>()
const selectData = ref<any[]>([]) const selectData = ref<any[]>([])
// //
const communication_typeList = ref([] as any[]) const communication_typeList = ref([] as any[])
const communication_typeDictList = async () => { const communication_typeDictList = async () => {
communication_typeList.value = await (await useDictionary('communication_type')).data.dictionary communication_typeList.value = await (
} await useDictionary('communication_type')
communication_typeDictList(); ).data.dictionary
const communication_resultList = ref([] as any[]) }
const communication_resultDictList = async () => { communication_typeDictList()
communication_resultList.value = await (await useDictionary('communication_result')).data.dictionary const communication_resultList = ref([] as any[])
} const communication_resultDictList = async () => {
communication_resultDictList(); communication_resultList.value = await (
const tagList = ref([] as any[]) await useDictionary('communication_result')
const tagDictList = async () => { ).data.dictionary
}
communication_resultDictList()
const tagList = ref([] as any[])
const tagDictList = async () => {
tagList.value = await (await useDictionary('tag')).data.dictionary tagList.value = await (await useDictionary('tag')).data.dictionary
} }
tagDictList(); tagDictList()
/** /**
* 获取沟通记录列表 * 获取沟通记录列表
@ -156,12 +245,14 @@ const loadCommunicationRecordsList = (page: number = 1) => {
getCommunicationRecordsList({ getCommunicationRecordsList({
page: communicationRecordsTable.page, page: communicationRecordsTable.page,
limit: communicationRecordsTable.limit, limit: communicationRecordsTable.limit,
...communicationRecordsTable.searchParam ...communicationRecordsTable.searchParam,
}).then(res => { })
.then((res) => {
communicationRecordsTable.loading = false communicationRecordsTable.loading = false
communicationRecordsTable.data = res.data.data communicationRecordsTable.data = res.data.data
communicationRecordsTable.total = res.data.total communicationRecordsTable.total = res.data.total
}).catch(() => { })
.catch(() => {
communicationRecordsTable.loading = false communicationRecordsTable.loading = false
}) })
} }
@ -190,26 +281,24 @@ const editEvent = (data: any) => {
* 删除沟通记录 * 删除沟通记录
*/ */
const deleteEvent = (id: number) => { const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('communicationRecordsDeleteTips'), t('warning'), ElMessageBox.confirm(t('communicationRecordsDeleteTips'), t('warning'), {
{
confirmButtonText: t('confirm'), confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'), cancelButtonText: t('cancel'),
type: 'warning', type: 'warning',
} }).then(() => {
).then(() => { deleteCommunicationRecords(id)
deleteCommunicationRecords(id).then(() => { .then(() => {
loadCommunicationRecordsList() loadCommunicationRecordsList()
}).catch(() => {
}) })
.catch(() => {})
}) })
} }
const resourceIdList = ref([])
const resourceIdList = ref([]) const setResourceIdList = async () => {
const setResourceIdList = async () => {
resourceIdList.value = await (await getWithCustomerResourcesList({})).data resourceIdList.value = await (await getWithCustomerResourcesList({})).data
} }
setResourceIdList() setResourceIdList()
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
@ -227,5 +316,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>

232
admin/src/app/views/communication_records/components/communication-records-edit.vue

@ -1,8 +1,30 @@
<template> <template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateCommunicationRecords') : t('addCommunicationRecords')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true"> <el-dialog
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading"> v-model="showDialog"
:title="
formData.id
? t('updateCommunicationRecords')
: t('addCommunicationRecords')
"
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-select class="input-width" v-model="formData.resource_id" clearable :placeholder="t('resourceIdPlaceholder')"> <el-select
class="input-width"
v-model="formData.resource_id"
clearable
:placeholder="t('resourceIdPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in resourceIdList" v-for="(item, index) in resourceIdList"
@ -14,11 +36,21 @@
</el-form-item> </el-form-item>
<el-form-item :label="t('resourceType')" prop="resource_type"> <el-form-item :label="t('resourceType')" prop="resource_type">
<el-input v-model="formData.resource_type" clearable :placeholder="t('resourceTypePlaceholder')" class="input-width" /> <el-input
v-model="formData.resource_type"
clearable
:placeholder="t('resourceTypePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('communicationType')" prop="communication_type"> <el-form-item :label="t('communicationType')" prop="communication_type">
<el-select class="input-width" v-model="formData.communication_type" clearable :placeholder="t('communicationTypePlaceholder')"> <el-select
class="input-width"
v-model="formData.communication_type"
clearable
:placeholder="t('communicationTypePlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in communication_typeList" v-for="(item, index) in communication_typeList"
@ -29,8 +61,16 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('communicationResult')" prop="communication_result"> <el-form-item
<el-select class="input-width" v-model="formData.communication_result" clearable :placeholder="t('communicationResultPlaceholder')"> :label="t('communicationResult')"
prop="communication_result"
>
<el-select
class="input-width"
v-model="formData.communication_result"
clearable
:placeholder="t('communicationResultPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in communication_resultList" v-for="(item, index) in communication_resultList"
@ -41,21 +81,38 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('communicationTime')" prop="communication_time" class="input-width"> <el-form-item
:label="t('communicationTime')"
prop="communication_time"
class="input-width"
>
<el-date-picker <el-date-picker
class="flex-1 !flex" class="flex-1 !flex"
v-model="formData.communication_time" v-model="formData.communication_time"
clearable clearable
type="datetime" type="datetime"
value-format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"
:placeholder="t('communicationTimePlaceholder')"> :placeholder="t('communicationTimePlaceholder')"
>
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
<el-form-item :label="t('remarks')" > <el-form-item :label="t('remarks')">
<el-input v-model="formData.remarks" type="textarea" rows="4" clearable :placeholder="t('remarksPlaceholder')" class="input-width"/> <el-input
v-model="formData.remarks"
type="textarea"
rows="4"
clearable
:placeholder="t('remarksPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('tag')" > <el-form-item :label="t('tag')">
<el-select class="input-width" v-model="formData.tag" clearable :placeholder="t('tagPlaceholder')"> <el-select
class="input-width"
v-model="formData.tag"
clearable
:placeholder="t('tagPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in tagList" v-for="(item, index) in tagList"
@ -65,15 +122,17 @@
/> />
</el-select> </el-select>
</el-form-item> </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 type="primary" :loading="loading" @click="confirm(formRef)">{{ <el-button
t('confirm') type="primary"
}}</el-button> :loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -84,7 +143,12 @@ 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 { addCommunicationRecords, editCommunicationRecords, getCommunicationRecordsInfo, getWithCustomerResourcesList } from '@/app/api/communication_records' import {
addCommunicationRecords,
editCommunicationRecords,
getCommunicationRecordsInfo,
getWithCustomerResourcesList,
} from '@/app/api/communication_records'
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -111,39 +175,39 @@ const formRules = computed(() => {
return { return {
resource_id: [ resource_id: [
{ required: true, message: t('resourceIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('resourceIdPlaceholder'), trigger: 'blur' },
],
]
,
resource_type: [ resource_type: [
{ required: true, message: t('resourceTypePlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('resourceTypePlaceholder'),
, trigger: 'blur',
},
],
communication_type: [ communication_type: [
{ required: true, message: t('communicationTypePlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('communicationTypePlaceholder'),
, trigger: 'blur',
},
],
communication_result: [ communication_result: [
{ required: true, message: t('communicationResultPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('communicationResultPlaceholder'),
, trigger: 'blur',
},
],
communication_time: [ communication_time: [
{ required: true, message: t('communicationTimePlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('communicationTimePlaceholder'),
, trigger: 'blur',
},
],
remarks: [ remarks: [
{ required: true, message: t('remarksPlaceholder'), trigger: 'blur' }, { required: true, message: t('remarksPlaceholder'), trigger: 'blur' },
],
] tag: [{ required: true, message: t('tagPlaceholder'), trigger: 'blur' }],
,
tag: [
{ required: true, message: t('tagPlaceholder'), trigger: 'blur' },
]
,
} }
}) })
@ -163,11 +227,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData let data = formData
save(data).then(res => { save(data)
.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
}) })
} }
@ -175,37 +241,56 @@ const confirm = async (formEl: FormInstance | undefined) => {
} }
// //
let communication_typeList = ref([]) let communication_typeList = ref([])
const communication_typeDictList = async () => { const communication_typeDictList = async () => {
communication_typeList.value = await (await useDictionary('communication_type')).data.dictionary communication_typeList.value = await (
await useDictionary('communication_type')
).data.dictionary
}
communication_typeDictList()
watch(
() => communication_typeList.value,
() => {
formData.communication_type = communication_typeList.value[0].value
} }
communication_typeDictList(); )
watch(() => communication_typeList.value, () => { formData.communication_type = communication_typeList.value[0].value }) let communication_resultList = ref([])
let communication_resultList = ref([]) const communication_resultDictList = async () => {
const communication_resultDictList = async () => { communication_resultList.value = await (
communication_resultList.value = await (await useDictionary('communication_result')).data.dictionary await useDictionary('communication_result')
).data.dictionary
}
communication_resultDictList()
watch(
() => communication_resultList.value,
() => {
formData.communication_result = communication_resultList.value[0].value
} }
communication_resultDictList(); )
watch(() => communication_resultList.value, () => { formData.communication_result = communication_resultList.value[0].value }) let tagList = ref([])
let tagList = ref([]) const tagDictList = async () => {
const tagDictList = async () => {
tagList.value = await (await useDictionary('tag')).data.dictionary tagList.value = await (await useDictionary('tag')).data.dictionary
}
tagDictList()
watch(
() => tagList.value,
() => {
formData.tag = tagList.value[0].value
} }
tagDictList(); )
watch(() => tagList.value, () => { formData.tag = tagList.value[0].value })
const resourceIdList = ref([] as any[]) const resourceIdList = ref([] as any[])
const setResourceIdList = async () => { const setResourceIdList = async () => {
resourceIdList.value = await (await getWithCustomerResourcesList({})).data resourceIdList.value = await (await getWithCustomerResourcesList({})).data
} }
setResourceIdList() setResourceIdList()
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){ if (row) {
const data = await (await getCommunicationRecordsInfo(row.id)).data const data = await (await getCommunicationRecordsInfo(row.id)).data
if (data) Object.keys(formData).forEach((key: string) => { if (data)
Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key] if (data[key] != undefined) formData[key] = data[key]
}) })
} }
@ -223,7 +308,12 @@ 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 (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)) { if (
value &&
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
value
)
) {
callback(new Error(t('generateIdCard'))) callback(new Error(t('generateIdCard')))
} else { } else {
callback() callback()
@ -250,13 +340,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>

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

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

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

@ -1,8 +1,26 @@
<template> <template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateOrderTable') : t('addOrderTable')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true"> <el-dialog
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading"> v-model="showDialog"
:title="formData.id ? t('updateOrderTable') : t('addOrderTable')"
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-select class="input-width" v-model="formData.resource_id" clearable :placeholder="t('resourceIdPlaceholder')"> <el-select
class="input-width"
v-model="formData.resource_id"
clearable
:placeholder="t('resourceIdPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in resourceIdList" v-for="(item, index) in resourceIdList"
@ -14,7 +32,12 @@
</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-select class="input-width" v-model="formData.order_status" clearable :placeholder="t('orderStatusPlaceholder')"> <el-select
class="input-width"
v-model="formData.order_status"
clearable
:placeholder="t('orderStatusPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in order_statusList" v-for="(item, index) in order_statusList"
@ -26,7 +49,12 @@
</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-select class="input-width" v-model="formData.payment_type" clearable :placeholder="t('paymentTypePlaceholder')"> <el-select
class="input-width"
v-model="formData.payment_type"
clearable
:placeholder="t('paymentTypePlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in payment_typeList" v-for="(item, index) in payment_typeList"
@ -38,11 +66,21 @@
</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 v-model="formData.order_amount" clearable :placeholder="t('orderAmountPlaceholder')" class="input-width" /> <el-input
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-select class="input-width" v-model="formData.course_id" clearable :placeholder="t('courseIdPlaceholder')"> <el-select
class="input-width"
v-model="formData.course_id"
clearable
:placeholder="t('courseIdPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in courseIdList" v-for="(item, index) in courseIdList"
@ -54,7 +92,12 @@
</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-select class="input-width" v-model="formData.class_id" clearable :placeholder="t('classIdPlaceholder')"> <el-select
class="input-width"
v-model="formData.class_id"
clearable
:placeholder="t('classIdPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in classIdList" v-for="(item, index) in classIdList"
@ -64,15 +107,17 @@
/> />
</el-select> </el-select>
</el-form-item> </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 type="primary" :loading="loading" @click="confirm(formRef)">{{ <el-button
t('confirm') type="primary"
}}</el-button> :loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -83,7 +128,15 @@ 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 { addOrderTable, editOrderTable, getOrderTableInfo, getWithCustomerResourcesList, getWithCourseList, getWithClassGradeList, getWithPersonnelList } from '@/app/api/order_table' import {
addOrderTable,
editOrderTable,
getOrderTableInfo,
getWithCustomerResourcesList,
getWithCourseList,
getWithClassGradeList,
getWithPersonnelList,
} from '@/app/api/order_table'
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -109,34 +162,22 @@ const formRules = computed(() => {
return { return {
resource_id: [ resource_id: [
{ required: true, message: t('resourceIdPlaceholder'), 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' },
],
]
,
} }
}) })
@ -156,11 +197,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData let data = formData
save(data).then(res => { save(data)
.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
}) })
} }
@ -168,40 +211,53 @@ const confirm = async (formEl: FormInstance | undefined) => {
} }
// //
let order_statusList = ref([]) let order_statusList = ref([])
const order_statusDictList = async () => { const order_statusDictList = async () => {
order_statusList.value = await (await useDictionary('order_status')).data.dictionary order_statusList.value = await (
await useDictionary('order_status')
).data.dictionary
}
order_statusDictList()
watch(
() => order_statusList.value,
() => {
formData.order_status = order_statusList.value[0].value
} }
order_statusDictList(); )
watch(() => order_statusList.value, () => { formData.order_status = order_statusList.value[0].value }) let payment_typeList = ref([])
let payment_typeList = ref([]) const payment_typeDictList = async () => {
const payment_typeDictList = async () => { payment_typeList.value = await (
payment_typeList.value = await (await useDictionary('payment_type')).data.dictionary await useDictionary('payment_type')
).data.dictionary
}
payment_typeDictList()
watch(
() => payment_typeList.value,
() => {
formData.payment_type = payment_typeList.value[0].value
} }
payment_typeDictList(); )
watch(() => payment_typeList.value, () => { formData.payment_type = payment_typeList.value[0].value })
const resourceIdList = ref([] as any[]) const resourceIdList = ref([] as any[])
const setResourceIdList = async () => { const setResourceIdList = async () => {
resourceIdList.value = await (await getWithCustomerResourcesList({})).data resourceIdList.value = await (await getWithCustomerResourcesList({})).data
} }
setResourceIdList() setResourceIdList()
const courseIdList = ref([] as any[]) const courseIdList = ref([] as any[])
const setCourseIdList = async () => { const setCourseIdList = async () => {
courseIdList.value = await (await getWithCourseList({})).data courseIdList.value = await (await getWithCourseList({})).data
} }
setCourseIdList() setCourseIdList()
const classIdList = ref([] as any[]) const classIdList = ref([] as any[])
const setClassIdList = async () => { const setClassIdList = async () => {
classIdList.value = await (await getWithClassGradeList({})).data classIdList.value = await (await getWithClassGradeList({})).data
} }
setClassIdList() setClassIdList()
const staffIdList = ref([] as any[]) const staffIdList = ref([] as any[])
const setStaffIdList = async () => { const setStaffIdList = async () => {
staffIdList.value = await (await getWithPersonnelList({})).data staffIdList.value = await (await getWithPersonnelList({})).data
} }
setStaffIdList() setStaffIdList()
const setFormData = async (row: any = null) => { const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
Object.assign(formData, row) Object.assign(formData, row)
@ -228,7 +284,12 @@ 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 (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)) { if (
value &&
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
value
)
) {
callback(new Error(t('generateIdCard'))) callback(new Error(t('generateIdCard')))
} else { } else {
callback() callback()
@ -255,13 +316,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>

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

@ -1,19 +1,29 @@
<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 class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card
<el-form :inline="true" :model="orderTableTable.searchParam" ref="searchFormRef"> class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="orderTableTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('orderStatus')" prop="order_status"> <el-form-item :label="t('orderStatus')" prop="order_status">
<el-select class="w-[280px]" v-model="orderTableTable.searchParam.order_status" clearable :placeholder="t('orderStatusPlaceholder')"> <el-select
class="w-[280px]"
v-model="orderTableTable.searchParam.order_status"
clearable
:placeholder="t('orderStatusPlaceholder')"
>
<el-option label="全部" value=""></el-option> <el-option label="全部" value=""></el-option>
<el-option <el-option
v-for="(item, index) in order_statusList" v-for="(item, index) in order_statusList"
@ -24,9 +34,13 @@
</el-select> </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-select class="w-[280px]" v-model="orderTableTable.searchParam.payment_type" clearable :placeholder="t('paymentTypePlaceholder')"> <el-select
class="w-[280px]"
v-model="orderTableTable.searchParam.payment_type"
clearable
:placeholder="t('paymentTypePlaceholder')"
>
<el-option label="全部" value=""></el-option> <el-option label="全部" value=""></el-option>
<el-option <el-option
v-for="(item, index) in payment_typeList" v-for="(item, index) in payment_typeList"
@ -38,20 +52,38 @@
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadOrderTableList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadOrderTableList()">{{
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> t('search')
}}</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 :data="orderTableTable.data" size="large" v-loading="orderTableTable.loading"> <el-table
: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 prop="resource_id_name" :label="t('resourceId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="resource_id_name"
:label="t('resourceId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column :label="t('orderStatus')" min-width="180" align="center" :show-overflow-tooltip="true"> <el-table-column
:label="t('orderStatus')"
min-width="180"
align="center"
:show-overflow-tooltip="true"
>
<template #default="{ row }"> <template #default="{ row }">
<div v-for="(item, index) in order_statusList"> <div v-for="(item, index) in order_statusList">
<div v-if="item.value == row.order_status">{{ item.name }}</div> <div v-if="item.value == row.order_status">{{ item.name }}</div>
@ -59,7 +91,12 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="t('paymentType')" min-width="180" align="center" :show-overflow-tooltip="true"> <el-table-column
:label="t('paymentType')"
min-width="180"
align="center"
:show-overflow-tooltip="true"
>
<template #default="{ row }"> <template #default="{ row }">
<div v-for="(item, index) in payment_typeList"> <div v-for="(item, index) in payment_typeList">
<div v-if="item.value == row.payment_type">{{ item.name }}</div> <div v-if="item.value == row.payment_type">{{ item.name }}</div>
@ -67,28 +104,65 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="order_amount" :label="t('orderAmount')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="order_amount"
:label="t('orderAmount')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="course_id_name" :label="t('courseId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="course_id_name"
:label="t('courseId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="class_id_name" :label="t('classId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="class_id_name"
:label="t('classId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="staff_id_name" :label="t('staffId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="staff_id_name"
:label="t('staffId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="payment_time" :label="t('paymentTime')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="payment_time"
:label="t('paymentTime')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column :label="t('operation')" fixed="right" min-width="120"> <el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button> <el-button type="primary" link @click="editEvent(row)">{{
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button> 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> </el-table>
<div class="mt-[16px] flex justify-end"> <div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="orderTableTable.page" v-model:page-size="orderTableTable.limit" <el-pagination
layout="total, sizes, prev, pager, next, jumper" :total="orderTableTable.total" v-model:current-page="orderTableTable.page"
@size-change="loadOrderTableList()" @current-change="loadOrderTableList" /> v-model:page-size="orderTableTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="orderTableTable.total"
@size-change="loadOrderTableList()"
@current-change="loadOrderTableList"
/>
</div> </div>
</div> </div>
@ -101,13 +175,20 @@
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, getWithCustomerResourcesList, getWithCourseList, getWithClassGradeList, getWithPersonnelList } 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,
@ -115,10 +196,10 @@ let orderTableTable = reactive({
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam:{ searchParam: {
"order_status":"", order_status: '',
"payment_type":"" payment_type: '',
} },
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -127,16 +208,20 @@ const searchFormRef = ref<FormInstance>()
const selectData = ref<any[]>([]) const selectData = ref<any[]>([])
// //
const order_statusList = ref([] as any[]) const order_statusList = ref([] as any[])
const order_statusDictList = async () => { const order_statusDictList = async () => {
order_statusList.value = await (await useDictionary('order_status')).data.dictionary order_statusList.value = await (
} await useDictionary('order_status')
order_statusDictList(); ).data.dictionary
const payment_typeList = ref([] as any[]) }
const payment_typeDictList = async () => { order_statusDictList()
payment_typeList.value = await (await useDictionary('payment_type')).data.dictionary const payment_typeList = ref([] as any[])
} const payment_typeDictList = async () => {
payment_typeDictList(); payment_typeList.value = await (
await useDictionary('payment_type')
).data.dictionary
}
payment_typeDictList()
/** /**
* 获取订单列表 * 获取订单列表
@ -148,12 +233,14 @@ 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
}) })
} }
@ -182,41 +269,39 @@ 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(() => {
).then(() => { deleteOrderTable(id)
deleteOrderTable(id).then(() => { .then(() => {
loadOrderTableList() loadOrderTableList()
}).catch(() => {
}) })
.catch(() => {})
}) })
} }
const resourceIdList = ref([])
const resourceIdList = ref([]) const setResourceIdList = async () => {
const setResourceIdList = async () => {
resourceIdList.value = await (await getWithCustomerResourcesList({})).data resourceIdList.value = await (await getWithCustomerResourcesList({})).data
} }
setResourceIdList() setResourceIdList()
const courseIdList = ref([]) const courseIdList = ref([])
const setCourseIdList = async () => { const setCourseIdList = async () => {
courseIdList.value = await (await getWithCourseList({})).data courseIdList.value = await (await getWithCourseList({})).data
} }
setCourseIdList() setCourseIdList()
const classIdList = ref([]) const classIdList = ref([])
const setClassIdList = async () => { const setClassIdList = async () => {
classIdList.value = await (await getWithClassGradeList({})).data classIdList.value = await (await getWithClassGradeList({})).data
} }
setClassIdList() setClassIdList()
const staffIdList = ref([]) const staffIdList = ref([])
const setStaffIdList = async () => { const setStaffIdList = async () => {
staffIdList.value = await (await getWithPersonnelList({})).data staffIdList.value = await (await getWithPersonnelList({})).data
} }
setStaffIdList() setStaffIdList()
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
@ -234,5 +319,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>

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

@ -1,8 +1,26 @@
<template> <template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updatePhysicalTest') : t('addPhysicalTest')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true"> <el-dialog
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading"> v-model="showDialog"
: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-select class="input-width" v-model="formData.resource_id" clearable :placeholder="t('resourceIdPlaceholder')"> <el-select
class="input-width"
v-model="formData.resource_id"
clearable
:placeholder="t('resourceIdPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in resourceIdList" v-for="(item, index) in resourceIdList"
@ -14,7 +32,12 @@
</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-select class="input-width" v-model="formData.student_id" clearable :placeholder="t('studentIdPlaceholder')"> <el-select
class="input-width"
v-model="formData.student_id"
clearable
:placeholder="t('studentIdPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in studentIdList" v-for="(item, index) in studentIdList"
@ -26,15 +49,30 @@
</el-form-item> </el-form-item>
<el-form-item :label="t('height')" prop="height"> <el-form-item :label="t('height')" prop="height">
<el-input v-model="formData.height" clearable :placeholder="t('heightPlaceholder')" class="input-width" /> <el-input
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 v-model="formData.weight" clearable :placeholder="t('weightPlaceholder')" class="input-width" /> <el-input
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-select class="input-width" v-model="formData.coach_id" clearable :placeholder="t('coachIdPlaceholder')"> <el-select
class="input-width"
v-model="formData.coach_id"
clearable
:placeholder="t('coachIdPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in coachIdList" v-for="(item, index) in coachIdList"
@ -45,54 +83,106 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('seatedForwardBend')" > <el-form-item :label="t('seatedForwardBend')">
<el-input v-model="formData.seated_forward_bend" clearable :placeholder="t('seatedForwardBendPlaceholder')" class="input-width" /> <el-input
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 v-model="formData.sit_ups" clearable :placeholder="t('sitUpsPlaceholder')" class="input-width" /> <el-input
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 v-model="formData.push_ups" clearable :placeholder="t('pushUpsPlaceholder')" class="input-width" /> <el-input
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 v-model="formData.flamingo_balance" clearable :placeholder="t('flamingoBalancePlaceholder')" class="input-width" /> <el-input
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 v-model="formData.thirty_sec_jump" clearable :placeholder="t('thirtySecJumpPlaceholder')" class="input-width" /> <el-input
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 v-model="formData.standing_long_jump" clearable :placeholder="t('standingLongJumpPlaceholder')" class="input-width" /> <el-input
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 v-model="formData.agility_run" clearable :placeholder="t('agilityRunPlaceholder')" class="input-width" /> <el-input
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 v-model="formData.balance_beam" clearable :placeholder="t('balanceBeamPlaceholder')" class="input-width" /> <el-input
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 v-model="formData.tennis_throw" clearable :placeholder="t('tennisThrowPlaceholder')" class="input-width" /> <el-input
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 v-model="formData.ten_meter_shuttle_run" clearable :placeholder="t('tenMeterShuttleRunPlaceholder')" class="input-width" /> <el-input
v-model="formData.ten_meter_shuttle_run"
clearable
:placeholder="t('tenMeterShuttleRunPlaceholder')"
class="input-width"
/>
</el-form-item> </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 type="primary" :loading="loading" @click="confirm(formRef)">{{ <el-button
t('confirm') type="primary"
}}</el-button> :loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -103,7 +193,14 @@ 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 { addPhysicalTest, editPhysicalTest, getPhysicalTestInfo, getWithCustomerResourcesList, getWithStudentList, getWithPersonnelList } from '@/app/api/physical_test' import {
addPhysicalTest,
editPhysicalTest,
getPhysicalTestInfo,
getWithCustomerResourcesList,
getWithStudentList,
getWithPersonnelList,
} from '@/app/api/physical_test'
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -138,79 +235,69 @@ 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' },
],
]
,
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',
},
],
} }
}) })
@ -230,11 +317,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData let data = formData
save(data).then(res => { save(data)
.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
}) })
} }
@ -243,23 +332,21 @@ const confirm = async (formEl: FormInstance | undefined) => {
// //
const resourceIdList = ref([] as any[])
const setResourceIdList = async () => {
const resourceIdList = ref([] as any[])
const setResourceIdList = async () => {
resourceIdList.value = await (await getWithCustomerResourcesList({})).data resourceIdList.value = await (await getWithCustomerResourcesList({})).data
} }
setResourceIdList() setResourceIdList()
const studentIdList = ref([] as any[]) const studentIdList = ref([] as any[])
const setStudentIdList = async () => { const setStudentIdList = async () => {
studentIdList.value = await (await getWithStudentList({})).data studentIdList.value = await (await getWithStudentList({})).data
} }
setStudentIdList() setStudentIdList()
const coachIdList = ref([] as any[]) const coachIdList = ref([] as any[])
const setCoachIdList = async () => { const setCoachIdList = async () => {
coachIdList.value = await (await getWithPersonnelList({})).data coachIdList.value = await (await getWithPersonnelList({})).data
} }
setCoachIdList() 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
@ -285,7 +372,12 @@ 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 (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)) { if (
value &&
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
value
)
) {
callback(new Error(t('generateIdCard'))) callback(new Error(t('generateIdCard')))
} else { } else {
callback() callback()
@ -312,13 +404,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>

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

@ -1,19 +1,29 @@
<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 class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card
<el-form :inline="true" :model="physicalTestTable.searchParam" ref="searchFormRef"> 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-form-item :label="t('resourceId')" prop="resource_id">
<el-select class="w-[280px]" v-model="physicalTestTable.searchParam.resource_id" clearable :placeholder="t('resourceIdPlaceholder')"> <el-select
class="w-[280px]"
v-model="physicalTestTable.searchParam.resource_id"
clearable
:placeholder="t('resourceIdPlaceholder')"
>
<el-option <el-option
v-for="(item, index) in resourceIdList" v-for="(item, index) in resourceIdList"
:key="index" :key="index"
@ -23,9 +33,13 @@
</el-select> </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-select class="w-[280px]" v-model="physicalTestTable.searchParam.student_id" clearable :placeholder="t('studentIdPlaceholder')"> <el-select
class="w-[280px]"
v-model="physicalTestTable.searchParam.student_id"
clearable
:placeholder="t('studentIdPlaceholder')"
>
<el-option <el-option
v-for="(item, index) in studentIdList" v-for="(item, index) in studentIdList"
:key="index" :key="index"
@ -36,39 +50,84 @@
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadPhysicalTestList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadPhysicalTestList()">{{
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> t('search')
}}</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 :data="physicalTestTable.data" size="large" v-loading="physicalTestTable.loading"> <el-table
: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 prop="resource_id_name" :label="t('resourceId')" min-width="120" :show-overflow-tooltip="true"/> <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="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="height"
:label="t('height')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="weight" :label="t('weight')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="weight"
:label="t('weight')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="coach_id_name" :label="t('coachId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="coach_id_name"
:label="t('coachId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column :label="t('operation')" fixed="right" min-width="120"> <el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button> <el-button type="primary" link @click="editEvent(row)">{{
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button> 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> </el-table>
<div class="mt-[16px] flex justify-end"> <div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="physicalTestTable.page" v-model:page-size="physicalTestTable.limit" <el-pagination
layout="total, sizes, prev, pager, next, jumper" :total="physicalTestTable.total" v-model:current-page="physicalTestTable.page"
@size-change="loadPhysicalTestList()" @current-change="loadPhysicalTestList" /> v-model:page-size="physicalTestTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="physicalTestTable.total"
@size-change="loadPhysicalTestList()"
@current-change="loadPhysicalTestList"
/>
</div> </div>
</div> </div>
@ -81,13 +140,19 @@
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 { getPhysicalTestList, deletePhysicalTest, getWithCustomerResourcesList, getWithStudentList, getWithPersonnelList } from '@/app/api/physical_test' import {
getPhysicalTestList,
deletePhysicalTest,
getWithCustomerResourcesList,
getWithStudentList,
getWithPersonnelList,
} 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 Edit from '@/app/views/physical_test/components/physical-test-edit.vue' 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,
@ -95,10 +160,10 @@ let physicalTestTable = reactive({
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam:{ searchParam: {
"resource_id":"", resource_id: '',
"student_id":"" student_id: '',
} },
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -108,7 +173,6 @@ const selectData = ref<any[]>([])
// //
/** /**
* 获取体测列表 * 获取体测列表
*/ */
@ -119,12 +183,14 @@ 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
}) })
} }
@ -153,36 +219,34 @@ const editEvent = (data: any) => {
* 删除体测 * 删除体测
*/ */
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(() => {
).then(() => { deletePhysicalTest(id)
deletePhysicalTest(id).then(() => { .then(() => {
loadPhysicalTestList() loadPhysicalTestList()
}).catch(() => {
}) })
.catch(() => {})
}) })
} }
const resourceIdList = ref([])
const resourceIdList = ref([]) const setResourceIdList = async () => {
const setResourceIdList = async () => {
resourceIdList.value = await (await getWithCustomerResourcesList({})).data resourceIdList.value = await (await getWithCustomerResourcesList({})).data
} }
setResourceIdList() setResourceIdList()
const studentIdList = ref([]) const studentIdList = ref([])
const setStudentIdList = async () => { const setStudentIdList = async () => {
studentIdList.value = await (await getWithStudentList({})).data studentIdList.value = await (await getWithStudentList({})).data
} }
setStudentIdList() setStudentIdList()
const coachIdList = ref([]) const coachIdList = ref([])
const setCoachIdList = async () => { const setCoachIdList = async () => {
coachIdList.value = await (await getWithPersonnelList({})).data coachIdList.value = await (await getWithPersonnelList({})).data
} }
setCoachIdList() setCoachIdList()
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
@ -200,5 +264,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>

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

@ -3,15 +3,26 @@
<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 :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form"> <el-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-select class="input-width" v-model="formData.resource_id" clearable :placeholder="t('resourceIdPlaceholder')"> <el-select
class="input-width"
v-model="formData.resource_id"
clearable
:placeholder="t('resourceIdPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in resourceIdList" v-for="(item, index) in resourceIdList"
@ -23,7 +34,12 @@
</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-select class="input-width" v-model="formData.student_id" clearable :placeholder="t('studentIdPlaceholder')"> <el-select
class="input-width"
v-model="formData.student_id"
clearable
:placeholder="t('studentIdPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in studentIdList" v-for="(item, index) in studentIdList"
@ -35,15 +51,30 @@
</el-form-item> </el-form-item>
<el-form-item :label="t('height')" prop="height"> <el-form-item :label="t('height')" prop="height">
<el-input v-model="formData.height" clearable :placeholder="t('heightPlaceholder')" class="input-width" /> <el-input
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 v-model="formData.weight" clearable :placeholder="t('weightPlaceholder')" class="input-width" /> <el-input
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-select class="input-width" v-model="formData.coach_id" clearable :placeholder="t('coachIdPlaceholder')"> <el-select
class="input-width"
v-model="formData.coach_id"
clearable
:placeholder="t('coachIdPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in coachIdList" v-for="(item, index) in coachIdList"
@ -54,59 +85,120 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('createdAt')" > <el-form-item :label="t('createdAt')">
<el-input v-model="formData.created_at" clearable :placeholder="t('createdAtPlaceholder')" class="input-width" /> <el-input
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 v-model="formData.updated_at" clearable :placeholder="t('updatedAtPlaceholder')" class="input-width" /> <el-input
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 v-model="formData.seated_forward_bend" clearable :placeholder="t('seatedForwardBendPlaceholder')" class="input-width" /> <el-input
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 v-model="formData.sit_ups" clearable :placeholder="t('sitUpsPlaceholder')" class="input-width" /> <el-input
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 v-model="formData.push_ups" clearable :placeholder="t('pushUpsPlaceholder')" class="input-width" /> <el-input
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 v-model="formData.flamingo_balance" clearable :placeholder="t('flamingoBalancePlaceholder')" class="input-width" /> <el-input
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 v-model="formData.thirty_sec_jump" clearable :placeholder="t('thirtySecJumpPlaceholder')" class="input-width" /> <el-input
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 v-model="formData.standing_long_jump" clearable :placeholder="t('standingLongJumpPlaceholder')" class="input-width" /> <el-input
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 v-model="formData.agility_run" clearable :placeholder="t('agilityRunPlaceholder')" class="input-width" /> <el-input
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 v-model="formData.balance_beam" clearable :placeholder="t('balanceBeamPlaceholder')" class="input-width" /> <el-input
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 v-model="formData.tennis_throw" clearable :placeholder="t('tennisThrowPlaceholder')" class="input-width" /> <el-input
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 v-model="formData.ten_meter_shuttle_run" clearable :placeholder="t('tenMeterShuttleRunPlaceholder')" class="input-width" /> <el-input
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)">{{ t('save') }}</el-button> <el-button type="primary" @click="onSave(formRef)">{{
t('save')
}}</el-button>
<el-button @click="back()">{{ t('cancel') }}</el-button> <el-button @click="back()">{{ t('cancel') }}</el-button>
</div> </div>
</div> </div>
@ -118,16 +210,21 @@ 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 { getPhysicalTestInfo,addPhysicalTest,editPhysicalTest, getWithCustomerResourcesList, getWithStudentList, getWithPersonnelList } from '@/app/api/physical_test'; import {
getPhysicalTestInfo,
addPhysicalTest,
editPhysicalTest,
getWithCustomerResourcesList,
getWithStudentList,
getWithPersonnelList,
} 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
/** /**
* 表单数据 * 表单数据
*/ */
@ -153,14 +250,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>()
// //
@ -168,111 +265,95 @@ const selectData = ref<any[]>([])
// //
const resourceIdList = ref([] as any[])
const setResourceIdList = async () => {
const resourceIdList = ref([] as any[])
const setResourceIdList = async () => {
resourceIdList.value = await (await getWithCustomerResourcesList({})).data resourceIdList.value = await (await getWithCustomerResourcesList({})).data
} }
setResourceIdList() setResourceIdList()
const studentIdList = ref([] as any[]) const studentIdList = ref([] as any[])
const setStudentIdList = async () => { const setStudentIdList = async () => {
studentIdList.value = await (await getWithStudentList({})).data studentIdList.value = await (await getWithStudentList({})).data
} }
setStudentIdList() setStudentIdList()
const coachIdList = ref([] as any[]) const coachIdList = ref([] as any[])
const setCoachIdList = async () => { const setCoachIdList = async () => {
coachIdList.value = await (await getWithPersonnelList({})).data coachIdList.value = await (await getWithPersonnelList({})).data
} }
setCoachIdList() 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',
},
],
} }
}) })
@ -284,13 +365,14 @@ const onSave = async (formEl: FormInstance | undefined) => {
let data = formData let data = formData
const save = id ? editPhysicalTest : addPhysicalTest const save = id ? editPhysicalTest : addPhysicalTest
save(data).then(res => { save(data)
.then((res) => {
loading.value = false loading.value = false
history.back() history.back()
}).catch(err => { })
.catch((err) => {
loading.value = false loading.value = false
}) })
} }
}) })
} }
@ -306,7 +388,12 @@ 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 (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)) { if (
value &&
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
value
)
) {
callback(new Error(t('generateIdCard'))) callback(new Error(t('generateIdCard')))
} else { } else {
callback() callback()
@ -322,7 +409,6 @@ 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)) {

123
admin/src/app/views/setting/pay.vue

@ -1,44 +1,89 @@
<template> <template>
<!--支付设置--> <!--支付设置-->
<div class="main-container" v-loading="payLoading"> <div class="main-container" v-loading="payLoading">
<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" v-if="!payLoading"> <div class="flex justify-between items-center" v-if="!payLoading">
<span class="text-page-title">{{ pageName }}</span> <span class="text-page-title">{{ pageName }}</span>
<el-button type="primary" @click="isEdit = true" ref="setConfigBtn">{{ t('setConfig') }}</el-button> <el-button type="primary" @click="isEdit = true" ref="setConfigBtn">{{
t('setConfig')
}}</el-button>
</div> </div>
</el-card> </el-card>
<el-card class="box-card mt-[15px] !border-none" shadow="never" v-for="(payItems, payKey) in payConfigData" :key="payKey"> <el-card
class="box-card mt-[15px] !border-none"
shadow="never"
v-for="(payItems, payKey) in payConfigData"
:key="payKey"
>
<h3 class="panel-title !text-sm">{{ payItems.name }}</h3> <h3 class="panel-title !text-sm">{{ payItems.name }}</h3>
<div> <div>
<div class="flex items-center justify-between p-[10px] table-item-border bg"> <div
class="flex items-center justify-between p-[10px] table-item-border bg"
>
<span class="text-base w-[230px]">{{ t('payType') }}</span> <span class="text-base w-[230px]">{{ t('payType') }}</span>
<span class="text-base w-[110px] text-center">{{ t('onState') }}</span> <span class="text-base w-[110px] text-center">{{
<span class="text-base w-[80px] text-center" v-if="isEdit">{{ t('templateName') }}</span> t('onState')
}}</span>
<span class="text-base w-[80px] text-center" v-if="isEdit">{{
t('templateName')
}}</span>
</div> </div>
<div ref="fieldBoxRefs" :data-key="payKey"> <div ref="fieldBoxRefs" :data-key="payKey">
<div class="flex items-center justify-between p-[10px] table-item-border" v-for="(childrenItem, childrenIndex) in payItems.pay_type" :key="childrenItem.redio_key" :id="payKey + '_' + childrenIndex"> <div
class="flex items-center justify-between p-[10px] table-item-border"
v-for="(childrenItem, childrenIndex) in payItems.pay_type"
:key="childrenItem.redio_key"
:id="payKey + '_' + childrenIndex"
>
<div class="flex w-[230px] flex-shrink-0"> <div class="flex w-[230px] flex-shrink-0">
<span v-if="isEdit" class="iconfont icontuodong mr-2 handle cursor-pointer"></span> <span
v-if="isEdit"
class="iconfont icontuodong mr-2 handle cursor-pointer"
></span>
<div class="flex items-center select-none"> <div class="flex items-center select-none">
<div class="mr-[15px] w-[30px] h-[30px] flex-shrink-0"> <div class="mr-[15px] w-[30px] h-[30px] flex-shrink-0">
<img class="w-[30px]" :src="img(childrenItem.icon)" /> <img class="w-[30px]" :src="img(childrenItem.icon)" />
</div> </div>
<span class="text-base text-[#666]">{{ childrenItem.name }}</span> <span class="text-base text-[#666]">{{
childrenItem.name
}}</span>
</div> </div>
</div> </div>
<div class="flex items-center justify-center w-[110px] select-none"> <div class="flex items-center justify-center w-[110px] select-none">
<el-switch v-if="isEdit" v-model="childrenItem.status" :active-value="1" :inactive-value="0" :active-text="t('isEnable')" @change="enablePaymentMode(childrenItem)" /> <el-switch
v-if="isEdit"
v-model="childrenItem.status"
:active-value="1"
:inactive-value="0"
:active-text="t('isEnable')"
@change="enablePaymentMode(childrenItem)"
/>
<div v-else> <div v-else>
<el-tag v-if="childrenItem.status" class="ml-2" type="success">{{ t('open') }}</el-tag> <el-tag
<el-tag v-else class="ml-2" type="info">{{ t('notOpen') }}</el-tag> v-if="childrenItem.status"
class="ml-2"
type="success"
>{{ t('open') }}</el-tag
>
<el-tag v-else class="ml-2" type="info">{{
t('notOpen')
}}</el-tag>
</div> </div>
</div> </div>
<div class="flex items-center justify-center w-[80px] select-none" v-if="isEdit"> <div
<button class="text-base" @click="configPayFn(childrenItem)" v-if="childrenItem.setting_component">{{ t('clickConfigure') }}</button> class="flex items-center justify-center w-[80px] select-none"
v-if="isEdit"
>
<button
class="text-base"
@click="configPayFn(childrenItem)"
v-if="childrenItem.setting_component"
>
{{ t('clickConfigure') }}
</button>
<button v-else>--</button> <button v-else>--</button>
</div> </div>
</div> </div>
@ -48,15 +93,23 @@
<div class="fixed-footer-wrap" v-if="isEdit"> <div class="fixed-footer-wrap" v-if="isEdit">
<div class="fixed-footer"> <div class="fixed-footer">
<el-button type="primary" :loading="loading" @click="cancelFn">{{ t('cancel') }}</el-button> <el-button type="primary" :loading="loading" @click="cancelFn">{{
<el-button type="primary" :loading="loading" @click="saveFn(formRef)">{{ t('save') }}</el-button> t('cancel')
}}</el-button>
<el-button type="primary" :loading="loading" @click="saveFn(formRef)">{{
t('save')
}}</el-button>
</div> </div>
</div> </div>
<template v-for="(item, index) in payTypeList"> <template v-for="(item, index) in payTypeList">
<component :is="item.setting_component" :ref="(el) => setPayTypeRefs(el, item.key)" v-if="item.setting_component" @complete="setConfigInfo"/> <component
:is="item.setting_component"
:ref="(el) => setPayTypeRefs(el, item.key)"
v-if="item.setting_component"
@complete="setConfigInfo"
/>
</template> </template>
</div> </div>
</template> </template>
@ -80,13 +133,16 @@ const modules: any = import.meta.glob('@/**/*.vue')
getAllPayType().then(({ data }) => { getAllPayType().then(({ data }) => {
Object.keys(data).forEach((key: string) => { Object.keys(data).forEach((key: string) => {
data[key].setting_component && (data[key].setting_component = defineAsyncComponent(modules[data[key].setting_component])) data[key].setting_component &&
(data[key].setting_component = defineAsyncComponent(
modules[data[key].setting_component]
))
}) })
payTypeList.value = data payTypeList.value = data
}) })
const setPayTypeRefs = (el: any, index: string) => { const setPayTypeRefs = (el: any, index: string) => {
payTypeRefs.value[index] = (el) payTypeRefs.value[index] = el
} }
const payLoading = ref(true) const payLoading = ref(true)
@ -97,7 +153,7 @@ const setConfigBtn = ref()
// //
const payConfigData = ref([]) const payConfigData = ref([])
const checkPayConfigList = () => { const checkPayConfigList = () => {
getPayConfigList().then(res => { getPayConfigList().then((res) => {
const payData = res.data const payData = res.data
for (const i in payData) { for (const i in payData) {
const payType = payData[i].pay_type const payType = payData[i].pay_type
@ -128,8 +184,8 @@ const checkPayConfigList = () => {
checkPayConfigList() checkPayConfigList()
// //
const setConfigInfo = (data:any) => { const setConfigInfo = (data: any) => {
payConfigData.value[data.channel].pay_type.forEach(element => { payConfigData.value[data.channel].pay_type.forEach((element) => {
if (element.key == data.type) { if (element.key == data.type) {
element.config = data.config element.config = data.config
} }
@ -138,14 +194,17 @@ const setConfigInfo = (data:any) => {
} }
// //
const configPayFn = (data:any) => { const configPayFn = (data: any) => {
payTypeRefs.value[data.key].setFormData(data) payTypeRefs.value[data.key].setFormData(data)
payTypeRefs.value[data.key].showDialog = true payTypeRefs.value[data.key].showDialog = true
} }
// //
const enablePaymentMode = async (data: any) => { const enablePaymentMode = async (data: any) => {
if (payTypeRefs.value[data.key] && typeof payTypeRefs.value[data.key].enableVerify == 'function') { if (
payTypeRefs.value[data.key] &&
typeof payTypeRefs.value[data.key].enableVerify == 'function'
) {
payTypeRefs.value[data.key].setFormData(data) payTypeRefs.value[data.key].setFormData(data)
const verify = payTypeRefs.value[data.key].enableVerify() const verify = payTypeRefs.value[data.key].enableVerify()
@ -166,7 +225,7 @@ const fieldBoxRefs = ref<any>([])
watch(isEdit, (newValue, oldValue) => { watch(isEdit, (newValue, oldValue) => {
if (newValue) { if (newValue) {
nextTick(() => { nextTick(() => {
fieldBoxRefs.value.forEach((item:any, index:any) => { fieldBoxRefs.value.forEach((item: any, index: any) => {
sortableFn(item, index) sortableFn(item, index)
}) })
}) })
@ -177,7 +236,7 @@ watch(isEdit, (newValue, oldValue) => {
const sortableFn = (item, index) => { const sortableFn = (item, index) => {
const sortable = Sortable.create(item, { const sortable = Sortable.create(item, {
group: { group: {
put: false // put: false, //
}, },
handle: '.handle', handle: '.handle',
animation: 200, animation: 200,
@ -186,7 +245,7 @@ const sortableFn = (item, index) => {
const key = evt.target.getAttribute('data-key') const key = evt.target.getAttribute('data-key')
const data = payConfigData.value[key].pay_type const data = payConfigData.value[key].pay_type
data.splice(evt.newIndex, 0, ...data.splice(evt.oldIndex, 1)) data.splice(evt.newIndex, 0, ...data.splice(evt.oldIndex, 1))
} },
}) })
} }
@ -195,12 +254,12 @@ const saveFn = () => {
payLoading.value = true payLoading.value = true
const data = cloneDeep(payConfigData.value) const data = cloneDeep(payConfigData.value)
Object.values(data).forEach((item, index) => { Object.values(data).forEach((item, index) => {
item.pay_type.forEach((subItem:any, subIndex:any) => { item.pay_type.forEach((subItem: any, subIndex: any) => {
subItem.sort = subIndex subItem.sort = subIndex
}) })
}) })
setPatConfig({ config: data }).then(res => { setPatConfig({ config: data }).then((res) => {
checkPayConfigList() checkPayConfigList()
isEdit.value = false isEdit.value = false
payLoading.value = false payLoading.value = false
@ -214,7 +273,7 @@ const cancelFn = () => {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.table-item-border { .table-item-border {
@apply border-b border-[var(--el-border-color)]; @apply border-b border-[var(--el-border-color)];
} }
</style> </style>

140
admin/src/app/views/student_courses/components/student-courses-edit.vue

@ -1,8 +1,26 @@
<template> <template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateStudentCourses') : t('addStudentCourses')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true"> <el-dialog
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading"> v-model="showDialog"
:title="formData.id ? t('updateStudentCourses') : t('addStudentCourses')"
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('studentId')" prop="student_id"> <el-form-item :label="t('studentId')" prop="student_id">
<el-select class="input-width" v-model="formData.student_id" clearable :placeholder="t('studentIdPlaceholder')"> <el-select
class="input-width"
v-model="formData.student_id"
clearable
:placeholder="t('studentIdPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in studentIdList" v-for="(item, index) in studentIdList"
@ -14,7 +32,12 @@
</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-select class="input-width" v-model="formData.course_id" clearable :placeholder="t('courseIdPlaceholder')"> <el-select
class="input-width"
v-model="formData.course_id"
clearable
:placeholder="t('courseIdPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in courseIdList" v-for="(item, index) in courseIdList"
@ -26,21 +49,36 @@
</el-form-item> </el-form-item>
<el-form-item :label="t('totalHours')" prop="total_hours"> <el-form-item :label="t('totalHours')" prop="total_hours">
<el-input v-model="formData.total_hours" clearable :placeholder="t('totalHoursPlaceholder')" class="input-width" /> <el-input
v-model="formData.total_hours"
clearable
:placeholder="t('totalHoursPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('giftHours')" > <el-form-item :label="t('giftHours')">
<el-input v-model="formData.gift_hours" clearable :placeholder="t('giftHoursPlaceholder')" class="input-width" /> <el-input
v-model="formData.gift_hours"
clearable
:placeholder="t('giftHoursPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('startDate')" prop="start_date" class="input-width"> <el-form-item
:label="t('startDate')"
prop="start_date"
class="input-width"
>
<el-date-picker <el-date-picker
class="flex-1 !flex" class="flex-1 !flex"
v-model="formData.start_date" v-model="formData.start_date"
clearable clearable
type="datetime" type="datetime"
value-format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"
:placeholder="t('startDatePlaceholder')"> :placeholder="t('startDatePlaceholder')"
>
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
<el-form-item :label="t('endDate')" prop="end_date" class="input-width"> <el-form-item :label="t('endDate')" prop="end_date" class="input-width">
@ -50,7 +88,8 @@
clearable clearable
type="datetime" type="datetime"
value-format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"
:placeholder="t('endDatePlaceholder')"> :placeholder="t('endDatePlaceholder')"
>
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -58,9 +97,12 @@
<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 type="primary" :loading="loading" @click="confirm(formRef)">{{ <el-button
t('confirm') type="primary"
}}</el-button> :loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -71,7 +113,13 @@ 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 { addStudentCourses, editStudentCourses, getStudentCoursesInfo, getWithStudentList, getWithCourseList } from '@/app/api/student_courses' import {
addStudentCourses,
editStudentCourses,
getStudentCoursesInfo,
getWithStudentList,
getWithCourseList,
} from '@/app/api/student_courses'
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -97,34 +145,22 @@ const formRules = computed(() => {
return { return {
student_id: [ student_id: [
{ required: true, message: t('studentIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('studentIdPlaceholder'), trigger: 'blur' },
],
]
,
course_id: [ course_id: [
{ required: true, message: t('courseIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('courseIdPlaceholder'), trigger: 'blur' },
],
]
,
total_hours: [ total_hours: [
{ required: true, message: t('totalHoursPlaceholder'), trigger: 'blur' }, { required: true, message: t('totalHoursPlaceholder'), trigger: 'blur' },
],
]
,
gift_hours: [ gift_hours: [
{ required: true, message: t('giftHoursPlaceholder'), trigger: 'blur' }, { required: true, message: t('giftHoursPlaceholder'), trigger: 'blur' },
],
]
,
start_date: [ start_date: [
{ required: true, message: t('startDatePlaceholder'), trigger: 'blur' }, { required: true, message: t('startDatePlaceholder'), trigger: 'blur' },
],
]
,
end_date: [ end_date: [
{ required: true, message: t('endDatePlaceholder'), trigger: 'blur' }, { required: true, message: t('endDatePlaceholder'), trigger: 'blur' },
],
]
,
} }
}) })
@ -144,11 +180,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData let data = formData
save(data).then(res => { save(data)
.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
}) })
} }
@ -157,24 +195,23 @@ const confirm = async (formEl: FormInstance | undefined) => {
// //
const studentIdList = ref([] as any[])
const setStudentIdList = async () => {
const studentIdList = ref([] as any[])
const setStudentIdList = async () => {
studentIdList.value = await (await getWithStudentList({})).data studentIdList.value = await (await getWithStudentList({})).data
} }
setStudentIdList() setStudentIdList()
const courseIdList = ref([] as any[]) const courseIdList = ref([] as any[])
const setCourseIdList = async () => { const setCourseIdList = async () => {
courseIdList.value = await (await getWithCourseList({})).data courseIdList.value = await (await getWithCourseList({})).data
} }
setCourseIdList() setCourseIdList()
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){ if (row) {
const data = await (await getStudentCoursesInfo(row.id)).data const data = await (await getStudentCoursesInfo(row.id)).data
if (data) Object.keys(formData).forEach((key: string) => { if (data)
Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key] if (data[key] != undefined) formData[key] = data[key]
}) })
} }
@ -192,7 +229,12 @@ 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 (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)) { if (
value &&
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
value
)
) {
callback(new Error(t('generateIdCard'))) callback(new Error(t('generateIdCard')))
} else { } else {
callback() callback()
@ -219,13 +261,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>

174
admin/src/app/views/student_courses/student_courses.vue

@ -1,19 +1,29 @@
<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('addStudentCourses') }} {{ t('addStudentCourses') }}
</el-button> </el-button>
</div> </div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card
<el-form :inline="true" :model="studentCoursesTable.searchParam" ref="searchFormRef"> class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="studentCoursesTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('studentId')" prop="student_id"> <el-form-item :label="t('studentId')" prop="student_id">
<el-select class="w-[280px]" v-model="studentCoursesTable.searchParam.student_id" clearable :placeholder="t('studentIdPlaceholder')"> <el-select
class="w-[280px]"
v-model="studentCoursesTable.searchParam.student_id"
clearable
:placeholder="t('studentIdPlaceholder')"
>
<el-option <el-option
v-for="(item, index) in studentIdList" v-for="(item, index) in studentIdList"
:key="index" :key="index"
@ -23,9 +33,13 @@
</el-select> </el-select>
</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-select class="w-[280px]" v-model="studentCoursesTable.searchParam.course_id" clearable :placeholder="t('courseIdPlaceholder')"> <el-select
class="w-[280px]"
v-model="studentCoursesTable.searchParam.course_id"
clearable
:placeholder="t('courseIdPlaceholder')"
>
<el-option <el-option
v-for="(item, index) in courseIdList" v-for="(item, index) in courseIdList"
:key="index" :key="index"
@ -36,41 +50,93 @@
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadStudentCoursesList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadStudentCoursesList()">{{
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> t('search')
}}</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 :data="studentCoursesTable.data" size="large" v-loading="studentCoursesTable.loading"> <el-table
:data="studentCoursesTable.data"
size="large"
v-loading="studentCoursesTable.loading"
>
<template #empty> <template #empty>
<span>{{ !studentCoursesTable.loading ? t('emptyData') : '' }}</span> <span>{{
!studentCoursesTable.loading ? t('emptyData') : ''
}}</span>
</template> </template>
<el-table-column prop="student_id_name" :label="t('studentId')" 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="course_id_name" :label="t('courseId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="course_id_name"
:label="t('courseId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="total_hours" :label="t('totalHours')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="total_hours"
:label="t('totalHours')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="gift_hours" :label="t('giftHours')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="gift_hours"
:label="t('giftHours')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="start_date" :label="t('startDate')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="start_date"
:label="t('startDate')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="end_date" :label="t('endDate')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="end_date"
:label="t('endDate')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column :label="t('operation')" fixed="right" min-width="120"> <el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button> <el-button type="primary" link @click="editEvent(row)">{{
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button> 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> </el-table>
<div class="mt-[16px] flex justify-end"> <div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="studentCoursesTable.page" v-model:page-size="studentCoursesTable.limit" <el-pagination
layout="total, sizes, prev, pager, next, jumper" :total="studentCoursesTable.total" v-model:current-page="studentCoursesTable.page"
@size-change="loadStudentCoursesList()" @current-change="loadStudentCoursesList" /> v-model:page-size="studentCoursesTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="studentCoursesTable.total"
@size-change="loadStudentCoursesList()"
@current-change="loadStudentCoursesList"
/>
</div> </div>
</div> </div>
@ -83,13 +149,18 @@
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 { getStudentCoursesList, deleteStudentCourses, getWithStudentList, getWithCourseList } from '@/app/api/student_courses' import {
getStudentCoursesList,
deleteStudentCourses,
getWithStudentList,
getWithCourseList,
} from '@/app/api/student_courses'
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/student_courses/components/student-courses-edit.vue' import Edit from '@/app/views/student_courses/components/student-courses-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 studentCoursesTable = reactive({ let studentCoursesTable = reactive({
page: 1, page: 1,
@ -97,10 +168,10 @@ let studentCoursesTable = reactive({
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam:{ searchParam: {
"student_id":"", student_id: '',
"course_id":"" course_id: '',
} },
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -110,7 +181,6 @@ const selectData = ref<any[]>([])
// //
/** /**
* 获取学员课程列表 * 获取学员课程列表
*/ */
@ -121,12 +191,14 @@ const loadStudentCoursesList = (page: number = 1) => {
getStudentCoursesList({ getStudentCoursesList({
page: studentCoursesTable.page, page: studentCoursesTable.page,
limit: studentCoursesTable.limit, limit: studentCoursesTable.limit,
...studentCoursesTable.searchParam ...studentCoursesTable.searchParam,
}).then(res => { })
.then((res) => {
studentCoursesTable.loading = false studentCoursesTable.loading = false
studentCoursesTable.data = res.data.data studentCoursesTable.data = res.data.data
studentCoursesTable.total = res.data.total studentCoursesTable.total = res.data.total
}).catch(() => { })
.catch(() => {
studentCoursesTable.loading = false studentCoursesTable.loading = false
}) })
} }
@ -155,31 +227,29 @@ const editEvent = (data: any) => {
* 删除学员课程 * 删除学员课程
*/ */
const deleteEvent = (id: number) => { const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('studentCoursesDeleteTips'), t('warning'), ElMessageBox.confirm(t('studentCoursesDeleteTips'), t('warning'), {
{
confirmButtonText: t('confirm'), confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'), cancelButtonText: t('cancel'),
type: 'warning', type: 'warning',
} }).then(() => {
).then(() => { deleteStudentCourses(id)
deleteStudentCourses(id).then(() => { .then(() => {
loadStudentCoursesList() loadStudentCoursesList()
}).catch(() => {
}) })
.catch(() => {})
}) })
} }
const studentIdList = ref([])
const studentIdList = ref([]) const setStudentIdList = async () => {
const setStudentIdList = async () => {
studentIdList.value = await (await getWithStudentList({})).data studentIdList.value = await (await getWithStudentList({})).data
} }
setStudentIdList() setStudentIdList()
const courseIdList = ref([]) const courseIdList = ref([])
const setCourseIdList = async () => { const setCourseIdList = async () => {
courseIdList.value = await (await getWithCourseList({})).data courseIdList.value = await (await getWithCourseList({})).data
} }
setCourseIdList() setCourseIdList()
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
@ -197,5 +267,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>

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

@ -8,7 +8,6 @@
> >
<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">体测列表</span> <span class="text-lg">体测列表</span>
<el-button type="primary" @click="addEvent"> <el-button type="primary" @click="addEvent">
@ -16,7 +15,7 @@
</el-button> </el-button>
</div> </div>
<!-- <el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <!-- <el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="physicalTestTable.searchParam" ref="searchFormRef"> <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">
@ -45,6 +44,7 @@
<el-form-item :label="t('height')" prop="height"> <el-form-item :label="t('height')" prop="height">
<el-input v-model="physicalTestTable.searchParam.height" :placeholder="t('heightPlaceholder')" /> <el-input v-model="physicalTestTable.searchParam.height" :placeholder="t('heightPlaceholder')" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadPhysicalTestList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadPhysicalTestList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> <el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
@ -53,39 +53,79 @@
</el-card> --> </el-card> -->
<div class="mt-[10px]"> <div class="mt-[10px]">
<el-table :data="physicalTestTable.data" size="large" v-loading="physicalTestTable.loading"> <el-table
: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 prop="resource_id_name" :label="t('resourceId')" min-width="120" :show-overflow-tooltip="true"/> <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="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="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="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
prop="updated_at"
:label="t('updatedAt')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column :label="t('operation')" fixed="right" min-width="120"> <el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button> <el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<!-- <el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</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 v-model:current-page="physicalTestTable.page" v-model:page-size="physicalTestTable.limit" <el-pagination
layout="total, sizes, prev, pager, next, jumper" :total="physicalTestTable.total" v-model:current-page="physicalTestTable.page"
@size-change="loadPhysicalTestList()" @current-change="loadPhysicalTestList" /> v-model:page-size="physicalTestTable.limit"
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" /> <edit ref="editPhysicalTestDialog" @complete="loadPhysicalTestList" />
</el-card> </el-card>
</div> </div>
</el-dialog> </el-dialog>
</template> </template>
@ -93,29 +133,33 @@
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 { getPhysicalTestList, deletePhysicalTest, getWithCustomerResourcesList, getWithStudentList, getWithPersonnelList } from '@/app/api/physical_test' import {
getPhysicalTestList,
deletePhysicalTest,
getWithCustomerResourcesList,
getWithStudentList,
getWithPersonnelList,
} 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 Edit from '@/app/views/physical_test/components/physical-test-edit.vue' import Edit from '@/app/views/physical_test/components/physical-test-edit.vue'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
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 showDialog = ref(false) let showDialog = ref(false)
let physicalTestTable = reactive({ let physicalTestTable = reactive({
page: 1, page: 1,
limit: 10, limit: 10,
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam:{ searchParam: {
"resource_id":"", resource_id: '',
"student_id":"", student_id: '',
"height":"" height: '',
} },
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -125,7 +169,6 @@ const selectData = ref<any[]>([])
// //
/** /**
* 获取体测列表 * 获取体测列表
*/ */
@ -136,17 +179,18 @@ 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
}) })
} }
const router = useRouter() const router = useRouter()
const editPhysicalTestDialog: Record<string, any> | null = ref(null) const editPhysicalTestDialog: Record<string, any> | null = ref(null)
@ -155,11 +199,12 @@ const editPhysicalTestDialog: Record<string, any> | null = ref(null)
* 添加体测 * 添加体测
*/ */
const addEvent = () => { const addEvent = () => {
editPhysicalTestDialog.value.setFormData({'resource_id':physicalTestTable.searchParam.resource_id}) editPhysicalTestDialog.value.setFormData({
resource_id: physicalTestTable.searchParam.resource_id,
})
editPhysicalTestDialog.value.showDialog = true editPhysicalTestDialog.value.showDialog = true
} }
/** /**
* 编辑体测 * 编辑体测
* @param data * @param data
@ -174,36 +219,34 @@ const editEvent = (data: any) => {
* 删除体测 * 删除体测
*/ */
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(() => {
).then(() => { deletePhysicalTest(id)
deletePhysicalTest(id).then(() => { .then(() => {
loadPhysicalTestList() loadPhysicalTestList()
}).catch(() => {
}) })
.catch(() => {})
}) })
} }
const resourceIdList = ref([])
const resourceIdList = ref([]) const setResourceIdList = async () => {
const setResourceIdList = async () => {
resourceIdList.value = await (await getWithCustomerResourcesList({})).data resourceIdList.value = await (await getWithCustomerResourcesList({})).data
} }
setResourceIdList() setResourceIdList()
const studentIdList = ref([]) const studentIdList = ref([])
const setStudentIdList = async () => { const setStudentIdList = async () => {
studentIdList.value = await (await getWithStudentList({})).data studentIdList.value = await (await getWithStudentList({})).data
} }
setStudentIdList() setStudentIdList()
const coachIdList = ref([]) const coachIdList = ref([])
const setCoachIdList = async () => { const setCoachIdList = async () => {
coachIdList.value = await (await getWithPersonnelList({})).data coachIdList.value = await (await getWithPersonnelList({})).data
} }
setCoachIdList() setCoachIdList()
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
@ -211,18 +254,17 @@ const resetForm = (formEl: FormInstance | undefined) => {
loadPhysicalTestList() loadPhysicalTestList()
} }
const setFormData = async (row: any = null) => { const setFormData = async (row: any = null) => {
// Object.assign(formData, initialFormData) // Object.assign(formData, initialFormData)
physicalTestTable.searchParam.resource_id = row.resource_id physicalTestTable.searchParam.resource_id = row.resource_id
console.log(physicalTestTable.searchParam.resource_id); console.log(physicalTestTable.searchParam.resource_id)
loadPhysicalTestList() loadPhysicalTestList()
} }
defineExpose({ defineExpose({
showDialog, showDialog,
setFormData setFormData,
}) })
</script> </script>
@ -235,5 +277,5 @@ defineExpose({
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
} }
</style> </style>

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

@ -26,7 +26,9 @@
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
@change="handleDateRangeChange" @change="handleDateRangeChange"
/> />
<el-button type="primary" class="ml-2" @click="fetchData">查询</el-button> <el-button type="primary" class="ml-2" @click="fetchData"
>查询</el-button
>
</div> </div>
<el-button @click="addSchedule">添加课程</el-button> <el-button @click="addSchedule">添加课程</el-button>
</div> </div>
@ -66,7 +68,9 @@
> >
<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">{{ getTeacherName(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"
@ -88,8 +92,15 @@
<!-- 详情弹窗 --> <!-- 详情弹窗 -->
<el-dialog v-model="dialogVisible" title="课程详情"> <el-dialog v-model="dialogVisible" title="课程详情">
<p><strong>教师:</strong> {{ getTeacherName(selectedCourse?.teacher) }}</p> <p>
<p><strong>学员:</strong> {{ selectedCourse?.students.map(id => getStudentName(id)).join(', ') }}</p> <strong>教师:</strong> {{ getTeacherName(selectedCourse?.teacher) }}
</p>
<p>
<strong>学员:</strong>
{{
selectedCourse?.students.map((id) => getStudentName(id)).join(', ')
}}
</p>
</el-dialog> </el-dialog>
</div> </div>
</el-card> </el-card>
@ -107,7 +118,7 @@ const selectedCampus = ref('')
// //
const dateRange = ref([ const dateRange = ref([
getMonday(new Date()).toISOString().split('T')[0], getMonday(new Date()).toISOString().split('T')[0],
getSunday(new Date()).toISOString().split('T')[0] getSunday(new Date()).toISOString().split('T')[0],
]) ])
// //

136
admin/src/app/views/xsyj/xsyj.vue

@ -1,27 +1,26 @@
<template> <template>
<div class="main-container"> <div class="main-container">
<el-card class="box-card !border-none" shadow="never" v-loading="loading"> <el-card class="box-card !border-none" shadow="never" v-loading="loading">
<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="addStage"> <el-button type="primary" @click="addStage"> 新增阶段 </el-button>
新增阶段
</el-button>
</div> </div>
</el-card> </el-card>
<el-card class="box-card !border-none" shadow="never">
<div
<el-card class="box-card !border-none" shadow="never" > class="flex items-center justify-between p-[10px] table-item-border bg"
>
<div class="flex items-center justify-between p-[10px] table-item-border bg">
<span class="text-base w-[230px]">阶段名称</span> <span class="text-base w-[230px]">阶段名称</span>
<span class="text-base w-[110px] text-center">底薪</span> <span class="text-base w-[110px] text-center">底薪</span>
</div> </div>
<el-collapse v-model="activeNames" accordion > <el-collapse v-model="activeNames" accordion>
<el-collapse-item v-for="(stage, index) in stages" :key="stage.id" :name="stage.id"> <el-collapse-item
v-for="(stage, index) in stages"
:key="stage.id"
:name="stage.id"
>
<template #title> <template #title>
<div class="collapse-title"> <div class="collapse-title">
<span class="title-name">{{ stage.name }}</span> <span class="title-name">{{ stage.name }}</span>
@ -42,20 +41,26 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-button type="success" size="small" @click="addRule(stage)"
>新增规则</el-button
<el-button type="success" size="small" @click="addRule(stage)">新增规则</el-button> >
<el-table :data="stage.rules" border style="margin-top: 10px"> <el-table :data="stage.rules" border style="margin-top: 10px">
<el-table-column prop="renewal_standard_min" label="续费上限"> <el-table-column prop="renewal_standard_min" label="续费上限">
<template #default="{ row }"> <template #default="{ row }">
<el-input v-model="row.renewal_standard_min" placeholder="请输入续费上限" /> <el-input
v-model="row.renewal_standard_min"
placeholder="请输入续费上限"
/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="renewal_standard_max" label="续费下限"> <el-table-column prop="renewal_standard_max" label="续费下限">
<template #default="{ row }"> <template #default="{ row }">
<el-input v-model="row.renewal_standard_max" placeholder="请输入续费下限" /> <el-input
v-model="row.renewal_standard_max"
placeholder="请输入续费下限"
/>
</template> </template>
</el-table-column> </el-table-column>
@ -89,17 +94,27 @@
</el-table-column> </el-table-column>
<el-table-column label="操作" width="100"> <el-table-column label="操作" width="100">
<template #default="{ $index }"> <template #default="{ $index }">
<el-button type="danger" size="small" @click="removeRule(stage, $index)">删除</el-button> <el-button
type="danger"
size="small"
@click="removeRule(stage, $index)"
>删除</el-button
>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<el-button type="danger" size="small" style="margin-top: 10px" <el-button
@click="removeStage(index)">删除该阶段</el-button> type="danger"
size="small"
style="margin-top: 10px"
@click="removeStage(index)"
>删除该阶段</el-button
>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
<div style="text-align: right; margin-top: 20px;"> <div style="text-align: right; margin-top: 20px">
<el-button type="primary" @click="onSave">提交保存</el-button> <el-button type="primary" @click="onSave">提交保存</el-button>
</div> </div>
</el-card> </el-card>
@ -107,40 +122,42 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { xsyjConfig, getXsyjConfig } from '@/app/api/sys' import { xsyjConfig, getXsyjConfig } from '@/app/api/sys'
import { reactive, ref } from 'vue' import { reactive, ref } from 'vue'
import {ElMessage} from 'element-plus' import { ElMessage } from 'element-plus'
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
const loading = ref(true) const loading = ref(true)
const stages = ref([]) const stages = ref([])
const activeNames = ref(null) const activeNames = ref(null)
function addStage() { function addStage() {
const newStage = { const newStage = {
name: '默认阶段', name: '默认阶段',
price:0, price: 0,
rules: [{ rules: [
{
renewal_standard_min: '', renewal_standard_min: '',
renewal_standard_max: '', renewal_standard_max: '',
renewal_commission: '', renewal_commission: '',
new_count_min: '', new_count_min: '',
new_count_max: '', new_count_max: '',
new_move_5: '', new_move_5: '',
new_move_7: '' new_move_7: '',
}] },
],
} }
stages.value.push(newStage) stages.value.push(newStage)
activeNames.value = newStage.name activeNames.value = newStage.name
} }
function removeStage(index) { function removeStage(index) {
stages.value.splice(index, 1) stages.value.splice(index, 1)
} }
function addRule(stage) { function addRule(stage) {
stage.rules.push({ stage.rules.push({
renewal_standard_min: '', renewal_standard_min: '',
renewal_standard_max: '', renewal_standard_max: '',
@ -148,27 +165,27 @@
new_count_min: '', new_count_min: '',
new_count_max: '', new_count_max: '',
new_move_5: '', new_move_5: '',
new_move_7: '' new_move_7: '',
}) })
} }
function removeRule(stage, ruleIndex) { function removeRule(stage, ruleIndex) {
if (stage.rules.length === 1) { if (stage.rules.length === 1) {
ElMessage.warning('至少保留一条规则') ElMessage.warning('至少保留一条规则')
return return
} }
stage.rules.splice(ruleIndex, 1) stage.rules.splice(ruleIndex, 1)
} }
const setFormData = async () => { const setFormData = async () => {
const data = await (await getXsyjConfig()).data const data = await (await getXsyjConfig()).data
stages.value = data stages.value = data
loading.value = false loading.value = false
} }
setFormData(); setFormData()
const onSave = async () => { const onSave = async () => {
xsyjConfig(stages.value) xsyjConfig(stages.value)
.then(() => { .then(() => {
loading.value = true loading.value = true
@ -177,11 +194,11 @@
.catch(() => { .catch(() => {
loading.value = false loading.value = false
}) })
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.collapse-title { .collapse-title {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
@ -191,22 +208,21 @@
padding-right: 10px; padding-right: 10px;
color: #333; color: #333;
padding: 10px; padding: 10px;
} }
.title-name { .title-name {
width: 230px; width: 230px;
} }
.title-salary { .title-salary {
width: 110px; width: 110px;
text-align: center; text-align: center;
color: #7438D5; color: #7438d5;
} }
.arrow { .arrow {
margin-left: auto; margin-left: auto;
color: #999; color: #999;
font-size: 14px; font-size: 14px;
} }
</style> </style>

Loading…
Cancel
Save