@@ -27,7 +27,6 @@ declare module 'vue' { | |||||
ElCol: typeof import('element-plus/es')['ElCol'] | ElCol: typeof import('element-plus/es')['ElCol'] | ||||
ElColorPicker: typeof import('element-plus/es')['ElColorPicker'] | ElColorPicker: typeof import('element-plus/es')['ElColorPicker'] | ||||
ElContainer: typeof import('element-plus/es')['ElContainer'] | ElContainer: typeof import('element-plus/es')['ElContainer'] | ||||
ElDatePicker: typeof import('element-plus/es')['ElDatePicker'] | |||||
ElDialog: typeof import('element-plus/es')['ElDialog'] | ElDialog: typeof import('element-plus/es')['ElDialog'] | ||||
ElDivider: typeof import('element-plus/es')['ElDivider'] | ElDivider: typeof import('element-plus/es')['ElDivider'] | ||||
ElDrawer: typeof import('element-plus/es')['ElDrawer'] | ElDrawer: typeof import('element-plus/es')['ElDrawer'] | ||||
@@ -40,7 +39,6 @@ declare module 'vue' { | |||||
ElFormItem: typeof import('element-plus/es')['ElFormItem'] | ElFormItem: typeof import('element-plus/es')['ElFormItem'] | ||||
ElHeader: typeof import('element-plus/es')['ElHeader'] | ElHeader: typeof import('element-plus/es')['ElHeader'] | ||||
ElIcon: typeof import('element-plus/es')['ElIcon'] | ElIcon: typeof import('element-plus/es')['ElIcon'] | ||||
ElImage: typeof import('element-plus/es')['ElImage'] | |||||
ElInput: typeof import('element-plus/es')['ElInput'] | ElInput: typeof import('element-plus/es')['ElInput'] | ||||
ElLink: typeof import('element-plus/es')['ElLink'] | ElLink: typeof import('element-plus/es')['ElLink'] | ||||
ElMain: typeof import('element-plus/es')['ElMain'] | ElMain: typeof import('element-plus/es')['ElMain'] | ||||
@@ -49,12 +47,9 @@ declare module 'vue' { | |||||
ElOption: typeof import('element-plus/es')['ElOption'] | ElOption: typeof import('element-plus/es')['ElOption'] | ||||
ElPagination: typeof import('element-plus/es')['ElPagination'] | ElPagination: typeof import('element-plus/es')['ElPagination'] | ||||
ElRadio: typeof import('element-plus/es')['ElRadio'] | ElRadio: typeof import('element-plus/es')['ElRadio'] | ||||
ElRadioButton: typeof import('element-plus/es')['ElRadioButton'] | |||||
ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup'] | |||||
ElRow: typeof import('element-plus/es')['ElRow'] | ElRow: typeof import('element-plus/es')['ElRow'] | ||||
ElScrollbar: typeof import('element-plus/es')['ElScrollbar'] | ElScrollbar: typeof import('element-plus/es')['ElScrollbar'] | ||||
ElSelect: typeof import('element-plus/es')['ElSelect'] | ElSelect: typeof import('element-plus/es')['ElSelect'] | ||||
ElSlider: typeof import('element-plus/es')['ElSlider'] | |||||
ElSpace: typeof import('element-plus/es')['ElSpace'] | ElSpace: typeof import('element-plus/es')['ElSpace'] | ||||
ElSubMenu: typeof import('element-plus/es')['ElSubMenu'] | ElSubMenu: typeof import('element-plus/es')['ElSubMenu'] | ||||
ElSwitch: typeof import('element-plus/es')['ElSwitch'] | ElSwitch: typeof import('element-plus/es')['ElSwitch'] | ||||
@@ -63,11 +58,8 @@ declare module 'vue' { | |||||
ElTabPane: typeof import('element-plus/es')['ElTabPane'] | ElTabPane: typeof import('element-plus/es')['ElTabPane'] | ||||
ElTabs: typeof import('element-plus/es')['ElTabs'] | ElTabs: typeof import('element-plus/es')['ElTabs'] | ||||
ElTag: typeof import('element-plus/es')['ElTag'] | ElTag: typeof import('element-plus/es')['ElTag'] | ||||
ElText: typeof import('element-plus/es')['ElText'] | |||||
ElTimePicker: typeof import('element-plus/es')['ElTimePicker'] | |||||
ElTooltip: typeof import('element-plus/es')['ElTooltip'] | ElTooltip: typeof import('element-plus/es')['ElTooltip'] | ||||
ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect'] | ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect'] | ||||
ElUpload: typeof import('element-plus/es')['ElUpload'] | |||||
ESign: typeof import('./src/components/ESign/index.vue')['default'] | ESign: typeof import('./src/components/ESign/index.vue')['default'] | ||||
FormContainer: typeof import('./src/components/Form/FormContainer/index.vue')['default'] | FormContainer: typeof import('./src/components/Form/FormContainer/index.vue')['default'] | ||||
Grid: typeof import('./src/components/Grid/index.vue')['default'] | Grid: typeof import('./src/components/Grid/index.vue')['default'] | ||||
@@ -48,6 +48,10 @@ const attendanceRoolcallApi = { | |||||
/** 修改点名任务 */ | /** 修改点名任务 */ | ||||
update(params: any) { | update(params: any) { | ||||
return http.put("update", params); | return http.put("update", params); | ||||
}, | |||||
/** 手动点名 */ | |||||
manualRoll(params: any) { | |||||
return http.post("manualRoll", params); | |||||
} | } | ||||
}; | }; | ||||
@@ -39,6 +39,22 @@ const portraitSummaryApi = { | |||||
/** 获取学生属性标签 */ | /** 获取学生属性标签 */ | ||||
getStudentDetail(params: any) { | getStudentDetail(params: any) { | ||||
return http.get("getStudentDetail", params); | return http.get("getStudentDetail", params); | ||||
}, | |||||
/* 学生-出勤情况 */ | |||||
getStudentAttendance(params: any) { | |||||
return http.post("attendance", params); | |||||
}, | |||||
/* 学生-出校 */ | |||||
getStudentOutSchool(params: any) { | |||||
return http.post("outsideSchool", params); | |||||
}, | |||||
/* 学生-图书馆 */ | |||||
getStudentLibrary(params: any) { | |||||
return http.post("library", params); | |||||
}, | |||||
/* 学生-食堂 */ | |||||
getStudentCanteen(params: any) { | |||||
return http.post("canteen", params); | |||||
} | } | ||||
}; | }; | ||||
@@ -187,6 +187,8 @@ const detialRef = ref<InstanceType<typeof TraceShow> | null>(null); | |||||
onMounted(async () => { | onMounted(async () => { | ||||
// 获取系部下拉数据 | // 获取系部下拉数据 | ||||
departmentOptions.value = await getDepartmentList() | departmentOptions.value = await getDepartmentList() | ||||
// 获取班级 | |||||
classOptions.value = await getClassList('') | |||||
}); | }); | ||||
</script> | </script> | ||||
<style scoped lang="scss"> | <style scoped lang="scss"> | ||||
@@ -101,9 +101,9 @@ const rules = reactive({ | |||||
similarity: [required("请选择相似度")], | similarity: [required("请选择相似度")], | ||||
cameraId: [required("请选择摄像头")], | cameraId: [required("请选择摄像头")], | ||||
continueTime: [required("请选择持续时间")], | continueTime: [required("请选择持续时间")], | ||||
personSetId: [required("请选择所属班级")], | |||||
depId: [required("请选择系部")], | |||||
majorId: [required("请选择专业")] | |||||
personSetId: [required("请选择所属班级")] | |||||
// depId: [required("请选择系部")], | |||||
// majorId: [required("请选择专业")] | |||||
}); | }); | ||||
/** | /** | ||||
@@ -112,6 +112,8 @@ const rules = reactive({ | |||||
*/ | */ | ||||
async function onOpen(props: FormProps.Base<any>) { | async function onOpen(props: FormProps.Base<any>) { | ||||
departmentOptions.value = await getDepartmentList(); | departmentOptions.value = await getDepartmentList(); | ||||
// 获取班级 | |||||
classOptions.value = await getClassList(""); | |||||
Object.assign(sysUserProps, props); //合并参数 | Object.assign(sysUserProps, props); //合并参数 | ||||
visible.value = true; //显示表单 | visible.value = true; //显示表单 | ||||
/* 监听系部、专业 */ | /* 监听系部、专业 */ | ||||
@@ -20,7 +20,7 @@ | |||||
<el-row :gutter="20"> | <el-row :gutter="20"> | ||||
<el-col :span="24" | <el-col :span="24" | ||||
><el-row class="rowbg"> | ><el-row class="rowbg"> | ||||
<el-col :xl="4" :lg="4" :md="6" :sm="8" :xs="12" v-for="(item, index) in listData" :key="index" | |||||
<el-col :xl="3" :lg="4" :md="6" :sm="8" :xs="12" v-for="(item, index) in listData" :key="index" | |||||
><div class="grid-content"> | ><div class="grid-content"> | ||||
<div class="imgBox" :class="{ active: item.status === 1 ? true : false }"> | <div class="imgBox" :class="{ active: item.status === 1 ? true : false }"> | ||||
<el-image | <el-image | ||||
@@ -42,6 +42,9 @@ | |||||
{{ item.personSetName }} | {{ item.personSetName }} | ||||
</div> | </div> | ||||
</div> | </div> | ||||
<div v-if="item.status !== 1" class="btn btns" style="justify-content: center; border-top: none"> | |||||
<el-button size="small" type="primary" @click="checkOut(item, index)">签到</el-button> | |||||
</div> | |||||
</div></el-col | </div></el-col | ||||
> | > | ||||
</el-row></el-col | </el-row></el-col | ||||
@@ -151,6 +154,19 @@ const assignFn = (item: any) => { | |||||
const checkOut = (item: any, index: number) => { | const checkOut = (item: any, index: number) => { | ||||
checkIndex.value = index; | checkIndex.value = index; | ||||
checkData.value = JSON.parse(JSON.stringify(item)); | checkData.value = JSON.parse(JSON.stringify(item)); | ||||
attendanceRoolcallApi.manualRoll([{ personId: item.personId, personSetId: item.personSetId, taskId: route.query.taskId }]).then(() => { | |||||
ElMessage({ | |||||
message: "点名成功", | |||||
type: "success" | |||||
}); | |||||
UnrecognizedD.value = UnrecognizedD.value.filter((item1: any) => item1.id !== item.id); | |||||
listData.value.map((item2: any) => { | |||||
if (item2.personId === item.personId) { | |||||
item2.status = 1; | |||||
} | |||||
}); | |||||
}); | |||||
}; | }; | ||||
const submitFn = () => { | const submitFn = () => { | ||||
if (!checkIndex.value && checkIndex.value !== 0) { | if (!checkIndex.value && checkIndex.value !== 0) { | ||||
@@ -162,7 +178,7 @@ const submitFn = () => { | |||||
} | } | ||||
visible.value = false; | visible.value = false; | ||||
attendanceRoolcallApi.update({ id: assignId.value, personId: checkData.value.personId, personSetId: checkData.value.personSetId }).then(() => { | |||||
attendanceRoolcallApi.update({ taskId: assignId.value, personId: checkData.value.personId, personSetId: checkData.value.personSetId }).then(() => { | |||||
ElMessage({ | ElMessage({ | ||||
message: "指派成功", | message: "指派成功", | ||||
type: "success" | type: "success" | ||||
@@ -209,11 +225,26 @@ onMounted(() => { | |||||
height: 190px; | height: 190px; | ||||
margin-bottom: 20px; | margin-bottom: 20px; | ||||
.grid-content { | .grid-content { | ||||
position: relative; | |||||
box-sizing: border-box; | box-sizing: border-box; | ||||
height: 100%; | |||||
// height: 100%; | |||||
padding: 15px; | padding: 15px; | ||||
margin: 10px; | margin: 10px; | ||||
background: #ffffff; | background: #ffffff; | ||||
.btns { | |||||
position: absolute; | |||||
top: 0; | |||||
left: 0; | |||||
width: 100%; | |||||
background: rgb(0 0 0 / 80%); | |||||
opacity: 0; | |||||
} | |||||
&:hover { | |||||
.btns { | |||||
opacity: 1; | |||||
} | |||||
} | |||||
.imgBox { | .imgBox { | ||||
display: flex; | display: flex; | ||||
align-items: center; | align-items: center; | ||||
@@ -233,7 +264,6 @@ onMounted(() => { | |||||
} | } | ||||
} | } | ||||
.info { | .info { | ||||
height: 80px; | |||||
.label { | .label { | ||||
margin-right: 8px; | margin-right: 8px; | ||||
font-size: 14px; | font-size: 14px; | ||||
@@ -181,7 +181,9 @@ const RefreshTable = () => { | |||||
} | } | ||||
onMounted(async () => { | onMounted(async () => { | ||||
// 获取系部下拉数据 | // 获取系部下拉数据 | ||||
departmentOptions.value = await getDepartmentList() | |||||
departmentOptions.value = await getDepartmentList(); | |||||
// 获取班级 | |||||
classOptions.value = await getClassList('') | |||||
}); | }); | ||||
</script> | </script> | ||||
<style scoped lang="scss"> | <style scoped lang="scss"> | ||||
@@ -156,6 +156,8 @@ const genderOptions = ref([ | |||||
]); | ]); | ||||
onMounted(async () => { | onMounted(async () => { | ||||
departmentOptions.value = await getDepartmentList(); | departmentOptions.value = await getDepartmentList(); | ||||
// 获取班级 | |||||
classOptions.value = await getClassList(""); | |||||
// 初始化 | // 初始化 | ||||
userInfo.value.gender = userInfo.value.gender ? userInfo.value.gender : genderOptions.value[0].value; | userInfo.value.gender = userInfo.value.gender ? userInfo.value.gender : genderOptions.value[0].value; | ||||
if (userInfo.value.personId) { | if (userInfo.value.personId) { | ||||
@@ -49,8 +49,8 @@ const rules = reactive({ | |||||
gender: [required("请选择性别")], | gender: [required("请选择性别")], | ||||
faces: [required("请上传人脸图片")], | faces: [required("请上传人脸图片")], | ||||
phone: [required("请输入手机号")], | phone: [required("请输入手机号")], | ||||
depId: [required("请选择系部")], | |||||
majorId: [required("请选择专业")], | |||||
// depId: [required("请选择系部")], | |||||
// majorId: [required("请选择专业")], | |||||
personSetId: [required("请选择班级")] | personSetId: [required("请选择班级")] | ||||
}); | }); | ||||
@@ -281,6 +281,8 @@ const handleAvatarSuccess: UploadProps["onSuccess"] = (response) => { | |||||
onMounted(async () => { | onMounted(async () => { | ||||
// 获取系部下拉数据 | // 获取系部下拉数据 | ||||
departmentOptions.value = await getDepartmentList() | departmentOptions.value = await getDepartmentList() | ||||
// 获取班级 | |||||
classOptions.value = await getClassList(""); | |||||
}); | }); | ||||
</script> | </script> | ||||
<style scoped lang="scss"> | <style scoped lang="scss"> | ||||
@@ -98,7 +98,7 @@ | |||||
</view> | </view> | ||||
<view class="tableBox"> | <view class="tableBox"> | ||||
<u-empty marginTop="100rpx" :show="false" mode="warnList" text="暂无数据"></u-empty> | |||||
<u-empty marginTop="100rpx" :show="false" mode="list" text="暂无数据"></u-empty> | |||||
<u-list @scrolltolower="scrolltolower" style="height: calc(100% - 0rpx);"> | <u-list @scrolltolower="scrolltolower" style="height: calc(100% - 0rpx);"> | ||||
<u-list-item v-for="(item, index) in warnList" :key="index"> | <u-list-item v-for="(item, index) in warnList" :key="index"> | ||||
<view class="liBox"> | <view class="liBox"> | ||||
@@ -184,6 +184,11 @@ | |||||
<script> | <script> | ||||
import selectRadio from "@/components/selectRadio.vue" | import selectRadio from "@/components/selectRadio.vue" | ||||
import selectSearch from "@/components/selectSearch.vue" | import selectSearch from "@/components/selectSearch.vue" | ||||
import { | |||||
page, //获取列表 | |||||
detail, //详情 | |||||
warnType, //获取预警类型 | |||||
} from '@/api/warn/index.js' | |||||
export default { | export default { | ||||
components: { | components: { | ||||
selectRadio, | selectRadio, | ||||
@@ -361,17 +366,21 @@ | |||||
loadmore() { | loadmore() { | ||||
if (this.status != 'loadmore') return | if (this.status != 'loadmore') return | ||||
this.status = 'loading' | this.status = 'loading' | ||||
setTimeout(() => { | |||||
for (let i = 0; i < 1; i++) { | |||||
this.warnList.push({}, {}) | |||||
} | |||||
page(this.searchForm).then(res=>{ | |||||
console.log(res) | |||||
// 获取到的总条数>=接口总条数 | // 获取到的总条数>=接口总条数 | ||||
if (this.warnList.length >= 14) { | if (this.warnList.length >= 14) { | ||||
this.status = 'nomore' | this.status = 'nomore' | ||||
} else { | } else { | ||||
this.status = 'loadmore' | this.status = 'loadmore' | ||||
} | } | ||||
}, 2000) | |||||
}) | |||||
// setTimeout(() => { | |||||
// for (let i = 0; i < 1; i++) { | |||||
// this.warnList.push({}, {}) | |||||
// } | |||||
// }, 2000) | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -9,9 +9,8 @@ | |||||
</view> | </view> | ||||
</view> | </view> | ||||
<view class="searchBox"> | <view class="searchBox"> | ||||
<view class="searchLine" @click="showTree"> | |||||
<view class="searchLabels"> | |||||
<view class="searchLine"> | |||||
<view class="searchLabels" @click="showTree"> | |||||
<image v-show="isShowSearch==false" src="@/static/image/earlyWarning/group.png" mode=""> | <image v-show="isShowSearch==false" src="@/static/image/earlyWarning/group.png" mode=""> | ||||
</image> | </image> | ||||
<image v-show="isShowSearch" src="@/static/image/earlyWarning/group2.png" mode=""> | <image v-show="isShowSearch" src="@/static/image/earlyWarning/group2.png" mode=""> | ||||
@@ -26,9 +25,46 @@ | |||||
<image v-show="isShowSearch" src="@/static/image/earlyWarning/arrow2.png" mode=""></image> | <image v-show="isShowSearch" src="@/static/image/earlyWarning/arrow2.png" mode=""></image> | ||||
</view> | </view> | ||||
</view> | </view> | ||||
<view @click="isShowSearch=false" class="searchDialog" v-if="isShowSearch"> | |||||
<view class="content" @click.stop="isSelect"> | |||||
<u-row justify="space-between" gutter="10"> | |||||
<u-col span="7"> | |||||
<view class="demo-layout"> | |||||
<view class="left-layout"> | |||||
<text>{{'警告类型'}}</text> | |||||
</view> | |||||
<view class="right-layout"> | |||||
<image style="width: 30rpx;height:30rpx;" | |||||
src="@/static/image/earlyWarning/arrowRight.png" mode=""></image> | |||||
</view> | |||||
</view> | |||||
</u-col> | |||||
<u-col span="5"> | |||||
<view class="demo-layout" @click="toOpenSelect"> | |||||
<view class="left-layout"> | |||||
<text>{{'处理状态'}}</text> | |||||
</view> | |||||
<view class="right-layout"> | |||||
<image style="width: 30rpx;height:30rpx;" | |||||
src="@/static/image/earlyWarning/arrowRight.png" mode=""></image> | |||||
</view> | |||||
</view> | |||||
</u-col> | |||||
</u-row> | |||||
<view class="btnBox"> | |||||
<view class="leftBtn" @click="clearform"> | |||||
重置 | |||||
</view> | |||||
<view class="rightBtn" @click="onsubmit"> | |||||
确认 | |||||
</view> | |||||
</view> | |||||
</view> | |||||
</view> | |||||
</view> | </view> | ||||
<view class="tableBox"> | <view class="tableBox"> | ||||
<u-empty marginTop="100rpx" :show="false" mode="warnList" text="暂无数据"></u-empty> | |||||
<u-empty marginTop="100rpx" :show="false" mode="list" text="暂无数据"></u-empty> | |||||
<u-list @scrolltolower="scrolltolower" style="height: calc(100% - 0rpx);"> | <u-list @scrolltolower="scrolltolower" style="height: calc(100% - 0rpx);"> | ||||
<u-list-item v-for="(item, index) in warnList" :key="index"> | <u-list-item v-for="(item, index) in warnList" :key="index"> | ||||
<view class="liBox"> | <view class="liBox"> | ||||