Merge remote-tracking branch 'origin/develop' into develop

This commit is contained in:
wangjian963
2026-06-02 16:03:09 +08:00
7 changed files with 797 additions and 560 deletions

View File

@@ -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;
} }

View File

@@ -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();
}
/** /**
* 计算相对前日的百分比变化 * 计算相对前日的百分比变化
* *

View File

@@ -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

View File

@@ -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",

View File

@@ -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

View File

@@ -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>

View File

@@ -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"