Browse Source

1

yuhongzhe
于宏哲PHP 10 months ago
parent
commit
e50342b3d5
  1. 33
      admin/src/app/api/physical_test.ts
  2. 53
      admin/src/app/lang/zh-cn/customer_resources.customer_resources.json
  3. 78
      admin/src/app/lang/zh-cn/physical_test.physical_test.json
  4. 39
      admin/src/app/lang/zh-cn/physical_test.physical_test_edit.json
  5. 37
      admin/src/app/lang/zh-cn/tc_dialog.physical_test_edit.json
  6. 17
      admin/src/app/views/customer_resources/customer_resources.vue
  7. 723
      admin/src/app/views/physical_test/components/physical-test-edit.vue
  8. 632
      admin/src/app/views/physical_test/physical_test.vue
  9. 339
      admin/src/app/views/physical_test/physical_test_edit.vue
  10. 239
      admin/src/app/views/tc_dialog/tc_dialog.vue
  11. 33
      niucloud/app/adminapi/controller/physical_test/PhysicalTest.php
  12. 9
      niucloud/app/adminapi/route/physical_test.php
  13. 210
      niucloud/app/model/physical_test/PhysicalTest.php
  14. 22
      niucloud/app/service/admin/physical_test/PhysicalTestService.php
  15. 4
      niucloud/app/validate/physical_test/PhysicalTest.php

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

