于宏哲PHP 10 months ago
parent
commit
f05e716903
  1. 6
      admin/src/app/api/contract.ts
  2. 16
      admin/src/app/lang/zh-cn/contract.contract.json
  3. 1
      admin/src/app/lang/zh-cn/course.course.json
  4. 346
      admin/src/app/views/contract/components/ff.vue
  5. 20
      admin/src/app/views/contract/contract.vue
  6. 12
      admin/src/app/views/contract_sign/contract_sign.vue
  7. 54
      admin/src/app/views/customer_resources/customer_resources.vue
  8. 202
      admin/src/app/views/physical_test/components/physical-test-edit.vue
  9. 11
      niucloud/app/adminapi/controller/contract/Contract.php
  10. 1
      niucloud/app/adminapi/controller/contract_sign/ContractSign.php
  11. 24
      niucloud/app/adminapi/controller/physical_test/PhysicalTest.php
  12. 3
      niucloud/app/adminapi/route/contract.php
  13. 14
      niucloud/app/service/admin/contract/ContractService.php
  14. 2
      niucloud/app/service/admin/contract_sign/ContractSignService.php
  15. 4
      niucloud/app/service/admin/lesson_course_teaching/LessonCourseTeachingService.php
  16. 11
      niucloud/app/service/admin/physical_test/PhysicalTestService.php
  17. 4
      niucloud/app/validate/physical_test/PhysicalTest.php

6
admin/src/app/api/contract.ts

@ -52,5 +52,11 @@ export function deleteContract(id: number) {
} }
export function ffContract(params: Record<string, any>) {
return request.post('contract/ff_contract', params, { showErrorMessage: true, showSuccessMessage: true })
}
// USER_CODE_END -- contract // USER_CODE_END -- contract

16
admin/src/app/lang/zh-cn/contract.contract.json

@ -15,5 +15,21 @@
"updateContract":"编辑合同", "updateContract":"编辑合同",
"contractDeleteTips":"确定要删除该数据吗?", "contractDeleteTips":"确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate":"请选择开始时间",
"endDate":"请选择结束时间",
"contractId":"合同",
"contractIdPlaceholder":"请输入合同",
"personnelId":"下发人员",
"personnelIdPlaceholder":"请输入下发人员",
"status":"签署状态",
"statusPlaceholder":"请输入签署状态",
"createdAt":"创建时间",
"createdAtPlaceholder":"请输入创建时间",
"signTime":"签署时间",
"signTimePlaceholder":"请输入签署时间",
"addContractSign":"添加合同关系",
"updateContractSign":"编辑合同关系",
"contractSignDeleteTips":"确定要删除该数据吗?",
"startDate":"请选择开始时间",
"endDate":"请选择结束时间" "endDate":"请选择结束时间"
} }

1
admin/src/app/lang/zh-cn/course.course.json

@ -48,4 +48,5 @@
"momePlaceholder": "请输入备注", "momePlaceholder": "请输入备注",
"createTime": "创建时间", "createTime": "创建时间",
"keyFormatTips": "关键字只允许输入字母和下划线" "keyFormatTips": "关键字只允许输入字母和下划线"
} }

346
admin/src/app/views/contract/components/ff.vue

