This commit is contained in:
Air 2025-02-27 17:53:03 +08:00
parent f618ccb65c
commit 0ef0ffbaf9
19 changed files with 1726 additions and 1057 deletions

16
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,16 @@
{
// 使 IntelliSense
//
// 访: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node-terminal",
"name": "运行脚本: dev",
"request": "launch",
"command": "npm run dev",
"cwd": "${workspaceFolder}"
}
]
}

4
components.d.ts vendored
View File

@ -20,6 +20,8 @@ declare module 'vue' {
LayContainer: typeof import('@layui/layui-vue')['LayContainer']
LayCountUp: typeof import('@layui/layui-vue')['LayCountUp']
LayDatePicker: typeof import('@layui/layui-vue')['LayDatePicker']
LayDescriptions: typeof import('@layui/layui-vue')['LayDescriptions']
LayDescriptionsItem: typeof import('@layui/layui-vue')['LayDescriptionsItem']
LayDropdown: typeof import('@layui/layui-vue')['LayDropdown']
LayDropdownMenu: typeof import('@layui/layui-vue')['LayDropdownMenu']
LayDropdownMenuItem: typeof import('@layui/layui-vue')['LayDropdownMenuItem']
@ -40,6 +42,8 @@ declare module 'vue' {
LayMenuItem: typeof import('@layui/layui-vue')['LayMenuItem']
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']
LaySelect: typeof import('@layui/layui-vue')['LaySelect']
LaySelectOption: typeof import('@layui/layui-vue')['LaySelectOption']

BIN
dist.zip

Binary file not shown.

View File

@ -7,7 +7,7 @@ type TAxiosOption = {
timeout: number;
baseURL: string;
}
//记得修改上传路径
//const baseURL = 'http://yfyd.hschool.com.cn' // 设置基础URL前缀
const baseURL="/api";

View File

@ -280,6 +280,51 @@ export const getYearListUpdate= function(date: any) {
return Http.post('/api/backend/Year/getMonthlyListUpdate', date)
}
//拒收红包列表
export const getRejectRedEnvelopes= function(date: any) {
return Http.post('/api/backend/reject_red_envelopes/index', date)
}
//拒收红包列表(新增)
export const rejectRedEnvelopesCreate= function(date: any) {
return Http.post('/api/backend/reject_red_envelopes/create', date)
}
//拒收红包列表(编辑)
export const rejectRedEnvelopesUpdate= function(date: any) {
return Http.post('/api/backend/reject_red_envelopes/examine', date)
}
//所有用户
export const getDoctorName= function(date: any) {
return Http.post('/api/backend/user/getDoctorName', date)
}
//加分减分记录
export const getAddition= function(date: any) {
return Http.post('/api/backend/addition_and_subtraction_records/index', date)
}
//加分减分记录(新增)
export const getAdditionCreate= function(date: any) {
return Http.post('/api/backend/addition_and_subtraction_records/create', date)
}
//加分减分记录(编辑)
export const getAdditionUpdate= function(date: any) {
return Http.post('/api/backend/addition_and_subtraction_records/update', date)
}
//加分减分记录(删除)
export const getAdditionDelete= function(date: any) {
return Http.post('/api/backend/addition_and_subtraction_records/delete', date)
}
//加分减分管理
export const getAdditionIndexManage= function(date: any) {
return Http.post('/api/backend/addition_and_subtraction_records/index_manage', date)
}
//加分减分审核
export const getAdditionIndexManageExamine= function(date: any) {
return Http.post('/api/backend/addition_and_subtraction_records/examine', date)
}

View File

@ -209,7 +209,7 @@ export default [
{
path: '/census/index',
name: 'censusIndex',
component: () => import('../../views/day_evaluation/index.vue'),
component: () => import('../../views/census/red.vue'),
meta: {title: '拒收红包报表统计', requireAuth: true, closable: true},
},{
path: '/census/day',

View File

@ -6,8 +6,8 @@
<lay-form style="margin-top: 20px">
<lay-row>
<lay-col :md="5">
<lay-form-item label="月度" label-width="80">
<lay-date-picker type="yearmonth" v-model="yearmonth" placeholder="月度" />
<lay-form-item label="日期" label-width="80">
<lay-date-picker v-model="date" placeholder="选择日期" />
</lay-form-item>
</lay-col>
<lay-col :md="4">
@ -23,7 +23,7 @@
<lay-col :md="24">
<lay-card>
<template #title>
<div style="font-size: 20px;font-weight: 600;color: #333;">月度考评填报 - 分数统计</div>
<div style="font-size: 20px;font-weight: 600;color: #333;">日常考评填报 - 分数统计</div>
</template>
<div id="main" ref="mainRef"></div>
</lay-card>
@ -31,7 +31,7 @@
<lay-col :md="24">
<lay-card>
<template #title>
<div style="font-size: 20px;font-weight: 600;color: #333;">月度考评报表 - 已参评人数统计</div>
<div style="font-size: 20px;font-weight: 600;color: #333;">日常考评报表 - 已参评人数统计</div>
</template>
<div id="barChart" ref="barChartRef"></div>
</lay-card>
@ -46,19 +46,19 @@ import * as echarts from 'echarts'
const mainRef = ref()
const barChartRef = ref()
const yearmonth = ref('')
const date = ref('')
//
const toSearch = () => {
console.log('查询月度:', yearmonth.value)
// TODO:
console.log('查询日期:', date.value)
// TODO:
initChart()
initBarChart()
}
//
const toReset = () => {
yearmonth.value = ''
date.value = ''
// TODO:
initChart()
initBarChart()
@ -71,54 +71,54 @@ const initChart = () => {
const myChart = echarts.init(chartDom)
const color = [
'#0090FF',
'#36CE9E',
'#FFC005',
'#FF515A',
'#8B5CFF',
'#00CA69'
'#6236FF', //
'#02C2E4', //
'#FFB100', //
'#1CC6A1', // 绿
'#7B61FF', //
'#00B4D8' //
]
const echartData = [
{
name: '内科',
value1: 94,
value2: 91
value1: 88,
value2: 85
},
{
name: '外科',
value1: 93,
value2: 90
value1: 87,
value2: 84
},
{
name: '儿科',
value1: 95,
value2: 92
value1: 89,
value2: 86
},
{
name: '妇产科',
value1: 92,
value2: 89
value1: 86,
value2: 83
},
{
name: '急诊科',
value1: 91,
value2: 88
value1: 85,
value2: 82
},
{
name: '骨科',
value1: 93,
value2: 91
value1: 87,
value2: 85
},
{
name: '眼科',
value1: 94,
value2: 90
value1: 88,
value2: 84
},
{
name: '口腔科',
value1: 92,
value2: 89
value1: 86,
value2: 83
}
]
@ -200,8 +200,8 @@ const initChart = () => {
yAxis: [
{
type: 'value',
min: 80,
max: 100,
min: 70,
max: 90,
axisLabel: {
textStyle: {
color: '#666'
@ -318,14 +318,14 @@ const initBarChart = () => {
const myChart = echarts.init(chartDom)
const barData = [
{ name: '内科', value: 45 },
{ name: '外科', value: 38 },
{ name: '儿科', value: 25 },
{ name: '妇产科', value: 32 },
{ name: '急诊科', value: 28 },
{ name: '骨科', value: 22 },
{ name: '眼科', value: 18 },
{ name: '口腔科', value: 20 }
{ name: '内科', value: 25 },
{ name: '外科', value: 22 },
{ name: '儿科', value: 18 },
{ name: '妇产科', value: 20 },
{ name: '急诊科', value: 15 },
{ name: '骨科', value: 12 },
{ name: '眼科', value: 10 },
{ name: '口腔科', value: 13 }
]
const option = {
@ -379,17 +379,17 @@ const initBarChart = () => {
data: barData.map(item => item.value),
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: '#83bff6' },
{ offset: 0.5, color: '#188df0' },
{ offset: 1, color: '#188df0' }
{ offset: 0, color: '#6236FF' }, //
{ offset: 0.5, color: '#02C2E4' }, //
{ offset: 1, color: '#1CC6A1' } //
])
},
emphasis: {
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: '#2378f7' },
{ offset: 0.7, color: '#2378f7' },
{ offset: 1, color: '#83bff6' }
{ offset: 0, color: '#5020E0' }, //
{ offset: 0.7, color: '#00A3C4' }, //
{ offset: 1, color: '#15A589' } //
])
}
}

347
src/views/census/red.vue Normal file
View File

@ -0,0 +1,347 @@
<template>
<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="80">
<lay-date-picker type="yearmonth" v-model="yearmonth" placeholder="月度" />
</lay-form-item>
</lay-col>
<lay-col :md="4">
<lay-form-item label-width="0">
<lay-button type="primary" @click="toSearch">查询</lay-button>
<lay-button @click="toReset" style="margin-left: 10px">重置</lay-button>
</lay-form-item>
</lay-col>
</lay-row>
</lay-form>
</lay-card>
</lay-col>
<lay-col :md="24">
<lay-card>
<template #title>
<div style="font-size: 20px;font-weight: 600;color: #333;">拒收红包金额统计</div>
</template>
<div id="main" ref="mainRef"></div>
</lay-card>
</lay-col>
<lay-col :md="24">
<lay-card>
<template #title>
<div style="font-size: 20px;font-weight: 600;color: #333;">拒收红包次数统计</div>
</template>
<div id="barChart" ref="barChartRef"></div>
</lay-card>
</lay-col>
</lay-row>
</lay-container>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import * as echarts from 'echarts'
const mainRef = ref()
const barChartRef = ref()
const yearmonth = ref('')
//
const toSearch = () => {
console.log('查询月度:', yearmonth.value)
// TODO:
initChart()
initBarChart()
}
//
const toReset = () => {
yearmonth.value = ''
// TODO:
initChart()
initBarChart()
}
//
const initChart = () => {
const chartDom = mainRef.value
// @ts-ignore
const myChart = echarts.init(chartDom)
const color = ['#FF515A', '#FFC005']
const echartData = [
{
name: '内科',
value1: 2800,
value2: 2400
},
{
name: '外科',
value1: 3200,
value2: 2900
},
{
name: '儿科',
value1: 1500,
value2: 1200
},
{
name: '妇产科',
value1: 2000,
value2: 1800
},
{
name: '急诊科',
value1: 1800,
value2: 1500
},
{
name: '骨科',
value1: 2500,
value2: 2200
},
{
name: '眼科',
value1: 1200,
value2: 1000
},
{
name: '口腔科',
value1: 1600,
value2: 1400
}
]
const xAxisData = echartData.map((v) => v.name)
const yAxisData1 = echartData.map((v) => v.value1)
const yAxisData2 = echartData.map((v) => v.value2)
const hexToRgba = (hex: string, opacity: number) => {
let rgbaColor = ''
let reg = /^#[\da-f]{6}$/i
if (reg.test(hex)) {
rgbaColor = `rgba(${parseInt('0x' + hex.slice(1, 3))},${parseInt(
'0x' + hex.slice(3, 5)
)},${parseInt('0x' + hex.slice(5, 7))},${opacity})`
}
return rgbaColor
}
const option = {
color: color,
legend: {
right: 10,
top: 10,
data: ['拒收总金额', '已上交金额']
},
tooltip: {
trigger: 'axis',
formatter: function (params: any) {
return `<div style="font-weight: 600;font-size: 14px;color: #333;margin-bottom: 8px">
${params[0].name}
</div>
<div style="color: #666;font-size: 13px;line-height: 24px">
<span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:${color[0]};"></span>
拒收总金额
<span style="color:${color[0]};font-weight:700;font-size: 14px">${params[0].value}</span>
</div>
<div style="color: #666;font-size: 13px;line-height: 24px">
<span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:${color[1]};"></span>
已上交金额
<span style="color:${color[1]};font-weight:700;font-size: 14px">${params[1].value}</span>
</div>`
},
extraCssText: 'background: #fff; border-radius: 4px; padding: 8px 12px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);color: #333;',
axisPointer: {
type: 'line',
lineStyle: {
color: '#ccc',
width: 1,
type: 'dashed'
}
}
},
grid: {
x: '50px',
y: '50px',
x2: '50px',
y2: '50px'
},
xAxis: [
{
type: 'category',
boundaryGap: true,
axisLabel: {
formatter: '{value}',
textStyle: {
color: '#333'
}
},
axisLine: {
lineStyle: {
color: '#D9D9D9'
}
},
data: xAxisData
}
],
yAxis: [
{
type: 'value',
name: '金额 (元)',
min: 0,
axisLabel: {
textStyle: {
color: '#666'
}
},
nameTextStyle: {
color: '#666',
fontSize: 12,
lineHeight: 40
},
splitLine: {
lineStyle: {
type: 'dashed',
color: '#E9E9E9'
}
},
axisLine: {
show: false
},
axisTick: {
show: false
}
}
],
series: [
{
name: '拒收总金额',
type: 'bar',
barWidth: '20%',
data: yAxisData1,
itemStyle: {
color: color[0]
}
},
{
name: '已上交金额',
type: 'bar',
barWidth: '20%',
data: yAxisData2,
itemStyle: {
color: color[1]
}
}
]
}
option && myChart.setOption(option)
}
//
const initBarChart = () => {
const chartDom = barChartRef.value
// @ts-ignore
const myChart = echarts.init(chartDom)
const barData = [
{ name: '内科', value: 15 },
{ name: '外科', value: 18 },
{ name: '儿科', value: 8 },
{ name: '妇产科', value: 12 },
{ name: '急诊科', value: 10 },
{ name: '骨科', value: 14 },
{ name: '眼科', value: 6 },
{ name: '口腔科', value: 9 }
]
const option = {
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
},
formatter: function(params: any) {
return `${params[0].name}<br/>拒收次数:${params[0].value}`
}
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: [
{
type: 'category',
data: barData.map(item => item.name),
axisTick: {
alignWithLabel: true
},
axisLabel: {
color: '#333'
}
}
],
yAxis: [
{
type: 'value',
name: '次数',
axisLabel: {
color: '#333'
},
splitLine: {
lineStyle: {
type: 'dashed',
color: '#E9E9E9'
}
}
}
],
series: [
{
name: '拒收次数',
type: 'bar',
barWidth: '60%',
data: barData.map(item => item.value),
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: '#ff7875' },
{ offset: 0.5, color: '#ff4d4f' },
{ offset: 1, color: '#f5222d' }
])
},
emphasis: {
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: '#ff4d4f' },
{ offset: 0.7, color: '#ff4d4f' },
{ offset: 1, color: '#ff7875' }
])
}
}
}
]
}
option && myChart.setOption(option)
}
onMounted(() => {
initChart()
initBarChart()
})
</script>
<style lang="less" scoped>
#main, #barChart {
width: 100%;
height: 400px;
}
</style>

