Browse Source

代码格式化

master
王泽彦 11 months ago
parent
commit
adf2ea85a9
  1. 4
      admin/components.d.ts
  2. 20
      admin/src/app/api/communication_records.ts
  3. 30
      admin/src/app/api/order_table.ts
  4. 29
      admin/src/app/api/physical_test.ts
  5. 24
      admin/src/app/api/student_courses.ts
  6. 3
      admin/src/app/api/sys.ts
  7. 3
      admin/src/app/lang/zh-cn/customer_resource_changes.customer_resource_changes.json
  8. 2
      admin/src/app/lang/zh-cn/customer_resources.customer_resources.json
  9. 2
      admin/src/app/views/campus_person_role/campus_person_role.vue
  10. 187
      admin/src/app/views/communication_records/communication_records.vue
  11. 204
      admin/src/app/views/communication_records/components/communication-records-edit.vue
  12. 368
      admin/src/app/views/customer_resources/customer_resources.vue
  13. 145
      admin/src/app/views/order_table/components/order-table-edit.vue
  14. 173
      admin/src/app/views/order_table/order_table.vue
  15. 248
      admin/src/app/views/physical_test/components/physical-test-edit.vue
  16. 140
      admin/src/app/views/physical_test/physical_test.vue
  17. 262
      admin/src/app/views/physical_test/physical_test_edit.vue
  18. 111
      admin/src/app/views/setting/pay.vue
  19. 118
      admin/src/app/views/student_courses/components/student-courses-edit.vue
  20. 150
      admin/src/app/views/student_courses/student_courses.vue
  21. 122
      admin/src/app/views/tc_dialog/tc_dialog.vue
  22. 21
      admin/src/app/views/timetables/timetables.vue
  23. 68
      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']