@ -0,0 +1,346 @@
<template>
<el-dialog v-model="showDialog" title="分发合同" width="50%" class="diy-dialog-wrap" :destroy-on-close="true">
<el-tabs v-model="activeTab">
<el-tab-pane label="分发人员" name="select">
<el-form :inline="true" :model="lessonCourseTeachingTable.searchParam" ref="searchFormRef">
<el-form-item :label="t('userName')" prop="title">
<el-input v-model="lessonCourseTeachingTable.searchParam.name" :placeholder="t('userName')" />
</el-form-item>
<el-form-item label="电话号" prop="status">
<el-input v-model="lessonCourseTeachingTable.searchParam.phone" placeholder="请输入电话号" />
</el-form-item>
<el-form-item label="角色" prop="role_id">
<el-select class="input-width" v-model="lessonCourseTeachingTable.searchParam.role_id" clearable
placeholder="请选择角色">
<el-option label="请选择" value=""></el-option>
<el-option v-for="(item, index) in roleIdList" :key="index" :label="item['role_name']"
:value="item['role_id']" />
</el-select>
</el-form-item>
<el-form-item label="部门">
<el-select class="input-width" v-model="lessonCourseTeachingTable.searchParam.dept_id" clearable
placeholder="请选择部门">
<el-option label="请选择" value=""></el-option>
<el-option v-for="(item, index) in deptIdList" :key="index" :label="item['department_name']"
:value="item['id']" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadLessonCourseTeachingList()">{{t('search')}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{t('reset')}}</el-button>
</el-form-item>
</el-form>
<div class="mt-[10px]">
<el-table ref="lessonCourseTableRef" :data="lessonCourseTeachingTable.data" size="large"
v-loading="lessonCourseTeachingTable.loading" @selection-change="handleSelectionChange">
<template #empty>
<span>{{
!lessonCourseTeachingTable.loading ? t('emptyData') : ''
}}</span>
</template>
<el-table-column type="selection" width="55" />
<el-table-column prop="name" :label="t('userName')" min-width="70" :show-overflow-tooltip="true" />
<el-table-column prop="phone" label="电话" min-width="120" :show-overflow-tooltip="true" />
<el-table-column label="状态" min-width="100" align="center" :show-overflow-tooltip="true">
<template #default="{ row }">
<div v-if="row.status == 1">待审核</div>
<div v-if="row.status == 2">已审核</div>
<div v-if="row.status == 3">已禁用</div>
</template>
</el-table-column>
<el-table-column prop="create_time" label="创建时间" min-width="150" :show-overflow-tooltip="true" />
<el-table-column prop="update_time" label="修改时间" min-width="150" :show-overflow-tooltip="true" />
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="lessonCourseTeachingTable.page"
v-model:page-size="lessonCourseTeachingTable.limit" layout="total, sizes, prev, pager, next, jumper"
:total="lessonCourseTeachingTable.total" @size-change="loadLessonCourseTeachingList()"
@current-change="loadLessonCourseTeachingList" />
</div>
</div>
<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-tab-pane>
<el-tab-pane label="分发记录" name="history" >
<sign :value="BindingId"/>
</el-tab-pane>
</el-tabs>
</el-dialog>
</template>
<script lang="ts" setup>
import { ref, reactive, computed, watch, nextTick } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
import type { FormInstance } from 'element-plus'
import {
getWithPersonnelDataList
} from '@/app/api/lesson_course_teaching'
import { ffContract } from '@/app/api/contract'
import Sign from '@/app/views/contract_sign/contract_sign.vue'
import {
role_all,
departments_all,
} from '@/app/api/sys'
const activeTab = ref('select')
import { ElMessage, ElMessageBox } from 'element-plus';
let showDialog = ref(false)
const loading = ref(false)
let lessonCourseTeachingTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
name: '',
phone: '',
dept_id: '',
role_id: ''
},
})
const lessonCourseTableRef = ref()
watch(
() => lessonCourseTeachingTable.data,
async (newData) => {
if (newData.length > 0) {
await nextTick()
newData.forEach((row) => {
lessonCourseTableRef.value.toggleRowSelection(row, false)
if (lessonCourseTeachingTable.searchParam.dept_id || lessonCourseTeachingTable.searchParam.role_id) {
lessonCourseTableRef.value.toggleRowSelection(row, true)
}
})
}
},
{ deep: true }
)
const roleIdList = ref([] as any[])
const setRoleIdList = async () => {
roleIdList.value = await (await role_all({})).data
}
setRoleIdList()
const deptIdList = ref([] as any[])
const setDeptIdList = async () => {
deptIdList.value = await (await departments_all({})).data
}
setDeptIdList()
const multipleSelection = ref<[]>([])
const binding_module = ref('')
const handleSelectionChange = (val : []) => {
multipleSelection.value = val
}
const loadLessonCourseTeachingList = (page : number = 1) => {
multipleSelection.value = [];
lessonCourseTeachingTable.loading = true
lessonCourseTeachingTable.page = page
getWithPersonnelDataList({
page: lessonCourseTeachingTable.page,
limit: lessonCourseTeachingTable.limit,
...lessonCourseTeachingTable.searchParam,
})
.then((res) => {
lessonCourseTeachingTable.loading = false
lessonCourseTeachingTable.data = res.data.data
lessonCourseTeachingTable.total = res.data.total
})
.catch(() => {
lessonCourseTeachingTable.loading = false
})
}
loadLessonCourseTeachingList()
const resetForm = (page : number = 1) => {
lessonCourseTeachingTable.searchParam.name = ''
lessonCourseTeachingTable.searchParam.phone = ''
loadLessonCourseTeachingList()
}
/**
* 表单数据
*/
const initialFormData = {
id: '',
title: '',
image: '',
type: '',
content: '',
status: '',
// user_permission: [],
}
const formData : Record<string, any> = reactive({ ...initialFormData })
const formRef = ref<FormInstance>()
//
const formRules = computed(() => {
return {
title: [
{ required: true, message: t('titlePlaceholder'), trigger: 'blur' },
],
image: [
{ required: true, message: t('imagePlaceholder'), trigger: 'blur' },
],
type: [{ required: true, message: t('typePlaceholder'), trigger: 'blur' }],
content: [
{ required: true, message: t('contentPlaceholder'), trigger: 'blur' },
],
status: [
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' },
],
}
})
const emit = defineEmits(['complete'])
/**
* 确认
* @param formEl
*/
const confirm = async (formEl : FormInstance | undefined) => {
if (multipleSelection.value.length == 0) {
ElMessage.error('请选择数据');
return;
}
let data = {
id: BindingId.value,
uid: multipleSelection.value
.map((item) => item.sys_user_id)
.join(',')
}
ffContract(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
})
.catch((err) => {
loading.value = false
})
}
//
let typeList = ref([])
const typeDictList = async () => {
typeList.value = await (await useDictionary('material_type')).data.dictionary
}
typeDictList()
watch(
() => typeList.value,
() => {
formData.type = typeList.value[0].value
}
)
let statusList = ref([])
const statusDictList = async () => {
statusList.value = await (
await useDictionary('course_status')
).data.dictionary
}
statusDictList()
watch(
() => statusList.value,
() => {
formData.status = statusList.value[0].value
}
)
const userPermissionList = ref([] as any[])
const BindingId = ref(0)
const contract_type = ref('')
const setUserPermissionList = async () => {
userPermissionList.value = await (await getWithPersonnelDataList({})).data
}
setUserPermissionList()
const setFormData = async (row : any = null) => {
BindingId.value = row.id
contract_type.value = row.contract_type
}
//
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>