View File

@ -82,12 +82,12 @@ const initChart = () => {
const myChart = echarts.init(chartDom)
const color = [
'#0090FF',
'#36CE9E',
'#FFC005',
'#FF515A',
'#8B5CFF',
'#00CA69'
'#FF6B6B', //
'#4ECDC4', //
'#45B7D1', //
'#96CEB4', // 绿
'#FFEEAD', //
'#D4A5A5' //
]
const echartData = [
@ -390,17 +390,17 @@ const initBarChart = () => {
data: barData.map(item => item.value),
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: '#83bff6' },
{ offset: 0.5, color: '#188df0' },
{ offset: 1, color: '#188df0' }
{ offset: 0, color: '#FF6B6B' }, //
{ offset: 0.5, color: '#FF8787' }, //
{ offset: 1, color: '#FFA5A5' } //
])
},
emphasis: {
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: '#2378f7' },
{ offset: 0.7, color: '#2378f7' },
{ offset: 1, color: '#83bff6' }
{ offset: 0, color: '#FF5252' }, //
{ offset: 0.7, color: '#FF6B6B' }, //
{ offset: 1, color: '#FF8787' } //
])
}
}

View File

@ -71,12 +71,12 @@ const initChart = () => {
const myChart = echarts.init(chartDom)
const color = [
'#0090FF',
'#36CE9E',
'#FFC005',
'#FF515A',
'#8B5CFF',
'#00CA69'
'#5470c6', //
'#91cc75', // 绿
'#fac858', //
'#ee6666', //
'#73c0de', //
'#3ba272' // 绿
]
const echartData = [
@ -379,17 +379,17 @@ const initBarChart = () => {
data: barData.map(item => item.value),
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: '#83bff6' },
{ offset: 0.5, color: '#188df0' },
{ offset: 1, color: '#188df0' }
{ offset: 0, color: '#5470c6' }, //
{ offset: 0.5, color: '#7b9eee' }, //
{ offset: 1, color: '#a8c1ff' } //
])
},
emphasis: {
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: '#2378f7' },
{ offset: 0.7, color: '#2378f7' },
{ offset: 1, color: '#83bff6' }
{ offset: 0, color: '#3a56b0' }, //
{ offset: 0.7, color: '#5470c6' }, //
{ offset: 1, color: '#7b9eee' } //
])
}
}

View File

@ -8,7 +8,7 @@
<lay-row>
<lay-col :md="5">
<lay-form-item label="患者姓名:" label-width="80">
<lay-input style="width: 220px" v-model="searchQuery.patientName" placeholder="请输入患者姓名"
<lay-input v-model="searchQuery.patientName" placeholder="请输入患者姓名"
:allow-clear="true">
</lay-input>
</lay-form-item>

View File

