于宏哲PHP 10 months ago
parent
commit
42e91c9c39
  1. 19
      admin/src/app/lang/zh-cn/customer_resources.customer_resources.json
  2. 92
      admin/src/app/views/binding_personnel/binding_personnel.vue
  3. 10
      admin/src/app/views/campus_person_role/components/campus-person-role-edit.vue
  4. 8
      admin/src/app/views/communication_records/communication_records.vue
  5. 10
      admin/src/app/views/customer_resource_changes/customer_resource_changes.vue
  6. 6
      admin/src/app/views/customer_resources/components/UserProfile.vue
  7. 37
      admin/src/app/views/customer_resources/components/customer-resources-edit.vue
  8. 10
      admin/src/app/views/customer_resources/customer_resources.vue
  9. 1
      admin/src/app/views/lesson_course_teaching/components/lesson-course-teaching-edit.vue
  10. 226
      admin/src/app/views/lesson_course_teaching/lesson_course_teaching.vue
  11. 570
      admin/src/app/views/personnel/components/personnel-edit.vue
  12. 7
      admin/src/app/views/six_speed_modification_log/six_speed_modification_log.vue
  13. 3
      niucloud/app/adminapi/controller/communication_records/CommunicationRecords.php
  14. 4
      niucloud/app/adminapi/controller/lesson_course_teaching/LessonCourseTeaching.php
  15. 3
      niucloud/app/adminapi/controller/personnel/Personnel.php
  16. 3
      niucloud/app/common.php
  17. 41
      niucloud/app/model/personnel/PersonnelInfo.php
  18. 5
      niucloud/app/service/admin/communication_records/CommunicationRecordsService.php
  19. 52
      niucloud/app/service/admin/lesson_course_teaching/LessonCourseTeachingService.php
  20. 14
      niucloud/app/service/admin/personnel/PersonnelService.php

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

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

92
admin/src/app/views/binding_personnel/binding_personnel.vue

