吉安感知网项目-前端
chenyao
4 days ago 35fb4a40571d69b85caede7348101d71789b5fb3
feat:提交吉安工单和移动端处置数据
8 files modified
193 ■■■■ changed files
applications/task-work-order/src/styles/common/cockpit.scss 3 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/clueEvents/DistributeDiaLog.vue 2 ●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/clueEvents/ViewDiaLog.vue 15 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/eventManage/ViewDiaLog.vue 87 ●●●●● patch | view | raw | blame | history
uniapps/work-app/src/subPackages/workDetail/HandleWork/index.vue 6 ●●●● patch | view | raw | blame | history
uniapps/work-app/src/subPackages/workDetail/HandleWorking/index-copy.vue 76 ●●●● patch | view | raw | blame | history
uniapps/work-app/src/subPackages/workDetail/HandleWorking/index.vue 2 ●●● patch | view | raw | blame | history
uniapps/work-app/src/subPackages/workDetail/index.vue 2 ●●● patch | view | raw | blame | history
applications/task-work-order/src/styles/common/cockpit.scss
@@ -686,7 +686,8 @@
  th.el-table__cell:not(.fixed-column),
  td.el-table__cell:not(.fixed-column) {
    background: transparent !important;
    // background: transparent !important;
    background: white !important;
  }
  .el-checkbox {
applications/task-work-order/src/views/orderView/orderManage/clueEvents/DistributeDiaLog.vue
@@ -146,7 +146,7 @@
// 打开弹框
async function open({ row, workOrderId: orderId } = {}) {
    console.log('333',row)
    console.log('33399',row)
    currentRow.value = row
    workOrderId.value = orderId
    formData.value = initForm()
applications/task-work-order/src/views/orderView/orderManage/clueEvents/ViewDiaLog.vue
@@ -180,8 +180,19 @@
.gd-dialog-table {
    flex: 1;
    :deep(.el-table__body-wrapper) {
        overflow-y: auto !important;
    .el-table__body-wrapper {
        flex: none;
        overflow: visible;
    }
    .el-table__body-wrapper .el-scrollbar,
    .el-table__body-wrapper .el-scrollbar__wrap {
        height: auto;
        overflow: visible;
    }
    .el-table__body-wrapper .el-scrollbar__bar.is-vertical {
        display: none;
    }
}
</style>
applications/task-work-order/src/views/orderView/orderManage/eventManage/ViewDiaLog.vue
@@ -72,12 +72,17 @@
                </div>
                <div class="img_flow">
                    <div class="imgurl">
                        <el-image
                        <el-image v-if="eventInfo.attachmentType === 1"
                            :src="eventInfo.eventImageUrl"
                            :preview-src-list="[eventInfo.eventImageUrl]"
                            fit="cover"
                            preview-teleported
                        />
                        <div class="video-btn" v-if="eventInfo.attachmentType === 3" @click="videoClick(eventInfo)">
                            <el-icon :size="30" color="#fff">
                                <VideoPlay />
                            </el-icon>
                        </div>
                    </div>
                    <div class="flow">
                        <div v-if="disposeRecords.length === 0">
@@ -86,7 +91,7 @@
                        <div v-else class="flow-card" v-for="item in disposeRecords" :key="item.id">
                            <div class="flow-row1">
                                <span class="flow-name">{{ item.disposeUserName }}</span>
                                <span class="flow-status">{{ item.disposeStatusName }}</span>
                                <span class="flow-status card-status" :class="statusClass(item.disposeStatus)">{{ item.disposeStatusName }}</span>
                            </div>
                            <div class="flow-row2">{{ item.disposeContent }}</div>
                            <div class="flow-row3" v-if="item.attachUrl?.length">
@@ -114,6 +119,7 @@
            </div>
        </div>
    </el-dialog>
    <VideoPlayDialog ref="videoPlayDialogRef" v-if="VideoShow" v-model="VideoShow" :playUrl="eventInfo.eventImageUrl" />
</template>
<script setup>
@@ -121,11 +127,15 @@
import { getDetailFull } from './eventManageApi'
import OrderStepBar from './OrderStepBar.vue'
import { ref } from 'vue'
import { VideoPlay } from '@element-plus/icons-vue'
import VideoPlayDialog from '@/components/VideoPlayDialog.vue'
const visible = defineModel()
const eventInfo = ref({})
const disposeRecords = ref([])
const statusFlows = ref([])
const VideoShow = ref(false)
const videoPlayDialogRef = ref(null)
// 获取状态文本
const getStatusLabel = status => {
@@ -137,6 +147,14 @@
        4: '已完成',
    }
    return map[status] || '未知'
}
// 状态样式类名
const statusClass = status => {
    if (status === 1) return 'status-processing'
    if (status === 3) return 'status-handled'
    if (status === 4) return 'status-completed'
    return ''
}
// 兼容事件记录接口中不同版本的字段名称
@@ -152,9 +170,15 @@
    }
}
function videoClick(eventInfo) {
    // currentVideo.value = eventInfo
    VideoShow.value = true
}
// 打开弹框
async function open({ row } = {}) {
    if (!row?.id) return
    console.log(row, '9098')
    const res = await getDetailFull({ id: row.id })
    const detail = res?.data?.data || {}
    eventInfo.value = detail.eventInfo || {}
@@ -216,6 +240,44 @@
                    width: 100%;
                }
            }
            .video-btn {
        width: 100%;
        height:100%;
        position: relative;
        overflow: hidden;
        border-radius: 4px;
        background: linear-gradient(135deg, rgba(76, 52, 255, 0.14), rgba(76, 52, 255, 0) 48%),
            linear-gradient(180deg, #f4f5ff 0%, #e9ecff 100%);
        box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.7);
        display: flex;
        align-items: center;
        justify-content: center;
        cursor: pointer;
        &::before {
            content: '';
            position: absolute;
            inset: 0;
            background-image: linear-gradient(
                90deg,
                rgba(76, 52, 255, 0.05) 0,
                rgba(76, 52, 255, 0.05) 1px,
                transparent 1px,
                transparent 12px
            );
            opacity: 0.42;
        }
        .el-icon {
            position: relative;
            z-index: 1;
            width: 42px;
            height: 42px;
            border-radius: 50%;
            background: rgba(76, 52, 255, 0.72);
            box-shadow: 0 4px 12px rgba(76, 52, 255, 0.2);
        }
    }
            .flow {
                margin-left: 10px;
                flex: 1;
@@ -265,6 +327,25 @@
                        font-size: 12px;
                        color: #999;
                    }
                    .card-status {
                        font-family: Source Han Sans CN, Source Han Sans CN;
                        font-weight: 400;
                        font-size: 14px;
                        padding: 2px 6px;
                        border-radius: 4px;
                        color: #ffffff;
                        background: #999;
                        &.status-processing {
                            background: #1d6fe9;
                        }
                        &.status-handled {
                            background: #e6a23c;
                        }
                        &.status-completed {
                            background: #00b578;
                        }
                    }
                }
            }
        }