@ -1,5 +1,11 @@
import request from '@/utils/request'
// USER_CODE_BEGIN -- physical_test
/**
*
@ -7,7 +13,7 @@ import request from '@/utils/request'
* @returns
*/
export function getPhysicalTestList(params: Record<string, any>) {
return request.get(`physical_test/physical_test`, { params })
return request.get(`physical_test/physical_test`, {params})
}
/**
@ -16,7 +22,7 @@ export function getPhysicalTestList(params: Record<string, any>) {
* @returns
*/
export function getPhysicalTestInfo(id: number) {
return request.get(`physical_test/physical_test/${id}`)
return request.get(`physical_test/physical_test/${id}`);
}
/**
@ -25,10 +31,7 @@ export function getPhysicalTestInfo(id: number) {
* @returns
*/
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 })
}
/**
@ -38,10 +41,7 @@ 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,10 +50,15 @@ 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>){
return request.get('physical_test/student_all', {params})
}export function getWithPersonnelList(params: Record<string,any>){
return request.get('physical_test/personnel_all', {params})
}
// USER_CODE_END -- physical_test

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

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

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

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

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

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

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

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

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

@ -98,7 +98,7 @@
<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="type == 'khzy'">
<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>
@ -124,6 +124,8 @@
<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>
@ -141,6 +143,8 @@
<fp ref="fpCustomerResourcesDialog" @complete="loadCustomerResourcesList" />
<Order ref="editOrderTableDialog" @complete="loadCustomerResourcesList" />
<tc ref="TcCustomerResourcesDialog" @complete="loadCustomerResourcesList" />
</el-card>
</div>
@ -156,6 +160,8 @@
import Edit from '@/app/views/customer_resources/components/customer-resources-edit.vue'
import Fp from '@/app/views/customer_resources/components/fp.vue'
import Order from '@/app/views/order_table/components/order-table-edit.vue'
import Tc from '@/app/views/tc_dialog/tc_dialog.vue'
import { useRouter, useRoute } from 'vue-router'
const route = useRoute()
@ -212,6 +218,15 @@
}
const TcCustomerResourcesDialog : Record<string, any> | null = ref(null)
const tcEvent = (row : any) => {
TcCustomerResourcesDialog.value.setFormData(row)
TcCustomerResourcesDialog.value.showDialog = true
}
const searchFormRef = ref<FormInstance>()
//

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

@ -1,399 +1,324 @@
<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-form-item :label="t('resourceId')" prop="resource_id">
<el-input
v-model="formData.resource_id"
clearable
:placeholder="t('resourceIdPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('studentId')" prop="student_id">
<el-input
v-model="formData.student_id"
clearable
:placeholder="t('studentIdPlaceholder')"
class="input-width"
/>
</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-form-item>
<el-form-item :label="t('weight')" prop="weight">
<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-input
v-model="formData.coach_id"
clearable
:placeholder="t('coachIdPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('createdAt')">
<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-form-item>
<el-form-item :label="t('seatedForwardBend')">
<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-form-item>
<el-form-item :label="t('pushUps')">
<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-form-item>
<el-form-item :label="t('thirtySecJump')">
<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-form-item>
<el-form-item :label="t('agilityRun')">
<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-form-item>
<el-form-item :label="t('tennisThrow')">
<el-input
v-model="formData.tennis_throw"
clearable
:placeholder="t('tennisThrowPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('tenMeterShuttleRun')">
<el-input
v-model="formData.ten_meter_shuttle_run"
clearable
:placeholder="t('tenMeterShuttleRunPlaceholder')"
class="input-width"
/>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
import type { FormInstance } from 'element-plus'
import {
addPhysicalTest,
editPhysicalTest,
getPhysicalTestInfo,
} from '@/app/api/physical_test'
let showDialog = ref(false)
const loading = ref(false)
/**
* 表单数据
*/
const initialFormData = {
id: '',
resource_id: '',
student_id: '',
height: '',
weight: '',
coach_id: '',
created_at: '',
updated_at: '',
seated_forward_bend: '',
sit_ups: '',
push_ups: '',
flamingo_balance: '',
thirty_sec_jump: '',
standing_long_jump: '',
agility_run: '',
balance_beam: '',
tennis_throw: '',
ten_meter_shuttle_run: '',
}
const formData: Record<string, any> = reactive({ ...initialFormData })
const formRef = ref<FormInstance>()
//
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',
},
],
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',
},
],
thirty_sec_jump: [
{
required: true,
message: t('thirtySecJumpPlaceholder'),
trigger: 'blur',
},
],
standing_long_jump: [
{
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',
},
],
}
})
const emit = defineEmits(['complete'])
/**
* 确认
* @param formEl
*/
const confirm = async (formEl: FormInstance | undefined) => {
if (loading.value || !formEl) return
let save = formData.id ? editPhysicalTest : addPhysicalTest
await formEl.validate(async (valid) => {
if (valid) {
loading.value = true
let data = formData
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
})
.catch((err) => {
loading.value = false
})
}
})
}
//
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
const data = await (await getPhysicalTestInfo(row.id)).data
if (data)
Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key]
})
}
loading.value = false
}
//
const mobileVerify = (rule: any, value: any, callback: any) => {
if (value && !/^1[3-9]\d{9}$/.test(value)) {
callback(new Error(t('generateMobile')))
} else {
callback()
}
}
//
const idCardVerify = (rule: any, value: any, callback: any) => {
if (
value &&
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
value
)
) {
callback(new Error(t('generateIdCard')))
} else {
callback()
}
}
//
const emailVerify = (rule: any, value: any, callback: any) => {
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) {
callback(new Error(t('generateEmail')))
} else {
callback()
}
}
//
const numberVerify = (rule: any, value: any, callback: any) => {
if (!Number.isInteger(value)) {
callback(new Error(t('generateNumber')))
} else {
callback()
}
}
defineExpose({
showDialog,
setFormData,
})
</script>
<style lang="scss" scoped></style>
<style lang="scss">
.diy-dialog-wrap .el-form-item__label {
height: auto !important;
}
</style>
<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-form-item :label="t('resourceId')" prop="resource_id">
<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"
:key="index"
:label="item['name']"
:value="item['id']"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('studentId')" prop="student_id">
<el-select class="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"
:key="index"
:label="item['name']"
:value="item['id']"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('height')" prop="height">
<el-input v-model="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-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-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in coachIdList"
:key="index"
:label="item['name']"
:value="item['id']"
/>
</el-select>
</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-form-item>
<el-form-item :label="t('sitUps')" >
<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-form-item>
<el-form-item :label="t('flamingoBalance')" >
<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-form-item>
<el-form-item :label="t('standingLongJump')" >
<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-form-item>
<el-form-item :label="t('balanceBeam')" >
<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-form-item>
<el-form-item :label="t('tenMeterShuttleRun')" >
<el-input v-model="formData.ten_meter_shuttle_run" clearable :placeholder="t('tenMeterShuttleRunPlaceholder')" class="input-width" />
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
</span>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
import type { FormInstance } from 'element-plus'
import { addPhysicalTest, editPhysicalTest, getPhysicalTestInfo, getWithCustomerResourcesList, getWithStudentList, getWithPersonnelList } from '@/app/api/physical_test'
let showDialog = ref(false)
const loading = ref(false)
/**
* 表单数据
*/
const initialFormData = {
id: '',
resource_id: '',
student_id: '',
height: '',
weight: '',
coach_id: '',
seated_forward_bend: '',
sit_ups: '',
push_ups: '',
flamingo_balance: '',
thirty_sec_jump: '',
standing_long_jump: '',
agility_run: '',
balance_beam: '',
tennis_throw: '',
ten_meter_shuttle_run: '',
}
const formData: Record<string, any> = reactive({ ...initialFormData })
const formRef = ref<FormInstance>()
//
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' },
]
,
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' },
]
,
thirty_sec_jump: [
{ required: true, message: t('thirtySecJumpPlaceholder'), trigger: 'blur' },
]
,
standing_long_jump: [
{ 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' },
]
,
}
})
const emit = defineEmits(['complete'])
/**
* 确认
* @param formEl
*/
const confirm = async (formEl: FormInstance | undefined) => {
if (loading.value || !formEl) return
let save = formData.id ? editPhysicalTest : addPhysicalTest
await formEl.validate(async (valid) => {
if (valid) {
loading.value = true
let data = formData
save(data).then(res => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
loading.value = false
})
}
})
}
//
const resourceIdList = ref([] as any[])
const setResourceIdList = async () => {
resourceIdList.value = await (await getWithCustomerResourcesList({})).data
}
setResourceIdList()
const studentIdList = ref([] as any[])
const setStudentIdList = async () => {
studentIdList.value = await (await getWithStudentList({})).data
}
setStudentIdList()
const coachIdList = ref([] as any[])
const setCoachIdList = async () => {
coachIdList.value = await (await getWithPersonnelList({})).data
}
setCoachIdList()
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
Object.assign(formData, row)
// if(row){
// const data = await (await getPhysicalTestInfo(row.id)).data
// if (data) Object.keys(formData).forEach((key: string) => {
// if (data[key] != undefined) formData[key] = data[key]
// })
// }
loading.value = false
}
//
const mobileVerify = (rule: any, value: any, callback: any) => {
if (value && !/^1[3-9]\d{9}$/.test(value)) {
callback(new Error(t('generateMobile')))
} else {
callback()
}
}
//
const idCardVerify = (rule: any, value: any, callback: any) => {
if (value && !/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value)) {
callback(new Error(t('generateIdCard')))
} else {
callback()
}
}
//
const emailVerify = (rule: any, value: any, callback: any) => {
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) {
callback(new Error(t('generateEmail')))
} else {
callback()
}
}
//
const numberVerify = (rule: any, value: any, callback: any) => {
if (!Number.isInteger(value)) {
callback(new Error(t('generateNumber')))
} else {
callback()
}
}
defineExpose({
showDialog,
setFormData
})
</script>
<style lang="scss" scoped></style>
<style lang="scss">
.diy-dialog-wrap .el-form-item__label{
height: auto !important;
}
</style>

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