@ -11,11 +11,11 @@
<lay-tag v-if="data.score_type==1" type="normal">加分</lay-tag>
<lay-tag v-if="data.score_type==2" type="danger">减分</lay-tag>
</template>
<template v-slot:scoring_category="{data}">
<!-- <template v-slot:scoring_category="{data}">
<span v-if="data.scoring_category==1">年度</span>
<span v-if="data.scoring_category==2">季度</span>
<span v-if="data.scoring_category==3">院外评分</span>
</template>
</template> -->
<template v-slot:operator="{data}">
<lay-space size="lg">
<span style="color: #00A394;cursor: pointer" @click="editShowMsd(data)">编辑</span>
@ -44,24 +44,24 @@
<lay-form-item required label-width="150px" label="项目名称" prop="project_name">
<lay-textarea placeholder="请输入项目名称" v-model="addData.project_name"></lay-textarea>
</lay-form-item>
<lay-form-item required label-width="150px" label="项目代码" prop="project_code">
<!-- <lay-form-item required label-width="150px" label="项目代码" prop="project_code">
<lay-input v-model="addData.project_code" placeholder="请输入项目代码"></lay-input>
</lay-form-item>
<lay-form-item required label-width="150px" label="评分类型" prop="scoring_category">
</lay-form-item> -->
<!-- <lay-form-item required label-width="150px" label="评分类型" prop="scoring_category">
<lay-select v-model="addData.scoring_category" placeholder="请选择">
<lay-select-option :value="1" label="年度"></lay-select-option>
<lay-select-option :value="2" label="季度"></lay-select-option>
<lay-select-option :value="3" label="院外评分"></lay-select-option>
</lay-select>
</lay-form-item>
<lay-form-item required label-width="150px" label="所属考评项目" prop="related_evaluation_project">
</lay-form-item> -->
<!-- <lay-form-item required label-width="150px" label="所属考评项目" prop="related_evaluation_project">
<lay-select v-model="addData.related_evaluation_project" placeholder="请选择">
<lay-select-option v-for="item in categoryList" :value="item.id" :label="item.project_name"></lay-select-option>
</lay-select>
</lay-form-item>
<lay-form-item required label-width="150px" label="每次填报次数上限" prop="annual_submission_limit">
</lay-form-item> -->
<!-- <lay-form-item required label-width="150px" label="每次填报次数上限" prop="annual_submission_limit">
<lay-input-number v-model="addData.annual_submission_limit"></lay-input-number>
</lay-form-item>
</lay-form-item> -->
<lay-form-item required label-width="150px" label="评分标准" prop="scoring_criteria">
<lay-textarea placeholder="请输入" v-model="addData.scoring_criteria"></lay-textarea>
</lay-form-item>
@ -163,11 +163,6 @@ const columns6 = [
customSlot: 'score_type',
key: "score_type"
},
{
title: "项目代码",
width: "90px",
key: "project_code"
},
{
title: "项目名称",
width: "100px",
@ -184,23 +179,6 @@ const columns6 = [
width: "100px",
key: "single_score_min"
},
{
title: "所属考评项目",
width: "100px",
key: "name",
ellipsisTooltip:true,
},
{
title: "评分类型",
width: "100px",
customSlot: 'scoring_category',
key: "scoring_category"
},
{
title: "每次填报上限",
width: "100px",
key: "annual_submission_limit"
},
{
title: "评分标准",
width: "100px",
@ -223,27 +201,23 @@ const addButton = ref([
console.log(addData);
if (addData.project_name == '') {
layer.msg('项目名称不能为空!', {icon: 2})
}
if (addData.project_code == '') {
layer.msg('项目代码不能为空!', {icon: 2})
return;
}
if (addData.score_type == null || addData.score_type == '') {
layer.msg('加减分类型不能为空!', {icon: 2, time: 1000})
return;
}
if (addData.single_score_max <=0) {
layer.msg('单次评分上限不能为0', {icon: 2, time: 1000})
return;
}
if (addData.single_score_min <=0) {
layer.msg('单次评分下限不能为0', {icon: 2, time: 1000})
}
if (addData.scoring_category ==null) {
layer.msg('评分类型不能为空!', {icon: 2, time: 1000})
}
if (addData.related_evaluation_project ==null) {
layer.msg('所属考评项目不能为空!', {icon: 2, time: 1000})
return;
}
if (addData.project_name =='') {
layer.msg('评分标准不能为空!', {icon: 2, time: 1000})
return;
}
if(addIsEdit.value==1){
var res = await scoringGetHierarchicalDataCreate(addData);

View File

@ -4,29 +4,13 @@
<div :style="{ width: isFold ? `0px` : `300px` }" class="left-tree">
<!-- tree -->
<div v-show="!isFold">
<lay-button type="normal" size="sm" @click="toAdd">
<lay-icon type="layui-icon-addition"></lay-icon>新建
</lay-button>
<lay-button type="warm" size="sm" @click="toEdit">
<lay-icon type="layui-icon-edit"></lay-icon>修改
</lay-button>
<lay-button type="danger" size="sm" @click="toDelete">
<lay-icon type="layui-icon-delete"></lay-icon>删除
</lay-button>
科室列表
</div>
<lay-tree
v-show="!isFold"
style="margin-top: 10px"
:data="data"
v-model:selectedKey="selectedKey"
:showLine="showLine"
:expandKeys="[1, 3, 4]"
@node-click="handleClick"
>
<lay-tree v-show="!isFold" style="margin-top: 10px" :data="data" v-model:selectedKey="leftId" :showLine="false"
@node-click="handleClick">
<template #title="{ data }">
<span :class="selectedKey == data.id ? 'isChecked' : ''">
{{ data.title }} {{ data.id }}
<span :class="leftId == data.id ? 'isChecked' : ''">
{{ data.name }}
</span>
</template>
</lay-tree>
@ -38,609 +22,276 @@
<div style="flex: 1; padding: 10px; over-flow: auto">
<!-- table -->
<lay-card>
<lay-form>
<lay-row>
<lay-col :md="5">
<lay-form-item label="用户账号" label-width="80">
<lay-input
v-model="searchQuery.userAccount"
placeholder="请输入"
size="sm"
:allow-clear="true"
style="width: 98%"
></lay-input>
</lay-form-item>
</lay-col>
<lay-col :md="5">
<lay-form-item label="用户名" label-width="80">
<lay-input
v-model="searchQuery.userName"
placeholder="请输入"
size="sm"
:allow-clear="true"
style="width: 98%"
></lay-input>
</lay-form-item>
</lay-col>
<lay-col :md="5">
<lay-form-item label="性别" label-width="80">
<lay-select
class="search-input"
size="sm"
v-model="searchQuery.sex"
:allow-clear="true"
placeholder="请选择"
>
<lay-select-option
value="man"
label="男"
></lay-select-option>
<lay-select-option
value="woman"
label="女"
></lay-select-option>
</lay-select>
</lay-form-item>
</lay-col>
<lay-col :md="5">
<lay-form-item label-width="20">
<lay-button
style="margin-left: 20px"
type="normal"
size="sm"
@click="toSearch"
>
查询
</lay-button>
<lay-button size="sm" @click="toReset"> 重置 </lay-button>
</lay-form-item>
</lay-col>
</lay-row>
</lay-form>
<lay-form style="margin-top: 20px">
<lay-row style="min-width: 1200px">
<lay-col :md="5">
<lay-form-item label="发生时间:" :label-width="100">
<lay-date-picker style="width: 100%" v-model="searchForm.fsdate"
placeholder="发生时间" allow-clear></lay-date-picker>
</lay-form-item>
</lay-col>
<lay-col :md="6" >
<lay-form-item label="考评对象:" :label-width="100">
<lay-select v-model="searchForm.user_id" placeholder="请选择考评对象"
:show-search="true">
<lay-select-option v-for="user in userList" :key="user.id"
:value="user.id" :label="user.nickname">
</lay-select-option>
</lay-select>
</lay-form-item>
</lay-col>
<lay-col :md="4">
<lay-form-item label="审核状态:" :label-width="100">
<lay-select style="width: 100%" v-model="searchForm.status"
placeholder="审核状态">
<lay-select-option :value="1" label="待审核"></lay-select-option>
<lay-select-option :value="2" label="已通过"></lay-select-option>
<lay-select-option :value="3" label="已驳回"></lay-select-option>
</lay-select>
</lay-form-item>
</lay-col>
<lay-col :md="4">
<lay-form-item :label-width="0">
<lay-button style="margin-left: 20px" type="primary"
@click="toSearch">查询</lay-button>
<lay-button @click="toReset">重置</lay-button>
</lay-form-item>
</lay-col>
</lay-row>
</lay-form>
</lay-card>
<lay-table
:page="page"
:height="'100%'"
:columns="columns"
:loading="loading"
:default-toolbar="true"
:data-source="dataSource"
v-model:selected-keys="selectedKeys"
@change="change"
@sortChange="sortChange"
>
<template #status="{ row }">
<lay-switch
:model-value="row.status"
@change="changeStatus($event, row)"
></lay-switch>
<lay-table :page="page" @change="handlePageChange" height="600px" :columns="columns" :loading="loading" :data-source="dataSource">
<template v-slot:status="{ data }">
<span v-if="data.status == 1" style="color: #1E9FFF">待审核</span>
<span v-if="data.status == 2" style="color: #009688">审核通过</span>
<span v-if="data.status == 3" style="color: #009688">已驳回</span>
</template>
<template #role="{ row }">
<lay-tag color="#165DFF" variant="light">{{ row.role }}</lay-tag>
<template v-slot:assessment_type="{ data }">
<lay-tag :type="data.assessment_type == 1 ? 'primary' : 'danger'">
{{ data.assessment_type == 1 ? '加分' : '减分' }}
</lay-tag>
</template>
<template v-slot:toolbar>
<lay-button
size="sm"
type="primary"
@click="changeVisible11('新增', null)"
>新增</lay-button
>
<lay-button size="sm" @click="toRemove">删除</lay-button>
</template>
<template v-slot:operator="{ row }">
<lay-button
size="xs"
border="green"
border-style="dashed"
@click="changeVisible11('编辑', row)"
>编辑</lay-button
>
<lay-popconfirm
content="确定要删除此用户吗?"
@confirm="confirm"
@cancel="cancel"
>
<lay-button size="xs" border="red" border-style="dashed"
>删除</lay-button
>
</lay-popconfirm>
<template v-slot:operator="{ data }">
<lay-space size="lg">
<span style="color: #00A394;cursor: pointer" @click="showDetail(data)">详情</span>
<lay-popconfirm v-if="data.status == 1" trigger="click" content="请确认你的操作,流程将结束" cancelText="审核拒绝" confirmText="审核通过" @confirm="confirm(data, 2)"
@cancel="confirm(data, 3)">
<span style="color: #00A394;cursor: pointer">审核</span>
</lay-popconfirm>
</lay-space>
</template>
</lay-table>
</div>
</div>
<lay-layer v-model="visible11" :title="title" :area="['500px', '450px']">
<lay-layer v-model="detailVisible" :type="4" title="详情查看" :area="['950px', '100%']" :shade="true">
<div style="padding: 20px">
<lay-form :model="model11" ref="layFormRef11" required>
<lay-form-item label="用户账号" prop="account">
<lay-input v-model="model11.account"></lay-input>
</lay-form-item>
<lay-form-item label="用户名" prop="name">
<lay-input v-model="model11.name"></lay-input>
</lay-form-item>
<lay-form-item label="性别" prop="sex">
<lay-select v-model="model11.sex" style="width: 100%">
<lay-select-option value="男" label="男"></lay-select-option>
<lay-select-option value="女" label="女"></lay-select-option>
</lay-select>
</lay-form-item>
<lay-form-item label="角色" prop="role">
<lay-input v-model="model11.role"></lay-input>
</lay-form-item>
<lay-form-item label="状态" prop="status">
<lay-switch :model-value="model11.status"></lay-switch>
</lay-form-item>
</lay-form>
<div style="width: 100%; text-align: center">
<lay-button size="sm" type="primary" @click="toSubmit"
>保存</lay-button
>
<lay-button size="sm" @click="toCancel">取消</lay-button>
</div>
</div>
</lay-layer>
<lay-layer v-model="visible22" :title="title22" :area="['700px', '400px']">
<div style="padding: 20px">
<lay-form :model="model22" ref="layFormRef11" required>
<lay-row>
<lay-col md="12">
<lay-form-item label="上级机构" prop="organization">
<lay-select v-model="model22.organization" style="width: 100%">
<lay-select-option value="1" label="研发部">
</lay-select-option>
<lay-select-option value="2" label="测试部">
</lay-select-option>
<lay-select-option value="3" label="设计部">
</lay-select-option>
<lay-select-option value="4" label="市场部">
</lay-select-option>
<lay-select-option value="5" label="运维部">
</lay-select-option>
</lay-select>
</lay-form-item>
<lay-form-item label="机构名称" prop="name">
<lay-input v-model="model22.name"></lay-input>
</lay-form-item>
<lay-form-item label="机构全称" prop="fullName">
<lay-input v-model="model22.fullName"></lay-input>
</lay-form-item>
<lay-form-item label="机构代码" prop="code">
<lay-input v-model="model22.code"></lay-input>
</lay-form-item>
</lay-col>
<lay-col md="12">
<lay-form-item label="机构类型" prop="type">
<lay-select v-model="model22.type" style="width: 100%">
<lay-select-option value="1" label="公司"></lay-select-option>
<lay-select-option value="2" label="子公司">
</lay-select-option>
<lay-select-option value="3" label="部门"></lay-select-option>
<lay-select-option value="4" label="小组"></lay-select-option>
</lay-select>
</lay-form-item>
<lay-form-item label="排序号" prop="sort">
<lay-input-number
style="width: 100%"
v-model="model22.sort"
position="right"
></lay-input-number>
</lay-form-item>
<lay-form-item label="备注" prop="remark">
<lay-textarea
placeholder="请输入备注"
v-model="model22.remark"
:rows="4"
></lay-textarea>
</lay-form-item>
</lay-col>
</lay-row>
</lay-form>
<div style="width: 100%; text-align: center">
<lay-button size="sm" type="primary" @click="toSubmit"
>保存</lay-button
>
<lay-button size="sm" @click="toCancel">取消</lay-button>
<lay-descriptions title="考评信息" :column="2" border>
<lay-descriptions-item label="考评人">
{{ detailForm.nickname }}
</lay-descriptions-item>
<lay-descriptions-item label="科室">
{{ detailForm.group_name }}
</lay-descriptions-item>
<lay-descriptions-item label="发生日期">
{{ detailForm.fsdate }}
</lay-descriptions-item>
<lay-descriptions-item label="证明人">
{{ detailForm.zm_nickname }}
</lay-descriptions-item>
<lay-descriptions-item label="考评类型">
{{ detailForm.assessment_type }}
</lay-descriptions-item>
<lay-descriptions-item label="考评项目">
{{ detailForm.project_name }}
</lay-descriptions-item>
<lay-descriptions-item label="分值">
{{ detailForm.score_value }}
</lay-descriptions-item>
<lay-descriptions-item label="状态">
{{ detailForm.status == 1 ? '待审核' : detailForm.status == 2 ? '审核通过' : '已驳回' }}
</lay-descriptions-item>
<lay-descriptions-item label="备注" :span="2">
{{ detailForm.notes || '暂无备注' }}
</lay-descriptions-item>
</lay-descriptions>
<lay-descriptions v-if="detailForm.fj_url" title="附件信息" :column="1" border style="margin-top: 20px">
<lay-descriptions-item label="附件">
<a style="color: #009688" :href="detailForm.fj_url" target="_blank">附件下载</a>
</lay-descriptions-item>
</lay-descriptions>
<div style="text-align: center; margin-top: 20px;">
<lay-button @click="detailVisible = false">关闭</lay-button>
</div>
</div>
</lay-layer>
</lay-container>
</template>
<script setup lang="ts">
import { ref, reactive } from 'vue'
import { ref, reactive, onMounted } from 'vue'
import { layer } from '@layui/layui-vue'
const data = ref([
{
title: 'xxxx公司',
id: 1,
checked: true,
children: [
{
title: '研发部',
id: 2,
children: [
{
title: '研发一部',
id: 3
},
{
title: '研发二部',
id: 4
},
{
title: '研发三部',
id: 5
}
]
},
{
title: '测试部',
id: 6,
children: [
{
title: '测试一部',
id: 7,
disabled: true
},
{
title: '测试二部',
id: 8
}
]
},
{
title: '设计部',
id: 9
},
{
title: '市场部',
id: 10
}
]
}
])
const showLine = ref(false)
const selectedKey = ref('')
const selectedNode = ref({
id: 0,
title: ''
import { getAdditionIndexManage, getAdditionIndexManageExamine, getDoctorName, userGroupData } from '@/api/module/home';
import { useUserStore } from '@/store/user';
const userStore = useUserStore()
onMounted(() => {
getLeftList();
getUserAllList();
})
const isFold = ref(false)
const searchQuery = ref({
userAccount: '',
userName: '',
sex: ''
})
function toReset() {
searchQuery.value = {
userAccount: '',
userName: '',
sex: ''
}
}
function handleClick(node: any) {
selectedNode.value = JSON.parse(JSON.stringify(node))
page.current = selectedNode.value.id
change(page)
}
function toAdd() {
visible22.value = true
}
function toEdit() {
model22.value = {
organization: '1',
name: '研发部',
fullName: 'xxxx公司-研发部',
code: '001',
type: '1',
sort: 1,
remark: '备注'
}
visible22.value = true
}
function toDelete() {
if (selectedKey.value == '') {
layer.msg('您未选择组织机构,请先选择要删除的组织机构', {
icon: 3,
time: 2000
const userList = ref([]);
const getUserAllList = () => {
getDoctorName({}).then((res) => {
if (res.code === 1) {
userList.value = res.data;
}
})
return
}
layer.confirm(
'您将删除所选中的组织机构 [ ' + selectedNode.value.title + ' ] ',
{
title: '提示',
btn: [
{
text: '确定',
callback: (id: any) => {
layer.msg('您已成功删除')
layer.close(id)
}
},
{
text: '取消',
callback: (id: any) => {
layer.msg('您已取消操作')
layer.close(id)
}
}
]
}
)
}
const leftId = ref(0);
const data = ref()
const getLeftList = () => {
userGroupData({}).then((res) => {
console.log(res)
if (res.code == 1) {
data.value = res.data;
leftId.value = res.data[0].id;
getUserList();
function toSearch() {
page.current = 1
change(page)
} else {
layer.msg(res.msg, { icon: 2 })
}
})
}
const getUserList = () => {
getAdditionIndexManage({ page: page.current, size: page.limit, group_id: leftId.value, ...searchForm.value }).then((res) => {
if (res.code == 1) {
dataSource.value = res.data.data;
page.total = res.data.count;
} else {
layer.msg(res.msg, { icon: 2 })
}
})
}
//
const toSearch = () => {
page.current = 1
dataSource.value = []
getUserList()
}
//
const handlePageChange = (d) => {
console.log(d);
getUserList()
}
//
const toReset = () => {
searchForm.value = {
fsdate: '',
user_id: '',
status: ''
}
page.current = 1
dataSource.value = []
getUserList()
}
const loading = ref(false)
const selectedKeys = ref()
const page = reactive({ current: 1, limit: 10, total: 100 })
const page = reactive({ current: 1, limit: 10, total: 1 })
const columns = ref([
{ title: '选项', width: '55px', type: 'checkbox', fixed: 'left' },
{ title: '编号', width: '80px', key: 'id', fixed: 'left', sort: 'id' },
{ title: '用户账号', width: '80px', key: 'account', sort: 'account' },
{ title: '用户名', width: '80px', key: 'name', sort: 'name' },
{ title: '性别', width: '80px', key: 'sex', sort: 'sex' },
{ title: '角色', width: '120px', key: 'role', customSlot: 'role' },
{
title: '创建时间',
width: '120px',
key: 'joinTime'
title: "序号",
width: "80px",
key: "id",
align: 'center'
},
{
title: "发生时间",
width: "160px",
key: "fsdate",
align: 'center'
},
{
title: "考评对象",
width: "120px",
key: "nickname",
align: 'center'
},
{
title: "考评类型",
width: "100px",
key: "assessment_type",
customSlot: 'assessment_type',
align: 'center'
},
{
title: "考评项",
width: "150px",
key: "project_name",
align: 'center'
},
{
title: "分值",
width: "80px",
key: "score_value",
align: 'center'
},
{
title: "记录状态",
width: "100px",
customSlot: 'status',
key: "status",
align: 'center'
},
{ title: '状态', width: '120px', key: 'status', sort: 'status' },
{
title: '操作',
width: '150px',
width: '180px',
customSlot: 'operator',
key: 'operator',
align: 'center',
fixed: 'right'
}
])
const change = (page: any) => {
loading.value = true
setTimeout(() => {
dataSource.value = loadDataSource(page.current, page.limit)
loading.value = false
}, 1000)
}
const sortChange = (key: any, sort: number) => {
layer.msg(`字段${key} - 排序${sort}, 你可以利用 sort-change 实现服务端排序`)
}
const dataSource = ref([
{
id: '1',
name: '管理员',
sex: '男',
role: '管理员',
account: 'admin',
joinTime: '2022-02-09 18:34:56',
status: true
},
{
id: '2',
name: '张三2',
sex: '男',
role: '普通用户',
account: '用户2',
joinTime: '2022-02-09 18:34:56',
status: true
},
{
id: '3',
name: '李四3',
sex: '男',
role: '普通用户',
account: '用户3',
joinTime: '2022-02-09 18:34:56',
status: true
},
{
id: '4',
name: '用户4',
sex: '男',
role: '普通用户',
account: '用户4',
joinTime: '2022-02-09 18:34:56',
status: true
},
{
id: '5',
name: '王五5',
sex: '男',
role: '普通用户',
account: '用户5',
joinTime: '2022-02-09 18:34:56',
status: true
},
{
id: '6',
name: '赵六6',
sex: '男',
role: '普通用户',
account: '用户6',
joinTime: '2022-02-09 18:34:56',
status: true
},
{
id: '7',
name: '黄齐7',
sex: '男',
role: '普通用户',
account: '用户7',
joinTime: '2022-02-09 18:34:56',
status: true
},
{
id: '8',
name: '用户8',
sex: '男',
role: '普通用户',
account: '用户8',
joinTime: '2022-02-09 18:34:56',
status: true
},
{
id: '9',
name: '游客9',
sex: '男',
role: '游客',
account: '游客9',
joinTime: '用户22-02-09 18:34:56',
status: true
},
{
id: '10',
name: '用户10',
sex: '女',
role: '普通用户',
account: 'user10',
joinTime: '2022-02-09 18:34:56 18:34:56',
status: true
}
])
const changeStatus = (isChecked: boolean, row: any) => {
dataSource.value.forEach((item) => {
if (item.id === row.id) {
layer.msg('Success', { icon: 1 }, () => {
item.status = isChecked
})
}
})
}
const remove = () => {
layer.msg(selectedKeys.value, { area: '50%' })
}
const loadDataSource = (page: number, pageSize: number) => {
var response = []
var startIndex = (page - 1) * pageSize + 1
var endIndex = page * pageSize
for (var i = startIndex; i <= endIndex; i++) {
response.push({
id: `${i}`,
account: `user${i}`,
sex: '男',
name: `用户${i}`,
joinTime: '2022-02-09 18:34:56',
role: '普通用户',
status: true
})
}
return response
}
const model11 = ref({
name: '',
role: '',
sex: '',
status: '',
account: ''
const dataSource = ref()
const detailVisible = ref(false)
const detailForm = ref({
nickname: '',
group_name: '',
fsdate: '',
zm_nickname: '',
assessment_type: '',
project_name: '',
score_value: '',
notes: '',
status: 1,
fj_url: ''
})
//
const searchForm = ref({
fsdate: '',
user_id: '',
status: ''
})
const layFormRef11 = ref()
const visible11 = ref(false)
const title = ref('新增')
const changeVisible11 = (text: any, row: any) => {
title.value = text
if (row != null) {
let info = JSON.parse(JSON.stringify(row))
model11.value = info
} else {
model11.value = {
name: '',
role: '',
sex: '',
status: '',
account: ''
}
}
visible11.value = !visible11.value
}
const submit11 = function () {
layFormRef11.value.validate((isValidate: any, model: any, errors: any) => {
layer.open({
type: 1,
title: '表单提交结果',
content: `<div style="padding: 10px"><p>是否通过 : ${isValidate}</p> <p>表单数据 : ${JSON.stringify(
model
)} </p> <p>错误信息 : ${JSON.stringify(errors)}</p></div>`,
shade: false,
isHtmlFragment: true,
btn: [
{
text: '确认',
callback(index: any) {
layer.close(index)
}
}
],
area: '500px'
})
})
}
//
const clearValidate11 = function () {
layFormRef11.value.clearValidate()
}
//
const reset11 = function () {
layFormRef11.value.reset()
}
function toRemove() {
if (selectedKeys.value.length == 0) {
layer.msg('您未选择数据,请先选择要删除的数据', { icon: 3, time: 2000 })
return
}
layer.confirm('您将删除所有选中的数据?', {
title: '提示',
btn: [
{
text: '确定',
callback: (id: any) => {
layer.msg('您已成功删除')
layer.close(id)
}
},
{
text: '取消',
callback: (id: any) => {
layer.msg('您已取消操作')
layer.close(id)
}
}
]
})
}
function toSubmit() {
layer.msg('保存成功!', { icon: 1, time: 1000 })
visible11.value = false
visible22.value = false
}
function toCancel() {
visible11.value = false
visible22.value = false
}
function confirm() {
layer.msg('您已成功删除')
}
function cancel() {
layer.msg('您已取消操作')
}
const model22 = ref({
organization: '',
name: '',
fullName: '',
code: '',
type: '',
sort: 0,
remark: ''
})
const layFormRef22 = ref()
const visible22 = ref(false)
const title22 = ref('新建')
//
const showDetail = (row: any) => {
detailForm.value = row
detailVisible.value = true
}
const confirm = (data: any, status: number) => {
console.log(data, status)
getAdditionIndexManageExamine({ id: data.id, status: status }).then((res) => {
if (res.code == 1) {
layer.msg(res.msg, { icon: 1 })
} else {
layer.msg(res.msg, { icon: 2 })
}
getUserList();
})
}
//
const handleClick = (node: any) => {
leftId.value = node.id
page.current = 1
dataSource.value = []
getUserList();
}
</script>
<style scoped>
@ -652,6 +303,7 @@ const title22 = ref('新建')
background-color: #fff;
overflow: hidden;
}
.left-tree {
display: inline-block;
padding: 20px 15px 0 5px;
@ -660,6 +312,7 @@ const title22 = ref('新建')
box-sizing: border-box;
position: relative;
}
/* todo layui-tree-entry 设置无效 */
.layui-tree-entry {
position: relative;
@ -668,6 +321,7 @@ const title22 = ref('新建')
line-height: 20px;
white-space: nowrap;
}
.isFold {
position: absolute;
top: 36%;
@ -680,6 +334,7 @@ const title22 = ref('新建')
border: 1px solid #e6e6e6;
cursor: pointer;
}
.search-input {
display: inline-block;
width: 98%;

View File

@ -4,24 +4,27 @@
<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="80">
<lay-select v-model="searchForm.status" placeholder="请选择状态">
<lay-select-option :value="1" label="待审核"></lay-select-option>
<lay-select-option :value="2" label="审核通过"></lay-select-option>
</lay-select>
</lay-form-item>
</lay-col>
<lay-col :md="4">
<lay-form-item label-width="0">
<lay-button type="primary" @click="search">查询</lay-button>
<lay-button @click="resetSearch" style="margin-left: 10px">重置</lay-button>
</lay-form-item>
</lay-col>
</lay-row>
</lay-form>
<div class="search-form-wrapper">
<lay-form style="margin-top: 20px">
<lay-row style="min-width: 1400px">
<lay-col :md="5">
<lay-form-item label="记录状态:">
<lay-select v-model="searchForm.status" placeholder="请选择状态" style="width: 180px;">
<lay-select-option :value="1" label="待审核"></lay-select-option>
<lay-select-option :value="2" label="审核通过"></lay-select-option>
<lay-select-option :value="3" label="已驳回"></lay-select-option>
</lay-select>
</lay-form-item>
</lay-col>
<lay-col :md="6">
<lay-form-item label-width="0">
<lay-button type="primary" @click="search">查询</lay-button>
<lay-button @click="resetSearch" style="margin-left: 10px">重置</lay-button>
</lay-form-item>
</lay-col>
</lay-row>
</lay-form>
</div>
</lay-card>
</lay-col>
<!-- 列表区域 -->
@ -31,18 +34,24 @@
<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 size="lg" :columns="columns" :data-source="dataSource" :page="page" @change="change">
<lay-table size="lg" height="500px" :columns="columns" :data-source="dataSource" :page="page" @change="change">
<template v-slot:status="{ data }">
<span v-if="data.status == 1" style="color: #1E9FFF">待审核</span>
<span v-if="data.status == 2" style="color: #009688">审核通过</span>
<span v-if="data.status == 3" style="color: #009688">已驳回</span>
</template>
<template v-slot:assessment_type="{ data }">
<lay-tag :type="data.assessment_type == 1 ? 'primary' : 'danger'">
{{ data.assessment_type == 1 ? '加分' : '减分' }}
</lay-tag>
</template>
<template v-slot:operator="{ data }">
<lay-space size="lg">
<span style="color: #00A394;cursor: pointer" @click="showDetail(data)">详情</span>
<span style="color: #00A394;cursor: pointer" @click="editRecord(data)">编辑</span>
<lay-popconfirm trigger="click" content="确定要删除吗?" @confirm="deleteRecord(data)">
<span v-if="data.status == 1" style="color: #00A394;cursor: pointer" @click="editRecord(data)">编辑</span>
<!-- <lay-popconfirm trigger="click" content="确定要删除吗?" @confirm="deleteRecord(data)">
<span style="color: #00A394;cursor: pointer">删除</span>
</lay-popconfirm>
</lay-popconfirm> -->
</lay-space>
</template>
</lay-table>
@ -52,149 +61,378 @@
:btn="formButtons">
<lay-container fluid="true" style="padding: 20px">
<lay-form :model="formData">
<lay-form-item required label="考评对象" prop="targetPerson">
<lay-input v-model="formData.targetPerson" placeholder="请输入考评对象"></lay-input>
<lay-form-item required label="考评对象" prop="user_id">
<lay-select v-model="formData.user_id" placeholder="请选择考评对象" :show-search="true">
<lay-select-option v-for="user in userList" :key="user.id" :value="user.id" :label="user.nickname">
</lay-select-option>
</lay-select>
</lay-form-item>
<lay-form-item required label="考评类型" prop="evaluationType">
<lay-select v-model="formData.evaluationType" placeholder="请选择">
<lay-form-item required label="考评类型" prop="assessment_type">
<lay-select v-model="formData.assessment_type" placeholder="请选择">
<lay-select-option :value="1" label="加分"></lay-select-option>
<lay-select-option :value="2" label="减分"></lay-select-option>
</lay-select>
</lay-form-item>
<lay-form-item required label="考评项目" prop="evaluationItem">
<lay-select v-model="formData.evaluationItem" placeholder="请选择">
<lay-select-option v-for="item in evaluationItems" :key="item.value" :value="item.value"
:label="item.label"></lay-select-option>
<lay-form-item required label="考评项目" prop="assessment_project" :tips="selectedItemTips">
<lay-select v-model="formData.assessment_project" placeholder="请选择" :show-search="true"
@change="handleItemChange">
<lay-select-option v-for="item in evaluationItems" :key="item.id" :value="item.id"
:label="item.project_name"></lay-select-option>
</lay-select>
</lay-form-item>
<lay-form-item required label="分值" prop="score">
<lay-input-number v-model="formData.score" placeholder="请输入分值"></lay-input-number>
<lay-form-item required label="分值" prop="score_value">
<lay-input-number :max="maxInput.single_score_max" :min="maxInput.single_score_min" v-model="formData.score_value" placeholder="请输入分值"></lay-input-number>
</lay-form-item>
<lay-form-item required label="发生时间" prop="occurTime">
<lay-date-picker v-model="formData.occurTime" type="datetime"></lay-date-picker>
<lay-form-item required label="发生时间" prop="fsdate">
<lay-date-picker v-model="formData.fsdate" placeholder="发生时间" type="datetime"></lay-date-picker>
</lay-form-item>
<lay-form-item required label="证明人" prop="witness">
<lay-select v-model="formData.witness" placeholder="请选择">
<lay-select-option v-for="person in witnessList" :key="person.value" :value="person.value"
:label="person.label"></lay-select-option>
<lay-form-item required label="证明人" prop="zm_user_id">
<lay-select v-model="formData.zm_user_id" placeholder="请选择证明人" :show-search="true">
<lay-select-option v-for="user in userList" :key="user.id" :value="user.id" :label="user.nickname">
</lay-select-option>
</lay-select>
</lay-form-item>
<lay-form-item label="附件" prop="attachment">
<lay-upload v-model="formData.attachment" :auto="true"></lay-upload>
</lay-form-item>
<lay-form-item label="备注" prop="remark">
<lay-textarea v-model="formData.remark" placeholder="请输入备注"></lay-textarea>
<lay-form-item label="附件" mode="block">
<lay-upload ref="uploadRef" :number="1" field="file" :size="1000"
:headers="{ token: userStore.token }" url="/api/api/common/upload" @cutdone="getCutDone"
v-model="file1" :auto="true" :cut="false" :cutOptions="cutOptions" @done="getFileDone">
<template #preview>
<a v-if="formData.fj_url!=''" style="color: #009688" :href="formData.fj_url" target="_blank">
{{ formData.fj_url }}
</a>
</template>
</lay-upload>
</lay-form-item>
<lay-form-item label="备注" prop="notes">
<lay-textarea v-model="formData.notes" placeholder="请输入备注"></lay-textarea>
</lay-form-item>
</lay-form>
</lay-container>
</lay-layer>
<lay-layer v-model="showDetailDialog" title="记录详情" :area="['950px', '100%']" :shade="true" :type="4">
<div style="padding: 20px">
<lay-descriptions title="基本信息" :column="2" border>
<lay-descriptions-item label="考评对象">
{{ detailData.nickname }}
</lay-descriptions-item>
<lay-descriptions-item label="考评类型">
{{ detailData.assessment_type == 1 ? '加分' : '减分' }}
</lay-descriptions-item>
<lay-descriptions-item label="考评项目">
{{ detailData.project_name }}
</lay-descriptions-item>
<lay-descriptions-item label="分值">
{{ detailData.score_value }}
</lay-descriptions-item>
<lay-descriptions-item label="发生时间">
{{ detailData.fsdate }}
</lay-descriptions-item>
<lay-descriptions-item label="证明人">
{{ detailData.zm_nickname }}
</lay-descriptions-item>
</lay-descriptions>
<lay-descriptions title="其他信息" :column="2" border style="margin-top: 20px">
<lay-descriptions-item label="状态">
<lay-tag size="sm" type="primary">
{{ detailData.status == 1 ? '待审核' : '审核通过' }}
</lay-tag>
</lay-descriptions-item>
<lay-descriptions-item label="备注" :span="2">
{{ detailData.notes || '暂无备注' }}
</lay-descriptions-item>
</lay-descriptions>
<lay-descriptions v-if="detailData.fj_url" title="附件信息" :column="1" border style="margin-top: 20px">
<lay-descriptions-item label="附件">
<a style="color: #009688" :href="detailData.fj_url" target="_blank">查看附件</a>
</lay-descriptions-item>
</lay-descriptions>
<div style="text-align: center; margin-top: 20px;">
<lay-button type="primary" @click="showDetailDialog = false">关闭</lay-button>
</div>
</div>
</lay-layer>
</lay-row>
</lay-container>
</template>
<script setup lang="ts">
import { ref, reactive } from 'vue'
import { ref, reactive, onMounted } from 'vue'
import { layer } from '@layui/layer-vue'
import { scoringGetHierarchicalData, getDoctorName, getAddition, getAdditionCreate, getAdditionUpdate, getAdditionDelete } from '@/api/module/home'
import { useUserStore } from '@/store/user'
interface EvaluationItem {
id: number
project_name: string
scoring_criteria: string
single_score_max: number
single_score_min: number
}
//
interface User {
id: number
nickname: string
}
// userList
const userList = ref<User[]>([])
const detailData = ref<DetailData>({
nickname: '',
assessment_type: 1,
project_name: '',
score_value: 0,
fsdate: '',
zm_nickname: '',
fj_url: '',
notes: '',
status: 1,
create_time: ''
})
const formData = reactive<FormData>({
id: 0,
user_id: '',
assessment_type: 1,
assessment_project: '',
score_value: 0,
fsdate: '',
zm_user_id: '',
fj_url: '',
notes: ''
})
//
interface UploadResponse {
data: string
msg: string
}
const getCutDone = (res: UploadResponse) => {
console.log("getCutDone", res)
cutUrl.value = res.msg
}
const getFileDone = (res: UploadResponse) => {
const date = JSON.parse(res.data)
console.log("getFileDone", date)
formData.fj_url = date.data.fullurl
}
// handleItemChange
const handleItemChange = (value: string | number | object) => {
const selectedItem = evaluationItems.value.find(item => item.id === Number(value))
if (selectedItem) {
maxInput.single_score_max = selectedItem.single_score_max
maxInput.single_score_min = selectedItem.single_score_min
selectedItemTips.value = selectedItem.scoring_criteria || ''
}
}
onMounted(() => {
getAdditionList()
getHierarchicalData()
getUserList()
})
//
const searchForm = reactive({
status: ''
})
const cutOptions = {
copperOption: {
center: false,
aspectRatio: 1,
}
}
const cutUrl = ref("");
const uploadRef = ref(null)
const file1 = ref([]);
//
const page = reactive({
total: 1, //
current: 1, //
limit: 10, //
showRefresh: true, //
showLimit: true //
})
const getAdditionList = () => {
const params = {
page: page.current,
size: page.limit,
...searchForm
}
getAddition(params).then((res) => {
console.log(res);
if (res.code == 1) {
dataSource.value = res.data.data;
page.total = res.data.count;
} else {
layer.msg(res.msg, { icon: 2 })
}
})
}
const evaluationItems = ref<EvaluationItem[]>([])
const selectedItemTips = ref('')
const getHierarchicalData = () => {
scoringGetHierarchicalData({}).then((res) => {
console.log(res)
if (res.code == 1) {
evaluationItems.value = res.data;
} else {
layer.msg(res.msg, { icon: 2 })
}
})
}
//
const dataSource = ref([
{
id: 1,
occurTime: '2024-03-15 14:30',
targetPerson: '张三',
evaluationType: 1,
evaluationItem: '工作表现优异',
score: 5,
reporter: '李四',
status: 1
},
{
id: 2,
occurTime: '2024-03-14 09:15',
targetPerson: '王五',
evaluationType: 2,
evaluationItem: '迟到',
score: -2,
reporter: '李四',
status: 2
}
])
const dataSource = ref()
//
const showForm = ref(false)
const isEdit = ref(false)
const showDetailDialog = ref(false)
//
const formData = reactive({
id: 0,
targetPerson: '',
evaluationType: 1,
evaluationItem: '',
score: 0,
occurTime: '',
witness: '',
attachment: [],
remark: ''
})
//
const formButtons = ref([
{
text: "确认",
callback: async () => {
//
if (!formData.user_id) {
layer.msg('考评对象不能为空!', { icon: 2 });
return;
}
if (!formData.assessment_project) {
layer.msg('考评项目不能为空!', { icon: 2 });
return;
}
if (!formData.score_value) {
layer.msg('分值不能为空!', { icon: 2 });
return;
}
if (!formData.fsdate) {
layer.msg('发生时间不能为空!', { icon: 2 });
return;
}
if (!formData.zm_user_id) {
layer.msg('证明人不能为空!', { icon: 2 });
return;
}
formData.tb_user_id = userStore.userInfo.id;
formData.group_id = userStore.userInfo.group_id;
try {
if (isEdit.value) {
//
await getAdditionUpdate(formData);
layer.msg('编辑成功!', { icon: 1 });
} else {
//
await getAdditionCreate(formData);
layer.msg('新增成功!', { icon: 1 });
}
showForm.value = false;
getAdditionList();
} catch (error) {
layer.msg('操作失败!', { icon: 2 });
}
}
},
{
text: "取消",
callback: () => {
showForm.value = false
}
}
])
//
const evaluationItems = [
{ value: 1, label: '工作表现优异' },
{ value: 2, label: '迟到' },
{ value: 3, label: '加班' },
{ value: 4, label: '工作失误' }
]
//
const search = () => {
page.current = 1;
dataSource.value = [];
getAdditionList()
}
//
const witnessList = [
{ value: 1, label: '张主任' },
{ value: 2, label: '王经理' },
{ value: 3, label: '李组长' }
]
//
const resetSearch = () => {
searchForm.status = '';
//
getAdditionList()
}
//
const change = ({ current, limit }: { current: number, limit: number }) => {
page.current = current
page.limit = limit
// getListData() //
}
const maxInput = reactive({
single_score_max:10,
single_score_min:0,
});
const getUserList = () => {
getDoctorName({}).then((res) => {
if (res.code === 1) {
userList.value = res.data;
}
})
}
//
const columns = [
{
title: "序号",
width: "80px",
key: "id"
key: "id",
align: 'center'
},
{
title: "发生时间",
width: "160px",
key: "occurTime"
key: "fsdate",
align: 'center'
},
{
title: "考评对象",
width: "120px",
key: "targetPerson"
key: "nickname",
align: 'center'
},
{
title: "考评类型",
width: "100px",
key: "evaluationType",
render: (data: any) => data.evaluationType === 1 ? '加分' : '减分'
key: "assessment_type",
align: 'center',
customSlot: 'assessment_type'
},
{
title: "考评项",
width: "150px",
key: "evaluationItem"
key: "project_name",
align: 'center'
},
{
title: "分值",
width: "80px",
key: "score"
},
{
title: "填报人",
width: "100px",
key: "reporter"
key: "score_value",
align: 'center'
},
{
title: "记录状态",
width: "100px",
customSlot: 'status',
key: "status"
key: "status",
align: 'center'
},
{
title: '操作',
@ -214,125 +452,46 @@ const openNew = () => {
}
const editRecord = (data: any) => {
isEdit.value = true
Object.assign(formData, data)
showForm.value = true
isEdit.value = true; //
formData.id = data.id; // ID
formData.user_id = data.user_id; //
formData.assessment_type = data.assessment_type; //
formData.assessment_project = data.assessment_project; //
formData.score_value = data.score_value; //
formData.fsdate = data.fsdate; //
formData.zm_user_id = data.zm_user_id; //
formData.fj_url = data.fj_url; // URL
formData.notes = data.notes; //
showForm.value = true; //
}
const showDetail = (data: any) => {
layer.msg('查看详情:' + JSON.stringify(data))
detailData.value = data
showDetailDialog.value = true
}
const deleteRecord = async (data: any) => {
layer.msg('删除成功!', { icon: 1 })
// API
try {
await getAdditionDelete({id: data.id}); //
layer.msg('删除成功!', { icon: 1 });
} catch (error) {
layer.msg('删除失败!', { icon: 2 });
}
getAdditionList()
}
const resetForm = () => {
formData.id = 0
formData.targetPerson = ''
formData.evaluationType = 1
formData.evaluationItem = ''
formData.score = 0
formData.occurTime = ''
formData.witness = ''
formData.attachment = []
formData.remark = ''
}
//
const formButtons = ref([
{
text: "确认",
callback: async () => {
if (!formData.targetPerson) {
layer.msg('考评对象不能为空!', { icon: 2 })
return
}
// API
layer.msg('提交成功!', { icon: 1 })
showForm.value = false
}
},
{
text: "取消",
callback: () => {
showForm.value = false
}
}
])
//
const searchForm = reactive({
status: undefined as number | undefined
})
//
const search = () => {
// API
console.log('搜索条件:', searchForm)
//
if (searchForm.status) {
dataSource.value = dataSource.value.filter(item => item.status === searchForm.status)
} else {
//
getListData()
}
}
//
const resetSearch = () => {
searchForm.status = undefined
//
getListData()
}
//
const page = reactive({
total: 100, //
current: 1, //
limit: 10, //
showRefresh: true, //
showLimit: true //
})
//
const change = ({ current, limit }: { current: number, limit: number }) => {
page.current = current
page.limit = limit
getListData() //
}
// getListData
const getListData = () => {
// API
// : { page: page.current, limit: page.limit }
//
dataSource.value = [
{
id: 1,
occurTime: '2024-03-15 14:30',
targetPerson: '张三',
evaluationType: 1,
evaluationItem: '工作表现优异',
score: 5,
reporter: '李四',
status: 1
},
{
id: 2,
occurTime: '2024-03-14 09:15',
targetPerson: '王五',
evaluationType: 2,
evaluationItem: '迟到',
score: -2,
reporter: '李四',
status: 2
}
]
page.total = 100 //
formData.user_id = ''
formData.assessment_type = 1
formData.assessment_project = ''
formData.score_value = 0
formData.fsdate = ''
formData.zm_user_id = ''
formData.fj_url = ''
formData.notes = ''
}
const userStore = useUserStore();
</script>
<style>
@ -344,4 +503,22 @@ const getListData = () => {
.layui-inline {
margin-right: 15px;
}
</style>
.search-form-wrapper {
width: 100%;
overflow-x: auto;
}
.search-form-wrapper::-webkit-scrollbar {
height: 8px;
}
.search-form-wrapper::-webkit-scrollbar-thumb {
background-color: #e0e0e0;
border-radius: 4px;
}
.search-form-wrapper::-webkit-scrollbar-track {
background-color: #f5f5f5;
}
</style>

View File

@ -1,102 +1,168 @@
<template>
<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="searchForm.year" placeholder="请选择"
allow-clear></lay-date-picker>
</lay-form-item>
</lay-col>
<lay-col :md="5">
<lay-form-item label="发生时间:" label-width="80">
<lay-date-picker v-model="searchForm.occurDate" placeholder="请选择"
allow-clear></lay-date-picker>
</lay-form-item>
</lay-col>
<lay-col :md="5">
<lay-form-item label="考评对象:" label-width="80">
<lay-input v-model="searchForm.evaluateObject" placeholder="请输入"></lay-input>
</lay-form-item>
</lay-col>
<lay-col :md="5">
<lay-form-item label="审核状态:" label-width="80">
<lay-select v-model="searchForm.status" placeholder="请选择">
<lay-select-option :value="1" label="待审核"></lay-select-option>
<lay-select-option :value="2" label="已通过"></lay-select-option>
<lay-select-option :value="3" label="已驳回"></lay-select-option>
</lay-select>
</lay-form-item>
</lay-col>
<lay-col :md="4">
<lay-form-item label-width="0">
<lay-button type="primary" @click="toSearch">查询</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-card>
<div style="padding: 10px">
<span style="font-size: 18px;vertical-align: center;margin-right: 20px">拒收红包列表</span>
<lay-button type="primary" size="sm" @click="openAdd">新增</lay-button>
<lay-button type="primary" size="sm">导出Excel</lay-button>
</div>
<lay-table :columns="columns" :dataSource="dataSource" :even="true" height="500px" size="md">
<template v-slot:checkbox="{ data }">
<lay-checkbox v-model="data.checked"></lay-checkbox>
</template>
</lay-table>
</lay-card>
</lay-col>
</lay-row>
<lay-container fluid="true" class="organization-box">
<div style="display: flex">
<!-- 添加左侧科室列表 -->
<div v-if="userStore.userInfo.level == 1" :style="{ width: isFold ? `0px` : `200px` }" class="left-tree">
<div v-show="!isFold">
科室列表
</div>
<lay-tree v-show="!isFold" style="margin-top: 10px" :data="data" v-model:selectedKey="leftId"
:showLine="false" :default-expand-all="false" @node-click="handleClick">
<template #title="{ data }">
<span :class="leftId == data.id ? 'isChecked' : ''">
{{ data.name }}
</span>
</template>
</lay-tree>
<div class="isFold" @click="isFold = !isFold">
&nbsp;<lay-icon v-if="!isFold" class="layui-icon-left"></lay-icon>
<lay-icon v-else class="layui-icon-right"></lay-icon>
</div>
</div>
<!-- 将原有内容包装在右侧容器中 -->
<div style="flex: 1; padding: 10px;">
<lay-row :space="10">
<lay-col :md="24">
<lay-card>
<lay-form style="margin-top: 20px">
<lay-row style="min-width: 1200px">
<lay-col :md="5">
<lay-form-item label="发生时间:" :label-width="100">
<lay-date-picker style="width: 100%" v-model="searchForm.fsdate"
placeholder="发生时间" allow-clear></lay-date-picker>
</lay-form-item>
</lay-col>
<lay-col :md="6" v-if="userStore.userInfo.level == 1">
<lay-form-item label="考评对象:" :label-width="100">
<lay-select v-model="searchForm.user_id" placeholder="请选择考评对象"
:show-search="true">
<lay-select-option v-for="user in userList" :key="user.id"
:value="user.id" :label="user.nickname">
</lay-select-option>
</lay-select>
</lay-form-item>
</lay-col>
<lay-col :md="4">
<lay-form-item label="审核状态:" :label-width="100">
<lay-select style="width: 100%" v-model="searchForm.status"
placeholder="审核状态">
<lay-select-option :value="1" label="待审核"></lay-select-option>
<lay-select-option :value="2" label="已通过"></lay-select-option>
<lay-select-option :value="3" label="已驳回"></lay-select-option>
</lay-select>
</lay-form-item>
</lay-col>
<lay-col :md="4">
<lay-form-item :label-width="0">
<lay-button style="margin-left: 20px" type="primary"
@click="toSearch">查询</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-card>
<div style="padding: 10px">
<span style="font-size: 18px;vertical-align: center;margin-right: 20px">拒收红包列表</span>
<lay-button type="primary" size="sm" @click="openAdd">新增</lay-button>
<lay-button type="primary" size="sm">导出Excel</lay-button>
</div>
<lay-table @change="handlePageChange" :columns="columns" :dataSource="dataSource" :even="true" height="500px" size="lg"
:page="page">
<template v-slot:checkbox="{ data }">
<lay-checkbox v-model="data.checked" :value="data.checked"></lay-checkbox>
</template>
<template v-slot:refundAmount="{ data }">
¥{{ data.refunding_amount }}
</template>
<template v-slot:refundType="{ data }">
{{ formatRefundType(data.refunding_type) }}
</template>
<template v-slot:status="{ data }">
<lay-tag v-if="data.status == 1" type="warm">待审核</lay-tag>
<lay-tag v-if="data.status == 2" type="primary">已通过</lay-tag>
<lay-tag v-if="data.status == 3" type="danger">已驳回</lay-tag>
</template>
<template v-slot:operation="{ data }">
<lay-popconfirm v-if="data.status == 1 && data.level == 1" content="请确认你的操作,流程将结束"
trigger="click" cancelText="审核拒绝" confirmText="审核通过" @confirm="confirm(data, 2)"
@cancel="confirm(data, 3)">
<lay-button v-if="data.status == 1 && data.level == 1" type="primary" size="sm"
style="margin-left: 8px">审核</lay-button>
</lay-popconfirm>
<lay-button type="normal" size="sm" style="margin-left: 8px"
@click="openDetail(data)">详情</lay-button>
</template>
</lay-table>
</lay-card>
</lay-col>
</lay-row>
</div>
</div>
</lay-container>
<!-- 新增/编辑弹窗 -->
<lay-layer v-model="visible" :title="formTitle" :area="['600px', '80%']" :shade="true">
<lay-layer v-model="visible" :title="formTitle" :type="4" :area="['950px', '100%']" :shade="true">
<div style="padding: 20px">
<lay-form :model="form">
<lay-form :model="form" mode="inline">
<lay-form-item label="考评对象" required>
<lay-input v-model="form.evaluateObject"></lay-input>
</lay-form-item>
<lay-form-item label="人员编号" required>
<lay-input v-model="form.staffNo"></lay-input>
</lay-form-item>
<lay-form-item label="科室" required>
<lay-input v-model="form.department"></lay-input>
<lay-select disabled v-model="form.user_id" placeholder="请选择考评对象" :show-search="true">
<lay-select-option v-for="user in userList" :key="user.id" :value="user.id"
:label="user.nickname">
</lay-select-option>
</lay-select>
</lay-form-item>
<!-- <lay-form-item label="科室" required>
<lay-cascader v-model="form.group_id" :options="ksOptions" placeholder="请选择科室"
:checkStrictly="false" search :replaceFields="replaceFields">
</lay-cascader>
</lay-form-item> -->
<lay-form-item label="发生日期" required>
<lay-date-picker v-model="form.occurDate"></lay-date-picker>
<lay-date-picker v-model="form.fsdate" placeholder="请选择发生日期"></lay-date-picker>
</lay-form-item>
<lay-form-item label="证明人" required>
<lay-input v-model="form.witness"></lay-input>
<lay-select v-model="form.zm_user_id" placeholder="请选择证明人" :show-search="true">
<lay-select-option v-for="user in userList" :key="user.id" :value="user.id"
:label="user.nickname">
</lay-select-option>
</lay-select>
</lay-form-item>
<lay-form-item label="病区名称" required>
<lay-input style="width: 220px" v-model="form.bq_name" placeholder="请输入病区名称"></lay-input>
</lay-form-item>
<lay-form-item label="患者姓名" required>
<lay-input v-model="form.patientName"></lay-input>
<lay-input style="width: 220px" v-model="form.hz_name" placeholder="请输入患者姓名"></lay-input>
</lay-form-item>
<lay-form-item label="退还金额" required>
<lay-input-number v-model="form.refundAmount"></lay-input-number>
<lay-input-number style="width: 220px" v-model="form.refunding_amount"
placeholder="请输入退还金额"></lay-input-number>
</lay-form-item>
<lay-form-item label="退还日期" required>
<lay-date-picker v-model="form.refundDate"></lay-date-picker>
<lay-date-picker v-model="form.thdate" placeholder="请选择退还日期"></lay-date-picker>
</lay-form-item>
<lay-form-item label="退还方式" required>
<lay-select v-model="form.refundType">
<lay-select v-model="form.refunding_type" placeholder="请选择退还方式">
<lay-select-option :value="1" label="现金"></lay-select-option>
<lay-select-option :value="2" label="转账"></lay-select-option>
</lay-select>
</lay-form-item>
<lay-form-item label="附件">
<lay-upload></lay-upload>
<lay-form-item label="附件" mode="block">
<lay-upload ref="uploadRef" :number="1" field="file" :size="1000"
:headers="{ token: userStore.token }" url="/api/api/common/upload" @cutdone="getCutDone"
v-model="file1" :auto="true" :cut="false" :cutOptions="cutOptions" @done="getFileDone">
<template #preview>
<a v-if="form.fj_url" style="color: #009688" :href="form.fj_url" target="_blank">
{{ form.fj_url }}
</a>
</template>
</lay-upload>
</lay-form-item>
<lay-form-item label="备注">
<lay-textarea v-model="form.remark"></lay-textarea>
<lay-form-item label="备注" mode="block">
<lay-textarea v-model="form.notes" placeholder="请输入备注信息"></lay-textarea>
</lay-form-item>
</lay-form>
<div style="text-align: center; margin-top: 20px;">
@ -105,137 +171,494 @@
</div>
</div>
</lay-layer>
<!-- 修改详情弹窗内容 -->
<lay-layer v-model="detailVisible" title="详情查看" :type="4" :area="['950px', '100%']" :shade="true">
<div style="padding: 20px">
<lay-descriptions title="基本信息" :column="2" border>
<lay-descriptions-item label="考评对象">
<lay-tag size="small" type="primary">{{ detailForm.nickname }}</lay-tag>
</lay-descriptions-item>
<lay-descriptions-item label="科室">
<lay-tag size="small" type="normal">{{ detailForm.group_name }}</lay-tag>
</lay-descriptions-item>
<lay-descriptions-item label="发生日期">
{{ detailForm.fsdate }}
</lay-descriptions-item>
<lay-descriptions-item label="证明人">
<lay-tag size="small" type="warm">{{ detailForm.zm_nickname }}</lay-tag>
</lay-descriptions-item>
<lay-descriptions-item label="病区名称">
{{ detailForm.bq_name }}
</lay-descriptions-item>
<lay-descriptions-item label="患者姓名">
{{ detailForm.hz_name }}
</lay-descriptions-item>
</lay-descriptions>
<lay-descriptions title="退还信息" :column="2" border style="margin-top: 20px">
<lay-descriptions-item label="退还金额">
<lay-tag size="small" type="danger">¥{{ detailForm.refunding_amount }}</lay-tag>
</lay-descriptions-item>
<lay-descriptions-item label="退还日期">
{{ detailForm.thdate }}
</lay-descriptions-item>
<lay-descriptions-item label="退还方式">
<lay-tag size="small" type="normal">{{ formatRefundType(detailForm.refunding_type) }}</lay-tag>
</lay-descriptions-item>
<lay-descriptions-item label="状态">
<lay-tag size="small"
:type="detailForm.status == 2 ? 'primary' : detailForm.status == 3 ? 'danger' : 'warm'">
{{ formatStatus(detailForm.status) }}
</lay-tag>
</lay-descriptions-item>
<lay-descriptions-item label="备注" :span="2">
{{ detailForm.notes || '暂无备注' }}
</lay-descriptions-item>
</lay-descriptions>
<lay-descriptions v-if="detailForm.fj_url" title="附件信息" :column="1" border style="margin-top: 20px">
<lay-descriptions-item label="附件">
<a style="color: #009688" :href="detailForm.fj_url" target="_blank">附件下载</a>
</lay-descriptions-item>
</lay-descriptions>
<div style="text-align: center; margin-top: 20px;">
<lay-button @click="detailVisible = false">关闭</lay-button>
</div>
</div>
</lay-layer>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { onMounted, reactive, ref } from 'vue'
import dayjs from "dayjs";
import { getDoctorName, getRejectRedEnvelopes, rejectRedEnvelopesCreate, rejectRedEnvelopesUpdate, userGroupData } from '@/api/module/home';
import { layer } from '@layui/layui-vue';
import { useUserStore } from '@/store/user';
const userStore = useUserStore()
//
const searchForm = ref({
year: dayjs().year(),
occurDate: '',
evaluateObject: '',
fsdate: '',
user_id: '',
status: ''
})
//
//
const page = reactive({
current: 1,
limit: 10,
total: 1
})
const cutOptions = {
copperOption: {
center: false,
aspectRatio: 1,
}
}
const cutUrl = ref("");
const uploadRef = ref(null)
const file1 = ref([]);
const getCutDone = (res) => {
console.log("getCutDone", res);
cutUrl.value = res.msg;
};
const getFileDone = (res) => {
var date = JSON.parse(res.data);
console.log("getFileDone", date);
form.value.fj_url = date.data.fullurl;
//uploadRef.value.submit()
};
//
const ksOptions = ref([])
const replaceFields = {
label: 'name',
value: 'id',
children: 'children'
}
//
const getGroupList = () => {
userGroupData({}).then((res) => {
if (res.code === 1) {
ksOptions.value = res.data;
} else {
layer.msg(res.msg, { icon: 2 })
}
})
}
const userList = ref([]);
const getUserList = () => {
getDoctorName({}).then((res) => {
if (res.code === 1) {
userList.value = res.data;
}
})
}
//
const dataSource = ref([])
//
const data = ref([])
const leftId = ref('')
const isFold = ref(false)
// id
const getList = () => {
const params = {
page: page.current,
size: page.limit,
group_id: leftId.value, // id
...searchForm.value
}
getRejectRedEnvelopes(params).then((res) => {
if (res.code === 1) {
dataSource.value = res.data.data;
page.total = res.data.count;
} else {
layer.msg(res.msg, { icon: 2 })
}
})
}
// 退
const formatRefundType = (type) => {
return type == 1 ? '现金' : '转账'
}
//
const columns = [
{
title: '',
width: '50px',
customSlot: 'checkbox'
},
{
title: '序号',
width: '80px',
key: 'index'
width: '90px',
key: 'id',
align: 'center'
},
{
title: '发生日期',
width: '120px',
key: 'occurDate'
key: 'fsdate',
align: 'center'
},
{
title: '考评对象',
width: '120px',
key: 'evaluateObject'
},
{
title: '工号',
width: '100px',
key: 'staffNo'
key: 'nickname',
align: 'center'
},
{
title: '科室',
width: '120px',
key: 'department'
key: 'group_name',
align: 'center'
},
{
title: '病区',
width: '120px',
key: 'bq_name',
align: 'center'
},
{
title: '患者姓名',
width: '120px',
key: 'patientName'
key: 'hz_name',
align: 'center'
},
{
title: '退还金额',
width: '100px',
key: 'refundAmount'
width: '120px',
key: 'refunding_amount',
align: 'center',
customSlot: 'refundAmount'
},
{
title: '退还日期',
width: '120px',
key: 'refundDate'
key: 'thdate',
align: 'center'
},
{
title: '退还方式',
width: '100px',
key: 'refundType'
width: '120px',
key: 'refunding_type',
align: 'center',
customSlot: 'refundType'
},
{
title: '状态',
width: '130px',
key: 'status',
align: 'center',
customSlot: 'status'
},
{
title: '操作',
width: '150px',
key: 'operation',
align: 'center',
fixed: 'right',
customSlot: 'operation'
}
]
//
const dataSource = ref([])
//
const visible = ref(false)
const formTitle = ref('新增拒收红包')
//
//
const form = ref({
evaluateObject: '',
staffNo: '',
department: '',
occurDate: '',
witness: '',
patientName: '',
refundAmount: 0,
refundDate: '',
refundType: '',
remark: ''
user_id: '',
group_id: [] as (string | number)[],
fsdate: '',
zm_user_id: '',
hz_name: '',
bq_name: '',
refunding_amount: 0,
thdate: '',
refunding_type: '',
fj_url: '',
notes: ''
})
//
const isEdit = ref(false)
const editId = ref('')
//
const toSearch = () => {
// TODO:
page.current = 1
getList()
}
//
const toReset = () => {
searchForm.value = {
year: dayjs().year(),
occurDate: '',
evaluateObject: '',
fsdate: '',
user_id: '',
status: ''
}
page.current = 1
getList()
}
//
const openAdd = () => {
console.log(userStore.userInfo);
formTitle.value = '新增拒收红包'
isEdit.value = false
editId.value = ''
form.value = {
evaluateObject: '',
staffNo: '',
department: '',
occurDate: '',
witness: '',
patientName: '',
refundAmount: 0,
refundDate: '',
refundType: '',
remark: ''
user_id: userStore.userInfo.id,
group_id: '',
fsdate: '',
zm_user_id: '',
hz_name: '',
bq_name: '',
refunding_amount: 0,
thdate: '',
refunding_type: '',
fj_url: '',
notes: ''
}
visible.value = true
}
//
//
const submitForm = () => {
// TODO:
visible.value = false
if (!form.value.user_id) {
layer.msg('请选择考评对象', { icon: 2 })
return
}
if (!form.value.fsdate) {
layer.msg('请选择发生日期', { icon: 2 })
return
}
if (!form.value.zm_user_id) {
layer.msg('请选择证明人', { icon: 2 })
return
}
if (!form.value.hz_name) {
layer.msg('请输入患者姓名', { icon: 2 })
return
}
if (!form.value.refunding_amount) {
layer.msg('请输入退还金额', { icon: 2 })
return
}
if (!form.value.thdate) {
layer.msg('请选择退还日期', { icon: 2 })
return
}
if (!form.value.refunding_type) {
layer.msg('请选择退还方式', { icon: 2 })
return
}
const params = {
...form.value,
//
group_id: userStore.userInfo.group_id
}
const submitRequest = rejectRedEnvelopesCreate(params);
submitRequest.then(res => {
if (res.code === 1) {
layer.msg('新增成功', { icon: 1 })
visible.value = false
getList()
} else {
layer.msg(res.msg, { icon: 2 })
}
})
}
const confirm = (data: any, type: number) => {
const submitRequest = rejectRedEnvelopesUpdate({ status: type, id: data.id });
submitRequest.then(res => {
if (res.code === 1) {
layer.msg('审核成功', { icon: 1 })
getList()
}
})
}
//
const handlePageChange = (current: number) => {
page.current = current
getList()
}
//
const handleLimitChange = (limit: number) => {
page.current = 1
page.limit = limit
getList()
}
//
const formatStatus = (status: number) => {
switch (status) {
case 1:
return '待审核'
case 2:
return '已通过'
case 3:
return '已驳回'
default:
return '未知'
}
}
//
const detailVisible = ref(false)
const detailForm = ref({
nickname: '',
group_name: '',
fsdate: '',
zm_user_name: '',
bq_name: '',
hz_name: '',
refunding_amount: '',
thdate: '',
refunding_type: '',
status: '',
fj_url: '',
notes: ''
})
//
const openDetail = (data: any) => {
detailForm.value = { ...data }
detailVisible.value = true
}
//
const getLeftList = () => {
userGroupData({}).then((res) => {
if (res.code === 1) {
data.value = res.data;
if (userStore.userInfo.level == 1) {
leftId.value = res.data[0].id;
} else {
leftId.value = userStore.userInfo.group_id;
}
getList(); //
} else {
layer.msg(res.msg, { icon: 2 })
}
})
}
//
function handleClick(node: any) {
leftId.value = node.id
getList();
}
onMounted(() => {
getLeftList(); // getList()
getUserList();
getGroupList();
})
</script>
<style>
.layui-table-header .layui-table-cell {
background-color: #ECF8FA !important;
}
.search-form-wrapper {
width: 100%;
overflow-x: auto;
}
.search-form-wrapper::-webkit-scrollbar {
height: 8px;
}
.search-form-wrapper::-webkit-scrollbar-thumb {
background-color: #e0e0e0;
border-radius: 4px;
}
.search-form-wrapper::-webkit-scrollbar-track {
background-color: #f5f5f5;
}
</style>
<style scoped>
/* 添加左侧树的样式 */
.organization-box {
width: calc(100vw - 240px);
height: calc(100vh - 110px);
margin-top: 10px;
box-sizing: border-box;
background-color: #fff;
overflow: hidden;
}
.left-tree {
display: inline-block;
padding: 20px 15px 0 5px;
height: 1200px;
border-right: 1px solid #e6e6e6;
box-sizing: border-box;
position: relative;
}
.isFold {
position: absolute;
top: 36%;
right: -10px;
width: 26px;
height: 26px;
line-height: 26px;
border-radius: 13px;
background-color: #fff;
border: 1px solid #e6e6e6;
cursor: pointer;
}
.isChecked {
display: inline-block;
background-color: #e8f1ff;
color: red;
}
</style>

View File

@ -77,9 +77,13 @@ const openNew = () => {
}
const getHierarchicalData = async () => {
//
// const res = await api.getList(page.current, page.limit)
// dataSource6.value = res.data.list
// page.total = res.data.total
userGroupData({}).then((res) => {
if (res.code === 1) {
dataSource6.value = res.data;
} else {
layer.msg(res.msg, { icon: 2 })
}
})
}
const addShowMsd = (data, pid) => {
console.log(data);

View File

@ -47,6 +47,11 @@
<template v-slot:password="{ data }">
{{ data.password }}
</template>
<template v-slot:level="{ data }">
<span :style="{ color: data.level == 1 ? '#1E9FFF' : '#FF5722' }">
{{ data.level == 1 ? '有审核权限' : '没有审核权限' }}
</span>
</template>
<template v-slot:operator="{ data }">
<lay-space>
<span v-if="data.id!=1" style="color: #00A394;cursor: pointer" @click="editDo(data)">编辑</span>
@ -71,6 +76,12 @@
<lay-form-item label="角色描述" prop="desc">
<lay-textarea placeholder="请输入角色描述" v-model="addData.describe"></lay-textarea>
</lay-form-item>
<lay-form-item label="审核权限" prop="level">
<lay-radio-group v-model="addData.level">
<lay-radio value="1">有审核权限</lay-radio>
<lay-radio value="2">没有审核权限</lay-radio>
</lay-radio-group>
</lay-form-item>
<lay-form-item label="角色权限" prop="desc">
<lay-tree
:default-expand-all="true"
@ -82,6 +93,7 @@
:replaceFields="replaceFields">
</lay-tree>
</lay-form-item>
</lay-form>
</lay-container>
</lay-layer>
@ -101,7 +113,9 @@ import {
const addData = reactive({
name: '',
describe: '',
rules: []
rules: [],
level: 2,
id: 0
})
const addIsEdit = ref(1)
onMounted(() => {
@ -114,6 +128,7 @@ const openAdd = () => {
addData.name = '';
addData.describe = '';
addData.rules = [];
addData.level = 2;
}
const editDo = (data) => {
console.log(data);
@ -122,6 +137,7 @@ const editDo = (data) => {
addData.describe = data.describe;
addData.rules = data.rules.split(',').map(Number);
addData.id = data.id;
addData.level = data.level;
console.log(addData.rules)
addIsEdit.value = 2;
}
@ -224,6 +240,13 @@ const columns = [
width: '150px',
key: 'describe'
},
{
title: '审核权限',
width: '100px',
customSlot: 'level',
align: 'center',
key: 'level'
},
{
title: '操作',
width: '180px',

View File

@ -2,6 +2,7 @@
<lay-container fluid="true" class="organization-box">
<div style="display: flex">
<div :style="{ width: isFold ? `0px` : `230px` }" class="left-tree">
<div v-if="!isFold">科室列表</div>
<lay-tree v-show="!isFold" style="margin-top: 10px" :data="data" v-model:selectedKey="group_id"
:showLine="false" @node-click="handleClick">
<template #title="{ data }">

View File

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