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']
ElPagination: typeof import('element-plus/es')['ElPagination']
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']
ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
ElSelect: typeof import('element-plus/es')['ElSelect']
@ -52,9 +50,7 @@ declare module '@vue/runtime-core' {
ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
ElTabPane: typeof import('element-plus/es')['ElTabPane']
ElTabs: typeof import('element-plus/es')['ElTabs']
ElTag: typeof import('element-plus/es')['ElTag']
ElTooltip: typeof import('element-plus/es')['ElTooltip']
ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']
ElUpload: typeof import('element-plus/es')['ElUpload']
ExportSure: typeof import('./src/components/export-sure/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'
// USER_CODE_BEGIN -- communication_records
/**
*
@ -18,7 +16,7 @@ export function getCommunicationRecordsList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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>) {

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

@ -1,9 +1,5 @@
import request from '@/utils/request'
// USER_CODE_BEGIN -- order_table
/**
*
@ -20,7 +16,7 @@ export function getOrderTableList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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>) {
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 })
}export function getWithClassGradeList(params: Record<string,any>){
}
export function getWithClassGradeList(params: Record<string, any>) {
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 })
}

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

@ -1,11 +1,5 @@
import request from '@/utils/request'
// USER_CODE_BEGIN -- physical_test
/**
*
@ -22,7 +16,7 @@ export function getPhysicalTestList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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>) {
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 })
}export function getWithPersonnelList(params: Record<string,any>){
}
export function getWithPersonnelList(params: Record<string, any>) {
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'
// USER_CODE_BEGIN -- student_courses
/**
*
@ -20,7 +16,7 @@ export function getStudentCoursesList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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>) {
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 })
}

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)
}
export function xsyjConfig(params: Record<string, any>) {
return request.post(`sys/xsyj_config`, params)
}
@ -773,5 +772,3 @@ export function xsyjConfig(params: Record<string, any>) {
export function getXsyjConfig() {
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": "确定要删除该数据吗?",
"startDate": "请选择开始时间",
"endDate": "请选择结束时间"
}

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

@ -36,7 +36,6 @@
"startDate": "请选择开始时间",
"endDate": "请选择结束时间",
"resourceId": "资源",
"resourceIdPlaceholder": "请输入资源",
"orderStatus": "订单状态",
@ -54,7 +53,6 @@
"addOrderTable": "添加订单",
"updateOrderTable": "编辑订单",
"resourceId": "客户姓名",
"resourceIdPlaceholder": "全部",
"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
// ?dept_id=1
const dept_id = pageName == '市场人员列表' ? 1 : 2;
const dept_id = pageName == '市场人员列表' ? 1 : 2
let campusPersonRoleTable = reactive({
page: 1,
limit: 10,

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

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,11 +8,22 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="communicationRecordsTable.searchParam" ref="searchFormRef">
<el-card
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-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
v-for="(item, index) in resourceIdList"
:key="index"
@ -23,9 +33,16 @@
</el-select>
</el-form-item>
<el-form-item :label="t('communicationType')" prop="communication_type">
<el-select class="w-[280px]" v-model="communicationRecordsTable.searchParam.communication_type" clearable :placeholder="t('communicationTypePlaceholder')">
<el-form-item
:label="t('communicationType')"
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
v-for="(item, index) in communication_typeList"
@ -37,42 +54,91 @@
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadCommunicationRecordsList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadCommunicationRecordsList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<div class="mt-[10px]">
<el-table :data="communicationRecordsTable.data" size="large" v-loading="communicationRecordsTable.loading">
<el-table
:data="communicationRecordsTable.data"
size="large"
v-loading="communicationRecordsTable.loading"
>
<template #empty>
<span>{{ !communicationRecordsTable.loading ? t('emptyData') : '' }}</span>
<span>{{
!communicationRecordsTable.loading ? t('emptyData') : ''
}}</span>
</template>
<el-table-column prop="resource_id_name" :label="t('resourceId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="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 }">
<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>
</template>
</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 }">
<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>
</template>
</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 }">
<div v-for="(item, index) in tagList">
<div v-if="item.value == row.tag">{{ item.name }}</div>
@ -80,22 +146,37 @@
</template>
</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 }">
<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="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="communicationRecordsTable.page" v-model:page-size="communicationRecordsTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="communicationRecordsTable.total"
@size-change="loadCommunicationRecordsList()" @current-change="loadCommunicationRecordsList" />
<el-pagination
v-model:current-page="communicationRecordsTable.page"
v-model:page-size="communicationRecordsTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="communicationRecordsTable.total"
@size-change="loadCommunicationRecordsList()"
@current-change="loadCommunicationRecordsList"
/>
</div>
</div>
<edit ref="editCommunicationRecordsDialog" @complete="loadCommunicationRecordsList" />
<edit
ref="editCommunicationRecordsDialog"
@complete="loadCommunicationRecordsList"
/>
</el-card>
</div>
</template>
@ -104,13 +185,17 @@
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
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 { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/communication_records/components/communication-records-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let communicationRecordsTable = reactive({
page: 1,
@ -119,9 +204,9 @@ let communicationRecordsTable = reactive({
loading: true,
data: [],
searchParam: {
"resource_id":"",
"communication_type":""
}
resource_id: '',
communication_type: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -132,19 +217,23 @@ const selectData = ref<any[]>([])
//
const communication_typeList = ref([] as any[])
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_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 tagDictList = async () => {
tagList.value = await (await useDictionary('tag')).data.dictionary
}
tagDictList();
tagDictList()
/**
* 获取沟通记录列表
@ -156,12 +245,14 @@ const loadCommunicationRecordsList = (page: number = 1) => {
getCommunicationRecordsList({
page: communicationRecordsTable.page,
limit: communicationRecordsTable.limit,
...communicationRecordsTable.searchParam
}).then(res => {
...communicationRecordsTable.searchParam,
})
.then((res) => {
communicationRecordsTable.loading = false
communicationRecordsTable.data = res.data.data
communicationRecordsTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
communicationRecordsTable.loading = false
})
}
@ -190,21 +281,19 @@ const editEvent = (data: any) => {
* 删除沟通记录
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('communicationRecordsDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('communicationRecordsDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteCommunicationRecords(id).then(() => {
}).then(() => {
deleteCommunicationRecords(id)
.then(() => {
loadCommunicationRecordsList()
}).catch(() => {
})
.catch(() => {})
})
}
const resourceIdList = ref([])
const setResourceIdList = async () => {
resourceIdList.value = await (await getWithCustomerResourcesList({})).data

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

@ -1,8 +1,30 @@
<template>
<el-dialog 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-dialog
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-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
v-for="(item, index) in resourceIdList"
@ -14,11 +36,21 @@
</el-form-item>
<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 :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
v-for="(item, index) in communication_typeList"
@ -29,8 +61,16 @@
</el-select>
</el-form-item>
<el-form-item :label="t('communicationResult')" prop="communication_result">
<el-select class="input-width" v-model="formData.communication_result" clearable :placeholder="t('communicationResultPlaceholder')">
<el-form-item
: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
v-for="(item, index) in communication_resultList"
@ -41,21 +81,38 @@
</el-select>
</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
class="flex-1 !flex"
v-model="formData.communication_time"
clearable
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
:placeholder="t('communicationTimePlaceholder')">
:placeholder="t('communicationTimePlaceholder')"
>
</el-date-picker>
</el-form-item>
<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 :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
v-for="(item, index) in tagList"
@ -65,15 +122,17 @@
/>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -84,7 +143,12 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
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)
const loading = ref(false)
@ -111,39 +175,39 @@ const formRules = computed(() => {
return {
resource_id: [
{ required: true, message: t('resourceIdPlaceholder'), trigger: 'blur' },
]
,
],
resource_type: [
{ required: true, message: t('resourceTypePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('resourceTypePlaceholder'),
trigger: 'blur',
},
],
communication_type: [
{ required: true, message: t('communicationTypePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('communicationTypePlaceholder'),
trigger: 'blur',
},
],
communication_result: [
{ required: true, message: t('communicationResultPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('communicationResultPlaceholder'),
trigger: 'blur',
},
],
communication_time: [
{ required: true, message: t('communicationTimePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('communicationTimePlaceholder'),
trigger: 'blur',
},
],
remarks: [
{ 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
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -177,23 +243,41 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
let communication_typeList = ref([])
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([])
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([])
const tagDictList = async () => {
tagList.value = await (await useDictionary('tag')).data.dictionary
}
tagDictList();
watch(() => tagList.value, () => { formData.tag = tagList.value[0].value })
tagDictList()
watch(
() => tagList.value,
() => {
formData.tag = tagList.value[0].value
}
)
const resourceIdList = ref([] as any[])
const setResourceIdList = async () => {
@ -205,7 +289,8 @@ const setFormData = async (row: any = null) => {
loading.value = true
if (row) {
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]
})
}
@ -223,7 +308,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -250,7 +340,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

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

@ -1,69 +1,111 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent" v-if="customerResourcesTable.searchParam.type == 'khzy'">
<el-button
type="primary"
@click="addEvent"
v-if="customerResourcesTable.searchParam.type == 'khzy'"
>
{{ t('addCustomerResources') }}
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="customerResourcesTable.searchParam" ref="searchFormRef">
<el-card
class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="customerResourcesTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('name')" prop="name">
<el-input v-model="customerResourcesTable.searchParam.name"
:placeholder="t('namePlaceholder')" />
<el-input
v-model="customerResourcesTable.searchParam.name"
:placeholder="t('namePlaceholder')"
/>
</el-form-item>
<el-form-item 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 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="female" />
<el-option label="其他" value="other" />
</el-select>
</el-form-item>
<el-form-item :label="t('phoneNumber')" prop="phone_number">
<el-input v-model="customerResourcesTable.searchParam.phone_number"
:placeholder="t('phoneNumberPlaceholder')" />
<el-input
v-model="customerResourcesTable.searchParam.phone_number"
:placeholder="t('phoneNumberPlaceholder')"
/>
</el-form-item>
<el-form-item label="创建时间">
<el-date-picker v-model="customerResourcesTable.searchParam.created_at" type="daterange" range-separator=""
start-placeholder="开始日期" end-placeholder="结束日期" format="YYYY-MM-DD"
value-format="YYYY-MM-DD" />
<el-date-picker
v-model="customerResourcesTable.searchParam.created_at"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
/>
</el-form-item>
<!-- 更新时间 -->
<el-form-item label="更新时间">
<el-date-picker v-model="customerResourcesTable.searchParam.updated_at" type="daterange" range-separator=""
start-placeholder="开始日期" end-placeholder="结束日期" format="YYYY-MM-DD"
value-format="YYYY-MM-DD" />
<el-date-picker
v-model="customerResourcesTable.searchParam.updated_at"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadCustomerResourcesList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadCustomerResourcesList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<div class="mt-[10px]">
<el-table :data="customerResourcesTable.data" size="large" v-loading="customerResourcesTable.loading">
<el-table
:data="customerResourcesTable.data"
size="large"
v-loading="customerResourcesTable.loading"
>
<template #empty>
<span>{{ !customerResourcesTable.loading ? t('emptyData') : '' }}</span>
<span>{{
!customerResourcesTable.loading ? t('emptyData') : ''
}}</span>
</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 }">
<div v-for="(item, index) in sourceList">
<div v-if="item.value == row.source">{{ item.name }}</div>
@ -71,14 +113,33 @@
</template>
</el-table-column>
<el-table-column prop="consultant_name" :label="t('consultant')" min-width="120"
: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">
<el-table-column
prop="consultant_name"
:label="t('consultant')"
min-width="120"
: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 }">
<div v-for="(item, index) in genderList">
<div v-if="item.value == row.gender">{{ item.name }}</div>
@ -86,66 +147,124 @@
</template>
</el-table-column>
<el-table-column prop="phone_number" :label="t('phoneNumber')" min-width="120"
:show-overflow-tooltip="true" />
<el-table-column prop="decision_maker" :label="t('decisionMaker')" min-width="120"
:show-overflow-tooltip="true" />
<el-table-column prop="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'">
<el-table-column
prop="phone_number"
:label="t('phoneNumber')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="decision_maker"
:label="t('decisionMaker')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="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 }">
<el-button type="primary" link @click="modificationLog(row.id)">六要素修改记录</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>
<el-button type="primary" link @click="modificationLog(row.id)"
>六要素修改记录</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>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="200"
v-if="customerResourcesTable.searchParam.type == 'yjfp'">
<el-table-column
:label="t('operation')"
fixed="right"
min-width="200"
v-if="customerResourcesTable.searchParam.type == 'yjfp'"
>
<template #default="{ row }">
<el-button type="primary" link @click="fpEvent(row)">分配</el-button>
<el-button type="primary" link @click="fpEvent(row)"
>分配</el-button
>
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="200"
v-if="customerResourcesTable.searchParam.type == 'zylb'">
<el-table-column
:label="t('operation')"
fixed="right"
min-width="200"
v-if="customerResourcesTable.searchParam.type == 'zylb'"
>
<template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</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>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</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>
</el-table-column>
</el-table>
<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"
layout="total, sizes, prev, pager, next, jumper" :total="customerResourcesTable.total"
@size-change="loadCustomerResourcesList()" @current-change="loadCustomerResourcesList" />
layout="total, sizes, prev, pager, next, jumper"
:total="customerResourcesTable.total"
@size-change="loadCustomerResourcesList()"
@current-change="loadCustomerResourcesList"
/>
</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" />
<tc ref="TcCustomerResourcesDialog" @complete="loadCustomerResourcesList" />
<tc
ref="TcCustomerResourcesDialog"
@complete="loadCustomerResourcesList"
/>
</el-card>
</div>
</template>
@ -154,7 +273,12 @@
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
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 { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/customer_resources/components/customer-resources-edit.vue'
@ -165,7 +289,7 @@
import { useRouter, useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
const router = useRouter()
let customerResourcesTable = reactive({
@ -175,58 +299,56 @@
loading: true,
data: [],
searchParam: {
"name": "",
"age": "",
"gender": "",
"phone_number": "",
'type': '',
"created_at" : "",
"updated_at" : ""
}
name: '',
age: '',
gender: '',
phone_number: '',
type: '',
created_at: '',
updated_at: '',
},
})
if (pageName == '业绩分配') {
customerResourcesTable.searchParam.type = 'yjfp';
customerResourcesTable.searchParam.type = 'yjfp'
} else if (pageName == '客户资源列表') {
customerResourcesTable.searchParam.type = 'khzy';
customerResourcesTable.searchParam.type = 'khzy'
} else if (pageName == '资源列表') {
customerResourcesTable.searchParam.type = 'zylb';
customerResourcesTable.searchParam.type = 'zylb'
}
// const type = pageName == '' ? 'yjfp' : 'khzy';
const modificationLog = (id: number) => {
router.push({ path: '/six_speed_modification_log/six_speed_modification_log', query: { id: id } })
router.push({
path: '/six_speed_modification_log/six_speed_modification_log',
query: { id: id },
})
}
const resourceChanges = (id: number) => {
router.push({ path: '/customer_resource_changes/customer_resource_changes', query: { id: id } })
router.push({
path: '/customer_resource_changes/customer_resource_changes',
query: { id: id },
})
}
/**
* 添加订单
*/
const editOrderTableDialog: Record<string, any> | null = ref(null)
const addOrder = (row: any) => {
console.log(row);
console.log(row)
editOrderTableDialog.value.setFormData(row)
editOrderTableDialog.value.showDialog = true
}
const TcCustomerResourcesDialog: Record<string, any> | null = ref(null)
const tcEvent = (row: any) => {
TcCustomerResourcesDialog.value.setFormData(row)
TcCustomerResourcesDialog.value.showDialog = true
}
const searchFormRef = ref<FormInstance>()
//
@ -237,38 +359,45 @@
const sourceDictList = async () => {
sourceList.value = await (await useDictionary('source')).data.dictionary
}
sourceDictList();
sourceDictList()
const source_channelList = ref([] as any[])
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 genderDictList = async () => {
genderList.value = await (await useDictionary('zy_sex')).data.dictionary
}
genderDictList();
genderDictList()
const purchasing_powerList = ref([] as any[])
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_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_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 statusDictList = async () => {
statusList.value = await (await useDictionary('kh_status')).data.dictionary
}
statusDictList();
statusDictList()
/**
* 获取客户资源列表
@ -280,12 +409,14 @@
getCustomerResourcesList({
page: customerResourcesTable.page,
limit: customerResourcesTable.limit,
...customerResourcesTable.searchParam
}).then(res => {
...customerResourcesTable.searchParam,
})
.then((res) => {
customerResourcesTable.loading = false
customerResourcesTable.data = res.data.data
customerResourcesTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
customerResourcesTable.loading = false
})
}
@ -317,26 +448,23 @@
fpCustomerResourcesDialog.value.showDialog = true
}
/**
* 删除客户资源
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('customerResourcesDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('customerResourcesDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteCustomerResources(id).then(() => {
}).then(() => {
deleteCustomerResources(id)
.then(() => {
loadCustomerResourcesList()
}).catch(() => {
})
.catch(() => {})
})
}
const consultantList = ref([])
const setConsultantList = async () => {
consultantList.value = await (await getWithPersonnelList({})).data

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

@ -1,8 +1,26 @@
<template>
<el-dialog 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-dialog
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-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
v-for="(item, index) in resourceIdList"
@ -14,7 +32,12 @@
</el-form-item>
<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
v-for="(item, index) in order_statusList"
@ -26,7 +49,12 @@
</el-form-item>
<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
v-for="(item, index) in payment_typeList"
@ -38,11 +66,21 @@
</el-form-item>
<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 :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
v-for="(item, index) in courseIdList"
@ -54,7 +92,12 @@
</el-form-item>
<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
v-for="(item, index) in classIdList"
@ -64,15 +107,17 @@
/>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -83,7 +128,15 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
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)
const loading = ref(false)
@ -109,34 +162,22 @@ const formRules = computed(() => {
return {
resource_id: [
{ required: true, message: t('resourceIdPlaceholder'), trigger: 'blur' },
]
,
],
order_status: [
{ required: true, message: t('orderStatusPlaceholder'), trigger: 'blur' },
]
,
],
payment_type: [
{ required: true, message: t('paymentTypePlaceholder'), trigger: 'blur' },
]
,
],
order_amount: [
{ required: true, message: t('orderAmountPlaceholder'), trigger: 'blur' },
]
,
],
course_id: [
{ required: true, message: t('courseIdPlaceholder'), trigger: 'blur' },
]
,
],
class_id: [
{ required: true, message: t('classIdPlaceholder'), trigger: 'blur' },
]
,
],
}
})
@ -156,11 +197,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -170,17 +213,30 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
let order_statusList = ref([])
const order_statusDictList = async () => {
order_statusList.value = await (await useDictionary('order_status')).data.dictionary
order_statusList.value = await (
await useDictionary('order_status')
).data.dictionary
}
order_statusDictList();
watch(() => order_statusList.value, () => { formData.order_status = order_statusList.value[0].value })
order_statusDictList()
watch(
() => order_statusList.value,
() => {
formData.order_status = order_statusList.value[0].value
}
)
let payment_typeList = ref([])
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();
watch(() => payment_typeList.value, () => { formData.payment_type = payment_typeList.value[0].value })
payment_typeDictList()
watch(
() => payment_typeList.value,
() => {
formData.payment_type = payment_typeList.value[0].value
}
)
const resourceIdList = ref([] as any[])
const setResourceIdList = async () => {
@ -228,7 +284,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -255,7 +316,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

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

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,11 +8,22 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="orderTableTable.searchParam" ref="searchFormRef">
<el-card
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-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
v-for="(item, index) in order_statusList"
@ -24,9 +34,13 @@
</el-select>
</el-form-item>
<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
v-for="(item, index) in payment_typeList"
@ -38,20 +52,38 @@
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadOrderTableList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadOrderTableList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<div class="mt-[10px]">
<el-table :data="orderTableTable.data" size="large" v-loading="orderTableTable.loading">
<el-table
:data="orderTableTable.data"
size="large"
v-loading="orderTableTable.loading"
>
<template #empty>
<span>{{ !orderTableTable.loading ? t('emptyData') : '' }}</span>
</template>
<el-table-column prop="resource_id_name" :label="t('resourceId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="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 }">
<div v-for="(item, index) in order_statusList">
<div v-if="item.value == row.order_status">{{ item.name }}</div>
@ -59,7 +91,12 @@
</template>
</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 }">
<div v-for="(item, index) in payment_typeList">
<div v-if="item.value == row.payment_type">{{ item.name }}</div>
@ -67,28 +104,65 @@
</template>
</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 }">
<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="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="orderTableTable.page" v-model:page-size="orderTableTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="orderTableTable.total"
@size-change="loadOrderTableList()" @current-change="loadOrderTableList" />
<el-pagination
v-model:current-page="orderTableTable.page"
v-model:page-size="orderTableTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="orderTableTable.total"
@size-change="loadOrderTableList()"
@current-change="loadOrderTableList"
/>
</div>
</div>
@ -101,13 +175,20 @@
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
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 { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/order_table/components/order-table-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let orderTableTable = reactive({
page: 1,
@ -116,9 +197,9 @@ let orderTableTable = reactive({
loading: true,
data: [],
searchParam: {
"order_status":"",
"payment_type":""
}
order_status: '',
payment_type: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -129,14 +210,18 @@ const selectData = ref<any[]>([])
//
const order_statusList = ref([] as any[])
const order_statusDictList = async () => {
order_statusList.value = await (await useDictionary('order_status')).data.dictionary
order_statusList.value = await (
await useDictionary('order_status')
).data.dictionary
}
order_statusDictList();
order_statusDictList()
const payment_typeList = ref([] as any[])
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({
page: orderTableTable.page,
limit: orderTableTable.limit,
...orderTableTable.searchParam
}).then(res => {
...orderTableTable.searchParam,
})
.then((res) => {
orderTableTable.loading = false
orderTableTable.data = res.data.data
orderTableTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
orderTableTable.loading = false
})
}
@ -182,21 +269,19 @@ const editEvent = (data: any) => {
* 删除订单
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('orderTableDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('orderTableDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteOrderTable(id).then(() => {
}).then(() => {
deleteOrderTable(id)
.then(() => {
loadOrderTableList()
}).catch(() => {
})
.catch(() => {})
})
}
const resourceIdList = ref([])
const setResourceIdList = async () => {
resourceIdList.value = await (await getWithCustomerResourcesList({})).data

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

@ -1,8 +1,26 @@
<template>
<el-dialog 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-dialog
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-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
v-for="(item, index) in resourceIdList"
@ -14,7 +32,12 @@
</el-form-item>
<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
v-for="(item, index) in studentIdList"
@ -26,15 +49,30 @@
</el-form-item>
<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 :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 :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
v-for="(item, index) in coachIdList"
@ -46,53 +84,105 @@
</el-form-item>
<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 :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 :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 :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 :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 :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 :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 :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 :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 :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>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -103,7 +193,14 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
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)
const loading = ref(false)
@ -138,79 +235,69 @@ const formRules = computed(() => {
return {
resource_id: [
{ required: true, message: t('resourceIdPlaceholder'), trigger: 'blur' },
]
,
],
student_id: [
{ required: true, message: t('studentIdPlaceholder'), trigger: 'blur' },
]
,
],
height: [
{ required: true, message: t('heightPlaceholder'), trigger: 'blur' },
]
,
],
weight: [
{ required: true, message: t('weightPlaceholder'), trigger: 'blur' },
]
,
],
coach_id: [
{ required: true, message: t('coachIdPlaceholder'), trigger: 'blur' },
]
,
],
seated_forward_bend: [
{ required: true, message: t('seatedForwardBendPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('seatedForwardBendPlaceholder'),
trigger: 'blur',
},
],
sit_ups: [
{ required: true, message: t('sitUpsPlaceholder'), trigger: 'blur' },
]
,
],
push_ups: [
{ required: true, message: t('pushUpsPlaceholder'), trigger: 'blur' },
]
,
],
flamingo_balance: [
{ required: true, message: t('flamingoBalancePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('flamingoBalancePlaceholder'),
trigger: 'blur',
},
],
thirty_sec_jump: [
{ required: true, message: t('thirtySecJumpPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('thirtySecJumpPlaceholder'),
trigger: 'blur',
},
],
standing_long_jump: [
{ required: true, message: t('standingLongJumpPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('standingLongJumpPlaceholder'),
trigger: 'blur',
},
],
agility_run: [
{ required: true, message: t('agilityRunPlaceholder'), trigger: 'blur' },
]
,
],
balance_beam: [
{ required: true, message: t('balanceBeamPlaceholder'), trigger: 'blur' },
]
,
],
tennis_throw: [
{ required: true, message: t('tennisThrowPlaceholder'), trigger: 'blur' },
]
,
],
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
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -243,8 +332,6 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const resourceIdList = ref([] as any[])
const setResourceIdList = async () => {
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) => {
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')))
} else {
callback()
@ -312,7 +404,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

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

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,11 +8,22 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="physicalTestTable.searchParam" ref="searchFormRef">
<el-card
class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="physicalTestTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('resourceId')" prop="resource_id">
<el-select class="w-[280px]" v-model="physicalTestTable.searchParam.resource_id" clearable :placeholder="t('resourceIdPlaceholder')">
<el-select
class="w-[280px]"
v-model="physicalTestTable.searchParam.resource_id"
clearable
:placeholder="t('resourceIdPlaceholder')"
>
<el-option
v-for="(item, index) in resourceIdList"
:key="index"
@ -23,9 +33,13 @@
</el-select>
</el-form-item>
<el-form-item :label="t('studentId')" prop="student_id">
<el-select class="w-[280px]" v-model="physicalTestTable.searchParam.student_id" clearable :placeholder="t('studentIdPlaceholder')">
<el-select
class="w-[280px]"
v-model="physicalTestTable.searchParam.student_id"
clearable
:placeholder="t('studentIdPlaceholder')"
>
<el-option
v-for="(item, index) in studentIdList"
:key="index"
@ -36,39 +50,84 @@
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadPhysicalTestList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadPhysicalTestList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<div class="mt-[10px]">
<el-table :data="physicalTestTable.data" size="large" v-loading="physicalTestTable.loading">
<el-table
:data="physicalTestTable.data"
size="large"
v-loading="physicalTestTable.loading"
>
<template #empty>
<span>{{ !physicalTestTable.loading ? t('emptyData') : '' }}</span>
</template>
<el-table-column prop="resource_id_name" :label="t('resourceId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="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 }">
<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="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="physicalTestTable.page" v-model:page-size="physicalTestTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="physicalTestTable.total"
@size-change="loadPhysicalTestList()" @current-change="loadPhysicalTestList" />
<el-pagination
v-model:current-page="physicalTestTable.page"
v-model:page-size="physicalTestTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="physicalTestTable.total"
@size-change="loadPhysicalTestList()"
@current-change="loadPhysicalTestList"
/>
</div>
</div>
@ -81,13 +140,19 @@
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict'
import { getPhysicalTestList, deletePhysicalTest, getWithCustomerResourcesList, getWithStudentList, getWithPersonnelList } from '@/app/api/physical_test'
import {
getPhysicalTestList,
deletePhysicalTest,
getWithCustomerResourcesList,
getWithStudentList,
getWithPersonnelList,
} from '@/app/api/physical_test'
import { img } from '@/utils/common'
import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/physical_test/components/physical-test-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let physicalTestTable = reactive({
page: 1,
@ -96,9 +161,9 @@ let physicalTestTable = reactive({
loading: true,
data: [],
searchParam: {
"resource_id":"",
"student_id":""
}
resource_id: '',
student_id: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -108,7 +173,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取体测列表
*/
@ -119,12 +183,14 @@ const loadPhysicalTestList = (page: number = 1) => {
getPhysicalTestList({
page: physicalTestTable.page,
limit: physicalTestTable.limit,
...physicalTestTable.searchParam
}).then(res => {
...physicalTestTable.searchParam,
})
.then((res) => {
physicalTestTable.loading = false
physicalTestTable.data = res.data.data
physicalTestTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
physicalTestTable.loading = false
})
}
@ -153,21 +219,19 @@ const editEvent = (data: any) => {
* 删除体测
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('physicalTestDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('physicalTestDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deletePhysicalTest(id).then(() => {
}).then(() => {
deletePhysicalTest(id)
.then(() => {
loadPhysicalTestList()
}).catch(() => {
})
.catch(() => {})
})
}
const resourceIdList = ref([])
const setResourceIdList = async () => {
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>
</div>
<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-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
v-for="(item, index) in resourceIdList"
@ -23,7 +34,12 @@
</el-form-item>
<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
v-for="(item, index) in studentIdList"
@ -35,15 +51,30 @@
</el-form-item>
<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 :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 :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
v-for="(item, index) in coachIdList"
@ -55,58 +86,119 @@
</el-form-item>
<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 :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 :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 :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 :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 :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 :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 :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 :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 :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 :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 :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>
</el-card>
<div class="fixed-footer-wrap">
<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>
</div>
</div>
@ -118,16 +210,21 @@ import { ref, reactive, computed, watch } from 'vue'
import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict'
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'
const route = useRoute()
const id:number = parseInt(route.query.id);
const id: number = parseInt(route.query.id)
const loading = ref(false)
const pageName = route.meta.title
/**
* 表单数据
*/
@ -160,7 +257,7 @@ const setFormData = async (id:number = 0) => {
if (data[key] != undefined) formData[key] = data[key]
})
}
if(id) setFormData(id);
if (id) setFormData(id)
const formRef = ref<FormInstance>()
//
@ -168,8 +265,6 @@ const selectData = ref<any[]>([])
//
const resourceIdList = ref([] as any[])
const setResourceIdList = async () => {
resourceIdList.value = await (await getWithCustomerResourcesList({})).data
@ -190,89 +285,75 @@ const formRules = computed(() => {
return {
resource_id: [
{ required: true, message: t('resourceIdPlaceholder'), trigger: 'blur' },
]
,
],
student_id: [
{ required: true, message: t('studentIdPlaceholder'), trigger: 'blur' },
]
,
],
height: [
{ required: true, message: t('heightPlaceholder'), trigger: 'blur' },
]
,
],
weight: [
{ required: true, message: t('weightPlaceholder'), trigger: 'blur' },
]
,
],
coach_id: [
{ required: true, message: t('coachIdPlaceholder'), trigger: 'blur' },
]
,
],
created_at: [
{ required: true, message: t('createdAtPlaceholder'), trigger: 'blur' },
]
,
],
updated_at: [
{ required: true, message: t('updatedAtPlaceholder'), trigger: 'blur' },
]
,
],
seated_forward_bend: [
{ required: true, message: t('seatedForwardBendPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('seatedForwardBendPlaceholder'),
trigger: 'blur',
},
],
sit_ups: [
{ required: true, message: t('sitUpsPlaceholder'), trigger: 'blur' },
]
,
],
push_ups: [
{ required: true, message: t('pushUpsPlaceholder'), trigger: 'blur' },
]
,
],
flamingo_balance: [
{ required: true, message: t('flamingoBalancePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('flamingoBalancePlaceholder'),
trigger: 'blur',
},
],
thirty_sec_jump: [
{ required: true, message: t('thirtySecJumpPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('thirtySecJumpPlaceholder'),
trigger: 'blur',
},
],
standing_long_jump: [
{ required: true, message: t('standingLongJumpPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('standingLongJumpPlaceholder'),
trigger: 'blur',
},
],
agility_run: [
{ required: true, message: t('agilityRunPlaceholder'), trigger: 'blur' },
]
,
],
balance_beam: [
{ required: true, message: t('balanceBeamPlaceholder'), trigger: 'blur' },
]
,
],
tennis_throw: [
{ required: true, message: t('tennisThrowPlaceholder'), trigger: 'blur' },
]
,
],
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
const save = id ? editPhysicalTest : addPhysicalTest
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
history.back()
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
})
}
@ -306,7 +388,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -322,7 +409,6 @@ const emailVerify = (rule: any, value: any, callback: any) => {
}
}
//
const numberVerify = (rule: any, value: any, callback: any) => {
if (!Number.isInteger(value)) {

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

@ -1,44 +1,89 @@
<template>
<!--支付设置-->
<div class="main-container" v-loading="payLoading">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center" v-if="!payLoading">
<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>
</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>
<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-[110px] text-center">{{ t('onState') }}</span>
<span class="text-base w-[80px] text-center" v-if="isEdit">{{ t('templateName') }}</span>
<span class="text-base w-[110px] text-center">{{
t('onState')
}}</span>
<span class="text-base w-[80px] text-center" v-if="isEdit">{{
t('templateName')
}}</span>
</div>
<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">
<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="mr-[15px] w-[30px] h-[30px] flex-shrink-0">
<img class="w-[30px]" :src="img(childrenItem.icon)" />
</div>
<span class="text-base text-[#666]">{{ childrenItem.name }}</span>
<span class="text-base text-[#666]">{{
childrenItem.name
}}</span>
</div>
</div>
<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>
<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>
<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 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>
<div
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>
</div>
</div>
@ -48,15 +93,23 @@
<div class="fixed-footer-wrap" v-if="isEdit">
<div class="fixed-footer">
<el-button type="primary" :loading="loading" @click="cancelFn">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="saveFn(formRef)">{{ t('save') }}</el-button>
<el-button type="primary" :loading="loading" @click="cancelFn">{{
t('cancel')
}}</el-button>
<el-button type="primary" :loading="loading" @click="saveFn(formRef)">{{
t('save')
}}</el-button>
</div>
</div>
<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>
</div>
</template>
@ -80,13 +133,16 @@ const modules: any = import.meta.glob('@/**/*.vue')
getAllPayType().then(({ data }) => {
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
})
const setPayTypeRefs = (el: any, index: string) => {
payTypeRefs.value[index] = (el)
payTypeRefs.value[index] = el
}
const payLoading = ref(true)
@ -97,7 +153,7 @@ const setConfigBtn = ref()
//
const payConfigData = ref([])
const checkPayConfigList = () => {
getPayConfigList().then(res => {
getPayConfigList().then((res) => {
const payData = res.data
for (const i in payData) {
const payType = payData[i].pay_type
@ -129,7 +185,7 @@ checkPayConfigList()
//
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) {
element.config = data.config
}
@ -145,7 +201,10 @@ const configPayFn = (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)
const verify = payTypeRefs.value[data.key].enableVerify()
@ -177,7 +236,7 @@ watch(isEdit, (newValue, oldValue) => {
const sortableFn = (item, index) => {
const sortable = Sortable.create(item, {
group: {
put: false //
put: false, //
},
handle: '.handle',
animation: 200,
@ -186,7 +245,7 @@ const sortableFn = (item, index) => {
const key = evt.target.getAttribute('data-key')
const data = payConfigData.value[key].pay_type
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()
isEdit.value = false
payLoading.value = false

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

@ -1,8 +1,26 @@
<template>
<el-dialog 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-dialog
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-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
v-for="(item, index) in studentIdList"
@ -14,7 +32,12 @@
</el-form-item>
<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
v-for="(item, index) in courseIdList"
@ -26,21 +49,36 @@
</el-form-item>
<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 :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 :label="t('startDate')" prop="start_date" class="input-width">
<el-form-item
:label="t('startDate')"
prop="start_date"
class="input-width"
>
<el-date-picker
class="flex-1 !flex"
v-model="formData.start_date"
clearable
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
:placeholder="t('startDatePlaceholder')">
:placeholder="t('startDatePlaceholder')"
>
</el-date-picker>
</el-form-item>
<el-form-item :label="t('endDate')" prop="end_date" class="input-width">
@ -50,7 +88,8 @@
clearable
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
:placeholder="t('endDatePlaceholder')">
:placeholder="t('endDatePlaceholder')"
>
</el-date-picker>
</el-form-item>
</el-form>
@ -58,9 +97,12 @@
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -71,7 +113,13 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
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)
const loading = ref(false)
@ -97,34 +145,22 @@ const formRules = computed(() => {
return {
student_id: [
{ required: true, message: t('studentIdPlaceholder'), trigger: 'blur' },
]
,
],
course_id: [
{ required: true, message: t('courseIdPlaceholder'), trigger: 'blur' },
]
,
],
total_hours: [
{ required: true, message: t('totalHoursPlaceholder'), trigger: 'blur' },
]
,
],
gift_hours: [
{ required: true, message: t('giftHoursPlaceholder'), trigger: 'blur' },
]
,
],
start_date: [
{ required: true, message: t('startDatePlaceholder'), trigger: 'blur' },
]
,
],
end_date: [
{ required: true, message: t('endDatePlaceholder'), trigger: 'blur' },
]
,
],
}
})
@ -144,11 +180,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -157,8 +195,6 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const studentIdList = ref([] as any[])
const setStudentIdList = async () => {
studentIdList.value = await (await getWithStudentList({})).data
@ -174,7 +210,8 @@ const setFormData = async (row: any = null) => {
loading.value = true
if (row) {
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]
})
}
@ -192,7 +229,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -219,7 +261,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

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

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,11 +8,22 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="studentCoursesTable.searchParam" ref="searchFormRef">
<el-card
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-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
v-for="(item, index) in studentIdList"
:key="index"
@ -23,9 +33,13 @@
</el-select>
</el-form-item>
<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
v-for="(item, index) in courseIdList"
:key="index"
@ -36,41 +50,93 @@
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadStudentCoursesList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadStudentCoursesList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<div class="mt-[10px]">
<el-table :data="studentCoursesTable.data" size="large" v-loading="studentCoursesTable.loading">
<el-table
:data="studentCoursesTable.data"
size="large"
v-loading="studentCoursesTable.loading"
>
<template #empty>
<span>{{ !studentCoursesTable.loading ? t('emptyData') : '' }}</span>
<span>{{
!studentCoursesTable.loading ? t('emptyData') : ''
}}</span>
</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 }">
<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="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="studentCoursesTable.page" v-model:page-size="studentCoursesTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="studentCoursesTable.total"
@size-change="loadStudentCoursesList()" @current-change="loadStudentCoursesList" />
<el-pagination
v-model:current-page="studentCoursesTable.page"
v-model:page-size="studentCoursesTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="studentCoursesTable.total"
@size-change="loadStudentCoursesList()"
@current-change="loadStudentCoursesList"
/>
</div>
</div>
@ -83,13 +149,18 @@
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
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 { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/student_courses/components/student-courses-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let studentCoursesTable = reactive({
page: 1,
@ -98,9 +169,9 @@ let studentCoursesTable = reactive({
loading: true,
data: [],
searchParam: {
"student_id":"",
"course_id":""
}
student_id: '',
course_id: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -110,7 +181,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取学员课程列表
*/
@ -121,12 +191,14 @@ const loadStudentCoursesList = (page: number = 1) => {
getStudentCoursesList({
page: studentCoursesTable.page,
limit: studentCoursesTable.limit,
...studentCoursesTable.searchParam
}).then(res => {
...studentCoursesTable.searchParam,
})
.then((res) => {
studentCoursesTable.loading = false
studentCoursesTable.data = res.data.data
studentCoursesTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
studentCoursesTable.loading = false
})
}
@ -155,21 +227,19 @@ const editEvent = (data: any) => {
* 删除学员课程
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('studentCoursesDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('studentCoursesDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteStudentCourses(id).then(() => {
}).then(() => {
deleteStudentCourses(id)
.then(() => {
loadStudentCoursesList()
}).catch(() => {
})
.catch(() => {})
})
}
const studentIdList = ref([])
const setStudentIdList = async () => {
studentIdList.value = await (await getWithStudentList({})).data

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

@ -8,7 +8,6 @@
>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">体测列表</span>
<el-button type="primary" @click="addEvent">
@ -45,6 +44,7 @@
<el-form-item :label="t('height')" prop="height">
<el-input v-model="physicalTestTable.searchParam.height" :placeholder="t('heightPlaceholder')" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadPhysicalTestList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
@ -53,39 +53,79 @@
</el-card> -->
<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>
<span>{{ !physicalTestTable.loading ? t('emptyData') : '' }}</span>
<span>{{
!physicalTestTable.loading ? t('emptyData') : ''
}}</span>
</template>
<el-table-column prop="resource_id_name" :label="t('resourceId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="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 }">
<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> -->
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="physicalTestTable.page" v-model:page-size="physicalTestTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="physicalTestTable.total"
@size-change="loadPhysicalTestList()" @current-change="loadPhysicalTestList" />
<el-pagination
v-model:current-page="physicalTestTable.page"
v-model:page-size="physicalTestTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="physicalTestTable.total"
@size-change="loadPhysicalTestList()"
@current-change="loadPhysicalTestList"
/>
</div>
</div>
<edit ref="editPhysicalTestDialog" @complete="loadPhysicalTestList" />
</el-card>
</div>
</el-dialog>
</template>
@ -93,18 +133,22 @@
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict'
import { getPhysicalTestList, deletePhysicalTest, getWithCustomerResourcesList, getWithStudentList, getWithPersonnelList } from '@/app/api/physical_test'
import {
getPhysicalTestList,
deletePhysicalTest,
getWithCustomerResourcesList,
getWithStudentList,
getWithPersonnelList,
} from '@/app/api/physical_test'
import { img } from '@/utils/common'
import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/physical_test/components/physical-test-edit.vue'
import { useRouter } from 'vue-router'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let showDialog = ref(false)
let physicalTestTable = reactive({
page: 1,
limit: 10,
@ -112,10 +156,10 @@ let physicalTestTable = reactive({
loading: true,
data: [],
searchParam: {
"resource_id":"",
"student_id":"",
"height":""
}
resource_id: '',
student_id: '',
height: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -125,7 +169,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取体测列表
*/
@ -136,17 +179,18 @@ const loadPhysicalTestList = (page: number = 1) => {
getPhysicalTestList({
page: physicalTestTable.page,
limit: physicalTestTable.limit,
...physicalTestTable.searchParam
}).then(res => {
...physicalTestTable.searchParam,
})
.then((res) => {
physicalTestTable.loading = false
physicalTestTable.data = res.data.data
physicalTestTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
physicalTestTable.loading = false
})
}
const router = useRouter()
const editPhysicalTestDialog: Record<string, any> | null = ref(null)
@ -155,11 +199,12 @@ const editPhysicalTestDialog: Record<string, any> | null = ref(null)
* 添加体测
*/
const addEvent = () => {
editPhysicalTestDialog.value.setFormData({'resource_id':physicalTestTable.searchParam.resource_id})
editPhysicalTestDialog.value.setFormData({
resource_id: physicalTestTable.searchParam.resource_id,
})
editPhysicalTestDialog.value.showDialog = true
}
/**
* 编辑体测
* @param data
@ -174,21 +219,19 @@ const editEvent = (data: any) => {
* 删除体测
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('physicalTestDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('physicalTestDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deletePhysicalTest(id).then(() => {
}).then(() => {
deletePhysicalTest(id)
.then(() => {
loadPhysicalTestList()
}).catch(() => {
})
.catch(() => {})
})
}
const resourceIdList = ref([])
const setResourceIdList = async () => {
resourceIdList.value = await (await getWithCustomerResourcesList({})).data
@ -211,18 +254,17 @@ const resetForm = (formEl: FormInstance | undefined) => {
loadPhysicalTestList()
}
const setFormData = async (row: any = null) => {
// Object.assign(formData, initialFormData)
physicalTestTable.searchParam.resource_id = row.resource_id
console.log(physicalTestTable.searchParam.resource_id);
console.log(physicalTestTable.searchParam.resource_id)
loadPhysicalTestList()
}
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

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

@ -26,7 +26,9 @@
value-format="YYYY-MM-DD"
@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>
<el-button @click="addSchedule">添加课程</el-button>
</div>
@ -66,7 +68,9 @@
>
<template #default="{ row }">
<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">
<el-tag
v-for="student in row.course.students"
@ -88,8 +92,15 @@
<!-- 详情弹窗 -->
<el-dialog v-model="dialogVisible" title="课程详情">
<p><strong>教师:</strong> {{ getTeacherName(selectedCourse?.teacher) }}</p>
<p><strong>学员:</strong> {{ selectedCourse?.students.map(id => getStudentName(id)).join(', ') }}</p>
<p>
<strong>教师:</strong> {{ getTeacherName(selectedCourse?.teacher) }}
</p>
<p>
<strong>学员:</strong>
{{
selectedCourse?.students.map((id) => getStudentName(id)).join(', ')
}}
</p>
</el-dialog>
</div>
</el-card>
@ -107,7 +118,7 @@ const selectedCampus = ref('')
//
const dateRange = ref([
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>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never" v-loading="loading">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addStage">
新增阶段
</el-button>
<el-button type="primary" @click="addStage"> 新增阶段 </el-button>
</div>
</el-card>
<el-card class="box-card !border-none" shadow="never">
<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]">阶段名称</span>
<span class="text-base w-[110px] text-center">底薪</span>
</div>
<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>
<div class="collapse-title">
<span class="title-name">{{ stage.name }}</span>
@ -42,20 +41,26 @@
</el-form-item>
</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-column prop="renewal_standard_min" label="续费上限">
<template #default="{ row }">
<el-input v-model="row.renewal_standard_min" placeholder="请输入续费上限" />
<el-input
v-model="row.renewal_standard_min"
placeholder="请输入续费上限"
/>
</template>
</el-table-column>
<el-table-column prop="renewal_standard_max" label="续费下限">
<template #default="{ row }">
<el-input v-model="row.renewal_standard_max" placeholder="请输入续费下限" />
<el-input
v-model="row.renewal_standard_max"
placeholder="请输入续费下限"
/>
</template>
</el-table-column>
@ -89,17 +94,27 @@
</el-table-column>
<el-table-column label="操作" width="100">
<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>
</el-table-column>
</el-table>
<el-button type="danger" size="small" style="margin-top: 10px"
@click="removeStage(index)">删除该阶段</el-button>
<el-button
type="danger"
size="small"
style="margin-top: 10px"
@click="removeStage(index)"
>删除该阶段</el-button
>
</el-collapse-item>
</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>
</div>
</el-card>
@ -122,15 +137,17 @@
const newStage = {
name: '默认阶段',
price: 0,
rules: [{
rules: [
{
renewal_standard_min: '',
renewal_standard_max: '',
renewal_commission: '',
new_count_min: '',
new_count_max: '',
new_move_5: '',
new_move_7: ''
}]
new_move_7: '',
},
],
}
stages.value.push(newStage)
activeNames.value = newStage.name
@ -148,7 +165,7 @@
new_count_min: '',
new_count_max: '',
new_move_5: '',
new_move_7: ''
new_move_7: '',
})
}
@ -166,7 +183,7 @@
loading.value = false
}
setFormData();
setFormData()
const onSave = async () => {
xsyjConfig(stages.value)
@ -200,7 +217,7 @@
.title-salary {
width: 110px;
text-align: center;
color: #7438D5;
color: #7438d5;
}
.arrow {
@ -208,5 +225,4 @@
color: #999;
font-size: 14px;
}
</style>

Loading…
Cancel
Save