<template>
<div class="dailyAddBox">
<titlepage v-if="pathStr !== '/'" :title="pathName" :query="query" />
<!-- 统计框 -->
<div class="stat-box unchecked-box"
:style="{ left: uncheckedBoxPosition.x + 'px', top: uncheckedBoxPosition.y + 'px' }"
@mousedown="startDrag($event, 'unchecked')"
@touchstart="startDrag($event, 'unchecked')">
<div class="stat-content">
<div class="stat-number">{{ uncheckedCount }}</div>
<div class="stat-label">未检查</div>
</div>
</div>
<div class="stat-box problem-box"
:style="{ left: problemBoxPosition.x + 'px', top: problemBoxPosition.y + 'px' }"
@mousedown="startDrag($event, 'problem')"
@touchstart="startDrag($event, 'problem')">
<div class="stat-content">
<div class="stat-number">{{ problemCount }}</div>
<div class="stat-label">有问题</div>
</div>
</div>
<div class="contentBox">
<div class="selectBox">
<p class="title">同行检查人</p>
<a-select
:filter-option="filterOption" @change="pairingCheckNameChange" allowClear placeholder="请选择同行检查人" showSearch style="flex:1" size="small" v-model="pairingCheckNameId" >
<a-select-option :disabled="checkPer==item.realname" :key="item.id" v-for="item in userList" :value="item.id">
{{item.realname}}
</a-select-option>
</a-select>
</div>
<div class="messageBox">
<p class="titleName">检查时间</p>
<p class="titleCon">{{ nowTime }}</p>
<p class="titleName">项目名称</p>
<p class="titleCon">{{ xmmc ? xmmc : "--" }}</p>
<p class="titleName">项目地址</p>
<p class="titleCon">{{ xmdz ? xmdz : "--" }}</p>
</div>
<div class="tableBox">
<a-collapse accordion class="firstCollapse">
<a-collapse-panel v-for="(item, i) in fristdata" :key="i">
<template #header>
<van-badge style="display: flex; align-items: center; width: 100%;">
<template #content v-if="item.questionStr">
{{ getBadge(item) }}
</template>
<div style="width: 25%">一级指标</div>
<div style="width: 50%">{{ item.name }}</div>
<div class="level1-counts">
<div class="count-item unchecked-count">
未检({{ getLevel1UncheckedCount(item) }})
</div>
<div class="count-item problem-count">
问题({{ getLevel1ProblemCount(item) }})
</div>
</div>
</van-badge>
</template>
<a-collapse accordion class="secondCollapse" v-if="item.children != []">
<a-collapse-panel v-for="(item1, i1) in item.children" :key="i1">
<template #header>
<van-badge style="display: flex">
<template #content v-if="item1.questionStr">
{{ getBadge(item1) }}
</template>
<div style="width: 30%">二级指标</div>
<div style="width: 65%">{{ item1.name }}</div>
</van-badge>
</template>
<div class="threeDatas">
<div v-if="item1.children != []" v-for="(item,idx) in item1.children" :key="idx" >
<!-- <h4 >{{ item.name }}</h4> -->
<div style="display: flex; align-items: center; margin-bottom: 8px;">
<a-checkbox v-model="item.checked" @change="(e) => onCheckboxChange(e, item1.children, idx,item1)" style="margin-right: 8px;"></a-checkbox>
<span :class="getIndicatorClass(item)" @click="toggleExpanded(item, item1.children, idx)" style="cursor: pointer; padding: 4px 8px; border-radius: 4px; transition: all 0.2s ease;" @mouseenter="$event.target.style.backgroundColor='rgba(0,0,0,0.05)'" @mouseleave="$event.target.style.backgroundColor=''">{{ item.name }}</span>
</div>
<!-- 使用手风琴效果,只能同时显示一个三级指标的详细内容 -->
<div class="hasProblem" v-if="item.isExpanded">
<p class="title">检查内容</p>
<p class="text" style="text-align: justify;">{{ item.inspectionContents ? item.inspectionContents.replaceAll("\n","") : ""}}</p>
</div>
<div class="radioBox" v-if="item.isExpanded">
<van-radio-group v-model="item.radio" @change="onRadioChange">
<van-radio name="3">无问题</van-radio>
<van-radio name="0">有问题</van-radio>
</van-radio-group>
</div>
<div class="hasProblem" v-if="item.isExpanded">
<p class="title">详细描述</p>
<p class="text">
<a-input type="textarea" v-model="item['problemDescription']" :maxLength="100"
placeholder="请输入问题描述"
rows="3" />
</p>
<p class="title">问题附件</p>
<p class="text">
<a-upload accept=".jpg,.png,.jpeg,.heic,.raw,.heif" :multiple="true" :headers="headers"
:action="action"
:file-list="item['problemAttachment']"
@change="(info) => fileChange(info, item)"
:beforeUpload="(fi, fil) => beforeUpload(fi, fil, item)">
<a-button>
<a-icon type="upload" />
上传附件
</a-button>
</a-upload>
</p>
<p class="title">整改期限</p>
<p class="text">
<a-date-picker v-model="item['zgqx']" style="width: 100%"
@change="dateChange($event, item)" />
</p>
</div>
</div>
</div>
</a-collapse-panel>
</a-collapse>
<a-table v-else :pagination="false" :columns="columns" :data-source="item">
<div slot="action" slot-scope="text, record">
<a-radio-group v-model="record.ruleId">
<a-radio :style="radioStyle" :value="radioItem.id" v-for="(radioItem, ri) in record.ruleList"
:key="ri">{{
radioItem.name }}
</a-radio>
</a-radio-group>
</div>
</a-table>
</a-collapse-panel>
</a-collapse>
</div>
</div>
<div class="bottonBox">
<span class="botText">检查人:{{ checkPer }} </span>
<van-button size="large" type="info" @click="daliyAddFn">提交2</van-button>
</div>
</div>
</template>
<script>
import moment from 'moment';
import { daliyAdd, getAllItem, getDailyManageList,pairingChexkUserList } from '@/api/dailyManager';
import {
getProject2Metrics,
} from "@/api/assessment";
export default {
data() {
return {
xmmc: "",
xmdz: "",
fristdata: [],
pairingCheckNameId:undefined,
pairingCheckName:undefined,
pairingCheckUsername:undefined,
userList:[],
checkPer: localStorage.getItem('realname'),
getAllItemData: [],
headers: {
'X-Access-Token': localStorage.getItem('token')
},
action: '/hdygwy/sys/common/upload',
pathStr: this.$route.path,
pathName: this.$route.meta.title ? this.$route.meta.title : '',
query: {},
nowTime: moment(new Date()).format('YYYY年MM月DD日 HH:mm:ss'),
// 统计框位置
uncheckedBoxPosition: { x: 0, y: 10 },
problemBoxPosition: { x: 0, y: 10 },
// 统计数据
uncheckedCount: 0,
problemCount: 0,
// 是否正在拖拽
isDragging: false,
// 拖拽开始时的鼠标/触摸位置
startX: 0,
startY: 0,
// 拖拽元素的当前位置
currentX: 0,
currentY: 0,
// 拖拽元素的初始位置
initialX: 0,
initialY: 0,
// 拖拽元素的ID
draggedElementId: null,
// 拖拽元素的类型 (unchecked 或 problem)
draggedElementType: null,
};
},
mounted() {
this.getAllItemFn();
this.getUserList();
this.initDragEvents();
this.initStatisticsBoxes();
// 监听窗口大小变化,重新调整统计框位置
window.addEventListener('resize', this.initStatisticsBoxes);
},
beforeDestroy() {
// 清理事件监听器
document.removeEventListener('mousemove', this.onDrag);
document.removeEventListener('mouseup', this.onDragEnd);
document.removeEventListener('touchmove', this.onDrag);
document.removeEventListener('touchend', this.onDragEnd);
// 清理窗口大小监听器
window.removeEventListener('resize', this.initStatisticsBoxes);
},
methods: {
filterOption(input, option) {
return (
option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
);
},
pairingCheckNameChange(id){
let data=this.userList.find(tar=>tar.id==id)
this.pairingCheckUsername=data.username
this.pairingCheckName=data.realname
},
getUserList(){
this.userList = [];
pairingChexkUserList().then(res=>{
this.userList=res.result
})
},
getAllItemFn() {
// this.getAllItemData = [];
// getDailyManageList().then((res) => {
// if (res.success) {
// const { result } = res;
// result.forEach((item) => {
// console.log(item);
// const { wylyfl, childrenList } = item;
// childrenList.forEach((child) => {
// this.getAllItemData.push({
// ...child,
// wylyfl,
// checked: false,
// radio: '0',
// zgqx: child.zgqxDate ?? '',
// problemAttachment: [],
// problemDescription: ''
// });
// });
// });
// }
// });
const params = {
projectId: this.$route.query.projectId,
};
this.fristdata = [];
getProject2Metrics(params).then((res) => {
if (res.success) {
// this.spinning = false;
const {
//
result: { list, projectInfo },
} = res;
this.xmmc = projectInfo ? projectInfo.xmmc : "--";
this.xmdz = projectInfo ? projectInfo.xmdz : "--";
// 为每个三级指标添加 isExpanded 属性
list.forEach(level1 => {
if (level1.children && level1.children.length > 0) {
level1.children.forEach(level2 => {
if (level2.children && level2.children.length > 0) {
level2.children.forEach(level3 => {
// 初始化时设置默认值
if (level3.checked === undefined) {
level3.checked = false;
}
// 不设置默认的单选框状态,让用户自己选择
if (level3.radio === undefined) {
level3.radio = '';
}
if (level3.problemDescription === undefined) {
level3.problemDescription = '';
}
if (level3.problemAttachment === undefined) {
level3.problemAttachment = [];
}
if (level3.zgqx === undefined) {
level3.zgqx = '';
}
// 添加展开状态属性
level3.isExpanded = false;
});
}
});
}
});
this.fristdata = [...list];
this.$nextTick(() => {
this.getStatistics();
});
}
});
},
// daliyAddFn() {
// const params = [];
// this.getAllItemData.forEach((item) => {
// if (item.checked) {
// params.push({
// defaultOption: item.jgsx,
// jcnr_xxms: item.xxms,
// performanceId: item.id,
// problemAttachment: item.problemAttachment.map((i) => i.response.message).join(','),
// problemDescription: item.problemDescription,
// processState: 0,
// projectId: this.$route.query.projectId,
// radio: item.radio,
// zgqx: item.zgqx,
// pairingCheckUsername:this.pairingCheckUsername,
// pairingCheckName:this.pairingCheckName
// });
// const _performanceId = params.at(-1).performanceId;
// params.map(item => item.performanceId = _performanceId);
// }
// });
// daliyAdd(params).then((res) => {
// if (res.success) {
// this.$message.success(res.message);
// // this.$router.back();
// this.$router.push({
// path: '/dailyManagerCheck',
// query: { projectId: this.$route.query.projectId }
// });
// }
// });
// },
daliyAddFn() {
const unchecked = this.uncheckedCount;
const problem = this.problemCount;
if (unchecked === 0 && problem === 0) {
this.handleSubmit();
} else {
const messageHTML = `
未检查指标 <span style="color: red;">${unchecked}</span> 条<br>
有问题指标 <span style="color: red;">${problem}</span> 条<br><br>
注:提交后可在【检查记录】中修改
`;
this.$dialog.confirm({
title: '检查未完成',
message: messageHTML,
messageAlign: 'left',
confirmButtonText: '提交',
cancelButtonText: '取消',
confirmButtonColor: '#1989fa', // 蓝色
cancelButtonColor: '#ccc', // 白色
style: {
'--van-dialog-confirm-button-height': '25px',
'--van-dialog-cancel-button-height': '25px',
'--van-dialog-confirm-button-width': '50px',
'--van-dialog-cancel-button-width': '50px',
'--van-dialog-padding': '20px',
'--van-dialog-font-size': '14px',
},
dangerouslyUseHTMLString: true,
}).then(() => {
this.handleSubmit();
}).catch(() => {
console.log('用户取消提交');
});
}
},
handleSubmit() {
const params = [];
this.getAllItemData.forEach((item) => {
if (item.checked) {
params.push({
defaultOption: item.jgsx,
jcnr_xxms: item.xxms,
performanceId: item.id,
problemAttachment: item.problemAttachment.map((i) => i.response.message).join(','),
problemDescription: item.problemDescription,
processState: 0,
projectId: this.$route.query.projectId,
radio: item.radio,
zgqx: item.zgqx,
pairingCheckUsername: this.pairingCheckUsername,
pairingCheckName: this.pairingCheckName
});
const _performanceId = params.at(-1).performanceId;
params.map(item => item.performanceId = _performanceId);
}
});
daliyAdd(params).then((res) => {
if (res.success) {
this.$message.success(res.message);
this.$router.push({
path: '/dailyManagerCheck',
query: { projectId: this.$route.query.projectId }
});
}
});
},
fileChange(info, item) {
// 直接更新当前指标的文件列表
item.problemAttachment = info.fileList;
},
beforeUpload(fi, fil, item) {
if (fil.length > 9) {
if (fi == fil.at(-1)) {
this.$message.warning('最多可上传9个文件');
}
return Promise.reject();
} else {
if (item.problemAttachment.length + fil.length > 9) {
if (fi == fil.at(-1)) {
this.$message.warning('最多可上传9个文件');
}
return Promise.reject();
}
return true;
}
},
dateChange(e, item) {
// 日期变化事件,item 是当前的三级指标对象
// 日期值会自动绑定到 item.zgqx,这里不需要额外处理
},
// 获取统计数据
getStatistics() {
this.uncheckedCount = 0;
this.problemCount = 0;
// 遍历所有三级指标计算统计
this.fristdata.forEach(level1 => {
if (level1.children && level1.children.length > 0) {
level1.children.forEach(level2 => {
if (level2.children && level2.children.length > 0) {
level2.children.forEach(level3 => {
// 重新定义统计逻辑:
// 1. 未处理:checked = false 或者 (checked = true 但 radio 没有值)
// 2. 已处理且有问题的:checked = true 且 radio = '0'
// 3. 已处理且无问题的:checked = true 且 radio = '3'
if (!level3.checked || (level3.checked && (level3.radio === undefined || level3.radio === ''))) {
// 未处理的指标(包括未选中和已选中但未选择单选框的)
this.uncheckedCount++;
} else if (level3.checked && level3.radio === '0') {
// 已选中且有问题的指标
this.problemCount++;
}
// 已选中且无问题的指标不计入任何统计
});
}
});
}
});
console.log('统计更新:', {
uncheckedCount: this.uncheckedCount,
problemCount: this.problemCount,
totalChecked: this.fristdata.reduce((total, level1) => {
if (level1.children && level1.children.length > 0) {
return total + level1.children.reduce((level2Total, level2) => {
if (level2.children && level2.children.length > 0) {
return level2Total + level2.children.filter(level3 => level3.checked).length;
}
return level2Total;
}, 0);
}
return total;
}, 0),
totalProcessed: this.fristdata.reduce((total, level1) => {
if (level1.children && level1.children.length > 0) {
return total + level1.children.reduce((level2Total, level2) => {
if (level2.children && level2.children.length > 0) {
return level2Total + level2.children.filter(level3 =>
level3.checked && level3.radio !== undefined && level3.radio !== ''
).length;
}
return level2Total;
}, 0);
}
return total;
}, 0)
});
},
// 初始化拖拽事件
initDragEvents() {
document.addEventListener('mousemove', this.onDrag);
document.addEventListener('mouseup', this.onDragEnd);
document.addEventListener('touchmove', this.onDrag, { passive: false });
document.addEventListener('touchend', this.onDragEnd);
},
// 拖拽事件处理
onDrag(event) {
if (!this.isDragging) return;
event.preventDefault();
const clientX = event.clientX || (event.touches && event.touches[0].clientX);
const clientY = event.clientY || (event.touches && event.touches[0].clientY);
const deltaX = clientX - this.startX;
const deltaY = clientY - this.startY;
const boxWidth = 60; // 统计框宽度
const boxHeight = 60; // 统计框高度
const margin = 20; // 边距
if (this.draggedElementType === 'unchecked') {
const newX = this.uncheckedBoxPosition.x + deltaX;
const newY = this.uncheckedBoxPosition.y + deltaY;
this.uncheckedBoxPosition.x = Math.max(margin, Math.min(window.innerWidth - boxWidth - margin, newX));
this.uncheckedBoxPosition.y = Math.max(margin, Math.min(window.innerHeight - boxHeight - margin, newY));
} else if (this.draggedElementType === 'problem') {
const newX = this.problemBoxPosition.x + deltaX;
const newY = this.problemBoxPosition.y + deltaY;
this.problemBoxPosition.x = Math.max(margin, Math.min(window.innerWidth - boxWidth - margin, newX));
this.problemBoxPosition.y = Math.max(margin, Math.min(window.innerHeight - boxHeight - margin, newY));
}
this.startX = clientX;
this.startY = clientY;
},
// 拖拽结束事件处理
onDragEnd() {
this.isDragging = false;
this.draggedElementType = null;
},
// 开始拖拽
startDrag(event, type) {
this.isDragging = true;
this.draggedElementType = type;
const clientX = event.clientX || (event.touches && event.touches[0].clientX);
const clientY = event.clientY || (event.touches && event.touches[0].clientY);
this.startX = clientX;
this.startY = clientY;
},
// 点击指标名称展开/隐藏详情(智能处理复选框状态)
toggleExpanded(item, children, parentIndex) {
console.log('点击指标名称:', {
name: item.name,
currentExpanded: item.isExpanded,
currentChecked: item.checked
});
if (item.isExpanded) {
// 如果当前是展开状态,则隐藏
item.isExpanded = false;
console.log('隐藏指标:', item.name);
} else {
// 如果当前是隐藏状态
if (!item.checked) {
// 如果复选框未选中,则同时选中复选框
item.checked = true;
console.log('自动选中复选框:', item.name);
// 注意:这里不立即更新统计,因为只是选中了复选框,没有做任何实际处理
// 统计会在用户选择单选框或填写详情后更新
} else {
console.log('复选框已选中,仅展开:', item.name);
}
// 展开当前指标(同时隐藏其他指标)
children.forEach((level3, index) => {
if (index !== parentIndex) {
level3.isExpanded = false;
} else {
level3.isExpanded = true;
}
});
console.log('展开指标:', item.name);
}
},
// 复选框变化事件
onCheckboxChange(e, children, parentIndex,item1) {
console.log(e.target , ';;;;;;;',item1);
if (e.target.checked) {
// 选中时,只设置展开状态,不自动设置单选框状态
children.forEach((level3, index) => {
if (index !== parentIndex) {
level3.isExpanded = false;
} else {
level3.isExpanded = true;
}
});
} else {
// 取消选中时,清空该指标的所有数据
const currentItem = children[parentIndex];
currentItem.isExpanded = false;
// 不清空单选框状态,保持用户之前的选择
currentItem.problemDescription = ''; // 清空问题描述
currentItem.problemAttachment = []; // 清空附件
currentItem.zgqx = ''; // 清空整改期限
currentItem.radio = ''
// 取消选中时需要更新统计,因为指标回到了未处理状态
this.$nextTick(() => {
this.getStatistics();
});
}
// 选中时不立即更新统计,因为还没有做任何实际处理
// 统计会在用户选择单选框或填写详情后更新
},
// 单选框变化事件
onRadioChange(value) {
console.log('单选框变化:', value);
// 立即更新统计,不需要等待 nextTick
this.getStatistics();
},
// 获取指标样式类
getIndicatorClass(item) {
if (!item.checked) {
return 'indicator-normal';
} else if (item.radio === '3') {
return 'indicator-no-problem';
} else if (item.radio === '0') {
return 'indicator-has-problem';
}
return 'indicator-normal';
},
// 初始化统计框位置
initStatisticsBoxes() {
this.$nextTick(() => {
// 确保统计框不超出屏幕边界
const boxWidth = 60; // 统计框宽度
const boxHeight = 60; // 统计框高度
const margin = 20; // 增加边距,防止超出屏幕
const spacing = 25; // 两个框之间的间距
// 第一个框放在右上角,确保不超出屏幕
this.uncheckedBoxPosition = {
x: Math.max(margin, window.innerWidth - boxWidth - margin),
y: margin
};
// 第二个框放在第一个框下方,增加间距避免重叠
this.problemBoxPosition = {
x: Math.max(margin, window.innerWidth - boxWidth - margin),
y: margin + boxHeight + spacing
};
});
},
// 获取徽章显示内容
getBadge(item) {
if (null == item.questionStr) return;
if (
item.questionStr &&
item.questionStr.split(",").includes("1") &&
item.questionStr.split(",").includes("2")
) {
return "存在扣分和未检查";
} else {
if (item.questionStr && item.questionStr.split(",").includes("1")) {
return "存在扣分项";
} else {
return "存在未检查项";
}
}
},
// 获取一级指标下未处理的三级指标数量
getLevel1UncheckedCount(level1Item) {
let count = 0;
if (level1Item.children && level1Item.children.length > 0) {
level1Item.children.forEach(level2 => {
if (level2.children && level2.children.length > 0) {
level2.children.forEach(level3 => {
// 与主统计逻辑保持一致:
// 未处理:checked = false 或者 (checked = true 但 radio 没有值)
if (!level3.checked || (level3.checked && (level3.radio === undefined || level3.radio === ''))) {
count++;
}
});
}
});
}
return count;
},
// 获取一级指标下有问题的三级指标数量
getLevel1ProblemCount(level1Item) {
let count = 0;
if (level1Item.children && level1Item.children.length > 0) {
level1Item.children.forEach(level2 => {
if (level2.children && level2.children.length > 0) {
level2.children.forEach(level3 => {
if (level3.checked && level3.radio === '0') {
count++;
}
});
}
});
}
return count;
},
// 获取当前展开的三级指标的索引
getActiveThirdLevel(children) {
for (let i = 0; i < children.length; i++) {
if (children[i].isExpanded) {
return i;
}
}
return -1; // 如果没有展开的,返回-1
}
},
watch: {
fristdata: {
handler() {
this.getStatistics();
},
deep: true
}
},
computed: {
// 计算所有三级指标
allThirdLevelIndicators() {
const indicators = [];
this.fristdata.forEach(level1 => {
if (level1.children && level1.children.length > 0) {
level1.children.forEach(level2 => {
if (level2.children && level2.children.length > 0) {
level2.children.forEach(level3 => {
indicators.push(level3);
});
}
});
}
});
return indicators;
}
}
};
</script>
<style lang="less" scoped>
.dailyAddBox {
height: 100%;
background: #f1f3f3;
width: 100%;
position: relative;
font-size: 16px;
.text {
font-size: 14px;
color: #999;
}
p {
margin: 0;
padding: 0;
}
/deep/ .bottonBox {
height: 12vh;
background: #fff;
width: 100%;
overflow: hidden;
text-align: center;
position: absolute;
box-shadow: 0 -2px 10px #ccc;
.botText {
font-size: 14px;
display: block;
margin-top: 5px;
}
.van-button--large {
margin: 0 -10px;
border-radius: 10px;
width: 87%;
font-size: 15px;
background: #3b77b3;
margin-top: 15px;
}
}
/deep/ .contentBox {
margin: 10px;
padding: 10px;
background: #fff;
height: calc(100% - 170px);
overflow-y: scroll;
.selectBox{
display: flex;
align-items: center;
margin-top: 18px;
margin-bottom: 5px;
.title{
margin: 0;
margin-right: 10px;
}
}
.radioBox {
display: flex;
margin-bottom: 20px;
margin-top: 20px;
padding-left: 0.75rem;
font-size: .36rem;
.van-radio-group {
display: flex;
.van-radio {
margin-right: 20px;
.van-radio__label {
color: #666;
font-weight: 550;
}
}
}
}
.hasProblem {
padding-left: .75rem !important;
}
.ant-divider-horizontal {
margin: 0;
}
.title {
margin: 0;
color: #000;
margin-top: 18px;
margin-bottom: 5px;
}
.text {
margin-bottom: 5px;
}
}
}
.messageBox {
margin-bottom: 20px;
.titleName {
font-weight: 550;
margin-top: 18px;
margin-bottom: 5px;
}
.titleCon {
color: #999;
font-size: 14px;
border-bottom: 1px solid #ccc;
padding-bottom: 5px;
}
}
/deep/ .firstCollapse>.ant-collapse-item>.ant-collapse-header {
color: #fff;
background: #3b77b3;
.van-badge {
display: flex !important;
align-items: center !important;
width: 100% !important;
.van-badge__content {
margin-right: 8px;
}
}
}
/deep/ .secondCollapse>.ant-collapse-item>.ant-collapse-header {
color: #000;
background: #eee;
}
/deep/ .thirdCollapse>.ant-collapse-item>.ant-collapse-header {
color: #000;
background: #fff;
}
/deep/ .ant-collapse-content>.ant-collapse-content-box {
padding: 0 !important;
}
/deep/ .ant-table .ant-table-row-indent+.ant-table-row-expand-icon {
display: none;
}
.threeDatas {
padding: 10px;
padding-left: 15px;
}
/* 一级指标数量提示样式 */
.level1-counts {
display: flex;
flex-direction: column;
align-items: flex-end;
margin-left: auto;
font-size: 11px;
line-height: 1.1;
min-width: 60px;
.count-item {
padding: 1px 4px;
border-radius: 3px;
margin: 1px 0;
white-space: nowrap;
text-align: center;
font-weight: 500;
}
.unchecked-count {
color: #fff;
background-color: rgba(255, 255, 255, 0.25);
border: 1px solid rgba(255, 255, 255, 0.3);
}
.problem-count {
color: #fff;
background-color: rgba(255, 255, 0, 0.4);
border: 1px solid rgba(255, 255, 0, 0.5);
}
}
/* 统计框样式 */
.stat-box {
position: fixed;
width: 60px;
height: 60px;
background-color: rgba(255, 255, 255, 0.7);
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
cursor: grab;
user-select: none;
transition: transform 0.2s ease-in-out;
z-index: 1000;
&:active {
cursor: grabbing;
transform: scale(1.05);
}
.stat-content {
text-align: center;
}
.stat-number {
font-size: 18px;
font-weight: bold;
margin-bottom: 3px;
}
.stat-label {
font-size: 10px;
color: #666;
}
}
.unchecked-box {
background-color: rgba(249, 249, 249, 0.7);
color: #999;
&:hover {
background-color: rgba(240, 247, 255, 0.85);
}
.stat-number {
color: #999;
}
}
.problem-box {
background-color: rgba(255, 240, 240, 0.7);
color: #ff6b6b;
&:hover {
background-color: rgba(255, 251, 230, 0.85);
}
.stat-number {
color: #ff4d4f;
}
}
/* 指标颜色样式 */
.indicator-normal {
color: #333;
}
.indicator-no-problem {
color: #52c41a;
font-weight: 500;
}
.indicator-has-problem {
color: #ff4d4f;
font-weight: 500;
}
</style>点击提交报错dailyManagerAdd.vue:402 Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'success')
at eval (dailyManagerAdd.vue:402:1)
最新发布