20
admin/src/app/views/contract/contract.vue

@ -76,6 +76,13 @@
<el-table-column :label="t('operation')" fixed="right" min-width="120"> <el-table-column :label="t('operation')" fixed="right" min-width="120">
<template #default="{ row }"> <template #default="{ row }">
<el-button
type="primary"
link
@click="addff(row)"
v-if="row.contract_type == '内部'"
>分发</el-button>
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button> <el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button> <el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
</template> </template>
@ -92,6 +99,12 @@
<edit ref="editContractDialog" @complete="loadContractList" /> <edit ref="editContractDialog" @complete="loadContractList" />
</el-card> </el-card>
</div> </div>
<ff
ref="FfDialog"
@complete="loadContractList"
/>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
@ -102,10 +115,17 @@ import { getContractList, deleteContract } from '@/app/api/contract'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus' import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/contract/components/contract-edit.vue' import Edit from '@/app/views/contract/components/contract-edit.vue'
import Ff from '@/app/views/contract/components/ff.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const pageName = route.meta.title; const pageName = route.meta.title;
const FfDialog: Record<string, any> | null = ref(null)
const addff = (row) => {
FfDialog.value.setFormData(row)
FfDialog.value.showDialog = true
}
let contractTable = reactive({ let contractTable = reactive({
page: 1, page: 1,
limit: 10, limit: 10,

12
admin/src/app/views/contract_sign/contract_sign.vue

@ -4,9 +4,9 @@
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-lg">{{pageName}}</span> <span class="text-lg">{{pageName}}</span>
<el-button type="primary" @click="addEvent"> <!-- <el-button type="primary" @click="addEvent">
{{ t('addContractSign') }} {{ t('addContractSign') }}
</el-button> </el-button> -->
</div> </div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
@ -112,8 +112,15 @@ import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/contract_sign/components/contract-sign-edit.vue' import Edit from '@/app/views/contract_sign/components/contract-sign-edit.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const pageName = route.meta.title; const pageName = route.meta.title;
const props = defineProps({
value: Number
})
let contractSignTable = reactive({ let contractSignTable = reactive({
page: 1, page: 1,
limit: 10, limit: 10,
@ -121,6 +128,7 @@ let contractSignTable = reactive({
loading: true, loading: true,
data: [], data: [],
searchParam:{ searchParam:{
"contract_id": props.value ? props.value : route.query.contract_id,
"status":"", "status":"",
"created_at":[], "created_at":[],
"sign_time":[] "sign_time":[]

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

@ -153,20 +153,39 @@
</el-table-column> </el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="350" <el-table-column :label="t('operation')" fixed="right" min-width="100"
v-if="customerResourcesTable.searchParam.type == 'zylb'"> v-if="customerResourcesTable.searchParam.type == 'zylb'">
<template #default="{ row }">
<el-button type="primary" link @click="UserPro(row)">客户详情</el-button>
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="orderList(row.id)">订单列表</el-button>
<el-button type="primary" link @click="addOrder({'resource_id':row.id})">添加订单</el-button> <template #default="{ row }">
<el-dropdown @command="handleCommand($event, row)">
<el-button type="primary" link @click="tcEvent({'resource_id':row.id})">体测</el-button> <el-button type="primary" link>
{{ t('operation') }}
<el-icon>
<ArrowDown />
</el-icon>
</el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item command="UserProfile">
客户详情
</el-dropdown-item>
<el-dropdown-item command="editEvent">
{{ t('edit') }}
</el-dropdown-item>
<el-dropdown-item command="orderList">
订单列表
</el-dropdown-item>
<el-dropdown-item command="addOrder">
添加订单
</el-dropdown-item>
<el-dropdown-item command="tcEvent">
体测
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -256,6 +275,19 @@
case 'UserProfile': case 'UserProfile':
UserProfile(row) UserProfile(row)
break break
case 'orderList':
orderList(row)
break
case 'addOrder':
addOrder(row)
break
case 'tcEvent':
tcEvent(row)
break
} }
} }

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

@ -39,95 +39,34 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<!-- <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-row :gutter="20">
<el-col :span="12">
<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-col>
<el-col :span="12">
<el-form-item :label="t('sitUps')">
<el-input v-model="formData.sit_ups" clearable :placeholder="t('sitUpsPlaceholder')"
class="input-width" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item :label="t('pushUps')">
<el-input v-model="formData.push_ups" clearable :placeholder="t('pushUpsPlaceholder')"
class="input-width" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="t('flamingoBalance')">
<el-input v-model="formData.flamingo_balance" clearable
:placeholder="t('flamingoBalancePlaceholder')" class="input-width" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<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-col>
<el-col :span="12">
<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-col>
</el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="24">
<el-form-item :label="t('agilityRun')"> <el-form-item label="附件" prop="physical_test_report" style="height:170px">
<el-input v-model="formData.agility_run" clearable :placeholder="t('agilityRunPlaceholder')" <el-upload class="upload-demo" :action="uploadApi" :headers="uploadHeaders" :file-list="fileList"
class="input-width" /> :limit="5" :on-preview="handlePreview" :on-remove="handleRemove" :on-success="handleSuccess"
</el-form-item> :before-upload="beforeUpload" :auto-upload="true" accept=".pdf" list-type="text">
</el-col> <el-button type="primary" :disabled="fileList.length >= 5">上传 PDF</el-button>
<el-col :span="12"> <template #tip>
<el-form-item :label="t('balanceBeam')"> <div class="el-upload__tip">最多上传 5 PDF 文件</div>
<el-input v-model="formData.balance_beam" clearable :placeholder="t('balanceBeamPlaceholder')" </template>
class="input-width" /> </el-upload>
<!-- 预览 PDF 的弹窗 -->
<el-dialog v-model="previewVisible" title="PDF 预览" width="80%">
<iframe v-if="previewUrl" :src="previewUrl" style="width: 100%; height: 600px;"
frameborder="0"></iframe>
</el-dialog>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item :label="t('tennisThrow')">
<el-input v-model="formData.tennis_throw" clearable :placeholder="t('tennisThrowPlaceholder')"
class="input-width" />
</el-form-item>
</el-col>
<el-col :span="12">
<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-col>
</el-row>
</el-form> </el-form>
<template #footer> <template #footer>
@ -152,6 +91,63 @@
getWithStudentList, getWithStudentList,
getWithPersonnelList, getWithPersonnelList,
} from '@/app/api/physical_test' } from '@/app/api/physical_test'
import dayjs from 'dayjs'
import { getToken } from '@/utils/common'
const fileList = ref([]) //
const previewVisible = ref(false)
const previewUrl = ref('')
const uploadApi = ref(`${import.meta.env.VITE_APP_BASE_URL}/sys/document/document`)
const uploadHeaders = {
'Token': getToken()
}
/** 文件上传成功后修改文件名 */
const handleSuccess = (res, file, files) => {
const index = files.length
const date = dayjs().format('YYYY-MM-DD')
file.name = `${date}-${index}-体测报告.pdf`
formData.physical_test_report = files.map(f => ({
name: f.name,
url: f.response?.data.url
}))
fileList.value = [...files]
}
/** 文件点击预览 */
const handlePreview = (file) => {
previewUrl.value = file.url ? `${import.meta.env.VITE_IMG_DOMAIN}/${file.url}` : `${import.meta.env.VITE_IMG_DOMAIN}/${file.response?.data.url}`
previewVisible.value = true
}
/** 文件移除 */
const handleRemove = (file, files) => {
fileList.value = [...files]
formData.physical_test_report = files.map(f => ({
name: f.name,
url: f.response?.data.url
}))
}
/** 上传前校验 */
const beforeUpload = (file) => {
const isPDF = file.type === 'application/pdf'
if (!isPDF) {
ElMessage.error('只能上传 PDF 文件')
}
return isPDF
}
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -166,16 +162,17 @@
height: '', height: '',
weight: '', weight: '',
// coach_id: '', // coach_id: '',
seated_forward_bend: '', // seated_forward_bend: '',
sit_ups: '', // sit_ups: '',
push_ups: '', // push_ups: '',
flamingo_balance: '', // flamingo_balance: '',
thirty_sec_jump: '', // thirty_sec_jump: '',
standing_long_jump: '', // standing_long_jump: '',
agility_run: '', // agility_run: '',
balance_beam: '', // balance_beam: '',
tennis_throw: '', // tennis_throw: '',
ten_meter_shuttle_run: '', // ten_meter_shuttle_run: '',
physical_test_report: []
} }
const formData : Record<string, any> = reactive({ ...initialFormData }) const formData : Record<string, any> = reactive({ ...initialFormData })
@ -259,6 +256,9 @@
* @param formEl * @param formEl
*/ */
const confirm = async (formEl : FormInstance | undefined) => { const confirm = async (formEl : FormInstance | undefined) => {
console.log(formData.physical_test_report, "===============");
if (loading.value || !formEl) return if (loading.value || !formEl) return
let save = formData.id ? editPhysicalTest : addPhysicalTest let save = formData.id ? editPhysicalTest : addPhysicalTest
@ -303,6 +303,8 @@
loading.value = true loading.value = true
Object.assign(formData, row) Object.assign(formData, row)
fileList.value = formData.physical_test_report
// if(row){ // if(row){
// const data = await (await getPhysicalTestInfo(row.id)).data // const data = await (await getPhysicalTestInfo(row.id)).data
// if (data) Object.keys(formData).forEach((key: string) => { // if (data) Object.keys(formData).forEach((key: string) => {
@ -364,4 +366,20 @@
.diy-dialog-wrap .el-form-item__label { .diy-dialog-wrap .el-form-item__label {
height: auto !important; height: auto !important;
} }
/* 横向排列上传列表 */
.el-upload-list--text {
display: flex;
flex-wrap: wrap; /* 超出自动换行 */
gap: 12px; /* 元素之间的间距 */
}
/* 每个上传项设定宽度 */
.el-upload-list--text .el-upload-list__item {
width: 160px; /* 你可以根据需要调整宽度 */
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
</style> </style>

11
niucloud/app/adminapi/controller/contract/Contract.php

@ -92,4 +92,15 @@ class Contract extends BaseAdminController
} }
public function ff_contract(){
$data = $this->request->params([
["id",""],
["uid",""]
]);
(new ContractService())->ff_contract($data);
return success();
}
} }

1
niucloud/app/adminapi/controller/contract_sign/ContractSign.php

@ -28,6 +28,7 @@ class ContractSign extends BaseAdminController
*/ */
public function lists(){ public function lists(){
$data = $this->request->params([ $data = $this->request->params([
["contract_id",""],
["status",""], ["status",""],
["created_at",["",""]], ["created_at",["",""]],
["sign_time",["",""]] ["sign_time",["",""]]

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

@ -53,17 +53,7 @@ class PhysicalTest extends BaseAdminController
["student_id",0], ["student_id",0],
["height",0.00], ["height",0.00],
["weight",0.00], ["weight",0.00],
["coach_id",0], ["physical_test_report",[]],
["seated_forward_bend",0.00],
["sit_ups",0.00],
["push_ups",0.00],
["flamingo_balance",0.00],
["thirty_sec_jump",0.00],
["standing_long_jump",0.00],
["agility_run",0.00],
["balance_beam",0.00],
["tennis_throw",0.00],
["ten_meter_shuttle_run",0.00]
]); ]);
$this->validate($data, 'app\validate\physical_test\PhysicalTest.add'); $this->validate($data, 'app\validate\physical_test\PhysicalTest.add');
$id = (new PhysicalTestService())->add($data); $id = (new PhysicalTestService())->add($data);
@ -81,17 +71,7 @@ class PhysicalTest extends BaseAdminController
["student_id",0], ["student_id",0],
["height",0.00], ["height",0.00],
["weight",0.00], ["weight",0.00],
["coach_id",0], ["physical_test_report",[]],
["seated_forward_bend",0.00],
["sit_ups",0.00],
["push_ups",0.00],
["flamingo_balance",0.00],
["thirty_sec_jump",0.00],
["standing_long_jump",0.00],
["agility_run",0.00],
["balance_beam",0.00],
["tennis_throw",0.00],
["ten_meter_shuttle_run",0.00]
]); ]);
$this->validate($data, 'app\validate\physical_test\PhysicalTest.edit'); $this->validate($data, 'app\validate\physical_test\PhysicalTest.edit');
(new PhysicalTestService())->edit($id, $data); (new PhysicalTestService())->edit($id, $data);

3
niucloud/app/adminapi/route/contract.php

@ -31,6 +31,9 @@ Route::group('contract', function () {
//删除合同 //删除合同
Route::delete('contract/:id', 'contract.Contract/del'); Route::delete('contract/:id', 'contract.Contract/del');
Route::post('ff_contract', 'contract.Contract/ff_contract');
})->middleware([ })->middleware([
AdminCheckToken::class, AdminCheckToken::class,
AdminCheckRole::class, AdminCheckRole::class,

14
niucloud/app/service/admin/contract/ContractService.php

@ -13,6 +13,7 @@ namespace app\service\admin\contract;
use app\model\contract\Contract; use app\model\contract\Contract;
use app\model\contract_sign\ContractSign;
use core\base\BaseAdminService; use core\base\BaseAdminService;
@ -95,5 +96,18 @@ class ContractService extends BaseAdminService
} }
public function ff_contract(array $data){
$contractSign = new ContractSign();
$user = explode(",",$data['uid']);
foreach ($user as $k=>$v){
$contractSign->insert([
'contract_id' => $data['id'],
'personnel_id' => $v,
]);
}
return true;
}
} }

