273 lines
6.9 KiB
Vue
273 lines
6.9 KiB
Vue
<template>
|
||
<view class="list u-p-b-20 u-p-l-20 u-p-r-20" ref="tableRef">
|
||
<view class="list-box">
|
||
<SwipeItem :list="list" :buttons="options" @action="actionClick" ref="swipeItem" :marginB="20">
|
||
<template v-slot="{ item }">
|
||
<view class="item" @tap.stop="goDetail(item)">
|
||
<view class="item-content">
|
||
<!-- 左侧信息区 -->
|
||
<view class="item-left">
|
||
<!-- 单号 + 普通标签(核心修改区域) -->
|
||
<view class="item-row item-header">
|
||
<!-- 新增:普通标签 -->
|
||
<view class="flow-tag">单号</view>
|
||
<text class="content unit-name">{{ item.billNo }}</text>
|
||
</view>
|
||
<view class="item-row">
|
||
<text class="label">申请单位:</text>
|
||
<text class="content unit-name">{{ item.applyDepName }}</text>
|
||
</view>
|
||
<view class="item-row">
|
||
<text class="label">申请人员:</text>
|
||
<text class="content">{{ item.applyUser}}</text>
|
||
</view>
|
||
<view class="item-row">
|
||
<text class="label">创建时间:</text>
|
||
<text class="content">{{ formatTime(item.create_time) }}</text>
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 右侧状态图 -->
|
||
<view class="item-right">
|
||
<image
|
||
v-if="item.approveStatusName == '未审核'"
|
||
src="../../img/UNAPPROVED.png"
|
||
mode="widthFix"
|
||
class="status-img" />
|
||
<image
|
||
v-if="item.approveStatusName == '审批中'"
|
||
src="../../img/APPROVING.png"
|
||
mode="widthFix"
|
||
class="status-img" />
|
||
<image
|
||
v-if="item.approveStatusName == '已审批'"
|
||
src="../../img/APPROVED.png"
|
||
mode="widthFix"
|
||
class="status-img" />
|
||
<image
|
||
v-if="item.approveStatusName == '已驳回'"
|
||
src="../../img/REJECTED.png"
|
||
mode="widthFix"
|
||
class="status-img" />
|
||
<image
|
||
v-if="item.approveStatusName == '已作废'"
|
||
src="../../img/INVALID.png"
|
||
mode="widthFix"
|
||
class="status-img" />
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</template>
|
||
</SwipeItem>
|
||
</view>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
// 脚本部分无需修改,保持原逻辑
|
||
import { useDefineSetting } from '@/utils/useDefineSetting';
|
||
import tableCell from '../tableCell.vue'
|
||
import SwipeItem from "@/components/SwipeItem/index"
|
||
export default {
|
||
emits: ['selectCheckbox', 'handleClick', 'handleMoreClick', 'goDetail', 'relationFormClick', 'update:modelValue'],
|
||
components: {
|
||
tableCell,
|
||
SwipeItem
|
||
},
|
||
props: [
|
||
'config',
|
||
'list',
|
||
'actionOptions',
|
||
'showSelect',
|
||
'checkedAll',
|
||
'modelValue',
|
||
'isMoreBtn',
|
||
'customBtnsList'
|
||
],
|
||
data() {
|
||
return {
|
||
selectData: [],
|
||
useDefine: useDefineSetting()
|
||
}
|
||
},
|
||
watch: {
|
||
checkedAll: {
|
||
handler(val) {
|
||
this.handleCheckAll()
|
||
},
|
||
immediate: true
|
||
}
|
||
},
|
||
computed: {
|
||
options() {
|
||
if (!this.customBtnsList?.length) return this.actionOptions;
|
||
return [{
|
||
text: this.$t('common.moreText'),
|
||
value: 'more',
|
||
style: {
|
||
backgroundColor: '#007aff'
|
||
}
|
||
},
|
||
...this.actionOptions,
|
||
];
|
||
},
|
||
showCheckbox() {
|
||
return this.showSelect
|
||
}
|
||
},
|
||
methods: {
|
||
formatTime(timestamp) {
|
||
if (!timestamp) return '-';
|
||
const date = new Date(timestamp);
|
||
const year = date.getFullYear();
|
||
const month = String(date.getMonth() + 1).padStart(2, '0');
|
||
const day = String(date.getDate()).padStart(2, '0');
|
||
const hours = String(date.getHours()).padStart(2, '0');
|
||
const minutes = String(date.getMinutes()).padStart(2, '0');
|
||
const seconds = String(date.getSeconds()).padStart(2, '0');
|
||
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
||
},
|
||
getStatusClass(statusName) {
|
||
switch (statusName) {
|
||
case '已审批':
|
||
return 'status-approved';
|
||
case '未审核':
|
||
return 'status-unchecked';
|
||
default:
|
||
return 'status-other';
|
||
}
|
||
},
|
||
relationFormClick(item, column) {
|
||
this.$emit('relationFormClick', item, column)
|
||
},
|
||
goDetail(item) {
|
||
this.$emit('goDetail', item)
|
||
},
|
||
actionClick(data) {
|
||
const { index, value } = data
|
||
if (value === 'remove') return this.$emit('handleClick', index)
|
||
if (value === 'more') return this.$emit('handleMoreClick', index)
|
||
},
|
||
checkboxChange(e, item) {
|
||
const isSelected = e.value;
|
||
const selectedItemsSet = new Set(this.selectData.map(selectedItem => selectedItem.id));
|
||
if (isSelected) {
|
||
selectedItemsSet.add(item.id);
|
||
} else {
|
||
selectedItemsSet.delete(item.id);
|
||
}
|
||
this.selectData = [...selectedItemsSet.values()].map(id => {
|
||
return this.list.find(listItem => listItem.id === id);
|
||
});
|
||
this.$emit('selectCheckbox', this.selectData);
|
||
},
|
||
handleCheckAll() {
|
||
this.selectData = []
|
||
if (this.checkedAll) this.selectData = this.list.filter(o => o.checked)
|
||
this.$emit('selectCheckbox', this.selectData);
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.list {
|
||
background-color: #f0f2f6;
|
||
.list-box {
|
||
.item {
|
||
background: #fff;
|
||
border-radius: 12rpx;
|
||
margin-bottom: 20rpx;
|
||
padding: 20rpx;
|
||
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.05);
|
||
position: relative;
|
||
|
||
.item-content {
|
||
display: flex;
|
||
align-items: flex-start; /* 改为顶部对齐,避免标签错位 */
|
||
justify-content: space-between;
|
||
}
|
||
|
||
.item-left {
|
||
flex: 1;
|
||
}
|
||
|
||
.item-row {
|
||
display: flex;
|
||
align-items: center;
|
||
margin-bottom: 8rpx; /* 调整行间距 */
|
||
&:last-child {
|
||
margin-bottom: 0;
|
||
}
|
||
.label {
|
||
font-size: 26rpx;
|
||
color: #909399;
|
||
min-width: 140rpx;
|
||
margin-right: 8rpx;
|
||
}
|
||
.content {
|
||
font-size: 28rpx;
|
||
color: #303133;
|
||
}
|
||
}
|
||
|
||
// 单号+标签的布局样式(核心新增)
|
||
.item-header {
|
||
align-items: center;
|
||
gap: 10rpx; // 标签、单号、单号值之间的间距
|
||
// 普通标签样式
|
||
.flow-tag {
|
||
font-size: 22rpx;
|
||
color: #1677ff;
|
||
background: #e8f3ff;
|
||
padding: 2rpx 8rpx;
|
||
border-radius: 4rpx;
|
||
font-weight: 500;
|
||
}
|
||
// 单号文本样式
|
||
.bill-label {
|
||
font-size: 26rpx;
|
||
color: #303133;
|
||
}
|
||
}
|
||
|
||
// 流程名称样式(对应图中的“管理员的动火审批流程”)
|
||
.flow-name {
|
||
font-size: 28rpx;
|
||
color: #1E293B;
|
||
font-weight: 500;
|
||
}
|
||
|
||
.status-tag {
|
||
padding: 4rpx 16rpx;
|
||
border-radius: 20rpx;
|
||
font-size: 26rpx;
|
||
color: #fff;
|
||
&.status-approved {
|
||
background-color: #67c23a;
|
||
}
|
||
&.status-unchecked {
|
||
background-color: #e6a23c;
|
||
}
|
||
&.status-other {
|
||
background-color: #909399;
|
||
}
|
||
}
|
||
|
||
// 右侧状态图样式
|
||
.item-right {
|
||
width: 100rpx;
|
||
height: 160rpx;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
.status-img {
|
||
width: 100%;
|
||
height: auto;
|
||
object-fit: contain;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</style> |