@ -23,6 +23,44 @@
:placeholder="t('userPhone')" :placeholder="t('userPhone')"
/> />
</el-form-item> </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-form-item>
<el-button type="primary" @click="loadLessonCourseTeachingList()">{{ <el-button type="primary" @click="loadLessonCourseTeachingList()">{{
t('search') t('search')
@ -35,6 +73,7 @@
<div class="mt-[10px]"> <div class="mt-[10px]">
<el-table <el-table
ref="lessonCourseTableRef"
:data="lessonCourseTeachingTable.data" :data="lessonCourseTeachingTable.data"
size="large" size="large"
v-loading="lessonCourseTeachingTable.loading" v-loading="lessonCourseTeachingTable.loading"
@ -83,16 +122,7 @@
:show-overflow-tooltip="true" :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, 1)">{{-->
<!-- t('delete')-->
<!-- }}</el-button>-->
<!-- </template>-->
<!-- </el-table-column>-->
</el-table> </el-table>
<div class="mt-[16px] flex justify-end"> <div class="mt-[16px] flex justify-end">
<el-pagination <el-pagination
@ -155,7 +185,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref, reactive, computed, watch } from 'vue' import { ref, reactive, computed, watch,nextTick } from 'vue'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang' import { t } from '@/lang'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
@ -167,6 +197,12 @@ import {
getWithPersonnelDataList, getWithPersonnelDataList,
setBindingModule, setBindingModule,
} from '@/app/api/lesson_course_teaching' } from '@/app/api/lesson_course_teaching'
import {
role_all,
departments_all,
} from '@/app/api/sys'
import { ElMessage, ElMessageBox } from 'element-plus'; import { ElMessage, ElMessageBox } from 'element-plus';
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -180,9 +216,42 @@ let lessonCourseTeachingTable = reactive({
searchParam: { searchParam: {
name: '', name: '',
phone: '', 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 multipleSelection = ref<[]>([])
const binding_module = ref('') const binding_module = ref('')
const handleSelectionChange = (val: []) => { const handleSelectionChange = (val: []) => {
@ -190,6 +259,7 @@ const handleSelectionChange = (val: []) => {
} }
const loadLessonCourseTeachingList = (page: number = 1) => { const loadLessonCourseTeachingList = (page: number = 1) => {
multipleSelection.value = [];
lessonCourseTeachingTable.loading = true lessonCourseTeachingTable.loading = true
lessonCourseTeachingTable.page = page lessonCourseTeachingTable.page = page

10
admin/src/app/views/campus_person_role/components/campus-person-role-edit.vue

@ -31,7 +31,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="人员" prop="person_id" v-if="!formData.person_id"> <el-form-item label="人员" prop="person_id" v-if="!person_id">
<el-select <el-select
class="input-width" class="input-width"
v-model="formData.person_id" v-model="formData.person_id"
@ -160,9 +160,6 @@ const formRef = ref<FormInstance>()
// //
const formRules = computed(() => { const formRules = computed(() => {
return { return {
campus_id: [
{ required: true, message: "请选择校区", trigger: 'blur' },
],
person_id: [ person_id: [
{ required: true, message: "请选择人员", trigger: 'blur' }, { required: true, message: "请选择人员", trigger: 'blur' },
], ],
@ -223,13 +220,18 @@ const setDeptIdList = async () => {
deptIdList.value = await (await getWithDepartmentsList({})).data deptIdList.value = await (await getWithDepartmentsList({})).data
} }
setDeptIdList() setDeptIdList()
const person_id = ref('')
const setFormData = async (row: any = null) => { const setFormData = async (row: any = null) => {
person_id.value = '';
console.log(person_id.value)
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
if (row.dept_id) { if (row.dept_id) {
formData.dept_id = parseInt(row.dept_id) formData.dept_id = parseInt(row.dept_id)
} }
if (row.person_id) { if (row.person_id) {
formData.person_id = parseInt(row.person_id) formData.person_id = parseInt(row.person_id)
person_id.value = parseInt(row.person_id)
} }
loading.value = true loading.value = true
if (row.id) { if (row.id) {

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

@ -2,7 +2,7 @@
<div class="main-container"> <div class="main-container">
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span> <!-- <span class="text-lg">{{ pageName }}</span> -->
<!-- <el-button type="primary" @click="addEvent"> <!-- <el-button type="primary" @click="addEvent">
{{ t('addCommunicationRecords') }} {{ t('addCommunicationRecords') }}
</el-button> --> </el-button> -->
@ -209,6 +209,11 @@ import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const pageName = route.meta.title const pageName = route.meta.title
const props = defineProps({
customer_resource_id: [String, Number]
})
let communicationRecordsTable = reactive({ let communicationRecordsTable = reactive({
page: 1, page: 1,
limit: 10, limit: 10,
@ -216,6 +221,7 @@ let communicationRecordsTable = reactive({
loading: true, loading: true,
data: [], data: [],
searchParam: { searchParam: {
customer_resource_id: props.customer_resource_id,
name: '', name: '',
phone_number: '', phone_number: '',
campus: '', campus: '',

10
admin/src/app/views/customer_resource_changes/customer_resource_changes.vue

@ -3,8 +3,11 @@
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span> <span class="text-lg">{{ pageName }}</span>
<el-button type="default" @click="goBack">返回</el-button>
</div> </div>
<div class="mt-[10px]"> <div class="mt-[10px]">
<el-table <el-table
:data="customerResourceChangesTable.data" :data="customerResourceChangesTable.data"
@ -72,10 +75,13 @@ import {
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox, FormInstance } from 'element-plus' import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/customer_resource_changes/components/customer-resource-changes-edit.vue' import Edit from '@/app/views/customer_resource_changes/components/customer-resource-changes-edit.vue'
import { useRoute } from 'vue-router' import { useRoute,useRouter } from 'vue-router'
const route = useRoute() const route = useRoute()
const pageName = route.meta.title const pageName = route.meta.title
const router = useRouter()
const goBack = () => {
router.go(-1)// router.go(-1)
}
const props = defineProps({ const props = defineProps({
value: Number value: Number
}) })

6
admin/src/app/views/customer_resources/components/UserProfile.vue

@ -28,6 +28,7 @@
<el-tab-pane label="修改日志" name="log" /> <el-tab-pane label="修改日志" name="log" />
<el-tab-pane label="学生情况" name="student" /> <el-tab-pane label="学生情况" name="student" />
<el-tab-pane label="订单列表" name="orders" /> <el-tab-pane label="订单列表" name="orders" />
<el-tab-pane label="沟通记录列表" name="communication_records" />
</el-tabs> </el-tabs>
<!-- 六要素信息卡片 --> <!-- 六要素信息卡片 -->
@ -80,6 +81,10 @@
<orders :value="user.id"/> <orders :value="user.id"/>
</el-card> </el-card>
<el-card v-if="activeTab === 'communication_records'">
<CommunicationRecords :customer_resource_id="user.id"/>
</el-card>
</el-dialog> </el-dialog>
</template> </template>
@ -90,6 +95,7 @@
import Log from '@/app/views/customer_resources/components/log.vue' import Log from '@/app/views/customer_resources/components/log.vue'
import Student from '@/app/views/customer_resources/components/student_courses.vue' import Student from '@/app/views/customer_resources/components/student_courses.vue'
import Orders from '@/app/views/customer_resources/components/order_table.vue' import Orders from '@/app/views/customer_resources/components/order_table.vue'
import CommunicationRecords from '@/app/views/communication_records/communication_records.vue'
let showDialog = ref(false) let showDialog = ref(false)

37
admin/src/app/views/customer_resources/components/customer-resources-edit.vue

@ -110,18 +110,29 @@
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item :label="t('distance')" prop="distance"> <el-form-item :label="t('distance')" prop="distance">
<el-input v-model="formData.distance" clearable <el-select class="input-width" v-model="formData.distance" clearable
:placeholder="t('distancePlaceholder')" class="input-width" /> :placeholder="t('distancePlaceholder')">
<el-option label="远60分钟以上路程" value="远60分钟以上路程"></el-option>
<el-option label="适中20-60分钟路程" value="适中20-60分钟路程"></el-option>
<el-option label="近20分钟以内" value="近20分钟以内"></el-option>
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item :label="t('decisionMaker')" prop="decision_maker"> <el-form-item :label="t('decisionMaker')" prop="decision_maker">
<el-input v-model="formData.decision_maker" clearable <el-select class="input-width" v-model="formData.decision_maker" clearable
:placeholder="t('decisionMakerPlaceholder')" class="input-width" /> :placeholder="t('decisionMakerPlaceholder')">
<el-option label="妈妈" value="妈妈"></el-option>
<el-option label="爸爸" value="爸爸"></el-option>
<el-option label="双亲" value="双亲"></el-option>
<el-option label="长辈" value="长辈"></el-option>
<el-option label="其他亲属" value="其他亲属"></el-option>
<el-option label="不详" value="不详"></el-option>
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="20"> <el-row :gutter="20">
@ -138,7 +149,7 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item :label="t('campus')" prop="campus"> <el-form-item :label="t('campus')" prop="campus">
<el-select class="input-width" v-model="formData.campus" clearable <el-select class="input-width" v-model="formData.campus" clearable
:placeholder="t('campusPlaceholder')"> :placeholder="t('campusPlaceholder')" :disabled="!!campus">
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option v-for="(item, index) in campusList" :key="index" <el-option v-for="(item, index) in campusList" :key="index"
:label="item['campus_name']" :value="item['id']" /> :label="item['campus_name']" :value="item['id']" />
@ -172,11 +183,11 @@
</el-form> </el-form>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="客户六要素" name="sixElements"> <el-tab-pane label="客户六要素" name="sixElements" v-if="pageName != '客户资源列表'">
<!-- 客户六要素表单内容 --> <!-- 客户六要素表单内容 -->
<el-form :model="formData" label-width="120px"> <el-form :model="formData" label-width="120px">
<el-row :gutter="20"> <!-- <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="需求购买力" prop="purchase_power"> <el-form-item label="需求购买力" prop="purchase_power">
@ -217,7 +228,7 @@
class="input-width" /> class="input-width" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row> -->
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="沟通备注" prop="communication"> <el-form-item label="沟通备注" prop="communication">
@ -271,7 +282,7 @@
</el-col> </el-col>
</el-row> </el-row>
<el-form-item label="是否关单" prop="is_closed"> <el-form-item label="是否关单" prop="is_closed">
<el-select class="input-width" v-model="formData.is_closed" clearable placeholder="请选择是否关单"> <el-select class="input-width" v-model="formData.is_closed" clearable placeholder="请选择是否关单" disabled >
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option v-for="(item, index) in is_closedList" :key="index" :label="item.name" <el-option v-for="(item, index) in is_closedList" :key="index" :label="item.name"
:value="Number(item.value)" /> :value="Number(item.value)" />
@ -314,6 +325,9 @@
getSixSpeedInfo, getSixSpeedInfo,
getWithCustomerResourcesList, getWithCustomerResourcesList,
} from '@/app/api/six_speed' } from '@/app/api/six_speed'
import { useRouter, useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const activeTab = ref('base') const activeTab = ref('base')
let showDialog = ref(false) let showDialog = ref(false)
@ -614,6 +628,7 @@
resourceIdList.value = await (await getWithCustomerResourcesList({})).data resourceIdList.value = await (await getWithCustomerResourcesList({})).data
} }
setResourceIdList() setResourceIdList()
const campus = ref('')
const setFormData = async (row : any = null) => { const setFormData = async (row : any = null) => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
@ -625,6 +640,8 @@
if (data[key] != undefined) formData[key] = data[key] if (data[key] != undefined) formData[key] = data[key]
}) })
} }
campus.value = formData.campus;
loading.value = false loading.value = false
} }

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

@ -153,9 +153,12 @@
</el-table-column> </el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="300" <el-table-column :label="t('operation')" fixed="right" min-width="350"
v-if="customerResourcesTable.searchParam.type == 'zylb'"> v-if="customerResourcesTable.searchParam.type == 'zylb'">
<template #default="{ row }"> <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="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="orderList(row.id)">订单列表</el-button> <el-button type="primary" link @click="orderList(row.id)">订单列表</el-button>
@ -256,6 +259,11 @@
} }
} }
const UserPro = (row) => {
UserProfile(row)
}
// const type = pageName == '' ? 'yjfp' : 'khzy'; // const type = pageName == '' ? 'yjfp' : 'khzy';
// //

1
admin/src/app/views/lesson_course_teaching/components/lesson-course-teaching-edit.vue

@ -129,6 +129,7 @@ const initialFormData = {
type: '', type: '',
content: '', content: '',
status: '', status: '',
url:''
// user_permission: [], // user_permission: [],
} }
const formData: Record<string, any> = reactive({ ...initialFormData }) const formData: Record<string, any> = reactive({ ...initialFormData })

226
admin/src/app/views/lesson_course_teaching/lesson_course_teaching.vue

@ -98,6 +98,8 @@
<el-avatar v-else icon="UserFilled" /> <el-avatar v-else icon="UserFilled" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
:label="t('type')" :label="t('type')"
min-width="180" min-width="180"
@ -111,6 +113,35 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="预览" width="100" align="left">
<template #default="{ row }">
<template v-if="row.type == '3'">
<el-image
:src="row.url"
style="width: 60px; height: 60px; cursor: pointer"
:preview-src-list="[row.url]"
preview-teleported
/>
</template>
<template v-else-if="row.type == '1'">
<el-button type="primary" text @click="previewVideo(row.url)">预览视频</el-button>
</template>
<template v-else-if="row.type == '2'">
<el-button type="success" text @click="openFile(row.url)">打开文件</el-button>
</template>
</template>
</el-table-column>
<el-table-column <el-table-column
:label="t('status')" :label="t('status')"
min-width="180" min-width="180"
@ -277,6 +308,29 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="预览" width="100" align="left">
<template #default="{ row }">
<template v-if="row.type == '3'">
<el-image
:src="row.url"
style="width: 60px; height: 60px; cursor: pointer"
:preview-src-list="[row.url]"
preview-teleported
/>
</template>
<template v-else-if="row.type == '1'">
<el-button type="primary" text @click="previewVideo(row.url)">预览视频</el-button>
</template>
<template v-else-if="row.type == '2'">
<el-button type="success" text @click="openFile(row.url)">打开文件</el-button>
</template>
</template>
</el-table-column>
<el-table-column <el-table-column
:label="t('status')" :label="t('status')"
min-width="180" min-width="180"
@ -448,6 +502,29 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="预览" width="100" align="left">
<template #default="{ row }">
<template v-if="row.type == '3'">
<el-image
:src="row.url"
style="width: 60px; height: 60px; cursor: pointer"
:preview-src-list="[row.url]"
preview-teleported
/>
</template>
<template v-else-if="row.type == '1'">
<el-button type="primary" text @click="previewVideo(row.url)">预览视频</el-button>
</template>
<template v-else-if="row.type == '2'">
<el-button type="success" text @click="openFile(row.url)">打开文件</el-button>
</template>
</template>
</el-table-column>
<el-table-column <el-table-column
:label="t('status')" :label="t('status')"
min-width="250" min-width="250"
@ -623,6 +700,29 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="预览" width="100" align="left">
<template #default="{ row }">
<template v-if="row.type == '3'">
<el-image
:src="row.url"
style="width: 60px; height: 60px; cursor: pointer"
:preview-src-list="[row.url]"
preview-teleported
/>
</template>
<template v-else-if="row.type == '1'">
<el-button type="primary" text @click="previewVideo(row.url)">预览视频</el-button>
</template>
<template v-else-if="row.type == '2'">
<el-button type="success" text @click="openFile(row.url)">打开文件</el-button>
</template>
</template>
</el-table-column>
<el-table-column <el-table-column
:label="t('status')" :label="t('status')"
min-width="180" min-width="180"
@ -794,6 +894,29 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="预览" width="100" align="left">
<template #default="{ row }">
<template v-if="row.type == '3'">
<el-image
:src="row.url"
style="width: 60px; height: 60px; cursor: pointer"
:preview-src-list="[row.url]"
preview-teleported
/>
</template>
<template v-else-if="row.type == '1'">
<el-button type="primary" text @click="previewVideo(row.url)">预览视频</el-button>
</template>
<template v-else-if="row.type == '2'">
<el-button type="success" text @click="openFile(row.url)">打开文件</el-button>
</template>
</template>
</el-table-column>
<el-table-column <el-table-column
:label="t('status')" :label="t('status')"
min-width="180" min-width="180"
@ -965,6 +1088,30 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="预览" width="100" align="left">
<template #default="{ row }">
<template v-if="row.type == '3'">
<el-image
:src="row.url"
style="width: 60px; height: 60px; cursor: pointer"
:preview-src-list="[row.url]"
preview-teleported
/>
</template>
<template v-else-if="row.type == '1'">
<el-button type="primary" text @click="previewVideo(row.url)">预览视频</el-button>
</template>
<template v-else-if="row.type == '2'">
<el-button type="success" text @click="openFile(row.url)">打开文件</el-button>
</template>
</template>
</el-table-column>
<el-table-column <el-table-column
:label="t('status')" :label="t('status')"
min-width="250" min-width="250"
@ -1136,6 +1283,29 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="预览" width="100" align="left">
<template #default="{ row }">
<template v-if="row.type == '3'">
<el-image
:src="row.url"
style="width: 60px; height: 60px; cursor: pointer"
:preview-src-list="[row.url]"
preview-teleported
/>
</template>
<template v-else-if="row.type == '1'">
<el-button type="primary" text @click="previewVideo(row.url)">预览视频</el-button>
</template>
<template v-else-if="row.type == '2'">
<el-button type="success" text @click="openFile(row.url)">打开文件</el-button>
</template>
</template>
</el-table-column>
<el-table-column <el-table-column
:label="t('status')" :label="t('status')"
min-width="180" min-width="180"
@ -1307,6 +1477,29 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="预览" width="100" align="left">
<template #default="{ row }">
<template v-if="row.type == '3'">
<el-image
:src="row.url"
style="width: 60px; height: 60px; cursor: pointer"
:preview-src-list="[row.url]"
preview-teleported
/>
</template>
<template v-else-if="row.type == '1'">
<el-button type="primary" text @click="previewVideo(row.url)">预览视频</el-button>
</template>
<template v-else-if="row.type == '2'">
<el-button type="success" text @click="openFile(row.url)">打开文件</el-button>
</template>
</template>
</el-table-column>
<el-table-column <el-table-column
:label="t('status')" :label="t('status')"
min-width="250" min-width="250"
@ -1383,7 +1576,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { reactive, ref, watch } from 'vue' import { reactive, ref, watch,h } from 'vue'
import { t } from '@/lang' import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { import {
@ -1415,6 +1608,37 @@ const route = useRoute()
const pageName = route.meta.title const pageName = route.meta.title
const active = 'CourseSyllabus' const active = 'CourseSyllabus'
const previewVideo = (url: string) => {
// 使 el-dialog + video
ElMessageBox({
title: '视频预览',
message: h('video', {
src: url,
controls: true,
style: 'width: 100%',
autoplay: true
}),
customClass: 'video-preview-box',
showCancelButton: false,
showConfirmButton: false,
dangerouslyUseHTMLString: true,
});
};
const openFile = (url: string) => {
window.open(`${import.meta.env.VITE_IMG_DOMAIN}/${url}`, '_blank');
};
const downloadFile = (url: string) => {
const a = document.createElement('a');
a.href = `${import.meta.env.VITE_IMG_DOMAIN}/${url}`;
a.download = '';
a.click();
};
let lessonCourseTeachingTable = reactive({ let lessonCourseTeachingTable = reactive({
page: 1, page: 1,
limit: 10, limit: 10,

570
admin/src/app/views/personnel/components/personnel-edit.vue

@ -1,68 +1,39 @@
<template> <template>
<el-dialog <el-dialog v-model="showDialog" :title="formData.id ? t('updatePersonnel') : t('addPersonnel')" width="50%"
v-model="showDialog" class="diy-dialog-wrap" :destroy-on-close="true">
:title="formData.id ? t('updatePersonnel') : t('addPersonnel')"
width="50%" <el-tabs v-model="activeTab" class="tab-pane-half">
class="diy-dialog-wrap" <!-- Tab 1: 基本信息 -->
:destroy-on-close="true" <el-tab-pane label="基本信息" name="base">
>
<el-form <el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form">
:model="formData"
label-width="120px"
ref="formRef"
:rules="formRules"
class="page-form"
v-loading="loading"
>
<el-form-item :label="t('name')" prop="name"> <el-form-item :label="t('name')" prop="name">
<el-input <el-input v-model="formData.name" clearable :placeholder="t('namePlaceholder')"
v-model="formData.name" class="input-width" />
clearable
:placeholder="t('namePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('gender')"> <el-form-item :label="t('gender')">
<el-radio-group <el-radio-group v-model="formData.gender" :placeholder="t('genderPlaceholder')">
v-model="formData.gender" <el-radio v-for="(item, index) in genderList" :key="index" :label="item.value">
:placeholder="t('genderPlaceholder')"
>
<el-radio
v-for="(item, index) in genderList"
:key="index"
:label="item.value"
>
{{ item.name }} {{ item.name }}
</el-radio> </el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item :label="t('phone')" prop="phone"> <el-form-item :label="t('phone')" prop="phone">
<el-input <el-input v-model="formData.phone" clearable :placeholder="t('phonePlaceholder')"
v-model="formData.phone" class="input-width" />
clearable
:placeholder="t('phonePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('address')"> <el-form-item :label="t('address')">
<el-input <el-input v-model="formData.address" clearable :placeholder="t('addressPlaceholder')"
v-model="formData.address" class="input-width" />
clearable
:placeholder="t('addressPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('nativePlace')"> <el-form-item :label="t('nativePlace')">
<el-input <el-input v-model="formData.native_place" clearable :placeholder="t('nativePlacePlaceholder')"
v-model="formData.native_place" class="input-width" />
clearable
:placeholder="t('nativePlacePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item label="头像"> <el-form-item label="头像">
@ -70,39 +41,21 @@
</el-form-item> </el-form-item>
<el-form-item :label="t('education')"> <el-form-item :label="t('education')">
<el-select <el-select class="input-width" v-model="formData.education" clearable
class="input-width" :placeholder="t('educationPlaceholder')">
v-model="formData.education"
clearable
:placeholder="t('educationPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option v-for="(item, index) in educationList" :key="index" :label="item.name"
v-for="(item, index) in educationList" :value="item.value" />
:key="index"
:label="item.name"
:value="item.value"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('profile')"> <el-form-item :label="t('profile')">
<el-input <el-input v-model="formData.profile" type="textarea" rows="4" clearable
v-model="formData.profile" :placeholder="t('profilePlaceholder')" class="input-width" />
type="textarea"
rows="4"
clearable
:placeholder="t('profilePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('emergencyContactPhone')"> <el-form-item :label="t('emergencyContactPhone')">
<el-input <el-input v-model="formData.emergency_contact_phone" clearable
v-model="formData.emergency_contact_phone" :placeholder="t('emergencyContactPhonePlaceholder')" class="input-width" />
clearable
:placeholder="t('emergencyContactPhonePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('idCardFront')"> <el-form-item :label="t('idCardFront')">
@ -114,70 +67,328 @@
</el-form-item> </el-form-item>
<el-form-item :label="t('status')" prop="status"> <el-form-item :label="t('status')" prop="status">
<el-select class="input-width" v-model="formData.status" clearable
:placeholder="t('statusPlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option v-for="(item, index) in statusList" :key="index" :label="item.name"
:value="item.value" />
</el-select>
</el-form-item>
<el-form-item :label="t('isSysUser')" prop="is_sys_user">
<el-radio-group v-model="formData.is_sys_user" :placeholder="t('isSysUserPlaceholder')">
<el-radio v-for="(item, index) in is_sys_userList" :key="index" :label="item.value">
{{ item.name }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="详情信息" name="info">
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="花名" prop="info.name">
<el-input v-model="formData.info.name" placeholder="请填写花名" class="input-width" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="门店" prop="info.store">
<el-input v-model="formData.info.store" placeholder="请填写门店" class="input-width" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="民族" prop="info.ethnicity">
<el-input v-model="formData.info.ethnicity" placeholder="请填写民族" class="input-width" />
</el-form-item>
</el-col>
<el-form-item label="生日日期" prop="info.birthday">
<el-date-picker
v-model="formData.info.birthday"
type="date"
placeholder="请选择生日日期"
class="input-width"
value-format="YYYY-MM-DD"
/>
</el-form-item>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="年龄" prop="info.age">
<el-input v-model="formData.info.age" placeholder="请填写年龄" class="input-width" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="司龄" prop="info.tenure">
<el-input v-model="formData.info.tenure" placeholder="请填写司龄" class="input-width" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="转正时间" prop="info.regular_date">
<el-date-picker
v-model="formData.info.regular_date"
type="date"
placeholder="请选择转正时间"
class="input-width"
value-format="YYYY-MM-DD"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否转正" prop="info.is_regular">
<el-select <el-select
v-model="formData.info.is_regular"
placeholder="请选择是否转正"
class="input-width" class="input-width"
v-model="formData.status"
clearable clearable
:placeholder="t('statusPlaceholder')"
> >
<el-option label="请选择" value=""></el-option> <el-option label="是" value="是" />
<el-option <el-option label="否" value="否" />
v-for="(item, index) in statusList"
:key="index"
:label="item.name"
:value="item.value"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('isSysUser')" prop="is_sys_user"> </el-col>
<el-radio-group
v-model="formData.is_sys_user" </el-row>
:placeholder="t('isSysUserPlaceholder')"
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="政治面貌" prop="info.politics">
<el-input v-model="formData.info.politics" placeholder="请填写政治面貌" class="input-width" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="毕业院校" prop="info.university">
<el-input v-model="formData.info.university" placeholder="请填写毕业院校" class="input-width" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="学历" prop="info.education">
<el-input v-model="formData.info.education" placeholder="请填写学历" class="input-width" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="专业" prop="info.major">
<el-input v-model="formData.info.major" placeholder="请填写专业" class="input-width" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="毕业时间" prop="info.graduation_date">
<el-date-picker
v-model="formData.info.graduation_date"
type="date"
placeholder="请选择毕业时间"
class="input-width"
value-format="YYYY-MM-DD"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="籍贯" prop="info.native_place">
<el-input v-model="formData.info.native_place" placeholder="请填写籍贯" class="input-width" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="户籍所在地" prop="info.household_place">
<el-input v-model="formData.info.household_place" placeholder="请填写户籍所在地" class="input-width" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="户籍类型" prop="info.household_type">
<el-input v-model="formData.info.household_type" placeholder="请填写户籍类型" class="input-width" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="户籍地址" prop="info.household_address">
<el-input v-model="formData.info.household_address" placeholder="请填写户籍地址" class="input-width" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="现居地址" prop="info.current_address">
<el-input v-model="formData.info.current_address" placeholder="请填写现居地址" class="input-width" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="紧急联系人" prop="info.emergency_contact">
<el-input v-model="formData.info.emergency_contact" placeholder="请填写紧急联系人" class="input-width" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="紧急联系人联系电话" prop="info.emergency_phone">
<el-input v-model="formData.info.emergency_phone" placeholder="请填写紧急联系人联系电话" class="input-width" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="婚否" prop="info.marital_status">
<el-select
v-model="formData.info.marital_status"
placeholder="请选择婚否"
class="input-width"
clearable
> >
<el-radio <el-option label="已婚" value="已婚" />
v-for="(item, index) in is_sys_userList" <el-option label="未婚" value="未婚" />
:key="index" </el-select>
:label="item.value" </el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="银行卡号" prop="info.bank_card">
<el-input v-model="formData.info.bank_card" placeholder="请填写银行卡号" class="input-width" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="开户行" prop="info.bank_name">
<el-input v-model="formData.info.bank_name" placeholder="请填写开户行" class="input-width" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="合同到期时间" prop="info.contract_expire">
<el-date-picker
v-model="formData.info.contract_expire"
type="date"
placeholder="请选择合同到期时间"
class="input-width"
value-format="YYYY-MM-DD"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="是否复聘" prop="info.is_rehired">
<el-select
v-model="formData.info.is_rehired"
placeholder="请选择是否复聘"
class="input-width"
clearable
> >
{{ item.name }} <el-option label="是" value="是" />
</el-radio> <el-option label="否" value="否" />
</el-radio-group> </el-select>
</el-form-item> </el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="info.remark">
<el-input v-model="formData.info.remark" placeholder="请填写备注" class="input-width" />
</el-form-item>
</el-col>
</el-row>
</el-form> </el-form>
</el-tab-pane>
</el-tabs>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> <el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button <el-button type="primary" :loading="loading"
type="primary" @click="confirm(formRef)">{{ t('confirm') }}</el-button>
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref, reactive, computed, watch } from 'vue' import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang' import { t } from '@/lang'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { import {
addPersonnel, addPersonnel,
editPersonnel, editPersonnel,
getPersonnelInfo, getPersonnelInfo,
} from '@/app/api/personnel' } from '@/app/api/personnel'
let showDialog = ref(false)
const loading = ref(false)
/** let showDialog = ref(false)
const loading = ref(false)
const activeTab = ref('base')
/**
* 表单数据 * 表单数据
*/ */
const initialFormData = { const initialFormData = {
id: '', id: '',
name: '', name: '',
gender: '', gender: '',
@ -192,13 +403,42 @@ const initialFormData = {
id_card_back: '', id_card_back: '',
status: '', status: '',
is_sys_user: '', is_sys_user: '',
} info:{
const formData: Record<string, any> = reactive({ ...initialFormData }) name:'',
store:'',
ethnicity:'',
birthday:'',
age:'',
tenure:'',
regular_date:'',
is_regular:'',
politics:'',
university:'',
education:'',
major:'',
graduation_date:'',
native_place:'',
household_place:'',
household_type:'',
household_address:'',
current_address:'',
emergency_contact:'',
emergency_phone:'',
marital_status:'',
bank_card:'',
bank_name:'',
contract_expire:'',
is_rehired:'',
remark:''
}
}
const formData : Record<string, any> = reactive({ ...initialFormData })
const formRef = ref<FormInstance>() const formRef = ref<FormInstance>()
// //
const formRules = computed(() => { const formRules = computed(() => {
return { return {
name: [{ required: true, message: t('namePlaceholder'), trigger: 'blur' }], name: [{ required: true, message: t('namePlaceholder'), trigger: 'blur' }],
gender: [ gender: [
@ -239,15 +479,15 @@ const formRules = computed(() => {
{ required: true, message: t('isSysUserPlaceholder'), trigger: 'blur' }, { required: true, message: t('isSysUserPlaceholder'), trigger: 'blur' },
], ],
} }
}) })
const emit = defineEmits(['complete']) const emit = defineEmits(['complete'])
/** /**
* 确认 * 确认
* @param formEl * @param formEl
*/ */
const confirm = async (formEl: FormInstance | undefined) => { const confirm = async (formEl : FormInstance | undefined) => {
if (loading.value || !formEl) return if (loading.value || !formEl) return
let save = formData.id ? editPersonnel : addPersonnel let save = formData.id ? editPersonnel : addPersonnel
@ -268,82 +508,82 @@ const confirm = async (formEl: FormInstance | undefined) => {
}) })
} }
}) })
} }
// //
let genderList = ref([]) let genderList = ref([])
const genderDictList = async () => { const genderDictList = async () => {
genderList.value = await (await useDictionary('gender')).data.dictionary genderList.value = await (await useDictionary('gender')).data.dictionary
} }
genderDictList() genderDictList()
watch( watch(
() => genderList.value, () => genderList.value,
() => { () => {
formData.gender = genderList.value[0].value formData.gender = genderList.value[0].value
} }
) )
let educationList = ref([]) let educationList = ref([])
const educationDictList = async () => { const educationDictList = async () => {
educationList.value = await (await useDictionary('education')).data.dictionary educationList.value = await (await useDictionary('education')).data.dictionary
} }
educationDictList() educationDictList()
watch( watch(
() => educationList.value, () => educationList.value,
() => { () => {
formData.education = educationList.value[0].value formData.education = educationList.value[0].value
} }
) )
let statusList = ref([]) let statusList = ref([])
const statusDictList = async () => { const statusDictList = async () => {
statusList.value = await ( statusList.value = await (
await useDictionary('personnel_status') await useDictionary('personnel_status')
).data.dictionary ).data.dictionary
} }
statusDictList() statusDictList()
watch( watch(
() => statusList.value, () => statusList.value,
() => { () => {
formData.status = statusList.value[0].value formData.status = statusList.value[0].value
} }
) )
let is_sys_userList = ref([]) let is_sys_userList = ref([])
const is_sys_userDictList = async () => { const is_sys_userDictList = async () => {
is_sys_userList.value = await ( is_sys_userList.value = await (
await useDictionary('global_true_or_false') await useDictionary('global_true_or_false')
).data.dictionary ).data.dictionary
} }
is_sys_userDictList() is_sys_userDictList()
watch( watch(
() => is_sys_userList.value, () => is_sys_userList.value,
() => { () => {
formData.is_sys_user = is_sys_userList.value[0].value formData.is_sys_user = is_sys_userList.value[0].value
} }
) )
const setFormData = async (row: any = null) => { const setFormData = async (row : any = null) => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
loading.value = true loading.value = true
if (row) { if (row) {
const data = await (await getPersonnelInfo(row.id)).data const data = await (await getPersonnelInfo(row.id)).data
if (data) if (data)
Object.keys(formData).forEach((key: string) => { Object.keys(formData).forEach((key : string) => {
if (data[key] != undefined) formData[key] = data[key] if (data[key] != undefined) formData[key] = data[key]
}) })
} }
loading.value = false loading.value = false
} }
// //
const mobileVerify = (rule: any, value: any, callback: any) => { const mobileVerify = (rule : any, value : any, callback : any) => {
if (value && !/^1[3-9]\d{9}$/.test(value)) { if (value && !/^1[3-9]\d{9}$/.test(value)) {
callback(new Error(t('generateMobile'))) callback(new Error(t('generateMobile')))
} else { } else {
callback() callback()
} }
} }
// //
const idCardVerify = (rule: any, value: any, callback: any) => { const idCardVerify = (rule : any, value : any, callback : any) => {
if ( if (
value && 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( !/^[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(
@ -354,35 +594,35 @@ const idCardVerify = (rule: any, value: any, callback: any) => {
} else { } else {
callback() callback()
} }
} }
// //
const emailVerify = (rule: any, value: any, callback: any) => { const emailVerify = (rule : any, value : any, callback : any) => {
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) { if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) {
callback(new Error(t('generateEmail'))) callback(new Error(t('generateEmail')))
} else { } else {
callback() callback()
} }
} }
// //
const numberVerify = (rule: any, value: any, callback: any) => { const numberVerify = (rule : any, value : any, callback : any) => {
if (!Number.isInteger(value)) { if (!Number.isInteger(value)) {
callback(new Error(t('generateNumber'))) callback(new Error(t('generateNumber')))
} else { } else {
callback() callback()
} }
} }
defineExpose({ defineExpose({
showDialog, showDialog,
setFormData, setFormData,
}) })
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>
<style lang="scss"> <style lang="scss">
.diy-dialog-wrap .el-form-item__label { .diy-dialog-wrap .el-form-item__label {
height: auto !important; height: auto !important;
} }
</style> </style>

7
admin/src/app/views/six_speed_modification_log/six_speed_modification_log.vue

@ -3,6 +3,7 @@
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-lg">六要素修改记录</span> <span class="text-lg">六要素修改记录</span>
<el-button type="default" @click="goBack">返回</el-button>
</div> </div>
<!-- <el-card <!-- <el-card
@ -111,9 +112,13 @@ import {
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/six_speed_modification_log/components/six-speed-modification-log-edit.vue' import Edit from '@/app/views/six_speed_modification_log/components/six-speed-modification-log-edit.vue'
import { useRoute } from 'vue-router' import { useRoute,useRouter } from 'vue-router'
const route = useRoute() const route = useRoute()
const pageName = route.meta.title const pageName = route.meta.title
const router = useRouter()
const goBack = () => {
router.go(-1)// router.go(-1)
}
let sixSpeedModificationLogTable = reactive({ let sixSpeedModificationLogTable = reactive({
page: 1, page: 1,

3
niucloud/app/adminapi/controller/communication_records/CommunicationRecords.php

@ -31,7 +31,8 @@ class CommunicationRecords extends BaseAdminController
["name",""], ["name",""],
["phone_number",""], ["phone_number",""],
["campus",""], ["campus",""],
["communication_type",""] ["communication_type",""],
["customer_resource_id",""]
]); ]);
return success((new CommunicationRecordsService())->getPage($data)); return success((new CommunicationRecordsService())->getPage($data));
} }

4
niucloud/app/adminapi/controller/lesson_course_teaching/LessonCourseTeaching.php

@ -754,7 +754,9 @@ class LessonCourseTeaching extends BaseAdminController
public function getPersonnelDataAll(){ public function getPersonnelDataAll(){
$data = $this->request->params([ $data = $this->request->params([
["name",""], ["name",""],
["phone",""] ["phone",""],
["role_id",""],
["dept_id",""]
]); ]);
return success((new LessonCourseTeachingService())->getPersonnelDataAll($data)); return success((new LessonCourseTeachingService())->getPersonnelDataAll($data));
} }

3
niucloud/app/adminapi/controller/personnel/Personnel.php

@ -68,7 +68,7 @@ class Personnel extends BaseAdminController
["id_card_back",""], ["id_card_back",""],
["status",0], ["status",0],
["is_sys_user",0], ["is_sys_user",0],
["info",[]],
]); ]);
$this->validate($data, 'app\validate\personnel\Personnel.add'); $this->validate($data, 'app\validate\personnel\Personnel.add');
$id = (new PersonnelService())->add($data); $id = (new PersonnelService())->add($data);
@ -95,6 +95,7 @@ class Personnel extends BaseAdminController
["id_card_back",""], ["id_card_back",""],
["status",0], ["status",0],
["is_sys_user",0], ["is_sys_user",0],
["info",[]],
]); ]);
$this->validate($data, 'app\validate\personnel\Personnel.edit'); $this->validate($data, 'app\validate\personnel\Personnel.edit');

