Merge remote-tracking branch 'origin/develop' into develop
This commit is contained in:
@@ -40,6 +40,16 @@ public class HomeStatisticsDto {
|
|||||||
*/
|
*/
|
||||||
private Double revenueTrend;
|
private Double revenueTrend;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 今日收入金额(数值,单位:元)
|
||||||
|
*/
|
||||||
|
private java.math.BigDecimal todayRevenueAmount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 昨日收入金额(数值,单位:元)
|
||||||
|
*/
|
||||||
|
private java.math.BigDecimal yesterdayRevenueAmount;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 今日预约数量
|
* 今日预约数量
|
||||||
*/
|
*/
|
||||||
@@ -69,4 +79,19 @@ public class HomeStatisticsDto {
|
|||||||
* 待写病历数量
|
* 待写病历数量
|
||||||
*/
|
*/
|
||||||
private Integer pendingEmr;
|
private Integer pendingEmr;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 今日处方数量
|
||||||
|
*/
|
||||||
|
private Integer todayPrescriptions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 昨日处方数量
|
||||||
|
*/
|
||||||
|
private Integer yesterdayPrescriptions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处方相对前日变化百分比
|
||||||
|
*/
|
||||||
|
private Double prescriptionTrend;
|
||||||
}
|
}
|
||||||
@@ -13,7 +13,16 @@ import com.openhis.administration.service.IPatientService;
|
|||||||
import com.openhis.administration.service.IPractitionerService;
|
import com.openhis.administration.service.IPractitionerService;
|
||||||
import com.openhis.common.enums.ParticipantType;
|
import com.openhis.common.enums.ParticipantType;
|
||||||
import com.openhis.web.dto.HomeStatisticsDto;
|
import com.openhis.web.dto.HomeStatisticsDto;
|
||||||
|
import com.openhis.financial.domain.PaymentReconciliation;
|
||||||
|
import com.openhis.financial.service.IPaymentReconciliationService;
|
||||||
|
import com.openhis.medication.domain.MedicationRequest;
|
||||||
|
import com.openhis.medication.service.IMedicationRequestService;
|
||||||
|
import com.openhis.common.enums.PaymentStatus;
|
||||||
import com.openhis.web.service.IHomeStatisticsService;
|
import com.openhis.web.service.IHomeStatisticsService;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Date;
|
||||||
import com.openhis.web.patientmanage.mapper.PatientManageMapper;
|
import com.openhis.web.patientmanage.mapper.PatientManageMapper;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
@@ -46,6 +55,12 @@ public class HomeStatisticsServiceImpl implements IHomeStatisticsService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private IPatientService patientService;
|
private IPatientService patientService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IPaymentReconciliationService paymentReconciliationService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMedicationRequestService medicationRequestService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取首页统计数据
|
* 获取首页统计数据
|
||||||
*
|
*
|
||||||
@@ -105,18 +120,108 @@ public class HomeStatisticsServiceImpl implements IHomeStatisticsService {
|
|||||||
double patientTrend = calculateTrend(totalPatients, yesterdayPatients);
|
double patientTrend = calculateTrend(totalPatients, yesterdayPatients);
|
||||||
statistics.setPatientTrend(patientTrend);
|
statistics.setPatientTrend(patientTrend);
|
||||||
|
|
||||||
// 今日收入和预约等其他统计(暂时设为0,后续从相应表查询)
|
// 查询今日收入
|
||||||
statistics.setTodayRevenue("¥ 0");
|
BigDecimal todayRevenue = queryRevenueByDate(new Date());
|
||||||
statistics.setYesterdayRevenue("¥ 0");
|
BigDecimal yesterdayRevenue = queryRevenueByDate(getYesterday());
|
||||||
statistics.setRevenueTrend(0.0);
|
java.text.DecimalFormat df = new java.text.DecimalFormat("#,##0.00");
|
||||||
|
statistics.setTodayRevenue("¥ " + df.format(todayRevenue));
|
||||||
|
statistics.setYesterdayRevenue("¥ " + df.format(yesterdayRevenue));
|
||||||
|
statistics.setTodayRevenueAmount(todayRevenue);
|
||||||
|
statistics.setYesterdayRevenueAmount(yesterdayRevenue);
|
||||||
|
statistics.setRevenueTrend(calculateTrend(todayRevenue.doubleValue(), yesterdayRevenue.doubleValue()));
|
||||||
|
|
||||||
|
// 今日预约和待审核(暂时设为0,后续实现)
|
||||||
statistics.setTodayAppointments(0);
|
statistics.setTodayAppointments(0);
|
||||||
statistics.setYesterdayAppointments(0);
|
statistics.setYesterdayAppointments(0);
|
||||||
statistics.setAppointmentTrend(0.0);
|
statistics.setAppointmentTrend(0.0);
|
||||||
statistics.setPendingApprovals(0);
|
statistics.setPendingApprovals(0);
|
||||||
|
|
||||||
|
|
||||||
|
// 查询今日处方数量
|
||||||
|
int todayPrescriptions = queryPrescriptionCountByDate(new Date(), practitioner);
|
||||||
|
int yesterdayPrescriptions = queryPrescriptionCountByDate(getYesterday(), practitioner);
|
||||||
|
statistics.setTodayPrescriptions(todayPrescriptions);
|
||||||
|
statistics.setYesterdayPrescriptions(yesterdayPrescriptions);
|
||||||
|
statistics.setPrescriptionTrend(calculateTrend(todayPrescriptions, yesterdayPrescriptions));
|
||||||
|
|
||||||
return statistics;
|
return statistics;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询指定日期的处方数量
|
||||||
|
*
|
||||||
|
* @param date 日期
|
||||||
|
* @param practitioner 当前医生(null 则查全部)
|
||||||
|
* @return 处方数量
|
||||||
|
*/
|
||||||
|
private int queryPrescriptionCountByDate(Date date, Practitioner practitioner) {
|
||||||
|
Calendar cal = Calendar.getInstance();
|
||||||
|
cal.setTime(date);
|
||||||
|
cal.set(Calendar.HOUR_OF_DAY, 0);
|
||||||
|
cal.set(Calendar.MINUTE, 0);
|
||||||
|
cal.set(Calendar.SECOND, 0);
|
||||||
|
cal.set(Calendar.MILLISECOND, 0);
|
||||||
|
Date dayStart = cal.getTime();
|
||||||
|
|
||||||
|
cal.add(Calendar.DAY_OF_MONTH, 1);
|
||||||
|
Date dayEnd = cal.getTime();
|
||||||
|
|
||||||
|
LambdaQueryWrapper<MedicationRequest> query = new LambdaQueryWrapper<>();
|
||||||
|
query.ge(MedicationRequest::getCreateTime, dayStart)
|
||||||
|
.lt(MedicationRequest::getCreateTime, dayEnd)
|
||||||
|
.eq(MedicationRequest::getDeleteFlag, "0");
|
||||||
|
|
||||||
|
// 如果是医生角色,只统计自己开的处方
|
||||||
|
if (practitioner != null) {
|
||||||
|
query.eq(MedicationRequest::getPractitionerId, practitioner.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
return (int) medicationRequestService.count(query);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询指定日期的收款总额(状态为支付成功且未全部退款)
|
||||||
|
*
|
||||||
|
* @param date 日期
|
||||||
|
* @return 收款总额
|
||||||
|
*/
|
||||||
|
private BigDecimal queryRevenueByDate(Date date) {
|
||||||
|
Calendar cal = Calendar.getInstance();
|
||||||
|
cal.setTime(date);
|
||||||
|
cal.set(Calendar.HOUR_OF_DAY, 0);
|
||||||
|
cal.set(Calendar.MINUTE, 0);
|
||||||
|
cal.set(Calendar.SECOND, 0);
|
||||||
|
cal.set(Calendar.MILLISECOND, 0);
|
||||||
|
Date dayStart = cal.getTime();
|
||||||
|
|
||||||
|
cal.add(Calendar.DAY_OF_MONTH, 1);
|
||||||
|
Date dayEnd = cal.getTime();
|
||||||
|
|
||||||
|
LambdaQueryWrapper<PaymentReconciliation> query = new LambdaQueryWrapper<>();
|
||||||
|
query.ge(PaymentReconciliation::getBillDate, dayStart)
|
||||||
|
.lt(PaymentReconciliation::getBillDate, dayEnd)
|
||||||
|
.eq(PaymentReconciliation::getStatusEnum, PaymentStatus.SUCCESS.getValue())
|
||||||
|
.eq(PaymentReconciliation::getDeleteFlag, "0")
|
||||||
|
.select(PaymentReconciliation::getDisplayAmount);
|
||||||
|
|
||||||
|
java.util.List<PaymentReconciliation> list = paymentReconciliationService.list(query);
|
||||||
|
if (list == null || list.isEmpty()) {
|
||||||
|
return BigDecimal.ZERO;
|
||||||
|
}
|
||||||
|
return list.stream()
|
||||||
|
.map(p -> p.getDisplayAmount() != null ? p.getDisplayAmount() : BigDecimal.ZERO)
|
||||||
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取昨天的日期
|
||||||
|
*/
|
||||||
|
private Date getYesterday() {
|
||||||
|
Calendar cal = Calendar.getInstance();
|
||||||
|
cal.add(Calendar.DAY_OF_MONTH, -1);
|
||||||
|
return cal.getTime();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 计算相对前日的百分比变化
|
* 计算相对前日的百分比变化
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -0,0 +1,93 @@
|
|||||||
|
# 数据源配置
|
||||||
|
spring:
|
||||||
|
datasource:
|
||||||
|
type: com.alibaba.druid.pool.DruidDataSource
|
||||||
|
driverClassName: org.postgresql.Driver
|
||||||
|
druid:
|
||||||
|
# 主库数据源
|
||||||
|
master:
|
||||||
|
url: jdbc:postgresql://192.168.110.252:15432/postgresql?currentSchema=hisdev&characterEncoding=UTF-8&client_encoding=UTF-8
|
||||||
|
username: postgresql
|
||||||
|
password: Jchl1528 # 请替换为实际的数据库密码
|
||||||
|
# 从库数据源
|
||||||
|
slave:
|
||||||
|
# 从数据源开关/默认关闭
|
||||||
|
enabled: false
|
||||||
|
url:
|
||||||
|
username:
|
||||||
|
password:
|
||||||
|
# 初始连接数
|
||||||
|
initialSize: 5
|
||||||
|
# 最小连接池数量
|
||||||
|
minIdle: 10
|
||||||
|
# 最大连接池数量
|
||||||
|
maxActive: 20
|
||||||
|
# 配置获取连接等待超时的时间
|
||||||
|
maxWait: 60000
|
||||||
|
# 配置连接超时时间
|
||||||
|
connectTimeout: 30000
|
||||||
|
# 配置网络超时时间
|
||||||
|
socketTimeout: 60000
|
||||||
|
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
|
||||||
|
timeBetweenEvictionRunsMillis: 60000
|
||||||
|
# 配置一个连接在池中最小生存的时间,单位是毫秒
|
||||||
|
minEvictableIdleTimeMillis: 300000
|
||||||
|
# 配置一个连接在池中最大生存的时间,单位是毫秒
|
||||||
|
maxEvictableIdleTimeMillis: 900000
|
||||||
|
# 配置检测连接是否有效
|
||||||
|
validationQuery: SELECT 1
|
||||||
|
testWhileIdle: true
|
||||||
|
testOnBorrow: true # 改为true以确保连接有效
|
||||||
|
testOnReturn: false
|
||||||
|
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
|
||||||
|
filters: stat,wall,slf4j
|
||||||
|
webStatFilter:
|
||||||
|
enabled: true
|
||||||
|
statViewServlet:
|
||||||
|
enabled: true
|
||||||
|
# 设置白名单,不填则允许所有访问
|
||||||
|
allow:
|
||||||
|
url-pattern: /druid/*
|
||||||
|
# 控制台管理用户名和密码
|
||||||
|
login-username: openhis
|
||||||
|
login-password: 123456
|
||||||
|
filter:
|
||||||
|
stat:
|
||||||
|
enabled: true
|
||||||
|
# 慢SQL记录
|
||||||
|
log-slow-sql: true
|
||||||
|
slow-sql-millis: 1000
|
||||||
|
merge-sql: true
|
||||||
|
wall:
|
||||||
|
config:
|
||||||
|
multi-statement-allow: true
|
||||||
|
# redis 配置
|
||||||
|
redis:
|
||||||
|
# 地址
|
||||||
|
host: 192.168.110.252
|
||||||
|
# 端口,默认为6379
|
||||||
|
port: 6379
|
||||||
|
# 数据库索引
|
||||||
|
database: 1
|
||||||
|
# 密码
|
||||||
|
password: Jchl1528
|
||||||
|
# 连接超时时间
|
||||||
|
timeout: 10s
|
||||||
|
lettuce:
|
||||||
|
pool:
|
||||||
|
# 连接池中的最小空闲连接
|
||||||
|
min-idle: 0
|
||||||
|
# 连接池中的最大空闲连接
|
||||||
|
max-idle: 8
|
||||||
|
# 连接池的最大数据库连接数
|
||||||
|
max-active: 8
|
||||||
|
# #连接池最大阻塞等待时间(使用负值表示没有限制)
|
||||||
|
max-wait: -1ms
|
||||||
|
|
||||||
|
# 服务器配置
|
||||||
|
server:
|
||||||
|
# 服务器的HTTP端口,默认为18080
|
||||||
|
port: 18080
|
||||||
|
servlet:
|
||||||
|
# 应用的访问路径
|
||||||
|
context-path: /openhis
|
||||||
@@ -64,7 +64,9 @@
|
|||||||
"vue-area-linkage": "^5.1.0",
|
"vue-area-linkage": "^5.1.0",
|
||||||
"vue-cropper": "^1.1.1",
|
"vue-cropper": "^1.1.1",
|
||||||
"vue-plugin-hiprint": "^0.0.19",
|
"vue-plugin-hiprint": "^0.0.19",
|
||||||
"vue-router": "^4.3.0"
|
"vue-router": "^4.3.0",
|
||||||
|
"vxe-table": "^4.19.6",
|
||||||
|
"xe-utils": "^3.9.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@playwright/test": "^1.58.2",
|
"@playwright/test": "^1.58.2",
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import {createApp} from 'vue';
|
import {createApp} from 'vue';
|
||||||
|
|
||||||
|
import VxeUIAll from 'vxe-table';
|
||||||
|
import 'vxe-table/lib/style.css';
|
||||||
import Cookies from 'js-cookie';
|
import Cookies from 'js-cookie';
|
||||||
|
|
||||||
// 导入 hiprint 并挂载到全局 window 对象
|
// 导入 hiprint 并挂载到全局 window 对象
|
||||||
@@ -122,6 +124,7 @@ directive(app);
|
|||||||
// 全局禁止点击遮罩层关闭弹窗
|
// 全局禁止点击遮罩层关闭弹窗
|
||||||
ElDialog.props.closeOnClickModal.default = false;
|
ElDialog.props.closeOnClickModal.default = false;
|
||||||
// 使用element-plus 并且设置全局的大小
|
// 使用element-plus 并且设置全局的大小
|
||||||
|
app.use(VxeUIAll);
|
||||||
app.use(ElementPlus, {
|
app.use(ElementPlus, {
|
||||||
locale: zhCn,
|
locale: zhCn,
|
||||||
// 支持 large、default、small
|
// 支持 large、default、small
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="home-container">
|
<div class="home-container">
|
||||||
<!-- 顶部欢迎区域 -->
|
<!-- 顶部欢迎区域 -->
|
||||||
<div class="welcome-section">
|
<div class="welcome-section">
|
||||||
|
<div class="welcome-bg">
|
||||||
|
<div class="welcome-orb orb-1"></div>
|
||||||
|
<div class="welcome-orb orb-2"></div>
|
||||||
|
</div>
|
||||||
<div class="welcome-content">
|
<div class="welcome-content">
|
||||||
<div class="greeting">
|
<div class="greeting">
|
||||||
<h1>{{ getGreeting() }},{{ userStore.nickName || userStore.name }}</h1>
|
<h1>{{ getGreeting() }},{{ userStore.nickName || userStore.name }}</h1>
|
||||||
@@ -14,6 +18,8 @@
|
|||||||
<el-tag
|
<el-tag
|
||||||
:type="getRoleTagType(userStore.roles[0])"
|
:type="getRoleTagType(userStore.roles[0])"
|
||||||
size="large"
|
size="large"
|
||||||
|
effect="dark"
|
||||||
|
round
|
||||||
>
|
>
|
||||||
{{ getRoleName(userStore.roles[0]) }}
|
{{ getRoleName(userStore.roles[0]) }}
|
||||||
</el-tag>
|
</el-tag>
|
||||||
@@ -32,7 +38,7 @@
|
|||||||
>
|
>
|
||||||
<div class="stat-icon">
|
<div class="stat-icon">
|
||||||
<el-icon
|
<el-icon
|
||||||
:size="36"
|
:size="32"
|
||||||
:color="stat.iconColor"
|
:color="stat.iconColor"
|
||||||
>
|
>
|
||||||
<component :is="stat.icon" />
|
<component :is="stat.icon" />
|
||||||
@@ -50,7 +56,7 @@
|
|||||||
class="stat-trend"
|
class="stat-trend"
|
||||||
>
|
>
|
||||||
<span :class="stat.trend > 0 ? 'trend-up' : 'trend-down'">
|
<span :class="stat.trend > 0 ? 'trend-up' : 'trend-down'">
|
||||||
{{ stat.trend > 0 ? '↑' : '↓' }} {{ Math.abs(stat.trend) }}%
|
{{ stat.trend > 0 ? '↑' : '↓' }} {{ Math.abs(stat.trend).toFixed(2) }}%
|
||||||
</span>
|
</span>
|
||||||
<span class="trend-label">较昨日</span>
|
<span class="trend-label">较昨日</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -86,7 +92,7 @@
|
|||||||
<div class="quick-icon">
|
<div class="quick-icon">
|
||||||
<svg-icon
|
<svg-icon
|
||||||
:icon-class="func.icon"
|
:icon-class="func.icon"
|
||||||
:style="{ fontSize: '28px', color: func.iconColor }"
|
:style="{ fontSize: '26px', color: func.iconColor }"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="quick-label">
|
<div class="quick-label">
|
||||||
@@ -97,6 +103,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- 待办 + 日程 双栏布局 -->
|
||||||
|
<div class="bottom-grid">
|
||||||
<!-- 待办事项 -->
|
<!-- 待办事项 -->
|
||||||
<div class="todo-section">
|
<div class="todo-section">
|
||||||
<div class="section-header">
|
<div class="section-header">
|
||||||
@@ -123,7 +131,7 @@
|
|||||||
@click="handleTodoClick(todo)"
|
@click="handleTodoClick(todo)"
|
||||||
>
|
>
|
||||||
<div class="todo-icon">
|
<div class="todo-icon">
|
||||||
<el-icon :size="20">
|
<el-icon :size="18">
|
||||||
<component :is="todo.icon" />
|
<component :is="todo.icon" />
|
||||||
</el-icon>
|
</el-icon>
|
||||||
</div>
|
</div>
|
||||||
@@ -184,6 +192,7 @@
|
|||||||
<el-tag
|
<el-tag
|
||||||
:type="item.type"
|
:type="item.type"
|
||||||
size="small"
|
size="small"
|
||||||
|
round
|
||||||
>
|
>
|
||||||
{{ item.tag }}
|
{{ item.tag }}
|
||||||
</el-tag>
|
</el-tag>
|
||||||
@@ -193,15 +202,15 @@
|
|||||||
class="empty-schedule"
|
class="empty-schedule"
|
||||||
>
|
>
|
||||||
<el-empty
|
<el-empty
|
||||||
description="暂无今日日程"
|
description="暂无日程安排"
|
||||||
:image-size="60"
|
:image-size="60"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup name="Home">
|
<script setup name="Home">
|
||||||
import { ref, computed, onMounted, onUnmounted } from 'vue'
|
import { ref, computed, onMounted, onUnmounted } from 'vue'
|
||||||
import { useRouter } from 'vue-router'
|
import { useRouter } from 'vue-router'
|
||||||
@@ -212,7 +221,7 @@ import { listTodo } from '@/api/workflow/task.js'
|
|||||||
import { getCurrentUserConfig } from '@/api/system/userConfig'
|
import { getCurrentUserConfig } from '@/api/system/userConfig'
|
||||||
import { listMenu, getMenuFullPath } from '@/api/system/menu'
|
import { listMenu, getMenuFullPath } from '@/api/system/menu'
|
||||||
import { getTodayMySchedule } from '@/api/appointmentmanage/doctorSchedule'
|
import { getTodayMySchedule } from '@/api/appointmentmanage/doctorSchedule'
|
||||||
import { ElDivider } from 'element-plus'
|
import { ElDivider, ElMessage } from 'element-plus'
|
||||||
import {
|
import {
|
||||||
User,
|
User,
|
||||||
Document,
|
Document,
|
||||||
@@ -310,7 +319,10 @@ const statisticsData = ref({
|
|||||||
todayAppointments: 0,
|
todayAppointments: 0,
|
||||||
yesterdayAppointments: 0,
|
yesterdayAppointments: 0,
|
||||||
appointmentTrend: 0,
|
appointmentTrend: 0,
|
||||||
pendingApprovals: 0
|
pendingApprovals: 0,
|
||||||
|
todayPrescriptions: 0,
|
||||||
|
yesterdayPrescriptions: 0,
|
||||||
|
prescriptionTrend: 0
|
||||||
})
|
})
|
||||||
|
|
||||||
// 不同角色的统计数据配置
|
// 不同角色的统计数据配置
|
||||||
@@ -583,7 +595,7 @@ const getDefaultQuickAccessConfig = () => {
|
|||||||
return [
|
return [
|
||||||
{ key: 'outpatient', label: '门诊接诊', icon: 'chat-dot-round', iconColor: '#3B82F6', route: '/doctorstation' },
|
{ key: 'outpatient', label: '门诊接诊', icon: 'chat-dot-round', iconColor: '#3B82F6', route: '/doctorstation' },
|
||||||
{ key: 'emr', label: '病历管理', icon: 'document', iconColor: '#10B981', route: '/doctorstation/doctorphrase' },
|
{ key: 'emr', label: '病历管理', icon: 'document', iconColor: '#10B981', route: '/doctorstation/doctorphrase' },
|
||||||
{ key: 'prescription', label: '开立处方', icon: 'box', iconColor: '#F59E0B', route: '/clinicmanagement/ePrescribing' },
|
{ key: 'prescription', label: '开立处方', icon: 'box', iconColor: '#F59E0B', route: '/ybmanagement/ePrescribing' },
|
||||||
{ key: 'history', label: '历史处方', icon: 'clock', iconColor: '#EF4444', route: '/clinicmanagement/historicalPrescription' },
|
{ key: 'history', label: '历史处方', icon: 'clock', iconColor: '#EF4444', route: '/clinicmanagement/historicalPrescription' },
|
||||||
{ key: 'schedule', label: '排班管理', icon: 'calendar', iconColor: '#64748B', route: '/appoinmentmanage/deptManage' },
|
{ key: 'schedule', label: '排班管理', icon: 'calendar', iconColor: '#64748B', route: '/appoinmentmanage/deptManage' },
|
||||||
{ key: 'inquiry', label: '患者查询', icon: 'search', iconColor: '#3B82F6', route: '/patientmanagement' }
|
{ key: 'inquiry', label: '患者查询', icon: 'search', iconColor: '#3B82F6', route: '/patientmanagement' }
|
||||||
@@ -609,7 +621,7 @@ const getDefaultQuickAccessConfig = () => {
|
|||||||
case 'cashier':
|
case 'cashier':
|
||||||
return [
|
return [
|
||||||
{ key: 'registration', label: '挂号收费', icon: 'money', iconColor: '#3B82F6', route: '/charge/outpatientregistration' },
|
{ key: 'registration', label: '挂号收费', icon: 'money', iconColor: '#3B82F6', route: '/charge/outpatientregistration' },
|
||||||
{ key: 'clinicCharge', label: '门诊收费', icon: 'wallet', iconColor: '#10B981', route: '/charge/cliniccharge' },
|
{ key: 'clinicCharge', label: '门诊收费', icon: 'wallet', iconColor: '#10B981', route: '/clinic/charge/cliniccharge' },
|
||||||
{ key: 'refund', label: '退费管理', icon: 'document', iconColor: '#F59E0B', route: '/charge/clinicrefund' },
|
{ key: 'refund', label: '退费管理', icon: 'document', iconColor: '#F59E0B', route: '/charge/clinicrefund' },
|
||||||
{ key: 'invoice', label: '发票打印', icon: 'files', iconColor: '#EF4444', route: '/basicmanage/InvoiceManagement' },
|
{ key: 'invoice', label: '发票打印', icon: 'files', iconColor: '#EF4444', route: '/basicmanage/InvoiceManagement' },
|
||||||
{ key: 'record', label: '收费记录', icon: 'clock', iconColor: '#64748B', route: '/charge/clinicRecord' },
|
{ key: 'record', label: '收费记录', icon: 'clock', iconColor: '#64748B', route: '/charge/clinicRecord' },
|
||||||
@@ -618,7 +630,7 @@ const getDefaultQuickAccessConfig = () => {
|
|||||||
default: // admin
|
default: // admin
|
||||||
return [
|
return [
|
||||||
{ key: 'patient', label: '患者管理', icon: 'user', iconColor: '#3B82F6', route: '/patient/patientmgr' },
|
{ key: 'patient', label: '患者管理', icon: 'user', iconColor: '#3B82F6', route: '/patient/patientmgr' },
|
||||||
{ key: 'appointment', label: '预约管理', icon: 'calendar', iconColor: '#10B981', route: '/appoinmentmanage' },
|
{ key: 'appointment', label: '预约管理', icon: 'calendar', iconColor: '#10B981', route: '/appoinmentmanage/outpatientAppointment' },
|
||||||
{ key: 'doctor', label: '医生管理', icon: 'user', iconColor: '#F59E0B', route: '/doctorstation' },
|
{ key: 'doctor', label: '医生管理', icon: 'user', iconColor: '#F59E0B', route: '/doctorstation' },
|
||||||
{ key: 'surgery', label: '手术管理', icon: 'operation', iconColor: '#EF4444', route: '/surgerymanage' },
|
{ key: 'surgery', label: '手术管理', icon: 'operation', iconColor: '#EF4444', route: '/surgerymanage' },
|
||||||
{ key: 'drug', label: '药品管理', icon: 'box', iconColor: '#64748B', route: '/pharmacymanagement' },
|
{ key: 'drug', label: '药品管理', icon: 'box', iconColor: '#64748B', route: '/pharmacymanagement' },
|
||||||
@@ -715,8 +727,8 @@ const currentStats = computed(() => {
|
|||||||
statWith.value = statisticsData.value.pendingEmr;
|
statWith.value = statisticsData.value.pendingEmr;
|
||||||
break;
|
break;
|
||||||
case 'prescriptions':
|
case 'prescriptions':
|
||||||
statWith.value = statisticsData.value.todayAppointments;
|
statWith.value = statisticsData.value.todayPrescriptions;
|
||||||
statWith.trend = statisticsData.value.appointmentTrend;
|
statWith.trend = statisticsData.value.prescriptionTrend;
|
||||||
break;
|
break;
|
||||||
case 'wardPatients':
|
case 'wardPatients':
|
||||||
statWith.value = statisticsData.value.totalPatients;
|
statWith.value = statisticsData.value.totalPatients;
|
||||||
@@ -734,8 +746,8 @@ const currentStats = computed(() => {
|
|||||||
statWith.trend = statisticsData.value.appointmentTrend;
|
statWith.trend = statisticsData.value.appointmentTrend;
|
||||||
break;
|
break;
|
||||||
case 'todayPrescriptions':
|
case 'todayPrescriptions':
|
||||||
statWith.value = statisticsData.value.todayAppointments;
|
statWith.value = statisticsData.value.todayPrescriptions;
|
||||||
statWith.trend = statisticsData.value.appointmentTrend;
|
statWith.trend = statisticsData.value.prescriptionTrend;
|
||||||
break;
|
break;
|
||||||
case 'pendingReview':
|
case 'pendingReview':
|
||||||
statWith.value = statisticsData.value.pendingApprovals;
|
statWith.value = statisticsData.value.pendingApprovals;
|
||||||
@@ -773,25 +785,37 @@ const currentStats = computed(() => {
|
|||||||
// 处理统计卡片点击
|
// 处理统计卡片点击
|
||||||
const handleStatClick = (stat) => {
|
const handleStatClick = (stat) => {
|
||||||
console.log('Stat clicked:', stat)
|
console.log('Stat clicked:', stat)
|
||||||
// 根据不同的统计项跳转到相应的详情页面
|
const routeMap = {
|
||||||
if (stat.key === 'totalPatients' || stat.key === 'myPatients' || stat.key === 'wardPatients') {
|
totalPatients: '/patient/patientmgr',
|
||||||
// 在院患者/我的患者/病房患者 - 跳转到患者管理页面
|
myPatients: '/patient/patientmgr',
|
||||||
router.push('/patient/patientmgr')
|
wardPatients: '/patient/patientmgr',
|
||||||
} else if (stat.key === 'todayRevenue' || stat.key === 'todayPayments') {
|
todayRevenue: '/clinic/charge/cliniccharge',
|
||||||
// 跳转到收费页面
|
todayPayments: '/clinic/charge/cliniccharge',
|
||||||
router.push('/charge/cliniccharge')
|
appointments: '/appoinmentmanage/outpatientAppointment',
|
||||||
} else if (stat.key === 'appointments') {
|
todayAppointments: '/doctorstation/today-outpatient',
|
||||||
// 跳转到预约管理页面
|
pendingApprovals: '/ybmanagement/ePrescribing',
|
||||||
router.push('/appoinmentmanage')
|
pendingReview: '/ybmanagement/ePrescribing',
|
||||||
} else if (stat.key === 'todayAppointments') {
|
pendingEmr: '/pending-emr',
|
||||||
// 跳转到今日门诊模块
|
prescriptions: '/doctorstation',
|
||||||
router.push('/doctorstation/today-outpatient')
|
todayPrescriptions: '/pharmacyManagement/westernmedicine'
|
||||||
} else if (stat.key === 'pendingApprovals' || stat.key === 'pendingReview') {
|
}
|
||||||
// 跳转到待审核页面
|
const path = routeMap[stat.key]
|
||||||
router.push('/clinicmanagement/ePrescribing')
|
if (!path) return
|
||||||
} else if (stat.key === 'pendingEmr') {
|
// 用 resolve 匹配,兼容有无前导斜杠
|
||||||
// 跳转到待写病历页面
|
const resolved = router.resolve(path)
|
||||||
router.push('/doctorstation/pending-emr')
|
if (resolved.matched && resolved.matched.length > 0) {
|
||||||
|
router.push(path)
|
||||||
|
} else {
|
||||||
|
// 再用 getRoutes 兜底匹配
|
||||||
|
const exists = router.getRoutes().some(r => {
|
||||||
|
const rp = '/' + r.path.replace(/^\//, '')
|
||||||
|
return rp === path
|
||||||
|
})
|
||||||
|
if (exists) {
|
||||||
|
router.push(path)
|
||||||
|
} else {
|
||||||
|
ElMessage.warning('您没有该页面的访问权限,请联系管理员添加菜单')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1106,153 +1130,183 @@ onUnmounted(() => {
|
|||||||
window.removeEventListener('homeFeaturesConfigUpdated', handleConfigUpdate);
|
window.removeEventListener('homeFeaturesConfigUpdated', handleConfigUpdate);
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
<style scoped lang="scss">
|
|
||||||
.home-container {
|
.home-container {
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
background: #f5f7fa;
|
background: #f8fafc;
|
||||||
min-height: calc(100vh - 120px);
|
min-height: calc(100vh - 84px);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 顶部欢迎区域 */
|
/* ===== 欢迎区 ===== */
|
||||||
.welcome-section {
|
.welcome-section {
|
||||||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
position: relative;
|
||||||
border-radius: 12px;
|
border-radius: 16px;
|
||||||
padding: 30px;
|
padding: 32px 36px;
|
||||||
margin-bottom: 20px;
|
margin-bottom: 24px;
|
||||||
color: white;
|
overflow: hidden;
|
||||||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
|
background: linear-gradient(135deg, #0f172a 0%, #1e3a5f 40%, #0e7490 100%);
|
||||||
|
box-shadow: 0 4px 20px rgba(14, 116, 144, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.welcome-bg {
|
||||||
|
position: absolute;
|
||||||
|
inset: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.welcome-orb {
|
||||||
|
position: absolute;
|
||||||
|
border-radius: 50%;
|
||||||
|
filter: blur(60px);
|
||||||
|
opacity: 0.3;
|
||||||
|
animation: welcomeFloat 10s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.orb-1 {
|
||||||
|
width: 200px;
|
||||||
|
height: 200px;
|
||||||
|
background: #22d3ee;
|
||||||
|
top: -60px;
|
||||||
|
right: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.orb-2 {
|
||||||
|
width: 150px;
|
||||||
|
height: 150px;
|
||||||
|
background: #6366f1;
|
||||||
|
bottom: -40px;
|
||||||
|
left: 30%;
|
||||||
|
animation-delay: -5s;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes welcomeFloat {
|
||||||
|
0%, 100% { transform: translate(0, 0); }
|
||||||
|
50% { transform: translate(15px, -10px); }
|
||||||
|
}
|
||||||
|
|
||||||
.welcome-content {
|
.welcome-content {
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
.greeting {
|
.greeting {
|
||||||
|
color: #fff;
|
||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
font-size: 28px;
|
font-size: 26px;
|
||||||
font-weight: 600;
|
font-weight: 700;
|
||||||
margin: 0 0 8px 0;
|
margin: 0 0 6px 0;
|
||||||
|
text-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
|
||||||
}
|
}
|
||||||
|
|
||||||
p {
|
p {
|
||||||
font-size: 16px;
|
font-size: 15px;
|
||||||
opacity: 0.9;
|
opacity: 0.8;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
letter-spacing: 1px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.role-badge {
|
.role-badge {
|
||||||
:deep(.el-tag) {
|
.el-tag {
|
||||||
font-size: 16px;
|
font-size: 13px;
|
||||||
padding: 12px 24px;
|
padding: 6px 16px;
|
||||||
height: auto;
|
|
||||||
background: rgba(255, 255, 255, 0.2);
|
|
||||||
border: 1px solid rgba(255, 255, 255, 0.3);
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 统计卡片网格 */
|
/* ===== 统计卡片 ===== */
|
||||||
.stats-grid {
|
.stats-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
|
grid-template-columns: repeat(4, 1fr);
|
||||||
gap: 16px;
|
gap: 20px;
|
||||||
margin-bottom: 20px;
|
margin-bottom: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
.stat-card {
|
.stat-card {
|
||||||
background: white;
|
background: #fff;
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
padding: 24px;
|
padding: 24px;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 16px;
|
gap: 20px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
transition: all 0.3s ease;
|
transition: all 0.3s ease;
|
||||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
|
border: 1px solid #f1f5f9;
|
||||||
|
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.03);
|
||||||
border-left: 4px solid transparent;
|
border-left: 4px solid transparent;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
transform: translateY(-4px);
|
transform: translateY(-3px);
|
||||||
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);
|
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
|
||||||
}
|
}
|
||||||
|
|
||||||
&.stat-primary {
|
&.stat-primary { border-left-color: #3B82F6; }
|
||||||
border-left-color: #3B82F6;
|
&.stat-success { border-left-color: #10B981; }
|
||||||
}
|
&.stat-warning { border-left-color: #F59E0B; }
|
||||||
|
&.stat-info { border-left-color: #8B5CF6; }
|
||||||
&.stat-success {
|
|
||||||
border-left-color: #10B981;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.stat-warning {
|
|
||||||
border-left-color: #F59E0B;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.stat-danger {
|
|
||||||
border-left-color: #EF4444;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.stat-info {
|
|
||||||
border-left-color: #64748B;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.stat-icon {
|
.stat-icon {
|
||||||
width: 60px;
|
width: 56px;
|
||||||
height: 60px;
|
height: 56px;
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
background: #f5f7fa;
|
background: #f8fafc;
|
||||||
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.stat-content {
|
.stat-content {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.stat-value {
|
.stat-value {
|
||||||
font-size: 24px;
|
font-size: 28px;
|
||||||
font-weight: 600;
|
font-weight: 700;
|
||||||
color: #303133;
|
color: #0f172a;
|
||||||
margin-bottom: 4px;
|
line-height: 1.2;
|
||||||
}
|
}
|
||||||
|
|
||||||
.stat-label {
|
.stat-label {
|
||||||
font-size: 14px;
|
font-size: 13px;
|
||||||
color: #64748B;
|
color: #94a3b8;
|
||||||
margin-bottom: 8px;
|
margin-top: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.stat-trend {
|
.stat-trend {
|
||||||
|
margin-top: 6px;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
|
|
||||||
.trend-up {
|
.trend-up {
|
||||||
color: #10B981;
|
color: #10B981;
|
||||||
margin-right: 4px;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
|
|
||||||
.trend-down {
|
.trend-down {
|
||||||
color: #EF4444;
|
color: #EF4444;
|
||||||
margin-right: 4px;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
|
|
||||||
.trend-label {
|
.trend-label {
|
||||||
color: #c0c4cc;
|
color: #cbd5e1;
|
||||||
}
|
margin-left: 4px;
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 快捷功能区域 */
|
/* ===== 快捷功能 ===== */
|
||||||
.quick-access-section {
|
.quick-access-section {
|
||||||
background: white;
|
background: #fff;
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
padding: 24px;
|
padding: 24px;
|
||||||
margin-bottom: 20px;
|
margin-bottom: 24px;
|
||||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
|
border: 1px solid #f1f5f9;
|
||||||
|
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.03);
|
||||||
|
}
|
||||||
|
|
||||||
.section-header {
|
.section-header {
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -1261,140 +1315,138 @@ onUnmounted(() => {
|
|||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
|
|
||||||
h3 {
|
h3 {
|
||||||
font-size: 18px;
|
font-size: 17px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: #303133;
|
color: #0f172a;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.divider {
|
|
||||||
color: #d8d8d8;
|
|
||||||
margin: 0 8px;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.quick-access-grid {
|
.quick-access-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
|
grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
|
||||||
gap: 16px;
|
gap: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
.quick-access-card {
|
.quick-access-card {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 24px 16px;
|
padding: 20px 12px;
|
||||||
border-radius: 8px;
|
border-radius: 10px;
|
||||||
background: #f5f7fa;
|
background: #f8fafc;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
transition: all 0.3s ease;
|
transition: all 0.3s ease;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background: #ecf5ff;
|
background: #fff;
|
||||||
transform: translateY(-4px);
|
border-color: #e2e8f0;
|
||||||
|
transform: translateY(-3px);
|
||||||
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);
|
||||||
|
|
||||||
.quick-label {
|
.quick-label { color: #3B82F6; }
|
||||||
color: #3B82F6;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.quick-icon {
|
.quick-icon {
|
||||||
margin-bottom: 12px;
|
margin-bottom: 10px;
|
||||||
|
width: 48px;
|
||||||
|
height: 48px;
|
||||||
|
border-radius: 10px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
background: #fff;
|
||||||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
|
||||||
}
|
}
|
||||||
|
|
||||||
.quick-label {
|
.quick-label {
|
||||||
font-size: 14px;
|
font-size: 13px;
|
||||||
color: #606266;
|
color: #475569;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
font-weight: 500;
|
||||||
transition: color 0.3s;
|
transition: color 0.3s;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
/* ===== 底部双栏 ===== */
|
||||||
|
.bottom-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr 1fr;
|
||||||
|
gap: 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 待办事项区域 */
|
.todo-section,
|
||||||
.todo-section {
|
.schedule-section {
|
||||||
background: white;
|
background: #fff;
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
padding: 24px;
|
padding: 24px;
|
||||||
margin-bottom: 20px;
|
border: 1px solid #f1f5f9;
|
||||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
|
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.03);
|
||||||
|
|
||||||
.section-header {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
|
|
||||||
h3 {
|
|
||||||
font-size: 18px;
|
|
||||||
font-weight: 600;
|
|
||||||
color: #303133;
|
|
||||||
margin: 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.divider {
|
/* ===== 待办事项 ===== */
|
||||||
color: #d8d8d8;
|
.todo-list .todo-item {
|
||||||
margin: 0 8px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.todo-list {
|
|
||||||
.todo-item {
|
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 16px;
|
padding: 14px 16px;
|
||||||
border-radius: 8px;
|
border-radius: 10px;
|
||||||
margin-bottom: 12px;
|
margin-bottom: 10px;
|
||||||
background: #f5f7fa;
|
background: #f8fafc;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
transition: all 0.3s ease;
|
transition: all 0.25s ease;
|
||||||
border-left: 3px solid transparent;
|
border-left: 3px solid transparent;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background: #ecf5ff;
|
background: #fff;
|
||||||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
|
||||||
}
|
}
|
||||||
|
|
||||||
&.priority-high {
|
&.priority-high { border-left-color: #EF4444; }
|
||||||
border-left-color: #EF4444;
|
&.priority-medium { border-left-color: #F59E0B; }
|
||||||
}
|
&.priority-low { border-left-color: #10B981; }
|
||||||
|
|
||||||
&.priority-medium {
|
&:last-child { margin-bottom: 0; }
|
||||||
border-left-color: #F59E0B;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.priority-low {
|
|
||||||
border-left-color: #10B981;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.todo-icon {
|
.todo-icon {
|
||||||
margin-right: 12px;
|
margin-right: 12px;
|
||||||
color: #64748B;
|
color: #94a3b8;
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
border-radius: 8px;
|
||||||
|
background: #fff;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.todo-content {
|
.todo-content {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
min-width: 0;
|
||||||
|
|
||||||
.todo-title {
|
.todo-title {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
color: #303133;
|
color: #0f172a;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
margin-bottom: 4px;
|
margin-bottom: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.todo-desc {
|
.todo-desc {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
color: #64748B;
|
color: #94a3b8;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.todo-time {
|
.todo-time {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
color: #c0c4cc;
|
color: #cbd5e1;
|
||||||
|
flex-shrink: 0;
|
||||||
|
margin-left: 12px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1402,58 +1454,53 @@ onUnmounted(() => {
|
|||||||
padding: 20px 0;
|
padding: 20px 0;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 日程区域 */
|
/* ===== 日程 ===== */
|
||||||
.schedule-section {
|
.schedule-list .schedule-item {
|
||||||
background: white;
|
|
||||||
border-radius: 12px;
|
|
||||||
padding: 24px;
|
|
||||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
|
|
||||||
|
|
||||||
.section-header {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
|
|
||||||
h3 {
|
|
||||||
font-size: 18px;
|
|
||||||
font-weight: 600;
|
|
||||||
color: #303133;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.divider {
|
|
||||||
color: #d8d8d8;
|
|
||||||
margin: 0 8px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.schedule-list {
|
|
||||||
.schedule-item {
|
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 16px;
|
padding: 14px 16px;
|
||||||
border-radius: 8px;
|
border-radius: 10px;
|
||||||
margin-bottom: 12px;
|
margin-bottom: 10px;
|
||||||
background: #f5f7fa;
|
background: #f8fafc;
|
||||||
transition: all 0.3s ease;
|
transition: all 0.25s ease;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background: #ecf5ff;
|
background: #fff;
|
||||||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
|
||||||
}
|
}
|
||||||
|
|
||||||
&:last-child {
|
&:last-child { margin-bottom: 0; }
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.schedule-time {
|
.schedule-time {
|
||||||
width: 80px;
|
width: 72px;
|
||||||
font-size: 18px;
|
font-size: 16px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: #3B82F6;
|
color: #3B82F6;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.schedule-content {
|
||||||
|
flex: 1;
|
||||||
|
margin: 0 16px;
|
||||||
|
min-width: 0;
|
||||||
|
|
||||||
|
.schedule-title {
|
||||||
|
font-size: 14px;
|
||||||
|
color: #0f172a;
|
||||||
|
font-weight: 500;
|
||||||
|
margin-bottom: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.schedule-location {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #94a3b8;
|
||||||
|
|
||||||
|
.el-icon { margin-right: 4px; }
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.empty-schedule {
|
.empty-schedule {
|
||||||
@@ -1461,83 +1508,35 @@ onUnmounted(() => {
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 40px 20px;
|
padding: 40px 20px;
|
||||||
min-height: 200px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.schedule-content {
|
/* ===== 响应式 ===== */
|
||||||
flex: 1;
|
|
||||||
margin: 0 16px;
|
|
||||||
|
|
||||||
.schedule-title {
|
|
||||||
font-size: 14px;
|
|
||||||
color: #303133;
|
|
||||||
font-weight: 500;
|
|
||||||
margin-bottom: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.schedule-location {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
font-size: 12px;
|
|
||||||
color: #64748B;
|
|
||||||
|
|
||||||
.el-icon {
|
|
||||||
margin-right: 4px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 响应式设计 */
|
|
||||||
@media (max-width: 1200px) {
|
@media (max-width: 1200px) {
|
||||||
.stats-grid {
|
.stats-grid { grid-template-columns: repeat(2, 1fr); }
|
||||||
grid-template-columns: repeat(2, 1fr);
|
.quick-access-grid { grid-template-columns: repeat(4, 1fr); }
|
||||||
}
|
|
||||||
|
|
||||||
.quick-access-grid {
|
|
||||||
grid-template-columns: repeat(4, 1fr);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
.home-container {
|
.home-container { padding: 12px; }
|
||||||
padding: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.welcome-section {
|
.welcome-section {
|
||||||
padding: 20px;
|
padding: 24px 20px;
|
||||||
|
|
||||||
.welcome-content {
|
.welcome-content {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
gap: 16px;
|
gap: 12px;
|
||||||
|
|
||||||
.greeting {
|
.greeting h1 { font-size: 20px; }
|
||||||
h1 {
|
|
||||||
font-size: 22px;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.stats-grid {
|
.stats-grid { grid-template-columns: 1fr; }
|
||||||
grid-template-columns: 1fr;
|
.quick-access-grid { grid-template-columns: repeat(3, 1fr); }
|
||||||
}
|
.bottom-grid { grid-template-columns: 1fr; }
|
||||||
|
|
||||||
.quick-access-grid {
|
|
||||||
grid-template-columns: repeat(3, 1fr);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 480px) {
|
@media (max-width: 480px) {
|
||||||
.quick-access-grid {
|
.quick-access-grid { grid-template-columns: repeat(2, 1fr); }
|
||||||
grid-template-columns: repeat(2, 1fr);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
@@ -75,23 +75,23 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-table
|
<vxe-table
|
||||||
v-if="refreshTable"
|
v-if="refreshTable"
|
||||||
ref="tableRef"
|
ref="tableRef"
|
||||||
v-loading="loading"
|
v-loading="loading"
|
||||||
:data="definitionList1"
|
:data="definitionList1"
|
||||||
tooltip-effect="dark"
|
show-overflow
|
||||||
:show-overflow-tooltip="true"
|
:edit-config="{trigger: 'click', mode: 'cell' }"
|
||||||
style="width: 100% !important"
|
style="width: 100% !important"
|
||||||
@selection-change="handleSelectionChange"
|
@selection-change="handleSelectionChange"
|
||||||
>
|
>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
type="selection"
|
type="checkbox"
|
||||||
width="40"
|
width="40"
|
||||||
align="center"
|
align="center"
|
||||||
fixed="left"
|
fixed="left"
|
||||||
/>
|
/>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
label="名称"
|
label="名称"
|
||||||
prop="name"
|
prop="name"
|
||||||
align="center"
|
align="center"
|
||||||
@@ -117,8 +117,8 @@
|
|||||||
</template>
|
</template>
|
||||||
</PopoverList>
|
</PopoverList>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</vxe-column>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
label="编码"
|
label="编码"
|
||||||
prop="busNo"
|
prop="busNo"
|
||||||
align="center"
|
align="center"
|
||||||
@@ -126,9 +126,9 @@
|
|||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ scope.row.busNo ? scope.row.busNo : '-' }}
|
{{ scope.row.busNo ? scope.row.busNo : '-' }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</vxe-column>
|
||||||
|
|
||||||
<el-table-column
|
<vxe-column
|
||||||
label="规格"
|
label="规格"
|
||||||
prop="volume"
|
prop="volume"
|
||||||
align="center"
|
align="center"
|
||||||
@@ -136,8 +136,8 @@
|
|||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ scope.row.volume ? scope.row.volume : '-' }}
|
{{ scope.row.volume ? scope.row.volume : '-' }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</vxe-column>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
label="当前进货价"
|
label="当前进货价"
|
||||||
prop="originBuyingPrice"
|
prop="originBuyingPrice"
|
||||||
align="center"
|
align="center"
|
||||||
@@ -145,10 +145,11 @@
|
|||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ scope.row.originBuyingPrice ? scope.row.originBuyingPrice : '-' }}
|
{{ scope.row.originBuyingPrice ? scope.row.originBuyingPrice : '-' }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</vxe-column>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
label="调后进货价"
|
label="调后进货价"
|
||||||
prop="newBuyingPrice"
|
prop="newBuyingPrice"
|
||||||
|
:edit-render="{}"
|
||||||
align="center"
|
align="center"
|
||||||
>
|
>
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
@@ -158,8 +159,8 @@
|
|||||||
step="0.01"
|
step="0.01"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</vxe-column>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
label="当前零售价"
|
label="当前零售价"
|
||||||
prop="originRetailPrice"
|
prop="originRetailPrice"
|
||||||
align="center"
|
align="center"
|
||||||
@@ -167,10 +168,11 @@
|
|||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ scope.row.originRetailPrice ? scope.row.originRetailPrice : '-' }}
|
{{ scope.row.originRetailPrice ? scope.row.originRetailPrice : '-' }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</vxe-column>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
label="调后零售价"
|
label="调后零售价"
|
||||||
prop="newRetailPrice"
|
prop="newRetailPrice"
|
||||||
|
:edit-render="{}"
|
||||||
align="center"
|
align="center"
|
||||||
>
|
>
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
@@ -180,10 +182,11 @@
|
|||||||
step="0.01"
|
step="0.01"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</vxe-column>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
label="调价理由"
|
label="调价理由"
|
||||||
prop="reason"
|
prop="reason"
|
||||||
|
:edit-render="{}"
|
||||||
align="center"
|
align="center"
|
||||||
>
|
>
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
@@ -195,8 +198,8 @@
|
|||||||
autosize
|
autosize
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</vxe-column>
|
||||||
</el-table>
|
</vxe-table>
|
||||||
<pagination
|
<pagination
|
||||||
v-show="total > 0"
|
v-show="total > 0"
|
||||||
v-model:page="queryParams.pageNo"
|
v-model:page="queryParams.pageNo"
|
||||||
@@ -268,23 +271,23 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-table
|
<vxe-table
|
||||||
v-if="refreshTable"
|
v-if="refreshTable"
|
||||||
ref="tableRef"
|
ref="tableRef"
|
||||||
v-loading="loading"
|
v-loading="loading"
|
||||||
:data="definitionList2"
|
:data="definitionList2"
|
||||||
tooltip-effect="dark"
|
show-overflow
|
||||||
:show-overflow-tooltip="true"
|
:edit-config="{trigger: 'click', mode: 'cell' }"
|
||||||
style="width: 100% !important"
|
style="width: 100% !important"
|
||||||
@selection-change="handleSelectionChange"
|
@selection-change="handleSelectionChange"
|
||||||
>
|
>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
type="selection"
|
type="checkbox"
|
||||||
width="40"
|
width="40"
|
||||||
align="center"
|
align="center"
|
||||||
fixed="left"
|
fixed="left"
|
||||||
/>
|
/>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
label="名称"
|
label="名称"
|
||||||
prop="name"
|
prop="name"
|
||||||
align="center"
|
align="center"
|
||||||
@@ -310,8 +313,8 @@
|
|||||||
</template>
|
</template>
|
||||||
</PopoverList>
|
</PopoverList>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</vxe-column>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
label="编码"
|
label="编码"
|
||||||
prop="busNo"
|
prop="busNo"
|
||||||
align="center"
|
align="center"
|
||||||
@@ -319,8 +322,8 @@
|
|||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ scope.row.busNo ? scope.row.busNo : '-' }}
|
{{ scope.row.busNo ? scope.row.busNo : '-' }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</vxe-column>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
label="规格"
|
label="规格"
|
||||||
prop="volume"
|
prop="volume"
|
||||||
align="center"
|
align="center"
|
||||||
@@ -328,8 +331,8 @@
|
|||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ scope.row.volume ? scope.row.volume : '-' }}
|
{{ scope.row.volume ? scope.row.volume : '-' }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</vxe-column>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
label="当前进货价"
|
label="当前进货价"
|
||||||
prop="originBuyingPrice"
|
prop="originBuyingPrice"
|
||||||
align="center"
|
align="center"
|
||||||
@@ -337,10 +340,11 @@
|
|||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ scope.row.originBuyingPrice ? scope.row.originBuyingPrice : '-' }}
|
{{ scope.row.originBuyingPrice ? scope.row.originBuyingPrice : '-' }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</vxe-column>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
label="调后进货价"
|
label="调后进货价"
|
||||||
prop="newBuyingPrice"
|
prop="newBuyingPrice"
|
||||||
|
:edit-render="{}"
|
||||||
align="center"
|
align="center"
|
||||||
>
|
>
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
@@ -350,8 +354,8 @@
|
|||||||
step="0.01"
|
step="0.01"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</vxe-column>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
label="当前零售价"
|
label="当前零售价"
|
||||||
prop="originRetailPrice"
|
prop="originRetailPrice"
|
||||||
align="center"
|
align="center"
|
||||||
@@ -359,10 +363,11 @@
|
|||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ scope.row.originRetailPrice ? scope.row.originRetailPrice : '-' }}
|
{{ scope.row.originRetailPrice ? scope.row.originRetailPrice : '-' }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</vxe-column>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
label="调后零售价"
|
label="调后零售价"
|
||||||
prop="newRetailPrice"
|
prop="newRetailPrice"
|
||||||
|
:edit-render="{}"
|
||||||
align="center"
|
align="center"
|
||||||
>
|
>
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
@@ -372,10 +377,11 @@
|
|||||||
step="0.01"
|
step="0.01"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</vxe-column>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
label="调价理由"
|
label="调价理由"
|
||||||
prop="reason"
|
prop="reason"
|
||||||
|
:edit-render="{}"
|
||||||
align="center"
|
align="center"
|
||||||
>
|
>
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
@@ -387,8 +393,8 @@
|
|||||||
autosize
|
autosize
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</vxe-column>
|
||||||
</el-table>
|
</vxe-table>
|
||||||
<pagination
|
<pagination
|
||||||
v-show="total > 0"
|
v-show="total > 0"
|
||||||
v-model:page="queryParams.pageNo"
|
v-model:page="queryParams.pageNo"
|
||||||
@@ -460,23 +466,23 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-table
|
<vxe-table
|
||||||
v-if="refreshTable"
|
v-if="refreshTable"
|
||||||
ref="tableRef"
|
ref="tableRef"
|
||||||
v-loading="loading"
|
v-loading="loading"
|
||||||
:data="definitionList3"
|
:data="definitionList3"
|
||||||
tooltip-effect="dark"
|
show-overflow
|
||||||
:show-overflow-tooltip="true"
|
:edit-config="{trigger: 'click', mode: 'cell' }"
|
||||||
style="width: 100% !important"
|
style="width: 100% !important"
|
||||||
@selection-change="handleSelectionChange"
|
@selection-change="handleSelectionChange"
|
||||||
>
|
>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
type="selection"
|
type="checkbox"
|
||||||
width="40"
|
width="40"
|
||||||
align="center"
|
align="center"
|
||||||
fixed="left"
|
fixed="left"
|
||||||
/>
|
/>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
label="名称"
|
label="名称"
|
||||||
prop="name"
|
prop="name"
|
||||||
align="center"
|
align="center"
|
||||||
@@ -502,8 +508,8 @@
|
|||||||
</template>
|
</template>
|
||||||
</PopoverList>
|
</PopoverList>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</vxe-column>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
label="编码"
|
label="编码"
|
||||||
prop="busNo"
|
prop="busNo"
|
||||||
align="center"
|
align="center"
|
||||||
@@ -511,9 +517,9 @@
|
|||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ scope.row.busNo ? scope.row.busNo : '-' }}
|
{{ scope.row.busNo ? scope.row.busNo : '-' }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</vxe-column>
|
||||||
|
|
||||||
<el-table-column
|
<vxe-column
|
||||||
label="当前零售价"
|
label="当前零售价"
|
||||||
prop="originRetailPrice"
|
prop="originRetailPrice"
|
||||||
align="center"
|
align="center"
|
||||||
@@ -521,10 +527,11 @@
|
|||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ scope.row.originRetailPrice ? scope.row.originRetailPrice : '-' }}
|
{{ scope.row.originRetailPrice ? scope.row.originRetailPrice : '-' }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</vxe-column>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
label="调后零售价"
|
label="调后零售价"
|
||||||
prop="newRetailPrice"
|
prop="newRetailPrice"
|
||||||
|
:edit-render="{}"
|
||||||
align="center"
|
align="center"
|
||||||
>
|
>
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
@@ -534,10 +541,11 @@
|
|||||||
step="0.01"
|
step="0.01"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</vxe-column>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
label="调价理由"
|
label="调价理由"
|
||||||
prop="reason"
|
prop="reason"
|
||||||
|
:edit-render="{}"
|
||||||
align="center"
|
align="center"
|
||||||
>
|
>
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
@@ -549,8 +557,8 @@
|
|||||||
autosize
|
autosize
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</vxe-column>
|
||||||
</el-table>
|
</vxe-table>
|
||||||
<pagination
|
<pagination
|
||||||
v-show="total > 0"
|
v-show="total > 0"
|
||||||
v-model:page="queryParams.pageNo"
|
v-model:page="queryParams.pageNo"
|
||||||
@@ -652,22 +660,22 @@
|
|||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<el-table
|
<vxe-table
|
||||||
v-if="refreshTable"
|
v-if="refreshTable"
|
||||||
ref="tableRef"
|
ref="tableRef"
|
||||||
v-loading="loading"
|
v-loading="loading"
|
||||||
:data="definitionList4"
|
:data="definitionList4"
|
||||||
tooltip-effect="dark"
|
show-overflow
|
||||||
:show-overflow-tooltip="true"
|
:edit-config="{trigger: 'click', mode: 'cell' }"
|
||||||
@selection-change="handleSelectionChange"
|
@selection-change="handleSelectionChange"
|
||||||
>
|
>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
type="selection"
|
type="checkbox"
|
||||||
width="40"
|
width="40"
|
||||||
align="center"
|
align="center"
|
||||||
fixed="left"
|
fixed="left"
|
||||||
/>
|
/>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
label="名称"
|
label="名称"
|
||||||
prop="orgName"
|
prop="orgName"
|
||||||
align="center"
|
align="center"
|
||||||
@@ -677,8 +685,8 @@
|
|||||||
{{ scope.row.orgName ? scope.row.orgName : '-' }}
|
{{ scope.row.orgName ? scope.row.orgName : '-' }}
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</vxe-column>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
label="类型"
|
label="类型"
|
||||||
min-width="120"
|
min-width="120"
|
||||||
align="center"
|
align="center"
|
||||||
@@ -701,8 +709,8 @@
|
|||||||
</el-select>
|
</el-select>
|
||||||
<span v-else>{{ scope.row.name }}</span>
|
<span v-else>{{ scope.row.name }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</vxe-column>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
label="当前零售价"
|
label="当前零售价"
|
||||||
prop="originRetailPrice"
|
prop="originRetailPrice"
|
||||||
align="center"
|
align="center"
|
||||||
@@ -710,10 +718,11 @@
|
|||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ scope.row.originRetailPrice ? scope.row.originRetailPrice : '-' }}
|
{{ scope.row.originRetailPrice ? scope.row.originRetailPrice : '-' }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</vxe-column>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
label="调后零售价"
|
label="调后零售价"
|
||||||
prop="newRetailPrice"
|
prop="newRetailPrice"
|
||||||
|
:edit-render="{}"
|
||||||
align="center"
|
align="center"
|
||||||
>
|
>
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
@@ -723,10 +732,11 @@
|
|||||||
step="0.01"
|
step="0.01"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</vxe-column>
|
||||||
<el-table-column
|
<vxe-column
|
||||||
label="调价理由"
|
label="调价理由"
|
||||||
prop="reason"
|
prop="reason"
|
||||||
|
:edit-render="{}"
|
||||||
align="center"
|
align="center"
|
||||||
>
|
>
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
@@ -738,8 +748,8 @@
|
|||||||
autosize
|
autosize
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</vxe-column>
|
||||||
</el-table>
|
</vxe-table>
|
||||||
<pagination
|
<pagination
|
||||||
v-show="total > 0"
|
v-show="total > 0"
|
||||||
v-model:page="queryParams.pageNo"
|
v-model:page="queryParams.pageNo"
|
||||||
|
|||||||
Reference in New Issue
Block a user