2
niucloud/app/service/admin/contract_sign/ContractSignService.php

@ -41,7 +41,7 @@ class ContractSignService extends BaseAdminService
$field = 'id,contract_id,personnel_id,sign_file,status,created_at,sign_time,updated_at,deleted_at'; $field = 'id,contract_id,personnel_id,sign_file,status,created_at,sign_time,updated_at,deleted_at';
$order = 'id desc'; $order = 'id desc';
$search_model = $this->model->withSearch(["status","created_at","sign_time"], $where)->with(['contract','personnel'])->field($field)->order($order); $search_model = $this->model->withSearch(["status","created_at","sign_time","contract_id"], $where)->with(['contract','personnel'])->field($field)->order($order);
$list = $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
return $list; return $list;
} }

4
niucloud/app/service/admin/lesson_course_teaching/LessonCourseTeachingService.php

@ -655,7 +655,9 @@ class LessonCourseTeachingService extends BaseAdminService
->join(['school_campus_person_role' => 'b'],'a.id = b.person_id','left') ->join(['school_campus_person_role' => 'b'],'a.id = b.person_id','left')
->where('a.is_sys_user', 1) ->where('a.is_sys_user', 1)
->field("a.*,b.role_id,b.dept_id") ->field("a.*,b.role_id,b.dept_id")
->where($whereArr)->order($order); ->where($whereArr)
->group("a.id")
->order($order);
$list = $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
return $list; return $list;
} }

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