3
niucloud/app/common.php

@ -1037,10 +1037,13 @@ function get_campus_where($user_id,$field="campus_id")
if($user_id > 1){ if($user_id > 1){
$person_id = $person->where(['sys_user_id' => $user_id])->value("id"); $person_id = $person->where(['sys_user_id' => $user_id])->value("id");
$role_info = $campusPersonRole->where(['person_id' => $person_id])->find(); $role_info = $campusPersonRole->where(['person_id' => $person_id])->find();
if (!in_array($role_info['role_id'], [1,7,8])) { if (!in_array($role_info['role_id'], [1,7,8])) {
if($role_info['campus_id']){
$where[] = [$field,'=',$role_info['campus_id']]; $where[] = [$field,'=',$role_info['campus_id']];
} }
} }
}
return $where; return $where;
} }

41
niucloud/app/model/personnel/PersonnelInfo.php

@ -0,0 +1,41 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\model\personnel;
use core\base\BaseModel;
use think\model\concern\SoftDelete;
use think\model\relation\HasMany;
use think\model\relation\HasOne;
/**
* 人力资源-人员模型
* Class Personnel
* @package app\model\personnel
*/
class PersonnelInfo extends BaseModel
{
/**
* 数据表主键
* @var string
*/
protected $pk = 'id';
/**
* 模型名称
* @var string
*/
protected $name = 'personnel_info';
}