@ -1,428 +1,204 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
{{ t('addPhysicalTest') }}
</el-button>
</div>
<el-card
class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="physicalTestTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('resourceId')" prop="resource_id">
<el-input
v-model="physicalTestTable.searchParam.resource_id"
:placeholder="t('resourceIdPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('studentId')" prop="student_id">
<el-input
v-model="physicalTestTable.searchParam.student_id"
:placeholder="t('studentIdPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('height')" prop="height">
<el-input
v-model="physicalTestTable.searchParam.height"
:placeholder="t('heightPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('weight')" prop="weight">
<el-input
v-model="physicalTestTable.searchParam.weight"
:placeholder="t('weightPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('coachId')" prop="coach_id">
<el-input
v-model="physicalTestTable.searchParam.coach_id"
:placeholder="t('coachIdPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('createdAt')" prop="created_at">
<el-input
v-model="physicalTestTable.searchParam.created_at"
:placeholder="t('createdAtPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('updatedAt')" prop="updated_at">
<el-input
v-model="physicalTestTable.searchParam.updated_at"
:placeholder="t('updatedAtPlaceholder')"
/>
</el-form-item>
<el-form-item
:label="t('seatedForwardBend')"
prop="seated_forward_bend"
>
<el-input
v-model="physicalTestTable.searchParam.seated_forward_bend"
:placeholder="t('seatedForwardBendPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('sitUps')" prop="sit_ups">
<el-input
v-model="physicalTestTable.searchParam.sit_ups"
:placeholder="t('sitUpsPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('pushUps')" prop="push_ups">
<el-input
v-model="physicalTestTable.searchParam.push_ups"
:placeholder="t('pushUpsPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('flamingoBalance')" prop="flamingo_balance">
<el-input
v-model="physicalTestTable.searchParam.flamingo_balance"
:placeholder="t('flamingoBalancePlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('thirtySecJump')" prop="thirty_sec_jump">
<el-input
v-model="physicalTestTable.searchParam.thirty_sec_jump"
:placeholder="t('thirtySecJumpPlaceholder')"
/>
</el-form-item>
<el-form-item
:label="t('standingLongJump')"
prop="standing_long_jump"
>
<el-input
v-model="physicalTestTable.searchParam.standing_long_jump"
:placeholder="t('standingLongJumpPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('agilityRun')" prop="agility_run">
<el-input
v-model="physicalTestTable.searchParam.agility_run"
:placeholder="t('agilityRunPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('balanceBeam')" prop="balance_beam">
<el-input
v-model="physicalTestTable.searchParam.balance_beam"
:placeholder="t('balanceBeamPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('tennisThrow')" prop="tennis_throw">
<el-input
v-model="physicalTestTable.searchParam.tennis_throw"
:placeholder="t('tennisThrowPlaceholder')"
/>
</el-form-item>
<el-form-item
:label="t('tenMeterShuttleRun')"
prop="ten_meter_shuttle_run"
>
<el-input
v-model="physicalTestTable.searchParam.ten_meter_shuttle_run"
:placeholder="t('tenMeterShuttleRunPlaceholder')"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadPhysicalTestList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<div class="mt-[10px]">
<el-table
:data="physicalTestTable.data"
size="large"
v-loading="physicalTestTable.loading"
>
<template #empty>
<span>{{ !physicalTestTable.loading ? t('emptyData') : '' }}</span>
</template>
<el-table-column
prop="resource_id"
:label="t('resourceId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="student_id"
: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="weight"
:label="t('weight')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="coach_id"
:label="t('coachId')"
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="seated_forward_bend"
:label="t('seatedForwardBend')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="sit_ups"
:label="t('sitUps')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="push_ups"
:label="t('pushUps')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="flamingo_balance"
:label="t('flamingoBalance')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="thirty_sec_jump"
:label="t('thirtySecJump')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="standing_long_jump"
:label="t('standingLongJump')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="agility_run"
:label="t('agilityRun')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="balance_beam"
:label="t('balanceBeam')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="tennis_throw"
:label="t('tennisThrow')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="ten_meter_shuttle_run"
:label="t('tenMeterShuttleRun')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination
v-model:current-page="physicalTestTable.page"
v-model:page-size="physicalTestTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="physicalTestTable.total"
@size-change="loadPhysicalTestList()"
@current-change="loadPhysicalTestList"
/>
</div>
</div>
<edit ref="editPhysicalTestDialog" @complete="loadPhysicalTestList" />
</el-card>
</div>
</template>
<script lang="ts" setup>
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict'
import {
getPhysicalTestList,
deletePhysicalTest,
} 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
let physicalTestTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
resource_id: '',
student_id: '',
height: '',
weight: '',
coach_id: '',
created_at: '',
updated_at: '',
seated_forward_bend: '',
sit_ups: '',
push_ups: '',
flamingo_balance: '',
thirty_sec_jump: '',
standing_long_jump: '',
agility_run: '',
balance_beam: '',
tennis_throw: '',
ten_meter_shuttle_run: '',
},
})
const searchFormRef = ref<FormInstance>()
//
const selectData = ref<any[]>([])
//
/**
* 获取体测列表
*/
const loadPhysicalTestList = (page: number = 1) => {
physicalTestTable.loading = true
physicalTestTable.page = page
getPhysicalTestList({
page: physicalTestTable.page,
limit: physicalTestTable.limit,
...physicalTestTable.searchParam,
})
.then((res) => {
physicalTestTable.loading = false
physicalTestTable.data = res.data.data
physicalTestTable.total = res.data.total
})
.catch(() => {
physicalTestTable.loading = false
})
}
loadPhysicalTestList()
const editPhysicalTestDialog: Record<string, any> | null = ref(null)
/**
* 添加体测
*/
const addEvent = () => {
editPhysicalTestDialog.value.setFormData()
editPhysicalTestDialog.value.showDialog = true
}
/**
* 编辑体测
* @param data
*/
const editEvent = (data: any) => {
editPhysicalTestDialog.value.setFormData(data)
editPhysicalTestDialog.value.showDialog = true
}
/**
* 删除体测
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('physicalTestDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}).then(() => {
deletePhysicalTest(id)
.then(() => {
loadPhysicalTestList()
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()
loadPhysicalTestList()
}
</script>
<style lang="scss" scoped>
/* 多行超出隐藏 */
.multi-hidden {
word-break: break-all;
text-overflow: ellipsis;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
</style>
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{pageName}}</span>
<el-button type="primary" @click="addEvent">
{{ t('addPhysicalTest') }}
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="physicalTestTable.searchParam" ref="searchFormRef">
<el-form-item :label="t('resourceId')" prop="resource_id">
<el-select class="w-[280px]" v-model="physicalTestTable.searchParam.resource_id" clearable :placeholder="t('resourceIdPlaceholder')">
<el-option
v-for="(item, index) in resourceIdList"
:key="index"
:label="item['name']"
:value="item['id']"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('studentId')" prop="student_id">
<el-select class="w-[280px]" v-model="physicalTestTable.searchParam.student_id" clearable :placeholder="t('studentIdPlaceholder')">
<el-option
v-for="(item, index) in studentIdList"
:key="index"
:label="item['name']"
:value="item['id']"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadPhysicalTestList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
</el-form-item>
</el-form>
</el-card>
<div class="mt-[10px]">
<el-table :data="physicalTestTable.data" size="large" v-loading="physicalTestTable.loading">
<template #empty>
<span>{{ !physicalTestTable.loading ? t('emptyData') : '' }}</span>
</template>
<el-table-column prop="resource_id_name" :label="t('resourceId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="student_id_name" :label="t('studentId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="height" :label="t('height')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="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 :label="t('operation')" fixed="right" min-width="120">
<template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="physicalTestTable.page" v-model:page-size="physicalTestTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="physicalTestTable.total"
@size-change="loadPhysicalTestList()" @current-change="loadPhysicalTestList" />
</div>
</div>
<edit ref="editPhysicalTestDialog" @complete="loadPhysicalTestList" />
</el-card>
</div>
</template>
<script lang="ts" setup>
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict'
import { getPhysicalTestList, deletePhysicalTest, getWithCustomerResourcesList, getWithStudentList, getWithPersonnelList } from '@/app/api/physical_test'
import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/physical_test/components/physical-test-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
let physicalTestTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam:{
"resource_id":"",
"student_id":""
}
})
const searchFormRef = ref<FormInstance>()
//
const selectData = ref<any[]>([])
//
/**
* 获取体测列表
*/
const loadPhysicalTestList = (page: number = 1) => {
physicalTestTable.loading = true
physicalTestTable.page = page
getPhysicalTestList({
page: physicalTestTable.page,
limit: physicalTestTable.limit,
...physicalTestTable.searchParam
}).then(res => {
physicalTestTable.loading = false
physicalTestTable.data = res.data.data
physicalTestTable.total = res.data.total
}).catch(() => {
physicalTestTable.loading = false
})
}
loadPhysicalTestList()
const editPhysicalTestDialog: Record<string, any> | null = ref(null)
/**
* 添加体测
*/
const addEvent = () => {
editPhysicalTestDialog.value.setFormData()
editPhysicalTestDialog.value.showDialog = true
}
/**
* 编辑体测
* @param data
*/
const editEvent = (data: any) => {
editPhysicalTestDialog.value.setFormData(data)
editPhysicalTestDialog.value.showDialog = true
}
/**
* 删除体测
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('physicalTestDeleteTips'), t('warning'),
{
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deletePhysicalTest(id).then(() => {
loadPhysicalTestList()
}).catch(() => {
})
})
}
const resourceIdList = ref([])
const setResourceIdList = async () => {
resourceIdList.value = await (await getWithCustomerResourcesList({})).data
}
setResourceIdList()
const studentIdList = ref([])
const setStudentIdList = async () => {
studentIdList.value = await (await getWithStudentList({})).data
}
setStudentIdList()
const coachIdList = ref([])
const setCoachIdList = async () => {
coachIdList.value = await (await getWithPersonnelList({})).data
}
setCoachIdList()
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()
loadPhysicalTestList()
}
</script>
<style lang="scss" scoped>
/* 多行超出隐藏 */
.multi-hidden {
word-break: break-all;
text-overflow: ellipsis;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
</style>

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

@ -0,0 +1,339 @@
<template>
<div class="main-container">
<div class="detail-head">
<div class="left" @click="back()">
<span class="iconfont iconxiangzuojiantou !text-xs"></span>
<span class="ml-[1px]">{{t('returnToPreviousPage')}}</span>
</div>
<span class="adorn">|</span>
<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-item :label="t('resourceId')" prop="resource_id">
<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"
:key="index"
:label="item['name']"
:value="item['id']"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('studentId')" prop="student_id">
<el-select class="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"
:key="index"
:label="item['name']"
:value="item['id']"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('height')" prop="height">
<el-input v-model="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-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-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in coachIdList"
:key="index"
:label="item['name']"
:value="item['id']"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('createdAt')" >
<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-form-item>
<el-form-item :label="t('seatedForwardBend')" >
<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-form-item>
<el-form-item :label="t('pushUps')" >
<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-form-item>
<el-form-item :label="t('thirtySecJump')" >
<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-form-item>
<el-form-item :label="t('agilityRun')" >
<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-form-item>
<el-form-item :label="t('tennisThrow')" >
<el-input v-model="formData.tennis_throw" clearable :placeholder="t('tennisThrowPlaceholder')" class="input-width" />
</el-form-item>
<el-form-item :label="t('tenMeterShuttleRun')" >
<el-input v-model="formData.ten_meter_shuttle_run" clearable :placeholder="t('tenMeterShuttleRunPlaceholder')" class="input-width" />
</el-form-item>
</el-form>
</el-card>
<div class="fixed-footer-wrap">
<div class="fixed-footer">
<el-button type="primary" @click="onSave(formRef)">{{ t('save') }}</el-button>
<el-button @click="back()">{{ t('cancel') }}</el-button>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
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 { useRoute } from 'vue-router'
const route = useRoute()
const id:number = parseInt(route.query.id);
const loading = ref(false)
const pageName = route.meta.title
/**
* 表单数据
*/
const initialFormData = {
id: 0,
resource_id: '',
student_id: '',
height: '',
weight: '',
coach_id: '',
created_at: '',
updated_at: '',
seated_forward_bend: '',
sit_ups: '',
push_ups: '',
flamingo_balance: '',
thirty_sec_jump: '',
standing_long_jump: '',
agility_run: '',
balance_beam: '',
tennis_throw: '',
ten_meter_shuttle_run: '',
}
const formData: Record<string, any> = reactive({ ...initialFormData })
const setFormData = async (id:number = 0) => {
Object.assign(formData, initialFormData)
const data = await (await getPhysicalTestInfo(id)).data
Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key]
})
}
if(id) setFormData(id);
const formRef = ref<FormInstance>()
//
const selectData = ref<any[]>([])
//
const resourceIdList = ref([] as any[])
const setResourceIdList = async () => {
resourceIdList.value = await (await getWithCustomerResourcesList({})).data
}
setResourceIdList()
const studentIdList = ref([] as any[])
const setStudentIdList = async () => {
studentIdList.value = await (await getWithStudentList({})).data
}
setStudentIdList()
const coachIdList = ref([] as any[])
const setCoachIdList = async () => {
coachIdList.value = await (await getWithPersonnelList({})).data
}
setCoachIdList()
//
const formRules = computed(() => {
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' },
]
,
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' },
]
,
thirty_sec_jump: [
{ required: true, message: t('thirtySecJumpPlaceholder'), trigger: 'blur' },
]
,
standing_long_jump: [
{ 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' },
]
,
}
})
const onSave = async (formEl: FormInstance | undefined) => {
if (loading.value || !formEl) return
await formEl.validate(async (valid) => {
if (valid) {
loading.value = true
let data = formData
const save = id ? editPhysicalTest : addPhysicalTest
save(data).then(res => {
loading.value = false
history.back()
}).catch(err => {
loading.value = false
})
}
})
}
//
const mobileVerify = (rule: any, value: any, callback: any) => {
if (value && !/^1[3-9]\d{9}$/.test(value)) {
callback(new Error(t('generateMobile')))
} else {
callback()
}
}
//
const idCardVerify = (rule: any, value: any, callback: any) => {
if (value && !/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value)) {
callback(new Error(t('generateIdCard')))
} else {
callback()
}
}
//
const emailVerify = (rule: any, value: any, callback: any) => {
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) {
callback(new Error(t('generateEmail')))
} else {
callback()
}
}
//
const numberVerify = (rule: any, value: any, callback: any) => {
if (!Number.isInteger(value)) {
callback(new Error(t('generateNumber')))
} else {
callback()
}
}
const back = () => {
history.back()
}
</script>
<style lang="scss" scoped></style>

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

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

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

