This commit is contained in:
王创世 2025-03-11 17:00:48 +08:00
parent a0070aa65d
commit fce1e1b5f4
16 changed files with 467 additions and 162 deletions

6
components.d.ts vendored
View File

@ -7,7 +7,6 @@ export {}
/* prettier-ignore */ /* prettier-ignore */
declare module 'vue' { declare module 'vue' {
export interface GlobalComponents { export interface GlobalComponents {
LayBadge: typeof import('@layui/layui-vue')['LayBadge']
LayBody: typeof import('@layui/layui-vue')['LayBody'] LayBody: typeof import('@layui/layui-vue')['LayBody']
LayBreadcrumb: typeof import('@layui/layui-vue')['LayBreadcrumb'] LayBreadcrumb: typeof import('@layui/layui-vue')['LayBreadcrumb']
LayBreadcrumbItem: typeof import('@layui/layui-vue')['LayBreadcrumbItem'] LayBreadcrumbItem: typeof import('@layui/layui-vue')['LayBreadcrumbItem']
@ -18,8 +17,6 @@ declare module 'vue' {
LayCol: typeof import('@layui/layui-vue')['LayCol'] LayCol: typeof import('@layui/layui-vue')['LayCol']
LayConfigProvider: typeof import('@layui/layui-vue')['LayConfigProvider'] LayConfigProvider: typeof import('@layui/layui-vue')['LayConfigProvider']
LayContainer: typeof import('@layui/layui-vue')['LayContainer'] LayContainer: typeof import('@layui/layui-vue')['LayContainer']
LayCountUp: typeof import('@layui/layui-vue')['LayCountUp']
LayDate: typeof import('@layui/layui-vue')['LayDate']
LayDatePicker: typeof import('@layui/layui-vue')['LayDatePicker'] LayDatePicker: typeof import('@layui/layui-vue')['LayDatePicker']
LayDescriptions: typeof import('@layui/layui-vue')['LayDescriptions'] LayDescriptions: typeof import('@layui/layui-vue')['LayDescriptions']
LayDescriptionsItem: typeof import('@layui/layui-vue')['LayDescriptionsItem'] LayDescriptionsItem: typeof import('@layui/layui-vue')['LayDescriptionsItem']
@ -41,9 +38,7 @@ declare module 'vue' {
LayLogo: typeof import('@layui/layui-vue')['LayLogo'] LayLogo: typeof import('@layui/layui-vue')['LayLogo']
LayMenu: typeof import('@layui/layui-vue')['LayMenu'] LayMenu: typeof import('@layui/layui-vue')['LayMenu']
LayMenuItem: typeof import('@layui/layui-vue')['LayMenuItem'] LayMenuItem: typeof import('@layui/layui-vue')['LayMenuItem']
LayPage: typeof import('@layui/layui-vue')['LayPage']
LayPopconfirm: typeof import('@layui/layui-vue')['LayPopconfirm'] LayPopconfirm: typeof import('@layui/layui-vue')['LayPopconfirm']
LayProgress: typeof import('@layui/layui-vue')['LayProgress']
LayRadio: typeof import('@layui/layui-vue')['LayRadio'] LayRadio: typeof import('@layui/layui-vue')['LayRadio']
LayRadioGroup: typeof import('@layui/layui-vue')['LayRadioGroup'] LayRadioGroup: typeof import('@layui/layui-vue')['LayRadioGroup']
LayRow: typeof import('@layui/layui-vue')['LayRow'] LayRow: typeof import('@layui/layui-vue')['LayRow']
@ -64,6 +59,5 @@ declare module 'vue' {
LayUpload: typeof import('@layui/layui-vue')['LayUpload'] LayUpload: typeof import('@layui/layui-vue')['LayUpload']
RouterLink: typeof import('vue-router')['RouterLink'] RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView'] RouterView: typeof import('vue-router')['RouterView']
WangEditor: typeof import('./src/components/WangEditor/index.vue')['default']
} }
} }

BIN
dist.zip Normal file

Binary file not shown.

View File

@ -9,8 +9,8 @@ type TAxiosOption = {
headers: object; headers: object;
} }
//记得修改上传路径/api/common/upload //记得修改上传路径/api/common/upload
//const baseURL = 'http://yfyd.hschool.com.cn' // 设置基础URL前缀 const baseURL = 'http://yfyd.hschool.com.cn' // 设置基础URL前缀
const baseURL="/api"; //const baseURL="http://127.0.0.1";
// 导出baseURL使其可以在其他页面使用 // 导出baseURL使其可以在其他页面使用
export { baseURL }; export { baseURL };

View File

@ -347,6 +347,26 @@ export function uploadImage(data: any) {
return Http.post('/api/common/upload', data) return Http.post('/api/common/upload', data)
} }
// 日志列表
export function logList(data: any) {
return Http.post('/api/backend/Logrecording/index', data)
}
// 查询某一个用户所有的月度考评
export function getMonthlyFindData(data: any) {
return Http.post('/api/backend/Monthly/getMonthlyFindData', data)
}
// 查询某一个用户所有的季度考评
export function getQuarterlyFindData(data: any) {
return Http.post('/api/backend/Quarter/getQuarterlyFindData', data)
}
// 查询某一个用户所有的年度考评
export function getAnnualFindData(data: any) {
return Http.post('/api/backend/Year/getAnnualFindData', data)
}

View File

@ -4,7 +4,7 @@
<div style="padding: 10px"> <div style="padding: 10px">
<span style="font-size: 18px;vertical-align: center;margin-right: 20px">登录日志列表</span> <span style="font-size: 18px;vertical-align: center;margin-right: 20px">登录日志列表</span>
</div> </div>
<lay-table size="lg" ref="tableRef" :columns="columns" :data-source="dataSource"> <lay-table height="600px" @change="changePage" :page="page" size="lg" ref="tableRef" :columns="columns" :data-source="dataSource">
<template v-slot:event_type="{ data }"> <template v-slot:event_type="{ data }">
<span :style="{ color: data.event_type === '登录' ? '#67C23A' : '#409EFF' }"> <span :style="{ color: data.event_type === '登录' ? '#67C23A' : '#409EFF' }">
{{ data.event_type }} {{ data.event_type }}
@ -16,22 +16,44 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, onMounted } from 'vue' import { ref, onMounted, reactive } from 'vue'
import { layer } from '@layui/layer-vue' import { layer } from '@layui/layer-vue'
import { logList } from '@/api/module/home';
const page = reactive({
current: 1,
limit: 10,
total: 1
});
// //
interface LoginLog { interface LoginLog {
id: number id: number
department: string // user_id: number
record_time: string // ip_code: string // IP
login_name: string // createtime: string //
username: string // content: string //
ip_address: string // IP nickname: string //
event_type: string // / work_number: string //
event_content: string // name: string //
device_info: string // }
onMounted(() => {
getLogList();
});
//
const changePage = (ppc) => {
page.current = ppc.current;
page.limit = ppc.limit;
getLogList();
}
const getLogList = () => {
logList({ page: page.current, size: page.limit }).then((res) => {
if (res.code === 1) {
dataSource.value = res.data.data;
page.total = res.data.count;
} else {
layer.msg(res.msg, { icon: 2 })
}
})
} }
// //
const dataSource = ref<LoginLog[]>([]) const dataSource = ref<LoginLog[]>([])
@ -40,44 +62,33 @@ const columns = [
{ {
title: "科室", title: "科室",
width: "120px", width: "120px",
key: "department" key: "name"
}, },
{ {
title: "记录时间", title: "工号",
width: "180px",
key: "record_time"
},
{
title: "登录名",
width: "120px", width: "120px",
key: "login_name" key: "work_number"
},
{
title: "用户名",
width: "120px",
key: "username"
}, },
{ {
title: "登录IP", title: "登录IP",
width: "150px", width: "150px",
key: "ip_address" key: "ip_code"
}, },
{ {
title: "事件类型", title: "用户姓名",
width: "100px", width: "120px",
key: "event_type", key: "nickname"
customSlot: 'event_type'
}, },
{ {
title: "事件内容", title: "事件内容",
width: "200px", width: "200px",
key: "event_content" key: "content"
}, },
{ {
title: "设备信息", title: "记录时间",
width: "250px", width: "180px",
key: "device_info" key: "createtime"
} },
] ]
onMounted(() => { onMounted(() => {
@ -99,14 +110,13 @@ const getLoginLogs = () => {
dataSource.value = [ dataSource.value = [
{ {
id: 1, id: 1,
department: '内科', user_id: 10,
record_time: '2024-03-20 10:30:45', ip_code: '192.168.1.100',
login_name: 'admin', createtime: '2024-03-20 10:30:45',
username: '管理员', content: '用户登录成功',
ip_address: '192.168.1.100', nickname: '张三',
event_type: '登录', work_number: '111111',
event_content: '用户登录成功', name: '大腿骨折2'
device_info: 'Chrome 122.0.0.0 / Windows 10'
}, },
{ {
id: 2, id: 2,

View File

@ -12,7 +12,7 @@
height="600px" height="600px"
:columns="columns" :columns="columns"
:data-source="dataSource" :data-source="dataSource"
@page-change="changePage" @change="changePage"
> >
<template v-slot:content="{ data }"> <template v-slot:content="{ data }">
<div v-html="data.content"></div> <div v-html="data.content"></div>
@ -75,7 +75,6 @@ const columns = [
title: "公告内容", title: "公告内容",
width: "280px", width: "280px",
key: "content", key: "content",
customSlot: 'content',
ellipsisTooltip: true ellipsisTooltip: true
}, },
{ {
@ -113,8 +112,9 @@ const getNoticeList = () => {
} }
// //
const changePage = (currentPage: number) => { const changePage = (ppc) => {
page.current = currentPage; page.current = ppc.current;
page.limit = ppc.limit;
getNoticeList(); getNoticeList();
} }

View File

@ -22,8 +22,7 @@
<lay-row> <lay-row>
<lay-col :md="5"> <lay-col :md="5">
<lay-form-item label="月度" label-width="80"> <lay-form-item label="月度" label-width="80">
<lay-date-picker type="yearmonth" v-model="yearmonth" placeholder="月度" <lay-date-picker type="yearmonth" v-model="yearmonth" placeholder="月度" allow-clear></lay-date-picker>
allow-clear></lay-date-picker>
</lay-form-item> </lay-form-item>
</lay-col> </lay-col>
<!-- <lay-col :md="5">--> <!-- <lay-col :md="5">-->
@ -55,18 +54,24 @@
</lay-card> </lay-card>
<lay-tab v-model="tab_id" type="brief" @change="openTab"> <lay-tab v-model="tab_id" type="brief" @change="openTab">
<lay-tab-item v-for="item in tabList" :title="item.title" :id="item.id"> <lay-tab-item v-for="item in tabList" :title="item.title" :id="item.id">
<lay-table :page="page" height="600px" :columns="columns" :loading="loading" <lay-table :page="page" height="600px" :columns="columns" :loading="loading" :data-source="dataSource"
:data-source="dataSource" v-model:selected-keys="selectedKeys" @change="change"> v-model:selected-keys="selectedKeys" @change="change">
<template v-slot:scoringrecord_status="{ row }"> <template v-slot:scoringrecord_status="{ row }">
<lay-tag v-if="row.scoringrecord_status == 1" type="primary">已自评</lay-tag> <lay-tag v-if="row.scoringrecord_status == 1" type="primary">已自评</lay-tag>
<lay-tag v-if="row.scoringrecord_status == 2">未自评</lay-tag> <lay-tag v-if="row.scoringrecord_status == 2">未自评</lay-tag>
</template> </template>
<template v-slot:nickname="{ row }">
<div style="color: #00A394;cursor: pointer" @click="openUserListShow(row)">{{ row.nickname }}</div>
</template>
<template v-slot:operator="{ row }"> <template v-slot:operator="{ row }">
<span style="color: #00A394;cursor: pointer" v-if="row.department_score_scoringrecord==0 && row.scoringrecord_status==1" <span style="color: #00A394;cursor: pointer"
v-if="row.department_score_scoringrecord == 0 && row.scoringrecord_status == 1"
@click="getInfo(row, 1)">科室评分</span> @click="getInfo(row, 1)">科室评分</span>
<span style="color: #00A394;cursor: pointer" v-if="row.department_score_scoringrecord!=0 && row.scoringrecord_status==1" <span style="color: #00A394;cursor: pointer"
v-if="row.department_score_scoringrecord != 0 && row.scoringrecord_status == 1"
@click="getInfo(row, 2)">考评详情</span> @click="getInfo(row, 2)">考评详情</span>
<span style="color: #999999;cursor: not-allowed" v-if="row.department_score_scoringrecord==0 && row.scoringrecord_status==2">考评详情</span> <span style="color: #999999;cursor: not-allowed"
v-if="row.department_score_scoringrecord == 0 && row.scoringrecord_status == 2">未自评</span>
</template> </template>
</lay-table> </lay-table>
</lay-tab-item> </lay-tab-item>
@ -83,19 +88,59 @@
<lay-input-number v-if="data.pid == 0" :disabled="true" :min="0" :max="data.base_score" <lay-input-number v-if="data.pid == 0" :disabled="true" :min="0" :max="data.base_score"
v-model="data.base_score" position="right"></lay-input-number> v-model="data.base_score" position="right"></lay-input-number>
<lay-input-number v-if="data.pid != 0" :disabled="addIsInfo == 2" :min="0" :max="data.base_score" <lay-input-number v-if="data.pid != 0" :disabled="addIsInfo == 2" :min="0" :max="data.base_score"
v-model="data.content_score" v-model="data.content_score" position="right"></lay-input-number>
position="right"></lay-input-number>
</template> </template>
<template v-slot:ksinput="{ data, rowIndex }"> <template v-slot:ksinput="{ data, rowIndex }">
<lay-input-number v-if="data.pid == 0" :disabled="true" :min="0" :max="data.base_score" <lay-input-number v-if="data.pid == 0" :disabled="true" :min="0" :max="data.base_score"
v-model="data.base_score" position="right"></lay-input-number> v-model="data.base_score" position="right"></lay-input-number>
<lay-input-number v-if="data.pid != 0" :disabled="addIsInfo == 2" :min="0" :max="data.base_score" <lay-input-number v-if="data.pid != 0" :disabled="addIsInfo == 2" :min="0" :max="data.base_score"
v-model="data.department_score" v-model="data.department_score" position="right"></lay-input-number>
position="right"></lay-input-number>
</template> </template>
</lay-table> </lay-table>
</lay-container> </lay-container>
</lay-layer> </lay-layer>
<lay-layer v-model="userShow" title="月度自评列表" :shade="true" :area="['90%', '90%']">
<lay-container fluid="true" style="padding: 20px">
<lay-row :space="10">
<lay-col :md="24">
<lay-card>
<lay-form style="margin-top: 20px">
<lay-row>
<lay-col :md="5">
<lay-form-item label="年度:" label-width="50">
<lay-date-picker type="year" v-model="searchAccountUser" placeholder="请选择"
allow-clear></lay-date-picker>
</lay-form-item>
</lay-col>
<lay-col :md="4">
<lay-form-item label-width="0">
<lay-button type="primary" @click="toUserSearch">查询</lay-button>
<lay-button @click="toReset">重置</lay-button>
</lay-form-item>
</lay-col>
</lay-row>
</lay-form>
</lay-card>
</lay-col>
<lay-col :md="24">
<lay-tab v-model="userTabId" type="brief" @change="openUserTab">
<lay-tab-item v-for="item in tabList" :title="item.title" :id="item.id">
<lay-table :default-expand-all="true" :columns="userColumns"
:data-source="userDataSource">
<template v-slot:operator="{ row }">
<span v-if="row.if ==2" style="color: #00A394;cursor: pointer"
@click="getMonthlyInfo(row)">考评详情</span>
<span style="color: #999999;cursor: not-allowed"
v-if="row.if ==1">未自评</span>
</template>
</lay-table>
</lay-tab-item>
</lay-tab>
</lay-col>
</lay-row>
</lay-container>
</lay-layer>
</lay-container> </lay-container>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
@ -106,13 +151,63 @@ import {
getGroupEvaluation, getGroupEvaluation,
getMonthlyUserList, getMonthlyUserList,
MonthlyCreate, MonthlyCreate,
getMonthlyListFind, getMonthlyListUpdate getMonthlyListFind, getMonthlyListUpdate, getMonthlyFindData,
MonthlyInfo
} from "@/api/module/home"; } from "@/api/module/home";
import dayjs from "dayjs"; import dayjs from "dayjs";
onMounted(() => { onMounted(() => {
getLeftList(); getLeftList();
}) })
const userShow = ref(false);
const userColumns = ref([
{ title: '月度', width: '80px', key: 'month', align: 'center' },
{ title: '考评对象', width: '100px', key: 'user', align: 'center' },
{ title: '参评时间', width: '100px', key: 'createtime', align: 'center' },
{ title: '自评总分', width: '100px', key: 'self_score', align: 'center' },
{ title: '科室评分', width: '100px', key: 'department_score', align: 'center' },
{ title: '医院评分', width: '100px', key: 'hospital_score', align: 'center' },
{ title: '操作', width: '100px', key: 'operator', customSlot: 'operator', align: 'center' },
])
const userDataSource = ref([]);
const userTabId = ref(0);
const userInfo = ref({});
const searchAccountUser = ref(dayjs().year());
const openUserListShow = (row) => {
userInfo.value = row;
userShow.value = true;
getUserListInfo();
}
const getUserListInfo = () => {
getMonthlyFindData({
'user_id': userInfo.value.id,
'evaluation_id': userTabId.value,
'time': searchAccountUser.value
}).then((res) => {
console.log(res)
if(res.code==1){
userDataSource.value = res.data;
}else{
userDataSource.value = [];
}
})
}
const openUserTab = (d) => {
console.log(d)
userTabId.value = d;
userDataSource.value = [];
getUserListInfo();
}
const getMonthlyInfo = (item) => {
addIsInfo.value=2;
infoShow.value = true;
console.log(item);
item.time=item.month;
getInfoMode(item);
}
const toUserSearch = () => {
getUserListInfo();
}
const openTab = (d) => { const openTab = (d) => {
console.log(d) console.log(d)
tab_id.value = d; tab_id.value = d;
@ -177,6 +272,7 @@ const getTabList = () => {
if (res.code == 1) { if (res.code == 1) {
tabList.value = res.data; tabList.value = res.data;
tab_id.value = res.data[0].id; tab_id.value = res.data[0].id;
userTabId.value = res.data[0].id;
getList(); getList();
} else { } else {
layer.msg(res.msg, { icon: 2 }) layer.msg(res.msg, { icon: 2 })
@ -230,10 +326,10 @@ const columns = ref([
{ title: '选项', width: '55px', type: 'checkbox', align: 'center' }, { title: '选项', width: '55px', type: 'checkbox', align: 'center' },
{ title: '序号', width: '60px', key: 'id', align: 'center' }, { title: '序号', width: '60px', key: 'id', align: 'center' },
{ title: '月度', width: '80px', key: 'time', align: 'center' }, { title: '月度', width: '80px', key: 'time', align: 'center' },
{title: '考评对象', width: '100px', key: 'nickname', align: 'center'}, { title: '考评对象', width: '100px', key: 'nickname', customSlot: 'nickname', align: 'center' },
{ title: '工号', width: '100px', key: 'work_number', align: 'center' }, { title: '工号', width: '100px', key: 'work_number', align: 'center' },
{ title: '部门', width: '120px', key: 'group_name', align: 'center' }, { title: '部门', width: '120px', key: 'group_name', align: 'center' },
{title: '季度总加分', width: '100px', key: 'zongjiafen', align: 'center'}, { title: '医院评分', width: '100px', key: 'hospital_score', align: 'center' },
{ title: '科室评分', width: '100px', key: 'department_score_scoringrecord', align: 'center' }, { title: '科室评分', width: '100px', key: 'department_score_scoringrecord', align: 'center' },
{ title: '自评总分', width: '100px', key: 'user_scoringrecord', align: 'center' }, { title: '自评总分', width: '100px', key: 'user_scoringrecord', align: 'center' },
{ title: '自评状态', width: '100px', key: 'scoringrecord_status', customSlot: 'scoringrecord_status', align: 'center' }, { title: '自评状态', width: '100px', key: 'scoringrecord_status', customSlot: 'scoringrecord_status', align: 'center' },
@ -361,5 +457,4 @@ const dataSource6 = ref([])
background-color: #e8f1ff; background-color: #e8f1ff;
color: red; color: red;
} }
</style> </style>

View File

@ -209,16 +209,6 @@ const columns = [
align: 'center', align: 'center',
key: 'createtime' key: 'createtime'
}, },
{
title: '加分',
key: 'remark',
align: 'center',
},
{
title: '扣分',
key: 'remark',
align: 'center',
},
{ {
title: '自评总分', title: '自评总分',
key: 'self_score', key: 'self_score',
@ -229,6 +219,11 @@ const columns = [
customSlot: 'department_score', customSlot: 'department_score',
align: 'center', align: 'center',
}, },
{
title: '医院评分',
key: 'hospital_score',
align: 'center',
},
{ {
title: '操作', title: '操作',
width: '180px', width: '180px',

View File

@ -55,12 +55,15 @@
<lay-tag v-if="row.scoringrecord_status==1" type="primary">已自评</lay-tag> <lay-tag v-if="row.scoringrecord_status==1" type="primary">已自评</lay-tag>
<lay-tag v-if="row.scoringrecord_status==2">未自评</lay-tag> <lay-tag v-if="row.scoringrecord_status==2">未自评</lay-tag>
</template> </template>
<template v-slot:nickname="{ row }">
<div style="color: #00A394;cursor: pointer" @click="openUserListShow(row)">{{ row.nickname }}</div>
</template>
<template v-slot:operator="{ row }"> <template v-slot:operator="{ row }">
<span style="color: #00A394;cursor: pointer" v-if="row.department_score_scoringrecord==0 && row.scoringrecord_status==1" <span style="color: #00A394;cursor: pointer" v-if="row.department_score_scoringrecord==0 && row.scoringrecord_status==1"
@click="getInfo(row,1)">科室评分</span> @click="getInfo(row,1)">科室评分</span>
<span style="color: #00A394;cursor: pointer" v-if="row.department_score_scoringrecord!=0 && row.scoringrecord_status==1" <span style="color: #00A394;cursor: pointer" v-if="row.department_score_scoringrecord!=0 && row.scoringrecord_status==1"
@click="getInfo(row,2)">考评详情</span> @click="getInfo(row,2)">考评详情</span>
<span style="color: #999999;cursor: not-allowed" v-if="row.department_score_scoringrecord==0 && row.scoringrecord_status==2">考评详情</span> <span style="color: #999999;cursor: not-allowed" v-if="row.department_score_scoringrecord==0 && row.scoringrecord_status==2">未自评</span>
</template> </template>
</lay-table> </lay-table>
</lay-tab-item> </lay-tab-item>
@ -90,6 +93,48 @@
</lay-table> </lay-table>
</lay-container> </lay-container>
</lay-layer> </lay-layer>
<lay-layer v-model="userShow" title="季度自评列表" :shade="true" :area="['90%', '90%']">
<lay-container fluid="true" style="padding: 20px">
<lay-row :space="10">
<lay-col :md="24">
<lay-card>
<lay-form style="margin-top: 20px">
<lay-row>
<lay-col :md="5">
<lay-form-item label="年度:" label-width="50">
<lay-date-picker type="year" v-model="searchAccountUser" placeholder="请选择"
allow-clear></lay-date-picker>
</lay-form-item>
</lay-col>
<lay-col :md="4">
<lay-form-item label-width="0">
<lay-button type="primary" @click="toUserSearch">查询</lay-button>
<lay-button @click="toReset">重置</lay-button>
</lay-form-item>
</lay-col>
</lay-row>
</lay-form>
</lay-card>
</lay-col>
<lay-col :md="24">
<lay-tab v-model="userTabId" type="brief" @change="openUserTab">
<lay-tab-item v-for="item in tabList" :title="item.title" :id="item.id">
<lay-table height="400px" :default-expand-all="true" :columns="userColumns"
:data-source="userDataSource">
<template v-slot:operator="{ row }">
<span v-if="row.if ==2" style="color: #00A394;cursor: pointer"
@click="getMonthlyInfo(row)">考评详情</span>
<span style="color: #999999;cursor: not-allowed"
v-if="row.if ==1">未自评</span>
</template>
</lay-table>
</lay-tab-item>
</lay-tab>
</lay-col>
</lay-row>
</lay-container>
</lay-layer>
</lay-container> </lay-container>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
@ -100,13 +145,63 @@ import {
getGroupQuarter, getGroupQuarter,
getQuarterUserList, getQuarterUserList,
getQuarterListFind, getQuarterListFind,
getQuarterListUpdate getQuarterListUpdate,
getQuarterlyFindData
} from "@/api/module/home"; } from "@/api/module/home";
import dayjs from "dayjs"; import dayjs from "dayjs";
onMounted(() => { onMounted(() => {
getLeftList(); getLeftList();
}) })
const userShow = ref(false);
const userColumns = ref([
{ title: '季度', width: '80px', key: 'quarter', align: 'center' },
{ title: '考评对象', width: '100px', key: 'user', align: 'center' },
{ title: '参评时间', width: '100px', key: 'createtime', align: 'center' },
{ title: '自评总分', width: '100px', key: 'self_score', align: 'center' },
{ title: '科室评分', width: '100px', key: 'department_score', align: 'center' },
{ title: '医院评分', width: '100px', key: 'hospital_score', align: 'center' },
{ title: '操作', width: '100px', key: 'operator', customSlot: 'operator', align: 'center' },
])
const userDataSource = ref([]);
const userTabId = ref(0);
const userInfo = ref({});
const searchAccountUser = ref(dayjs().year());
const openUserListShow = (row) => {
userInfo.value = row;
userShow.value = true;
getUserListInfo();
}
const getUserListInfo = () => {
getQuarterlyFindData({
'user_id': userInfo.value.id,
'evaluation_id': userTabId.value,
'time': searchAccountUser.value
}).then((res) => {
console.log(res)
if(res.code==1){
userDataSource.value = res.data;
}else{
userDataSource.value = [];
}
})
}
const openUserTab = (d) => {
console.log(d)
userTabId.value = d;
userDataSource.value = [];
getUserListInfo();
}
const getMonthlyInfo = (item) => {
addIsInfo.value=2;
infoShow.value = true;
console.log(item);
item.time=item.quarter;
getInfoMode(item);
}
const toUserSearch = () => {
getUserListInfo();
}
const openTab = (d) => { const openTab = (d) => {
console.log(d) console.log(d)
tab_id.value = d; tab_id.value = d;
@ -146,8 +241,9 @@ const getList = () => {
}) })
} }
const thisInfo = ref(); const thisInfo = ref();
const getInfo = (row) => { const getInfo = (row,type) => {
infoShow.value = true; infoShow.value = true;
addIsInfo.value = type;
console.log(row); console.log(row);
thisInfo.value = row; thisInfo.value = row;
getInfoMode(row); getInfoMode(row);
@ -174,6 +270,7 @@ const getTabList = () => {
if (res.code == 1) { if (res.code == 1) {
tabList.value = res.data; tabList.value = res.data;
tab_id.value = res.data[0].id; tab_id.value = res.data[0].id;
userTabId.value = res.data[0].id;
getList(); getList();
} else { } else {
layer.msg(res.msg, {icon: 2}) layer.msg(res.msg, {icon: 2})
@ -228,10 +325,10 @@ const columns = ref([
{title: '选项', width: '55px', type: 'checkbox', align: 'center'}, {title: '选项', width: '55px', type: 'checkbox', align: 'center'},
{title: '序号', width: '60px', key: 'id', align: 'center'}, {title: '序号', width: '60px', key: 'id', align: 'center'},
{title: '季度', width: '80px', key: 'time', align: 'center'}, {title: '季度', width: '80px', key: 'time', align: 'center'},
{title: '考评对象', width: '100px', key: 'nickname', align: 'center'}, {title: '考评对象', width: '100px', key: 'nickname',customSlot:'nickname', align: 'center'},
{title: '工号', width: '100px', key: 'work_number', align: 'center'}, {title: '工号', width: '100px', key: 'work_number', align: 'center'},
{title: '部门', width: '120px', key: 'group_name', align: 'center'}, {title: '部门', width: '120px', key: 'group_name', align: 'center'},
{title: '季度总加分', width: '100px', key: 'zongjiafen', align: 'center'}, {title: '医院评分', width: '100px', key: 'hospital_score', align: 'center'},
{title: '科室评分', width: '100px', key: 'department_score_scoringrecord', align: 'center'}, {title: '科室评分', width: '100px', key: 'department_score_scoringrecord', align: 'center'},
{title: '自评总分', width: '100px', key: 'user_scoringrecord', align: 'center'}, {title: '自评总分', width: '100px', key: 'user_scoringrecord', align: 'center'},
{title: '自评状态', width: '100px', key: 'scoringrecord_status', customSlot: 'scoringrecord_status',align: 'center'}, {title: '自评状态', width: '100px', key: 'scoringrecord_status', customSlot: 'scoringrecord_status',align: 'center'},

View File

@ -50,8 +50,8 @@
{{ data.password }} {{ data.password }}
</template> </template>
<template v-slot:operator="{ data }"> <template v-slot:operator="{ data }">
<span style="color: #00A394;cursor: pointer" v-if="data.if_period==1" @click="getMonthlyInfo(data)">详情</span> <span style="color: #00A394;cursor: pointer" v-if="data.if==2" @click="getMonthlyInfo(data)">详情</span>
<span style="color: #00A394;cursor: pointer" v-if="data.if_period==2" <span style="color: #00A394;cursor: pointer" v-if="data.if==1"
@click="insZp(data)">开始自评</span> @click="insZp(data)">开始自评</span>
</template> </template>
</lay-table> </lay-table>
@ -59,7 +59,7 @@
</lay-col> </lay-col>
</lay-row> </lay-row>
</lay-container> </lay-container>
<lay-layer v-model="visible11" title="季度自评详情" :type="4" :shade="true" :area="['950px','100%']" :btn="addIsInfo==1?addButton:''"> <lay-layer v-model="visible11" title="季度自评" :type="4" :shade="true" :area="['950px','100%']" :btn="addIsInfo==1?addButton:''">
<lay-container fluid="true" style="padding: 20px"> <lay-container fluid="true" style="padding: 20px">
<lay-card shadow="always"> <lay-card shadow="always">
<div style="height: 70px;width: 100%;"> <div style="height: 70px;width: 100%;">
@ -217,16 +217,6 @@ const columns = [
align: 'center', align: 'center',
key: 'createtime' key: 'createtime'
}, },
{
title: '加分',
key: 'remark',
align: 'center',
},
{
title: '扣分',
key: 'remark',
align: 'center',
},
{ {
title: '自评总分', title: '自评总分',
key: 'self_score', key: 'self_score',
@ -236,6 +226,10 @@ const columns = [
key: 'department_score', key: 'department_score',
customSlot: 'department_score', customSlot: 'department_score',
align: 'center', align: 'center',
}, {
title: '医院评分',
key: 'hospital_score',
align: 'center',
}, },
{ {
title: '操作', title: '操作',

View File

@ -57,8 +57,8 @@
</lay-row> </lay-row>
</lay-form> </lay-form>
</lay-card> </lay-card>
<lay-table :page="page" height="600px" :columns="columns" :loading="loading" :default-toolbar="true" <lay-table :page="page" height="600px" :columns="columns" :loading="loading" :default-toolbar="false"
:data-source="dataSource"> :data-source="dataSource" @change="changePage">
<template #status="{ row }"> <template #status="{ row }">
<lay-tag type="danger" v-if="row.status == 0">已禁用</lay-tag> <lay-tag type="danger" v-if="row.status == 0">已禁用</lay-tag>
<lay-tag type="primary" v-if="row.status == 1">正常</lay-tag> <lay-tag type="primary" v-if="row.status == 1">正常</lay-tag>
@ -208,12 +208,18 @@ const getUserList = () => {
userData({group_id: leftId.value, size: page.limit, page: page.current}).then((res) => { userData({group_id: leftId.value, size: page.limit, page: page.current}).then((res) => {
console.log(res) console.log(res)
if (res.code == 1) { if (res.code == 1) {
dataSource.value = res.data; dataSource.value = res.data.data;
page.total = res.data.count;
} else { } else {
layer.msg(res.msg, {icon: 2}) layer.msg(res.msg, {icon: 2})
} }
}) })
} }
const changePage = (ppc) => {
page.current = ppc.current;
page.limit = ppc.limit;
getUserList();
}
const partyList = ref([]) const partyList = ref([])
const getPartyList = () => { const getPartyList = () => {
partyGroupData({}).then((res) => { partyGroupData({}).then((res) => {

View File

@ -5,10 +5,10 @@
<span style="font-size: 18px;vertical-align: center;margin-right: 20px">通知公告</span> <span style="font-size: 18px;vertical-align: center;margin-right: 20px">通知公告</span>
<lay-button type="primary" @click="openNew()" size="sm">新增公告</lay-button> <lay-button type="primary" @click="openNew()" size="sm">新增公告</lay-button>
</div> </div>
<lay-table :page="page" height="600px" size="lg" :columns="columns" :data-source="dataSource"> <lay-table :page="page" height="600px" size="lg" @change="changePage" :columns="columns" :data-source="dataSource">
<template v-slot:content="{ data }"> <!-- <template v-slot:content="{ data }">
<div v-html="data.content"></div> <div v-html="data.content"></div>
</template> </template> -->
<template v-slot:status="{ data }"> <template v-slot:status="{ data }">
<span v-if="data.status == 1">已发布</span> <span v-if="data.status == 1">已发布</span>
<span v-if="data.status == 0">已隐藏</span> <span v-if="data.status == 0">已隐藏</span>
@ -229,7 +229,12 @@ interface NoticeData {
content: string; content: string;
status: number; status: number;
} }
//
const changePage = (ppc) => {
page.current = ppc.current;
page.limit = ppc.limit;
getNoticeList();
}
// //
const dataSource = ref<NoticeData[]>([]); const dataSource = ref<NoticeData[]>([]);
const addShow = ref(false); const addShow = ref(false);
@ -317,11 +322,6 @@ const delShowMsd = async (data: NoticeData) => {
} }
} }
const changePage = (currentPage: number) => {
page.current = currentPage;
getNoticeList();
}
const columns = [ const columns = [
{ {
title: "公告标题", title: "公告标题",
@ -337,7 +337,6 @@ const columns = [
title: "公告内容", title: "公告内容",
width: "280px", width: "280px",
key: "content", key: "content",
customSlot: 'content',
ellipsisTooltip: true ellipsisTooltip: true
}, },
{ {

View File

@ -188,7 +188,9 @@ const action11 = ref([
layer.msg('请选择菜单!', {icon: 2}) layer.msg('请选择菜单!', {icon: 2})
return; return;
} }
if(typeof addData.rules != 'string'){
addData.rules = addData.rules.join(','); addData.rules = addData.rules.join(',');
}
if (addIsEdit.value == 1) { if (addIsEdit.value == 1) {
var res = await authGroupDataAdd(addData); var res = await authGroupDataAdd(addData);
} else { } else {

View File

@ -46,12 +46,17 @@
<lay-tag v-if="row.scoringrecord_status==1" type="primary">已自评</lay-tag> <lay-tag v-if="row.scoringrecord_status==1" type="primary">已自评</lay-tag>
<lay-tag v-if="row.scoringrecord_status==2">未自评</lay-tag> <lay-tag v-if="row.scoringrecord_status==2">未自评</lay-tag>
</template> </template>
<template v-slot:nickname="{ row }">
<div style="color: #00A394;cursor: pointer" @click="openUserListShow(row)">{{ row.nickname }}</div>
</template>
<template v-slot:operator="{ row }"> <template v-slot:operator="{ row }">
<span style="color: #00A394;cursor: pointer;padding-right: 10px;" v-if="row.department_score_scoringrecord!=0 && row.scoringrecord_status==1"
@click="getInfo(row,1)">医院评分</span>
<span style="color: #00A394;cursor: pointer" v-if="row.department_score_scoringrecord==0 && row.scoringrecord_status==1" <span style="color: #00A394;cursor: pointer" v-if="row.department_score_scoringrecord==0 && row.scoringrecord_status==1"
@click="getInfo(row,1)">科室评分</span> @click="getInfo(row,1)">科室评分</span>
<span style="color: #00A394;cursor: pointer" v-if="row.department_score_scoringrecord!=0 && row.scoringrecord_status==1" <span style="color: #00A394;cursor: pointer" v-if="row.department_score_scoringrecord!=0 && row.scoringrecord_status==1"
@click="getInfo(row,2)">考评详情</span> @click="getInfo(row,2)">考评详情</span>
<span style="color: #999999;cursor: not-allowed" v-if="row.department_score_scoringrecord==0 && row.scoringrecord_status==2">考评详情</span> <span style="color: #999999;cursor: not-allowed" v-if="row.department_score_scoringrecord==0 && row.scoringrecord_status==2">未自评</span>
</template> </template>
</lay-table> </lay-table>
</lay-tab-item> </lay-tab-item>
@ -81,6 +86,48 @@
</lay-table> </lay-table>
</lay-container> </lay-container>
</lay-layer> </lay-layer>
<lay-layer v-model="userShow" title="季度自评列表" :shade="true" :area="['90%', '90%']">
<lay-container fluid="true" style="padding: 20px">
<lay-row :space="10">
<lay-col :md="24">
<lay-card>
<lay-form style="margin-top: 20px">
<lay-row>
<lay-col :md="5">
<lay-form-item label="年度:" label-width="50">
<lay-date-picker type="year" v-model="searchAccountUser" placeholder="请选择"
allow-clear></lay-date-picker>
</lay-form-item>
</lay-col>
<lay-col :md="4">
<lay-form-item label-width="0">
<lay-button type="primary" @click="toUserSearch">查询</lay-button>
<lay-button @click="toReset">重置</lay-button>
</lay-form-item>
</lay-col>
</lay-row>
</lay-form>
</lay-card>
</lay-col>
<lay-col :md="24">
<lay-tab v-model="userTabId" type="brief" @change="openUserTab">
<lay-tab-item v-for="item in tabList" :title="item.title" :id="item.id">
<lay-table height="400px" :default-expand-all="true" :columns="userColumns"
:data-source="userDataSource">
<template v-slot:operator="{ row }">
<span v-if="row.if ==2" style="color: #00A394;cursor: pointer"
@click="getMonthlyInfo(row)">考评详情</span>
<span style="color: #999999;cursor: not-allowed"
v-if="row.if ==1">未自评</span>
</template>
</lay-table>
</lay-tab-item>
</lay-tab>
</lay-col>
</lay-row>
</lay-container>
</lay-layer>
</lay-container> </lay-container>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
@ -90,13 +137,64 @@ import {
getUserGroupNew, getUserGroupNew,
getGroupYear, getGroupYear,
getYearUserList, getYearUserList,
getYearListFind, getYearListUpdate getYearListFind, getYearListUpdate,
getAnnualFindData
} from "@/api/module/home"; } from "@/api/module/home";
import dayjs from "dayjs"; import dayjs from "dayjs";
onMounted(() => { onMounted(() => {
getLeftList(); getLeftList();
}) })
const userShow = ref(false);
const userColumns = ref([
{ title: '年度', width: '80px', key: 'year', align: 'center' },
{ title: '考评对象', width: '100px', key: 'user', align: 'center' },
{ title: '参评时间', width: '100px', key: 'createtime', align: 'center' },
{ title: '自评总分', width: '100px', key: 'self_score', align: 'center' },
{ title: '科室评分', width: '100px', key: 'department_score', align: 'center' },
{ title: '医院评分', width: '100px', key: 'hospital_score', align: 'center' },
{ title: '操作', width: '100px', key: 'operator', customSlot: 'operator', align: 'center' },
])
const userDataSource = ref([]);
const userTabId = ref(0);
const userInfo = ref({});
const searchAccountUser = ref(dayjs().year());
const openUserListShow = (row) => {
userInfo.value = row;
userShow.value = true;
getUserListInfo();
}
const getUserListInfo = () => {
getAnnualFindData({
'user_id': userInfo.value.id,
'evaluation_id': userTabId.value,
'time': searchAccountUser.value
}).then((res) => {
console.log(res)
if(res.code==1){
userDataSource.value = res.data;
}else{
userDataSource.value = [];
}
})
}
const openUserTab = (d) => {
console.log(d)
userTabId.value = d;
userDataSource.value = [];
getUserListInfo();
}
const getMonthlyInfo = (item) => {
addIsInfo.value=2;
infoShow.value = true;
console.log(item);
item.time=item.year;
getInfoMode(item);
}
const toUserSearch = () => {
getUserListInfo();
}
const openTab = (d) => { const openTab = (d) => {
console.log(d) console.log(d)
tab_id.value = d; tab_id.value = d;
@ -161,6 +259,7 @@ const getTabList = () => {
if (res.code == 1) { if (res.code == 1) {
tabList.value = res.data; tabList.value = res.data;
tab_id.value = res.data[0].id; tab_id.value = res.data[0].id;
userTabId.value = res.data[0].id;
getList(); getList();
} else { } else {
layer.msg(res.msg, {icon: 2}) layer.msg(res.msg, {icon: 2})
@ -214,10 +313,10 @@ const columns = ref([
{title: '选项', width: '55px', type: 'checkbox', align: 'center'}, {title: '选项', width: '55px', type: 'checkbox', align: 'center'},
{title: '序号', width: '60px', key: 'id', align: 'center'}, {title: '序号', width: '60px', key: 'id', align: 'center'},
{title: '年度', width: '80px', key: 'time', align: 'center'}, {title: '年度', width: '80px', key: 'time', align: 'center'},
{title: '考评对象', width: '100px', key: 'nickname', align: 'center'}, {title: '考评对象', width: '100px', key: 'nickname', customSlot: 'nickname', align: 'center'},
{title: '工号', width: '100px', key: 'work_number', align: 'center'}, {title: '工号', width: '100px', key: 'work_number', align: 'center'},
{title: '部门', width: '120px', key: 'group_name', align: 'center'}, {title: '部门', width: '120px', key: 'group_name', align: 'center'},
{title: '年度总加分', width: '100px', key: 'zongjiafen', align: 'center'}, {title: '医院评分', width: '100px', key: 'hospital_score', align: 'center'},
{title: '科室评分', width: '100px', key: 'department_score_scoringrecord', align: 'center'}, {title: '科室评分', width: '100px', key: 'department_score_scoringrecord', align: 'center'},
{title: '自评总分', width: '100px', key: 'user_scoringrecord', align: 'center'}, {title: '自评总分', width: '100px', key: 'user_scoringrecord', align: 'center'},
{title: '自评状态', width: '100px', key: 'scoringrecord_status', customSlot: 'scoringrecord_status', align: 'center'}, {title: '自评状态', width: '100px', key: 'scoringrecord_status', customSlot: 'scoringrecord_status', align: 'center'},

View File

@ -221,16 +221,6 @@ const columns = [
align: 'center', align: 'center',
key: 'createtime' key: 'createtime'
}, },
{
title: '加分',
key: 'remark',
align: 'center',
},
{
title: '扣分',
key: 'remark',
align: 'center',
},
{ {
title: '自评总分', title: '自评总分',
key: 'self_score', key: 'self_score',
@ -240,6 +230,10 @@ const columns = [
key: 'department_score', key: 'department_score',
customSlot: 'department_score', customSlot: 'department_score',
align: 'center', align: 'center',
}, {
title: '医院评分',
key: 'hospital_score',
align: 'center',
}, },
{ {
title: '操作', title: '操作',

View File

@ -20,7 +20,7 @@ export default defineConfig({
server: { server: {
proxy: { proxy: {
'/api': { '/api': {
target: 'http://192.168.10.140/', target: 'http://127.0.0.1/',
changeOrigin: true, changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '') rewrite: (path) => path.replace(/^\/api/, '')
} }