5
niucloud/app/service/admin/communication_records/CommunicationRecordsService.php

@ -57,6 +57,11 @@ class CommunicationRecordsService extends BaseAdminService
$where[] = ['a.communication_type','=',$data['communication_type']]; $where[] = ['a.communication_type','=',$data['communication_type']];
} }
if($data['customer_resource_id']){
$where[] = ['b.id','=',$data['customer_resource_id']];
}
$search_model = $this->model $search_model = $this->model
->alias("a") ->alias("a")
->join(['school_customer_resources' => 'b'],'a.resource_id = b.id','left') ->join(['school_customer_resources' => 'b'],'a.resource_id = b.id','left')

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

@ -38,7 +38,7 @@ class LessonCourseTeachingService extends BaseAdminService
*/ */
public function getPage(array $where = []) public function getPage(array $where = [])
{ {
$field = 'id,title,image,type,content,status,create_time,update_time,delete_time,table_type,user_permission,exam_papers_id'; $field = 'id,title,image,type,url,content,status,create_time,update_time,delete_time,table_type,user_permission,exam_papers_id';
$order = 'id desc'; $order = 'id desc';
$search_model = $this->model->withSearch(["title","status","create_time","update_time","table_type"], $where)->with(['personnelData'])->field($field)->order($order); $search_model = $this->model->withSearch(["title","status","create_time","update_time","table_type"], $where)->with(['personnelData'])->field($field)->order($order);
@ -85,7 +85,7 @@ class LessonCourseTeachingService extends BaseAdminService
*/ */
public function jumpPetPage(array $where = []) public function jumpPetPage(array $where = [])
{ {
$field = 'id,title,image,type,content,status,create_time,update_time,delete_time,table_type,user_permission,exam_papers_id'; $field = 'id,title,image,type,url,content,status,create_time,update_time,delete_time,table_type,user_permission,exam_papers_id';
$order = 'id desc'; $order = 'id desc';
$search_model = $this->model->withSearch(["title","status","create_time","update_time","table_type"], $where)->with(['personnelData'])->field($field)->order($order); $search_model = $this->model->withSearch(["title","status","create_time","update_time","table_type"], $where)->with(['personnelData'])->field($field)->order($order);
$list = $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
@ -129,7 +129,7 @@ class LessonCourseTeachingService extends BaseAdminService
*/ */
public function enPetPage(array $where = []) public function enPetPage(array $where = [])
{ {
$field = 'id,title,image,type,content,status,create_time,update_time,delete_time,table_type,user_permission,exam_papers_id'; $field = 'id,title,image,type,url,content,status,create_time,update_time,delete_time,table_type,user_permission,exam_papers_id';
$order = 'id desc'; $order = 'id desc';
$search_model = $this->model->withSearch(["title","status","create_time","update_time","table_type"], $where)->with(['personnelData'])->field($field)->order($order); $search_model = $this->model->withSearch(["title","status","create_time","update_time","table_type"], $where)->with(['personnelData'])->field($field)->order($order);
$list = $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
@ -174,7 +174,7 @@ class LessonCourseTeachingService extends BaseAdminService
*/ */
public function basketballPetPage(array $where = []) public function basketballPetPage(array $where = [])
{ {
$field = 'id,title,image,type,content,status,create_time,update_time,delete_time,table_type,user_permission,exam_papers_id'; $field = 'id,title,image,type,url,content,status,create_time,update_time,delete_time,table_type,user_permission,exam_papers_id';
$order = 'id desc'; $order = 'id desc';
$search_model = $this->model->withSearch(["title","status","create_time","update_time","table_type"], $where)->with(['personnelData'])->field($field)->order($order); $search_model = $this->model->withSearch(["title","status","create_time","update_time","table_type"], $where)->with(['personnelData'])->field($field)->order($order);
$list = $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
@ -218,7 +218,7 @@ class LessonCourseTeachingService extends BaseAdminService
*/ */
public function strengPetPage(array $where = []) public function strengPetPage(array $where = [])
{ {
$field = 'id,title,image,type,content,status,create_time,update_time,delete_time,table_type,user_permission,exam_papers_id'; $field = 'id,title,image,type,url,content,status,create_time,update_time,delete_time,table_type,user_permission,exam_papers_id';
$order = 'id desc'; $order = 'id desc';
$search_model = $this->model->withSearch(["title","status","create_time","update_time","table_type"], $where)->with(['personnelData'])->field($field)->order($order); $search_model = $this->model->withSearch(["title","status","create_time","update_time","table_type"], $where)->with(['personnelData'])->field($field)->order($order);
$list = $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
@ -262,7 +262,7 @@ class LessonCourseTeachingService extends BaseAdminService
*/ */
public function ninjaPetPage(array $where = []) public function ninjaPetPage(array $where = [])
{ {
$field = 'id,title,image,type,content,status,create_time,update_time,delete_time,table_type,user_permission,exam_papers_id'; $field = 'id,title,image,type,url,content,status,create_time,update_time,delete_time,table_type,user_permission,exam_papers_id';
$order = 'id desc'; $order = 'id desc';
$search_model = $this->model->withSearch(["title","status","create_time","update_time","table_type"], $where)->with(['personnelData'])->field($field)->order($order); $search_model = $this->model->withSearch(["title","status","create_time","update_time","table_type"], $where)->with(['personnelData'])->field($field)->order($order);
$list = $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
@ -306,7 +306,7 @@ class LessonCourseTeachingService extends BaseAdminService
*/ */
public function securityPetPage(array $where = []) public function securityPetPage(array $where = [])
{ {
$field = 'id,title,image,type,content,status,create_time,update_time,delete_time,table_type,user_permission,exam_papers_id'; $field = 'id,title,image,type,url,content,status,create_time,update_time,delete_time,table_type,user_permission,exam_papers_id';
$order = 'id desc'; $order = 'id desc';
$search_model = $this->model->withSearch(["title","status","create_time","update_time","table_type"], $where)->with(['personnelData'])->field($field)->order($order); $search_model = $this->model->withSearch(["title","status","create_time","update_time","table_type"], $where)->with(['personnelData'])->field($field)->order($order);
$list = $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
@ -350,7 +350,7 @@ class LessonCourseTeachingService extends BaseAdminService
*/ */
public function physicalPetPage(array $where = []) public function physicalPetPage(array $where = [])
{ {
$field = 'id,title,image,type,content,status,create_time,update_time,delete_time,table_type,user_permission,exam_papers_id'; $field = 'id,title,image,type,url,content,status,create_time,update_time,delete_time,table_type,user_permission,exam_papers_id';
$order = 'id desc'; $order = 'id desc';
$search_model = $this->model->withSearch(["title","status","create_time","update_time","table_type"], $where)->with(['personnelData'])->field($field)->order($order); $search_model = $this->model->withSearch(["title","status","create_time","update_time","table_type"], $where)->with(['personnelData'])->field($field)->order($order);
$list = $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
@ -398,7 +398,7 @@ class LessonCourseTeachingService extends BaseAdminService
*/ */
public function actionPetPage(array $where = []) public function actionPetPage(array $where = [])
{ {
$field = 'id,title,image,type,content,status,create_time,update_time,delete_time,table_type,user_permission,exam_papers_id'; $field = 'id,title,image,type,url,content,status,create_time,update_time,delete_time,table_type,user_permission,exam_papers_id';
$order = 'id desc'; $order = 'id desc';
$search_model = $this->model->withSearch(["title","status","create_time","update_time","table_type"], $where)->with(['personnelData'])->field($field)->order($order); $search_model = $this->model->withSearch(["title","status","create_time","update_time","table_type"], $where)->with(['personnelData'])->field($field)->order($order);
$list = $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
@ -443,7 +443,7 @@ class LessonCourseTeachingService extends BaseAdminService
*/ */
public function gamesPetPage(array $where = []) public function gamesPetPage(array $where = [])
{ {
$field = 'id,title,image,type,content,status,create_time,update_time,delete_time,table_type,user_permission,exam_papers_id'; $field = 'id,title,image,type,url,content,status,create_time,update_time,delete_time,table_type,user_permission,exam_papers_id';
$order = 'id desc'; $order = 'id desc';
$search_model = $this->model->withSearch(["title","status","create_time","update_time","table_type"], $where)->with(['personnelData'])->field($field)->order($order); $search_model = $this->model->withSearch(["title","status","create_time","update_time","table_type"], $where)->with(['personnelData'])->field($field)->order($order);
$list = $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
@ -489,7 +489,7 @@ class LessonCourseTeachingService extends BaseAdminService
*/ */
public function fitnessPetPage(array $where = []) public function fitnessPetPage(array $where = [])
{ {
$field = 'id,title,image,type,content,status,create_time,update_time,delete_time,table_type,user_permission,exam_papers_id'; $field = 'id,title,image,type,url,content,status,create_time,update_time,delete_time,table_type,user_permission,exam_papers_id';
$order = 'id desc'; $order = 'id desc';
$search_model = $this->model->withSearch(["title","status","create_time","update_time","table_type"], $where)->with(['personnelData'])->field($field)->order($order); $search_model = $this->model->withSearch(["title","status","create_time","update_time","table_type"], $where)->with(['personnelData'])->field($field)->order($order);
$list = $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
@ -534,7 +534,7 @@ class LessonCourseTeachingService extends BaseAdminService
*/ */
public function relaxationPetPage(array $where = []) public function relaxationPetPage(array $where = [])
{ {
$field = 'id,title,image,type,content,status,create_time,update_time,delete_time,table_type,user_permission,exam_papers_id'; $field = 'id,title,image,type,url,content,status,create_time,update_time,delete_time,table_type,user_permission,exam_papers_id';
$order = 'id desc'; $order = 'id desc';
$search_model = $this->model->withSearch(["title","status","create_time","update_time","table_type"], $where)->with(['personnelData'])->field($field)->order($order); $search_model = $this->model->withSearch(["title","status","create_time","update_time","table_type"], $where)->with(['personnelData'])->field($field)->order($order);
$list = $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
@ -574,7 +574,7 @@ class LessonCourseTeachingService extends BaseAdminService
public function publicPetPage(array $where = []) public function publicPetPage(array $where = [])
{ {
$field = 'id,title,image,type,content,status,create_time,update_time,delete_time,table_type,user_permission,exam_papers_id'; $field = 'id,title,image,type,url,content,status,create_time,update_time,delete_time,table_type,user_permission,exam_papers_id';
$order = 'id desc'; $order = 'id desc';
$search_model = $this->model->withSearch(["title","status","create_time","update_time","table_type"], $where)->with(['personnelData'])->field($field)->order($order); $search_model = $this->model->withSearch(["title","status","create_time","update_time","table_type"], $where)->with(['personnelData'])->field($field)->order($order);
$list = $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
@ -611,7 +611,7 @@ class LessonCourseTeachingService extends BaseAdminService
*/ */
public function getInfo(int $id) public function getInfo(int $id)
{ {
$field = 'id,title,image,type,content,status,create_time,update_time,delete_time,table_type,user_permission,url,exam_papers_id'; $field = 'id,title,image,type,url,content,status,create_time,update_time,delete_time,table_type,user_permission,url,exam_papers_id';
$info = $this->model->field($field)->where([['id', "=", $id]])->with(['personnelData'])->findOrEmpty()->toArray(); $info = $this->model->field($field)->where([['id', "=", $id]])->with(['personnelData'])->findOrEmpty()->toArray();
$info['status'] = strval($info['status']); $info['status'] = strval($info['status']);
$info['type'] = strval($info['type']); $info['type'] = strval($info['type']);
@ -633,16 +633,29 @@ class LessonCourseTeachingService extends BaseAdminService
public function getPersonnelDataAll(array $where = []){ public function getPersonnelDataAll(array $where = []){
$personnelDataModel = new PersonnelData(); $personnelDataModel = new PersonnelData();
$field = 'id,name,gender,phone,status,status,sys_user_id,create_time,update_time'; // $field = 'id,name,gender,phone,status,status,sys_user_id,create_time,update_time';
$order = 'id desc'; $order = 'a.id desc';
$whereArr = []; $whereArr = [];
if (!empty($where['name'])) { if (!empty($where['name'])) {
$whereArr[] = ['name','like',"'%'".$where['name']."'%'"]; $whereArr[] = ['a.name','like',"'%'".$where['name']."'%'"];
} }
if (!empty($where['phone'])) { if (!empty($where['phone'])) {
$whereArr[] = ['phone','like',"'%'".$where['phone']."'%'"]; $whereArr[] = ['a.phone','like',"'%'".$where['phone']."'%'"];
}
if (!empty($where['role_id'])) {
$whereArr[] = ['b.role_id','=',$where['role_id']];
} }
$search_model = $personnelDataModel->where('is_sys_user', 1)->where($whereArr)->field($field)->order($order); if (!empty($where['dept_id'])) {
$whereArr[] = ['b.dept_id','=',$where['dept_id']];
}
$search_model = $personnelDataModel
->alias("a")
->join(['school_campus_person_role' => 'b'],'a.id = b.person_id','left')
->where('a.is_sys_user', 1)
->field("a.*,b.role_id,b.dept_id")
->where($whereArr)->order($order);
$list = $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
return $list; return $list;
} }
@ -660,6 +673,7 @@ class LessonCourseTeachingService extends BaseAdminService
} }
$search_model = $ExamPapersModel->where($whereArr)->field($field)->order($order); $search_model = $ExamPapersModel->where($whereArr)->field($field)->order($order);
$list = $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
return $list; return $list;
} }

14
niucloud/app/service/admin/personnel/PersonnelService.php

@ -15,6 +15,7 @@ use app\dict\sys\UserDict;
use app\model\campus_person_role\CampusPersonRole; use app\model\campus_person_role\CampusPersonRole;
use app\model\personnel\Personnel; use app\model\personnel\Personnel;
use app\model\personnel\PersonnelInfo;
use app\model\sys\SysUser; use app\model\sys\SysUser;
use app\service\admin\user\UserService; use app\service\admin\user\UserService;
use core\base\BaseAdminService; use core\base\BaseAdminService;
@ -85,6 +86,8 @@ class PersonnelService extends BaseAdminService
$info['gender'] = strval($info['gender']); $info['gender'] = strval($info['gender']);
$info['status'] = strval($info['status']); $info['status'] = strval($info['status']);
$info['is_sys_user'] = strval($info['is_sys_user']); $info['is_sys_user'] = strval($info['is_sys_user']);
$info['info'] = (new PersonnelInfo())->where(['person_id' => $id])->findOrEmpty()->toArray();
return $info; return $info;
} }
@ -95,6 +98,9 @@ class PersonnelService extends BaseAdminService
*/ */
public function add(array $data) public function add(array $data)
{ {
$info = $data['info'];
unset($data['info']);
$status = $this->model->where('phone', $data['phone'])->value('id'); $status = $this->model->where('phone', $data['phone'])->value('id');
if ($status) { if ($status) {
throw new \Exception('手机号已存在'); throw new \Exception('手机号已存在');
@ -115,6 +121,9 @@ class PersonnelService extends BaseAdminService
// 员工编号 // 员工编号
$data['employee_number'] = getEmployeeNumber(); $data['employee_number'] = getEmployeeNumber();
$res = $this->model->create($data); $res = $this->model->create($data);
$info['person_id'] = $res->id;
(new PersonnelInfo())->insert($info);
Db::commit(); Db::commit();
return $res->id; return $res->id;
} catch (\Exception $e) { } catch (\Exception $e) {
@ -131,7 +140,9 @@ class PersonnelService extends BaseAdminService
*/ */
public function edit(int $id, array $data) public function edit(int $id, array $data)
{ {
$info = $data['info'];
unset($data['info']);
$status = $this->model->where('phone', $data['phone'])->value('id'); $status = $this->model->where('phone', $data['phone'])->value('id');
if ($status && $status != $id) { if ($status && $status != $id) {
throw new \Exception('手机号已存在'); throw new \Exception('手机号已存在');
@ -153,6 +164,9 @@ class PersonnelService extends BaseAdminService
} }
} }
$this->model->where([['id', '=', $id]])->update($data); $this->model->where([['id', '=', $id]])->update($data);
(new PersonnelInfo())->where(['person_id' => $id])->update($info);
Db::commit(); Db::commit();
} catch (\Exception $e) { } catch (\Exception $e) {
Db::rollback(); Db::rollback();

Loading…
Cancel
Save