This commit is contained in:
Air 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 */
declare module 'vue' {
export interface GlobalComponents {
LayBadge: typeof import('@layui/layui-vue')['LayBadge']
LayBody: typeof import('@layui/layui-vue')['LayBody']
LayBreadcrumb: typeof import('@layui/layui-vue')['LayBreadcrumb']
LayBreadcrumbItem: typeof import('@layui/layui-vue')['LayBreadcrumbItem']
@ -18,8 +17,6 @@ declare module 'vue' {
LayCol: typeof import('@layui/layui-vue')['LayCol']
LayConfigProvider: typeof import('@layui/layui-vue')['LayConfigProvider']
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']
LayDescriptions: typeof import('@layui/layui-vue')['LayDescriptions']
LayDescriptionsItem: typeof import('@layui/layui-vue')['LayDescriptionsItem']
@ -41,9 +38,7 @@ declare module 'vue' {
LayLogo: typeof import('@layui/layui-vue')['LayLogo']
LayMenu: typeof import('@layui/layui-vue')['LayMenu']
LayMenuItem: typeof import('@layui/layui-vue')['LayMenuItem']
LayPage: typeof import('@layui/layui-vue')['LayPage']
LayPopconfirm: typeof import('@layui/layui-vue')['LayPopconfirm']
LayProgress: typeof import('@layui/layui-vue')['LayProgress']
LayRadio: typeof import('@layui/layui-vue')['LayRadio']
LayRadioGroup: typeof import('@layui/layui-vue')['LayRadioGroup']
LayRow: typeof import('@layui/layui-vue')['LayRow']
@ -64,6 +59,5 @@ declare module 'vue' {
LayUpload: typeof import('@layui/layui-vue')['LayUpload']
RouterLink: typeof import('vue-router')['RouterLink']
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;
}
//记得修改上传路径/api/common/upload
//const baseURL = 'http://yfyd.hschool.com.cn' // 设置基础URL前缀
const baseURL="/api";
const baseURL = 'http://yfyd.hschool.com.cn' // 设置基础URL前缀
//const baseURL="http://127.0.0.1";
// 导出baseURL使其可以在其他页面使用
export { baseURL };

View File

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

View File

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

View File

@ -3,7 +3,7 @@
<div style="display: flex">
<div :style="{ width: isFold ? `0px` : `230px` }" class="left-tree">
<lay-tree v-show="!isFold" style="margin-top: 10px" :data="data" v-model:selectedKey="group_id"
:showLine="false" @node-click="handleClick">
:showLine="false" @node-click="handleClick">
<template #title="{ data }">
<span :class="group_id == data.id ? 'isChecked' : ''">
{{ data.name }}
@ -22,8 +22,7 @@
<lay-row>
<lay-col :md="5">
<lay-form-item label="月度" label-width="80">
<lay-date-picker type="yearmonth" v-model="yearmonth" placeholder="月度"
allow-clear></lay-date-picker>
<lay-date-picker type="yearmonth" v-model="yearmonth" placeholder="月度" allow-clear></lay-date-picker>
</lay-form-item>
</lay-col>
<!-- <lay-col :md="5">-->
@ -55,18 +54,24 @@
</lay-card>
<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-table :page="page" height="600px" :columns="columns" :loading="loading"
:data-source="dataSource" v-model:selected-keys="selectedKeys" @change="change">
<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==2">未自评</lay-tag>
<lay-table :page="page" height="600px" :columns="columns" :loading="loading" :data-source="dataSource"
v-model:selected-keys="selectedKeys" @change="change">
<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 == 2">未自评</lay-tag>
</template>
<template v-slot:nickname="{ row }">
<div style="color: #00A394;cursor: pointer" @click="openUserListShow(row)">{{ row.nickname }}</div>
</template>
<template v-slot:operator="{ row }">
<span style="color: #00A394;cursor: pointer" 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"
@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: #00A394;cursor: pointer"
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"
@click="getInfo(row, 2)">考评详情</span>
<span style="color: #999999;cursor: not-allowed"
v-if="row.department_score_scoringrecord == 0 && row.scoringrecord_status == 2">未自评</span>
</template>
</lay-table>
</lay-tab-item>
@ -74,45 +79,135 @@
</div>
</div>
<lay-layer v-model="infoShow" title="自评详情" :type="4" :shade="true" :area="['950px','100%']"
:btn="addIsInfo==1?addButton:''">
<lay-layer v-model="infoShow" title="自评详情" :type="4" :shade="true" :area="['950px', '100%']"
:btn="addIsInfo == 1 ? addButton : ''">
<lay-container fluid="true" style="padding: 20px">
<lay-table :default-expand-all="true" ref="tableRef6" children-column-name="children" :columns="columns6"
:data-source="dataSource6">
<template v-slot:input="{ data,rowIndex}">
<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>
<lay-input-number v-if="data.pid!=0" :disabled="addIsInfo==2" :min="0" :max="data.base_score"
v-model="data.content_score"
position="right"></lay-input-number>
:data-source="dataSource6">
<template v-slot:input="{ data, rowIndex }">
<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>
<lay-input-number v-if="data.pid != 0" :disabled="addIsInfo == 2" :min="0" :max="data.base_score"
v-model="data.content_score" position="right"></lay-input-number>
</template>
<template v-slot:ksinput="{ data,rowIndex}">
<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>
<lay-input-number v-if="data.pid!=0" :disabled="addIsInfo==2" :min="0" :max="data.base_score"
v-model="data.department_score"
position="right"></lay-input-number>
<template v-slot:ksinput="{ data, rowIndex }">
<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>
<lay-input-number v-if="data.pid != 0" :disabled="addIsInfo == 2" :min="0" :max="data.base_score"
v-model="data.department_score" position="right"></lay-input-number>
</template>
</lay-table>
</lay-container>
</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>
</template>
<script setup lang="ts">
import {ref, reactive, onMounted} from 'vue'
import {layer} from '@layui/layui-vue'
import { ref, reactive, onMounted } from 'vue'
import { layer } from '@layui/layui-vue'
import {
getUserGroupNew,
getGroupEvaluation,
getMonthlyUserList,
MonthlyCreate,
getMonthlyListFind, getMonthlyListUpdate
getMonthlyListFind, getMonthlyListUpdate, getMonthlyFindData,
MonthlyInfo
} from "@/api/module/home";
import dayjs from "dayjs";
onMounted(() => {
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) => {
console.log(d)
tab_id.value = d;
@ -120,7 +215,7 @@ const openTab = (d) => {
page.current = 1;
getList();
}
const page = reactive({current: 1, limit: 10, total: 1})
const page = reactive({ current: 1, limit: 10, total: 1 })
const change = (d) => {
console.log(d);
page.current = d.current;
@ -143,7 +238,7 @@ const getList = () => {
dataSource.value = res.data.result;
page.total = res.data.count;
} else {
layer.msg(res.msg, {icon: 2})
layer.msg(res.msg, { icon: 2 })
}
})
}
@ -165,21 +260,22 @@ const getInfoMode = (row) => {
if (res.code == 1) {
dataSource6.value = res.data;
} else {
layer.msg(res.msg, {icon: 2})
layer.msg(res.msg, { icon: 2 })
}
})
}
const tabList = ref([]);
const tab_id = ref(0);
const getTabList = () => {
getGroupEvaluation({'group_id': group_id.value}).then((res) => {
getGroupEvaluation({ 'group_id': group_id.value }).then((res) => {
console.log(res)
if (res.code == 1) {
tabList.value = res.data;
tab_id.value = res.data[0].id;
userTabId.value = res.data[0].id;
getList();
} else {
layer.msg(res.msg, {icon: 2})
layer.msg(res.msg, { icon: 2 })
}
})
}
@ -192,7 +288,7 @@ const getLeftList = () => {
group_id.value = res.data[0].id;
getTabList();
} else {
layer.msg(res.msg, {icon: 2})
layer.msg(res.msg, { icon: 2 })
}
})
}
@ -227,16 +323,16 @@ function toSearch() {
const loading = ref(false)
const selectedKeys = ref()
const columns = ref([
{title: '选项', width: '55px', type: 'checkbox', align: 'center'},
{title: '序号', width: '60px', key: 'id', align: 'center'},
{title: '月度', width: '80px', key: 'time', align: 'center'},
{title: '考评对象', width: '100px', key: 'nickname', align: 'center'},
{title: '工号', width: '100px', key: 'work_number', align: 'center'},
{title: '部门', width: '120px', key: 'group_name', align: 'center'},
{title: '季度总加分', width: '100px', key: 'zongjiafen', align: 'center'},
{title: '科室评分', width: '100px', key: 'department_score_scoringrecord', align: 'center'},
{title: '自评总分', width: '100px', key: 'user_scoringrecord', align: 'center'},
{title: '自评状态', width: '100px', key: 'scoringrecord_status', customSlot: 'scoringrecord_status', align: 'center'},
{ title: '选项', width: '55px', type: 'checkbox', align: 'center' },
{ title: '序号', width: '60px', key: 'id', align: 'center' },
{ title: '月度', width: '80px', key: 'time', align: 'center' },
{ title: '考评对象', width: '100px', key: 'nickname', customSlot: 'nickname', align: 'center' },
{ title: '工号', width: '100px', key: 'work_number', align: 'center' },
{ title: '部门', width: '120px', key: 'group_name', align: 'center' },
{ title: '医院评分', width: '100px', key: 'hospital_score', align: 'center' },
{ title: '科室评分', width: '100px', key: 'department_score_scoringrecord', align: 'center' },
{ title: '自评总分', width: '100px', key: 'user_scoringrecord', align: 'center' },
{ title: '自评状态', width: '100px', key: 'scoringrecord_status', customSlot: 'scoringrecord_status', align: 'center' },
{
title: '操作',
width: '180px',
@ -259,12 +355,12 @@ const addButton = ref([
});
console.log(res)
if (res.code == 1) {
layer.msg('提交成功!', {icon: 1})
layer.msg('提交成功!', { icon: 1 })
thisInfo.value = {};
infoShow.value = false;
getList();
} else {
layer.msg(res.msg, {icon: 2})
layer.msg(res.msg, { icon: 2 })
}
}
},
@ -361,5 +457,4 @@ const dataSource6 = ref([])
background-color: #e8f1ff;
color: red;
}
</style>

View File

@ -209,16 +209,6 @@ const columns = [
align: 'center',
key: 'createtime'
},
{
title: '加分',
key: 'remark',
align: 'center',
},
{
title: '扣分',
key: 'remark',
align: 'center',
},
{
title: '自评总分',
key: 'self_score',
@ -229,6 +219,11 @@ const columns = [
customSlot: 'department_score',
align: 'center',
},
{
title: '医院评分',
key: 'hospital_score',
align: 'center',
},
{
title: '操作',
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==2">未自评</lay-tag>
</template>
<template v-slot:nickname="{ row }">
<div style="color: #00A394;cursor: pointer" @click="openUserListShow(row)">{{ row.nickname }}</div>
</template>
<template v-slot:operator="{ row }">
<span style="color: #00A394;cursor: pointer" 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"
@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>
</lay-table>
</lay-tab-item>
@ -90,6 +93,48 @@
</lay-table>
</lay-container>
</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>
</template>
<script setup lang="ts">
@ -100,13 +145,63 @@ import {
getGroupQuarter,
getQuarterUserList,
getQuarterListFind,
getQuarterListUpdate
getQuarterListUpdate,
getQuarterlyFindData
} from "@/api/module/home";
import dayjs from "dayjs";
onMounted(() => {
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) => {
console.log(d)
tab_id.value = d;
@ -146,8 +241,9 @@ const getList = () => {
})
}
const thisInfo = ref();
const getInfo = (row) => {
const getInfo = (row,type) => {
infoShow.value = true;
addIsInfo.value = type;
console.log(row);
thisInfo.value = row;
getInfoMode(row);
@ -174,6 +270,7 @@ const getTabList = () => {
if (res.code == 1) {
tabList.value = res.data;
tab_id.value = res.data[0].id;
userTabId.value = res.data[0].id;
getList();
} else {
layer.msg(res.msg, {icon: 2})
@ -228,10 +325,10 @@ const columns = ref([
{title: '选项', width: '55px', type: 'checkbox', align: 'center'},
{title: '序号', width: '60px', key: 'id', 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: '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: 'user_scoringrecord', align: 'center'},
{title: '自评状态', width: '100px', key: 'scoringrecord_status', customSlot: 'scoringrecord_status',align: 'center'},

View File

@ -50,8 +50,8 @@
{{ data.password }}
</template>
<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_period==2"
<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==1"
@click="insZp(data)">开始自评</span>
</template>
</lay-table>
@ -59,7 +59,7 @@
</lay-col>
</lay-row>
</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-card shadow="always">
<div style="height: 70px;width: 100%;">
@ -217,16 +217,6 @@ const columns = [
align: 'center',
key: 'createtime'
},
{
title: '加分',
key: 'remark',
align: 'center',
},
{
title: '扣分',
key: 'remark',
align: 'center',
},
{
title: '自评总分',
key: 'self_score',
@ -236,6 +226,10 @@ const columns = [
key: 'department_score',
customSlot: 'department_score',
align: 'center',
}, {
title: '医院评分',
key: 'hospital_score',
align: 'center',
},
{
title: '操作',

View File

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

View File

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

View File

@ -188,7 +188,9 @@ const action11 = ref([
layer.msg('请选择菜单!', {icon: 2})
return;
}
addData.rules = addData.rules.join(',');
if(typeof addData.rules != 'string'){
addData.rules = addData.rules.join(',');
}
if (addIsEdit.value == 1) {
var res = await authGroupDataAdd(addData);
} 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==2">未自评</lay-tag>
</template>
<template v-slot:nickname="{ row }">
<div style="color: #00A394;cursor: pointer" @click="openUserListShow(row)">{{ row.nickname }}</div>
</template>
<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"
@click="getInfo(row,1)">科室评分</span>
<span style="color: #00A394;cursor: pointer" v-if="row.department_score_scoringrecord!=0 && row.scoringrecord_status==1"
@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>
</lay-table>
</lay-tab-item>
@ -81,6 +86,48 @@
</lay-table>
</lay-container>
</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>
</template>
<script setup lang="ts">
@ -90,13 +137,64 @@ import {
getUserGroupNew,
getGroupYear,
getYearUserList,
getYearListFind, getYearListUpdate
getYearListFind, getYearListUpdate,
getAnnualFindData
} from "@/api/module/home";
import dayjs from "dayjs";
onMounted(() => {
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) => {
console.log(d)
tab_id.value = d;
@ -161,6 +259,7 @@ const getTabList = () => {
if (res.code == 1) {
tabList.value = res.data;
tab_id.value = res.data[0].id;
userTabId.value = res.data[0].id;
getList();
} else {
layer.msg(res.msg, {icon: 2})
@ -214,10 +313,10 @@ const columns = ref([
{title: '选项', width: '55px', type: 'checkbox', align: 'center'},
{title: '序号', width: '60px', key: 'id', 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: '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: 'user_scoringrecord', align: 'center'},
{title: '自评状态', width: '100px', key: 'scoringrecord_status', customSlot: 'scoringrecord_status', align: 'center'},

View File

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

View File

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