@ -29,22 +29,7 @@ class PhysicalTest extends BaseAdminController
public function lists(){
$data = $this->request->params([
["resource_id",""],
["student_id",""],
["height",""],
["weight",""],
["coach_id",""],
["created_at",""],
["updated_at",""],
["seated_forward_bend",""],
["sit_ups",""],
["push_ups",""],
["flamingo_balance",""],
["thirty_sec_jump",""],
["standing_long_jump",""],
["agility_run",""],
["balance_beam",""],
["tennis_throw",""],
["ten_meter_shuttle_run",""]
["student_id",""]
]);
return success((new PhysicalTestService())->getPage($data));
}
@ -69,8 +54,6 @@ class PhysicalTest extends BaseAdminController
["height",0.00],
["weight",0.00],
["coach_id",0],
["created_at",1747389000],
["updated_at",1747389000],
["seated_forward_bend",0.00],
["sit_ups",0.00],
["push_ups",0.00],
@ -99,8 +82,6 @@ class PhysicalTest extends BaseAdminController
["height",0.00],
["weight",0.00],
["coach_id",0],
["created_at",1747389000],
["updated_at",1747389000],
["seated_forward_bend",0.00],
["sit_ups",0.00],
["push_ups",0.00],
@ -128,4 +109,16 @@ class PhysicalTest extends BaseAdminController
}
public function getCustomerResourcesAll(){
return success(( new PhysicalTestService())->getCustomerResourcesAll());
}
public function getStudentAll(){
return success(( new PhysicalTestService())->getStudentAll());
}
public function getPersonnelAll(){
return success(( new PhysicalTestService())->getPersonnelAll());
}
}

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

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

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