20
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
/** /**
* *
@ -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,7 +51,10 @@ 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>) {

30
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
/** /**
* *
@ -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,16 +50,22 @@ 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>){ }
export function getWithCourseList(params: Record<string, any>) {
return request.get('order_table/course_all', { params }) return request.get('order_table/course_all', { params })
}export function getWithClassGradeList(params: Record<string,any>){ }
export function getWithClassGradeList(params: Record<string, any>) {
return request.get('order_table/class_grade_all', { params }) return request.get('order_table/class_grade_all', { params })
}export function getWithPersonnelList(params: Record<string,any>){ }
export function getWithPersonnelList(params: Record<string, any>) {
return request.get('order_table/personnel_all', { params }) return request.get('order_table/personnel_all', { params })
} }

29
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
/** /**
* *
@ -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,14 +50,19 @@ 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>){ }
export function getWithStudentList(params: Record<string, any>) {
return request.get('physical_test/student_all', { params }) return request.get('physical_test/student_all', { params })
}export function getWithPersonnelList(params: Record<string,any>){ }
export function getWithPersonnelList(params: Record<string, any>) {
return request.get('physical_test/personnel_all', { params }) return request.get('physical_test/personnel_all', { params })
} }

24
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
/** /**
* *
@ -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,12 +50,16 @@ 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>){ }
export function getWithCourseList(params: Record<string, any>) {
return request.get('student_courses/course_all', { params }) return request.get('student_courses/course_all', { params })
} }

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')
} }

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

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

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

@ -36,7 +36,6 @@
"startDate": "请选择开始时间", "startDate": "请选择开始时间",
"endDate": "请选择结束时间", "endDate": "请选择结束时间",
"resourceId": "资源", "resourceId": "资源",
"resourceIdPlaceholder": "请输入资源", "resourceIdPlaceholder": "请输入资源",
"orderStatus": "订单状态", "orderStatus": "订单状态",
@ -54,7 +53,6 @@
"addOrderTable": "添加订单", "addOrderTable": "添加订单",
"updateOrderTable": "编辑订单", "updateOrderTable": "编辑订单",
"resourceId": "客户姓名", "resourceId": "客户姓名",
"resourceIdPlaceholder": "全部", "resourceIdPlaceholder": "全部",
"studentId": "学员姓名", "studentId": "学员姓名",

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,

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

@ -1,7 +1,6 @@
<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">
@ -9,11 +8,22 @@
</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,
@ -119,9 +204,9 @@ let communicationRecordsTable = reactive({
loading: true, loading: true,
data: [], data: [],
searchParam: { searchParam: {
"resource_id":"", resource_id: '',
"communication_type":"" communication_type: '',
} },
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -132,19 +217,23 @@ 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')
).data.dictionary
} }
communication_typeDictList(); communication_typeDictList()
const communication_resultList = ref([] as any[]) const communication_resultList = ref([] as any[])
const communication_resultDictList = async () => { const communication_resultDictList = async () => {
communication_resultList.value = await (await useDictionary('communication_result')).data.dictionary communication_resultList.value = await (
await useDictionary('communication_result')
).data.dictionary
} }
communication_resultDictList(); communication_resultDictList()
const tagList = ref([] as any[]) const tagList = ref([] as any[])
const tagDictList = async () => { 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,21 +281,19 @@ 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

204
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
}) })
} }
@ -177,23 +243,41 @@ 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 (await useDictionary('communication_result')).data.dictionary communication_resultList.value = await (
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(); tagDictList()
watch(() => tagList.value, () => { formData.tag = tagList.value[0].value }) 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 () => {
@ -205,7 +289,8 @@ const setFormData = async (row: any = null) => {
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,7 +340,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({ defineExpose({
showDialog, showDialog,
setFormData setFormData,
}) })
</script> </script>

368
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,66 +147,124 @@
</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>
@ -154,7 +273,12 @@
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 {
getCustomerResourcesList,
deleteCustomerResources,
getWithPersonnelList,
getWithCampusList,
} from '@/app/api/customer_resources'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox, FormInstance } from 'element-plus' import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/customer_resources/components/customer-resources-edit.vue' import Edit from '@/app/views/customer_resources/components/customer-resources-edit.vue'
@ -165,7 +289,7 @@
import { useRouter, useRoute } from 'vue-router' import { useRouter, useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const pageName = route.meta.title; const pageName = route.meta.title
const router = useRouter() const router = useRouter()
let customerResourcesTable = reactive({ let customerResourcesTable = reactive({
@ -175,58 +299,56 @@
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 == '业绩分配') { if (pageName == '业绩分配') {
customerResourcesTable.searchParam.type = 'yjfp'; customerResourcesTable.searchParam.type = 'yjfp'
} else if (pageName == '客户资源列表') { } else if (pageName == '客户资源列表') {
customerResourcesTable.searchParam.type = 'khzy'; customerResourcesTable.searchParam.type = 'khzy'
} else if (pageName == '资源列表') { } else if (pageName == '资源列表') {
customerResourcesTable.searchParam.type = 'zylb'; customerResourcesTable.searchParam.type = 'zylb'
} }
// const type = pageName == '' ? 'yjfp' : 'khzy'; // const type = pageName == '' ? 'yjfp' : 'khzy';
const modificationLog = (id: number) => { const modificationLog = (id: number) => {
router.push({ path: '/six_speed_modification_log/six_speed_modification_log', query: { id: id } }) router.push({
path: '/six_speed_modification_log/six_speed_modification_log',
query: { id: id },
})
} }
const resourceChanges = (id: number) => { const resourceChanges = (id: number) => {
router.push({ path: '/customer_resource_changes/customer_resource_changes', query: { id: id } }) 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>()
// //
@ -237,38 +359,45 @@
const sourceDictList = async () => { 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')
).data.dictionary
} }
source_channelDictList(); source_channelDictList()
const genderList = ref([] as any[]) const genderList = ref([] as any[])
const genderDictList = async () => { 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')
).data.dictionary
} }
purchasing_powerDictList(); purchasing_powerDictList()
const cognitive_ideaList = ref([] as any[]) const cognitive_ideaList = ref([] as any[])
const cognitive_ideaDictList = async () => { const cognitive_ideaDictList = async () => {
cognitive_ideaList.value = await (await useDictionary('cognitive_concept')).data.dictionary cognitive_ideaList.value = await (
await useDictionary('cognitive_concept')
).data.dictionary
} }
cognitive_ideaDictList(); cognitive_ideaDictList()
const initial_intentList = ref([] as any[]) const initial_intentList = ref([] as any[])
const initial_intentDictList = async () => { const initial_intentDictList = async () => {
initial_intentList.value = await (await useDictionary('preliminarycustomerintention')).data.dictionary initial_intentList.value = await (
await useDictionary('preliminarycustomerintention')
).data.dictionary
} }
initial_intentDictList(); initial_intentDictList()
const statusList = ref([] as any[]) const statusList = ref([] as any[])
const statusDictList = async () => { const statusDictList = async () => {
statusList.value = await (await useDictionary('kh_status')).data.dictionary statusList.value = await (await useDictionary('kh_status')).data.dictionary
} }
statusDictList(); statusDictList()
/** /**
* 获取客户资源列表 * 获取客户资源列表
@ -280,12 +409,14 @@
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
}) })
} }
@ -317,26 +448,23 @@
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

145
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
}) })
} }
@ -170,17 +213,30 @@ 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(); order_statusDictList()
watch(() => order_statusList.value, () => { formData.order_status = order_statusList.value[0].value }) 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 (await useDictionary('payment_type')).data.dictionary payment_typeList.value = await (
await useDictionary('payment_type')
).data.dictionary
} }
payment_typeDictList(); payment_typeDictList()
watch(() => payment_typeList.value, () => { formData.payment_type = payment_typeList.value[0].value }) 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 () => {
@ -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,7 +316,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({ defineExpose({
showDialog, showDialog,
setFormData setFormData,
}) })
</script> </script>

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

@ -1,7 +1,6 @@
<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">
@ -9,11 +8,22 @@
</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,
@ -116,9 +197,9 @@ let orderTableTable = reactive({
loading: true, loading: true,
data: [], data: [],
searchParam: { searchParam: {
"order_status":"", order_status: '',
"payment_type":"" payment_type: '',
} },
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -129,14 +210,18 @@ 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')
).data.dictionary
} }
order_statusDictList(); order_statusDictList()
const payment_typeList = ref([] as any[]) const payment_typeList = ref([] as any[])
const payment_typeDictList = async () => { const payment_typeDictList = async () => {
payment_typeList.value = await (await useDictionary('payment_type')).data.dictionary payment_typeList.value = await (
await useDictionary('payment_type')
).data.dictionary
} }
payment_typeDictList(); 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,21 +269,19 @@ 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

248
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"
@ -46,53 +84,105 @@
</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,8 +332,6 @@ const confirm = async (formEl: FormInstance | undefined) => {
// //
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
@ -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,7 +404,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({ defineExpose({
showDialog, showDialog,
setFormData setFormData,
}) })
</script> </script>

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

@ -1,7 +1,6 @@
<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">
@ -9,11 +8,22 @@
</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,
@ -96,9 +161,9 @@ let physicalTestTable = reactive({
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,21 +219,19 @@ 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

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

@ -9,9 +9,20 @@
<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"
@ -55,58 +86,119 @@
</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
/** /**
* 表单数据 * 表单数据
*/ */
@ -160,7 +257,7 @@ const setFormData = async (id:number = 0) => {
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,8 +265,6 @@ const selectData = ref<any[]>([])
// //
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
@ -190,89 +285,75 @@ 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)) {

111
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
@ -129,7 +185,7 @@ 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
} }
@ -145,7 +201,10 @@ const configPayFn = (data:any) => {
// //
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()
@ -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))
} },
}) })
} }
@ -200,7 +259,7 @@ const saveFn = () => {
}) })
}) })
setPatConfig({ config: data }).then(res => { setPatConfig({ config: data }).then((res) => {
checkPayConfigList() checkPayConfigList()
isEdit.value = false isEdit.value = false
payLoading.value = false payLoading.value = false

118
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,8 +195,6 @@ const confirm = async (formEl: FormInstance | undefined) => {
// //
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
@ -174,7 +210,8 @@ const setFormData = async (row: any = null) => {
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,7 +261,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({ defineExpose({
showDialog, showDialog,
setFormData setFormData,
}) })
</script> </script>

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

@ -1,7 +1,6 @@
<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">
@ -9,11 +8,22 @@
</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,
@ -98,9 +169,9 @@ let studentCoursesTable = reactive({
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,21 +227,19 @@ 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

122
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">
@ -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,18 +133,22 @@
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,
@ -112,10 +156,10 @@ let physicalTestTable = reactive({
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,21 +219,19 @@ 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
@ -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>

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],
]) ])
// //

68
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"> <el-card class="box-card !border-none" shadow="never">
<div
<div class="flex items-center justify-between p-[10px] table-item-border bg"> 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>
@ -122,15 +137,17 @@
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
@ -148,7 +165,7 @@
new_count_min: '', new_count_min: '',
new_count_max: '', new_count_max: '',
new_move_5: '', new_move_5: '',
new_move_7: '' new_move_7: '',
}) })
} }
@ -166,7 +183,7 @@
loading.value = false loading.value = false
} }
setFormData(); setFormData()
const onSave = async () => { const onSave = async () => {
xsyjConfig(stages.value) xsyjConfig(stages.value)
@ -200,7 +217,7 @@
.title-salary { .title-salary {
width: 110px; width: 110px;
text-align: center; text-align: center;
color: #7438D5; color: #7438d5;
} }
.arrow { .arrow {
@ -208,5 +225,4 @@
color: #999; color: #999;
font-size: 14px; font-size: 14px;
} }
</style> </style>

Loading…
Cancel
Save