@@ -291,6 +372,8 @@
    .processBox {
        display: flex;
        flex-direction: column;
        height: 650px;
        overflow: auto;
        .process {
            height: 100%;
uniapps/work-app/src/subPackages/workDetail/HandleWork/index.vue
@@ -225,9 +225,9 @@
.card-status {
    font-family: Source Han Sans CN, Source Han Sans CN;
    font-weight: 400;
    font-size: 24rpx;
    padding: 4rpx 16rpx;
    border-radius: 6rpx;
    // font-size: 44px;
    padding: 4px 16px;
    border-radius: 6px;
    color: #ffffff;
    background: #999;
uniapps/work-app/src/subPackages/workDetail/HandleWorking/index-copy.vue
@@ -36,10 +36,7 @@
                <view v-if="attachmentList.length" class="attachment-list">
                    <view v-for="(file, index) in attachmentList" :key="`${file.path}-${index}`" class="attachment-item">
                        <view class="file-info">
                            <text class="file-name">{{ file.name }}</text>
                            <text v-if="file.size" class="file-size">{{ formatFileSize(file.size) }}</text>
                        </view>
            <image class="attachment-image" :src="file.path" mode="aspectFill" @click="handlePreviewImage(index)" />
                        <text class="remove-file-btn" @click.stop="handleRemoveFile(index)">×</text>
                    </view>
                </view>
@@ -156,7 +153,7 @@
// 处理选择文件失败
function handleChooseFail(error) {
    if (error?.errMsg?.includes('cancel')) return
    uni.showToast({ title: '选择文件失败', icon: 'none' })
  uni.showToast({ title: '取消选择文件', icon: 'none' })
}
// 选择附件
@@ -169,7 +166,7 @@
    }
    const options = {
        count: availableCount,
        type: 'all',
    type: 'image',
        success: handleChooseSuccess,
        fail: handleChooseFail,
    }
@@ -192,11 +189,12 @@
    attachmentList.value.splice(index, 1)
}
// 格式化文件大小
function formatFileSize(size) {
    if (size < 1024) return `${size} B`
    if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`
    return `${(size / 1024 / 1024).toFixed(1)} MB`
// 预览已选择图片
function handlePreviewImage(index) {
  uni.previewImage({
    current: index,
    urls: attachmentList.value.map(file => file.path),
  })
}
// 取消处置
@@ -290,10 +288,13 @@
}
.form-scroll {
    // #ifdef APP-PLUS
    padding-top: 60rpx;
    // #endif
    box-sizing: border-box;
    height: 0;
    flex: 1;
    padding: 60rpx 24rpx 24rpx;
  padding: 0 24rpx 24rpx;
}
.form-section {
@@ -392,45 +393,38 @@
}
.attachment-list {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 16rpx;
    padding: 10rpx 22rpx 0;
}
.attachment-item {
    display: flex;
    align-items: center;
    justify-content: space-between;
    min-height: 70rpx;
    border-bottom: 1rpx solid #eeeeee;
}
.file-info {
    display: flex;
    align-items: center;
    width: 0;
    flex: 1;
}
.file-name {
  position: relative;
  width: 100%;
  aspect-ratio: 1;
    overflow: hidden;
    font-size: 26rpx;
    color: #222324;
    text-overflow: ellipsis;
    white-space: nowrap;
  border-radius: 8rpx;
}
.file-size {
    margin-left: 14rpx;
    font-size: 22rpx;
    color: #999;
    white-space: nowrap;
.attachment-image {
  display: block;
  width: 100%;
  height: 100%;
}
.remove-file-btn {
    width: 56rpx;
    font-size: 42rpx;
    line-height: 56rpx;
    color: #999;
    text-align: right;
  position: absolute;
  top: 6rpx;
  right: 6rpx;
  width: 40rpx;
  height: 40rpx;
  font-size: 32rpx;
  line-height: 36rpx;
  color: #ffffff;
  text-align: center;
  background: rgba(0, 0, 0, 0.55);
  border-radius: 50%;
}
.action-footer {
uniapps/work-app/src/subPackages/workDetail/HandleWorking/index.vue
@@ -227,7 +227,7 @@
      recordType: 1,
      disposeContent: formData.value.disposeContent,
      targetEventStatus: eventStatus.value == 1 ? 3 : eventStatus.value,
      updateEventStatus: true,
      updateEventStatus: Number(eventStatus.value) == 1 ? true : false,
      attachUrl: attachmentList.value.map(file => file.link),
      // operateTime: '2026-07-30 14:00:00',
      // eventStatus: formData.value.isHandling ? '1' : '3',
uniapps/work-app/src/subPackages/workDetail/index.vue
@@ -241,7 +241,7 @@
    if (workDetailData.value.eventStatus === 1 && selectedOption.value === 3) {
        // 跳转上传处置页面
        uni.navigateTo({
            url: `/subPackages/workDetail/HandleWorking/index?id=${workDetailData.value.id}&eventStatus=${selectedOption.value}`,
            url: `/subPackages/workDetail/HandleWorking/index?id=${workDetailData.value.id}&eventStatus=${workDetailData.value.eventStatus}`,
        })
    }