@ -16,6 +16,12 @@ use think\model\concern\SoftDelete;
use think\model\relation\HasMany;
use think\model\relation\HasOne;
use app\model\customer_resources\CustomerResources;
use app\model\student\Student;
use app\model\personnel\Personnel;
/**
* 体测模型
* Class PhysicalTest
@ -43,19 +49,7 @@ class PhysicalTest extends BaseModel
/**
* 搜索器:体测体测编号
* @param $value
* @param $data
*/
public function searchIdAttr($query, $value, $data)
{
if ($value) {
$query->where("id", $value);
}
}
/**
* 搜索器:体测资源ID
* 搜索器:体测客户姓名
* @param $value
* @param $data
*/
@ -67,7 +61,7 @@ class PhysicalTest extends BaseModel
}
/**
* 搜索器:体测学员ID
* 搜索器:体测学员姓名
* @param $value
* @param $data
*/
@ -78,189 +72,21 @@ class PhysicalTest extends BaseModel
}
}
/**
* 搜索器:体测身高
* @param $value
* @param $data
*/
public function searchHeightAttr($query, $value, $data)
{
if ($value) {
$query->where("height", $value);
}
}
/**
* 搜索器:体测体重
* @param $value
* @param $data
*/
public function searchWeightAttr($query, $value, $data)
{
if ($value) {
$query->where("weight", $value);
}
}
/**
* 搜索器:体测教练ID
* @param $value
* @param $data
*/
public function searchCoachIdAttr($query, $value, $data)
{
if ($value) {
$query->where("coach_id", $value);
}
}
/**
* 搜索器:体测创建时间
* @param $value
* @param $data
*/
public function searchCreatedAtAttr($query, $value, $data)
{
if ($value) {
$query->where("created_at", $value);
}
}
/**
* 搜索器:体测修改时间
* @param $value
* @param $data
*/
public function searchUpdatedAtAttr($query, $value, $data)
{
if ($value) {
$query->where("updated_at", $value);
}
}
/**
* 搜索器:体测坐位体前屈
* @param $value
* @param $data
*/
public function searchSeatedForwardBendAttr($query, $value, $data)
{
if ($value) {
$query->where("seated_forward_bend", $value);
}
}
/**
* 搜索器:体测仰卧卷腹
* @param $value
* @param $data
*/
public function searchSitUpsAttr($query, $value, $data)
{
if ($value) {
$query->where("sit_ups", $value);
}
}
/**
* 搜索器:体测九十度仰卧撑
* @param $value
* @param $data
*/
public function searchPushUpsAttr($query, $value, $data)
{
if ($value) {
$query->where("push_ups", $value);
}
}
/**
* 搜索器:体测火烈鸟平衡测试
* @param $value
* @param $data
*/
public function searchFlamingoBalanceAttr($query, $value, $data)
{
if ($value) {
$query->where("flamingo_balance", $value);
}
}
/**
* 搜索器:体测三十秒双脚连续跳
* @param $value
* @param $data
*/
public function searchThirtySecJumpAttr($query, $value, $data)
{
if ($value) {
$query->where("thirty_sec_jump", $value);
}
}
/**
* 搜索器:体测立定跳远
* @param $value
* @param $data
*/
public function searchStandingLongJumpAttr($query, $value, $data)
{
if ($value) {
$query->where("standing_long_jump", $value);
}
}
/**
* 搜索器:体测4乘10m灵敏折返跑
* @param $value
* @param $data
*/
public function searchAgilityRunAttr($query, $value, $data)
{
if ($value) {
$query->where("agility_run", $value);
}
}
/**
* 搜索器:体测走平衡木
* @param $value
* @param $data
*/
public function searchBalanceBeamAttr($query, $value, $data)
{
if ($value) {
$query->where("balance_beam", $value);
}
}
/**
* 搜索器:体测网球掷远
* @param $value
* @param $data
*/
public function searchTennisThrowAttr($query, $value, $data)
{
if ($value) {
$query->where("tennis_throw", $value);
}
public function customerResources(){
return $this->hasOne(CustomerResources::class, 'id', 'resource_id')->joinType('left')->withField('name,id')->bind(['resource_id_name'=>'name']);
}
/**
* 搜索器:体测十米往返跑
* @param $value
* @param $data
*/
public function searchTenMeterShuttleRunAttr($query, $value, $data)
{
if ($value) {
$query->where("ten_meter_shuttle_run", $value);
}
public function student(){
return $this->hasOne(Student::class, 'id', 'student_id')->joinType('left')->withField('name,id')->bind(['student_id_name'=>'name']);
}
public function personnel(){
return $this->hasOne(Personnel::class, 'id', 'coach_id')->joinType('left')->withField('name,id')->bind(['coach_id_name'=>'name']);
}
}

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

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

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

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

Loading…
Cancel
Save