@ -39,12 +39,13 @@ class PhysicalTestService extends BaseAdminService
*/ */
public function getPage(array $where = []) public function getPage(array $where = [])
{ {
$field = 'id,resource_id,student_id,height,weight,coach_id,created_at,updated_at,seated_forward_bend,sit_ups,push_ups,flamingo_balance,thirty_sec_jump,standing_long_jump,agility_run,balance_beam,tennis_throw,ten_meter_shuttle_run'; $field = 'id,resource_id,student_id,height,weight,coach_id,created_at,updated_at,seated_forward_bend,sit_ups,push_ups,flamingo_balance,thirty_sec_jump,standing_long_jump,agility_run,balance_beam,tennis_throw,ten_meter_shuttle_run,physical_test_report';
$order = 'id desc'; $order = 'id desc';
$search_model = $this->model->withSearch(["resource_id","student_id"], $where)->with(['customerResources','student','personnel'])->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 $this->pageQuery($search_model, function ($item, $key) {
return $list; $item['physical_test_report'] = json_decode($item['physical_test_report'],true);
});
} }
/** /**
@ -54,7 +55,7 @@ class PhysicalTestService extends BaseAdminService
*/ */
public function getInfo(int $id) public function getInfo(int $id)
{ {
$field = 'id,resource_id,student_id,height,weight,coach_id,created_at,updated_at,seated_forward_bend,sit_ups,push_ups,flamingo_balance,thirty_sec_jump,standing_long_jump,agility_run,balance_beam,tennis_throw,ten_meter_shuttle_run'; $field = 'id,resource_id,student_id,height,weight,coach_id,created_at,updated_at,seated_forward_bend,sit_ups,push_ups,flamingo_balance,thirty_sec_jump,standing_long_jump,agility_run,balance_beam,tennis_throw,ten_meter_shuttle_run,physical_test_report';
$info = $this->model->field($field)->where([['id', "=", $id]])->with(['customerResources','student','personnel'])->findOrEmpty()->toArray(); $info = $this->model->field($field)->where([['id', "=", $id]])->with(['customerResources','student','personnel'])->findOrEmpty()->toArray();
return $info; return $info;
@ -67,6 +68,7 @@ class PhysicalTestService extends BaseAdminService
*/ */
public function add(array $data) public function add(array $data)
{ {
$data['physical_test_report'] = json_encode($data['physical_test_report'],JSON_UNESCAPED_UNICODE);
$res = $this->model->create($data); $res = $this->model->create($data);
return $res->id; return $res->id;
@ -81,6 +83,7 @@ class PhysicalTestService extends BaseAdminService
public function edit(int $id, array $data) public function edit(int $id, array $data)
{ {
$data['physical_test_report'] = json_encode($data['physical_test_report'],JSON_UNESCAPED_UNICODE);
$this->model->where([['id', '=', $id]])->update($data); $this->model->where([['id', '=', $id]])->update($data);
return true; return true;
} }

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

@ -36,8 +36,8 @@ class PhysicalTest extends BaseValidate
]; ];
protected $scene = [ protected $scene = [
"add" => ['resource_id', 'student_id', 'height', 'weight', 'coach_id', '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'],
"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'] "edit" => ['resource_id', 'student_id', 'height', 'weight']
]; ];
} }

Loading…
Cancel
Save