Compare commits

...

5 Commits

Author SHA1 Message Date
wuxw
0a3f3db0ed v1.9 工作单办理bug 2025-07-30 11:35:24 +08:00
wuxw
c8479d2ed6 优化工作单pc 端办理bug 2025-07-30 11:34:55 +08:00
wuxw
2061c5fb0a v1.9 解决房屋收费页面抄表记录传参不对bug 2025-07-29 11:25:54 +08:00
wuxw
b9b17c9e20 v1.9 解决优惠申请导出bug 2025-07-29 11:23:41 +08:00
wuxw
5870b43f63 v1.9 解决房屋收费页面抄表记录传参不对bug 2025-07-29 10:40:49 +08:00
10 changed files with 726 additions and 101 deletions

View File

@ -0,0 +1,158 @@
import request from '@/utils/request'
import { getCommunityId } from '@/api/community/communityApi'
// 获取工单详情
export function getWorkDetail(params) {
return new Promise((resolve, reject) => {
request({
url: '/work.listWorkPool',
method: 'get',
params: {
...params,
communityId: getCommunityId()
}
}).then(response => {
const res = response.data
resolve(res)
}).catch(error => {
reject(error)
})
})
}
// 获取工单项列表
export function getWorkTaskItems(params) {
return new Promise((resolve, reject) => {
request({
url: '/task.listWorkTaskItem',
method: 'get',
params: {
...params,
communityId: getCommunityId()
}
}).then(response => {
const res = response.data
resolve(res)
}).catch(error => {
reject(error)
})
})
}
// 获取工单事件列表
export function getWorkEvents(params) {
return new Promise((resolve, reject) => {
request({
url: '/workEvent.listWorkEvent',
method: 'get',
params: {
...params,
communityId: getCommunityId()
}
}).then(response => {
const res = response.data
resolve(res)
}).catch(error => {
reject(error)
})
})
}
// 获取工单文件列表
export function getWorkFiles(params) {
return new Promise((resolve, reject) => {
request({
url: '/work.listWorkPoolFile',
method: 'get',
params: {
...params,
communityId: getCommunityId()
}
}).then(response => {
const res = response.data
resolve(res)
}).catch(error => {
reject(error)
})
})
}
// 完成工单任务
export function finishWorkTask(data) {
return new Promise((resolve, reject) => {
request({
url: '/work.finishWorkTask',
method: 'post',
data: {
...data,
communityId: getCommunityId()
}
}).then(response => {
const res = response.data
resolve(res)
}).catch(error => {
reject(error)
})
})
}
// 获取组织树
export function getOrgTree(params) {
return new Promise((resolve, reject) => {
request({
url: '/org.listOrgTree',
method: 'get',
params: {
...params,
communityId: getCommunityId()
}
}).then(response => {
const res = response.data
resolve(res)
}).catch(error => {
reject(error)
})
})
}
// 获取员工列表
export function getStaffList(params) {
return new Promise((resolve, reject) => {
request({
url: '/query.staff.infos',
method: 'get',
params: {
...params,
communityId: getCommunityId()
}
}).then(response => {
const res = response.data
resolve(res)
}).catch(error => {
reject(error)
})
})
}
// 上传文件
export function uploadFile(data, config) {
return new Promise((resolve, reject) => {
const formData = new FormData()
formData.append('uploadFile', data.get('uploadFile'))
request({
url: '/uploadVedio/upload',
method: 'post',
data: formData,
headers: {
'Content-Type': 'multipart/form-data'
},
...config
}).then(response => {
const res = response.data
resolve(res)
}).catch(error => {
reject(error)
})
})
}

View File

@ -161,7 +161,7 @@ export default {
},
openWorkTaskDetail(work) {
this.$router.push({
path: '/oa/workTaskDetail',
path: '/pages/oa/workTaskDetail',
query: {
workId: work.workId,
taskId: work.taskId

View File

@ -62,7 +62,8 @@ export const messages = {
file:'File',
hide:'Hide',
viewDetail:'View Detail',
yuan:'yuan'
yuan:'yuan',
process:'Process'
}
},
zh: {
@ -128,7 +129,8 @@ export const messages = {
file:'附件',
hide:'隐藏',
viewDetail:'查看详情',
yuan:'元'
yuan:'元',
process:'处理'
}
}
}

View File

@ -56,6 +56,7 @@ import { messages as visitUndoMessages } from '../views/oa/visitUndoLang'
import { messages as doHistoryComplaintsMessages } from '../views/oa/doHistoryComplaintsLang'
import { messages as myAuditHistoryOrdersMessages } from '../views/resource/myAuditHistoryOrdersLang'
import { messages as visitFinishMessages } from '../views/oa/visitFinishLang'
import { messages as workTaskDetailMessages } from '../views/oa/workTaskDetailLang'
export const messages ={
@ -117,6 +118,7 @@ export const messages ={
...doHistoryComplaintsMessages.en,
...myAuditHistoryOrdersMessages.en,
...visitFinishMessages.en,
...workTaskDetailMessages.en,
},
zh:{
...activitiesTypeManageMessages.zh,
@ -176,5 +178,6 @@ export const messages ={
...doHistoryComplaintsMessages.zh,
...myAuditHistoryOrdersMessages.zh,
...visitFinishMessages.zh,
...workTaskDetailMessages.zh,
}
}

View File

@ -269,4 +269,9 @@ export default [
name:'/pages/property/visitFinish',
component: () => import('@/views/oa/visitFinishList.vue')
},
{
path:'/pages/oa/workTaskDetail',
name:'/pages/oa/workTaskDetail',
component: () => import('@/views/oa/workTaskDetailList.vue')
},
]

View File

@ -118,7 +118,7 @@
</template>
<script>
import { getDict } from '@/api/community/communityApi'
import { getDict,getCommunityId } from '@/api/community/communityApi'
import { queryApplyRoomDiscount, queryApplyRoomDiscountType } from '@/api/fee/applyRoomDiscountManageApi'
import AddApplyRoomDiscount from '@/components/fee/addApplyRoomDiscount'
import EditApplyRoomDiscount from '@/components/fee/editApplyRoomDiscount'
@ -126,6 +126,8 @@ import EditApplyRoomDiscountRecord from '@/components/fee/editApplyRoomDiscountR
import ReviewApplyRoomDiscount from '@/components/fee/reviewApplyRoomDiscount'
import DeleteApplyRoomDiscount from '@/components/fee/deleteApplyRoomDiscount'
import ViewImage from '@/components/system/viewImage'
import { exportData } from '@/api/report/reportFeeSummaryApi'
export default {
name: 'ApplyRoomDiscountManageList',
@ -160,6 +162,7 @@ export default {
this.getList()
this.getApplyTypes()
this.getDictData()
this.searchForm.communityId = getCommunityId()
},
methods: {
async getList() {
@ -250,8 +253,22 @@ export default {
handleOpenDiscountType() {
this.$router.push('/views/fee/discountType')
},
handleExport() {
async handleExport() {
//
try {
const params = {
...this.searchForm,
communityId: this.searchForm.communityId,
pagePath: 'applyRoomDiscount'
}
await exportData(params)
this.$message.success(this.$t('reportFeeSummary.exportSuccess'))
this.$router.push('/pages/property/downloadTempFile?tab=下载中心')
} catch (error) {
console.error('Failed to export:', error)
this.$message.error(this.$t('reportFeeSummary.exportFailed'))
}
},
handleSuccess() {
this.getList()

View File

@ -4,12 +4,9 @@
<el-col :span="4">
<el-card class="tree-card">
<ul class="state-list">
<li
v-for="(item,index) in doWorkInfo.states"
:key="index"
@click="swatchWorkState(item)"
:class="{'active-state':doWorkInfo.conditions.state === item.state}">
{{item.name}}
<li v-for="(item, index) in doWorkInfo.states" :key="index" @click="swatchWorkState(item)"
:class="{ 'active-state': doWorkInfo.conditions.state === item.state }">
{{ item.name }}
</li>
</ul>
</el-card>
@ -21,31 +18,21 @@
</div>
<el-row :gutter="20">
<el-col :span="4">
<el-input
v-model.trim="doWorkInfo.conditions.workNameLike"
:placeholder="$t('doWork.search.workNameLike')"
clearable />
<el-input v-model.trim="doWorkInfo.conditions.workNameLike"
:placeholder="$t('doWork.search.workNameLike')" clearable />
</el-col>
<el-col :span="4">
<el-input
v-model.trim="doWorkInfo.conditions.staffNameLike"
:placeholder="$t('doWork.search.staffNameLike')"
clearable />
<el-input v-model.trim="doWorkInfo.conditions.staffNameLike"
:placeholder="$t('doWork.search.staffNameLike')" clearable />
</el-col>
<el-col :span="4">
<el-date-picker
v-model="doWorkInfo.conditions.queryStartTime"
type="datetime"
:placeholder="$t('doWork.search.queryStartTime')"
value-format="yyyy-MM-dd HH:mm:ss">
<el-date-picker v-model="doWorkInfo.conditions.queryStartTime" type="datetime"
:placeholder="$t('doWork.search.queryStartTime')" value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-col>
<el-col :span="4">
<el-date-picker
v-model="doWorkInfo.conditions.queryEndTime"
type="datetime"
:placeholder="$t('doWork.search.queryEndTime')"
value-format="yyyy-MM-dd HH:mm:ss"
<el-date-picker v-model="doWorkInfo.conditions.queryEndTime" type="datetime"
:placeholder="$t('doWork.search.queryEndTime')" value-format="yyyy-MM-dd HH:mm:ss"
:disabled="!doWorkInfo.conditions.queryStartTime">
</el-date-picker>
</el-col>
@ -66,104 +53,53 @@
<div slot="header" class="flex justify-between">
<span>{{ $t('doWork.table.title') }}</span>
</div>
<el-table
:data="doWorkInfo.works"
border
style="width: 100%"
v-loading="loading">
<el-table-column
prop="workId"
:label="$t('doWork.table.workId')"
align="center">
<el-table :data="doWorkInfo.works" border style="width: 100%" v-loading="loading">
<el-table-column prop="workId" :label="$t('doWork.table.workId')" align="center">
</el-table-column>
<el-table-column
prop="workName"
:label="$t('doWork.table.workName')"
align="center">
<el-table-column prop="workName" :label="$t('doWork.table.workName')" align="center">
</el-table-column>
<el-table-column
prop="typeName"
:label="$t('doWork.table.typeName')"
align="center">
<el-table-column prop="typeName" :label="$t('doWork.table.typeName')" align="center">
</el-table-column>
<el-table-column
prop="workCycle"
:label="$t('doWork.table.workCycle')"
align="center">
<el-table-column prop="workCycle" :label="$t('doWork.table.workCycle')" align="center">
<template slot-scope="scope">
{{ scope.row.workCycle === '1001' ? $t('doWork.workCycle.once') : $t('doWork.workCycle.periodic') }}
</template>
</el-table-column>
<el-table-column
prop="startTime"
:label="$t('doWork.table.startTime')"
align="center">
<el-table-column prop="startTime" :label="$t('doWork.table.startTime')" align="center">
</el-table-column>
<el-table-column
prop="endTime"
:label="$t('doWork.table.endTime')"
align="center">
<el-table-column prop="endTime" :label="$t('doWork.table.endTime')" align="center">
</el-table-column>
<el-table-column
prop="createUserName"
:label="$t('doWork.table.createUserName')"
align="center">
<el-table-column prop="createUserName" :label="$t('doWork.table.createUserName')" align="center">
</el-table-column>
<el-table-column
prop="curStaffName"
:label="$t('doWork.table.curStaffName')"
align="center">
<el-table-column prop="curStaffName" :label="$t('doWork.table.curStaffName')" align="center">
<template slot-scope="scope">
{{ scope.row.curStaffName || '-' }}
</template>
</el-table-column>
<el-table-column
prop="curCopyName"
:label="$t('doWork.table.curCopyName')"
align="center">
<el-table-column prop="curCopyName" :label="$t('doWork.table.curCopyName')" align="center">
<template slot-scope="scope">
{{ scope.row.curCopyName || '-' }}
</template>
</el-table-column>
<el-table-column
prop="stateName"
:label="$t('doWork.table.stateName')"
align="center">
<el-table-column prop="stateName" :label="$t('doWork.table.stateName')" align="center">
</el-table-column>
<el-table-column
prop="createTime"
:label="$t('doWork.table.createTime')"
align="center">
<el-table-column prop="createTime" :label="$t('doWork.table.createTime')" align="center">
</el-table-column>
<el-table-column
:label="$t('common.operation')"
align="center"
width="180">
<el-table-column :label="$t('common.operation')" align="center" width="180">
<template slot-scope="scope">
<el-button
v-if="scope.row.state === 'W' || scope.row.state === 'D'"
type="text"
size="small"
<el-button v-if="scope.row.state === 'W' || scope.row.state === 'D'" type="text" size="small"
@click="_openTodoTaskDetail(scope.row)">
{{ $t('common.process') }}
</el-button>
<el-button
type="text"
size="small"
@click="_toWorkDetailPage(scope.row)">
<el-button type="text" size="small" @click="_toWorkDetailPage(scope.row)">
{{ $t('common.detail') }}
</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="pagination.current"
:page-sizes="[10, 20, 30, 50]"
:page-size="pagination.size"
layout="total, sizes, prev, pager, next, jumper"
:total="pagination.total">
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
:current-page="pagination.current" :page-sizes="[10, 20, 30, 50]" :page-size="pagination.size"
layout="total, sizes, prev, pager, next, jumper" :total="pagination.total">
</el-pagination>
</el-card>
</el-col>
@ -272,7 +208,7 @@ export default {
},
_toWorkDetailPage(work) {
this.$router.push({
path: '/pages/oa/workDetail',
path: '/views/oa/workDetail',
query: {
workId: work.workId
}

View File

@ -14,7 +14,7 @@
<!-- 业主信息 -->
<div class="margin-top">
<el-row :gutter="20" >
<el-row :gutter="20">
<el-col :span="24" class="text-left">
<el-row :gutter="20">
<el-col :span="6">
@ -150,7 +150,7 @@
<div v-if="workDetailInfo._currentTab == 'workDetailContent'">
<div class="padding flex justify-start" v-for="(item, index) in workDetailInfo.contents" :key="index">
<div>{{ item.seqNum }}</div>
<div v-html="item.content" style="width: 80%;"></div>
<div v-html="item.content" style="width: 80%;" class="text-left"></div>
</div>
</div>
<div v-if="workDetailInfo._currentTab == 'workDetailTask'">

View File

@ -0,0 +1,89 @@
export const messages = {
en: {
workTaskDetail: {
title: 'Work Task Detail',
workId: 'Work ID',
workName: 'Work Name',
typeName: 'Type Name',
workCycle: 'Work Cycle',
once: 'One-time',
periodic: 'Periodic',
startTime: 'Start Time',
endTime: 'End Time',
createUserName: 'Creator',
curStaffName: 'Handler',
curCopyName: 'CC',
stateName: 'Status',
createTime: 'Create Time',
attachment: 'Attachment',
select: 'Select',
content: 'Content',
status: 'Status',
pending: 'Pending',
processed: 'Processed',
flow: 'Work Flow',
preStaff: 'Previous Handler',
staff: 'Handler',
validTime: 'Valid Time',
time: 'Time',
type: 'Type',
handler: 'Handler Process',
copy: 'CC Process',
process: 'Process',
remark: 'Remark',
attachmentList: 'Attachments',
action: 'Action',
pleaseSelect: 'Please Select',
transfer: 'Transfer',
nextHandler: 'Next Handler',
selectNextHandler: 'Please select next handler',
inputRemark: 'Please input remark',
submitSuccess: 'Submit success',
submitFailed: 'Submit failed'
}
},
zh: {
workTaskDetail: {
title: '任务单详情',
workId: '工单编号',
workName: '工单名称',
typeName: '类型名称',
workCycle: '标识',
once: '一次性工单',
periodic: '周期性工单',
startTime: '开始时间',
endTime: '结束时间',
createUserName: '发起人',
curStaffName: '处理人',
curCopyName: '抄送人',
stateName: '状态',
createTime: '创建时间',
attachment: '附件',
select: '选择',
content: '工作单内容',
status: '状态',
pending: '待处理',
processed: '已处理',
flow: '工作单流转',
preStaff: '前处理人',
staff: '处理人',
validTime: '任务有效期',
time: '时间',
type: '类型',
handler: '处理人办理',
copy: '抄送人办理',
remark: '意见',
attachmentList: '工作单附件',
action: '动作',
pleaseSelect: '请选择',
process: '办理',
transfer: '转单',
nextHandler: '下一处理人',
selectNextHandler: '必填,请选择下一处理人',
inputRemark: '必填,请填写工单说明',
submitSuccess: '办理成功',
submitFailed: '办理失败'
}
}
}

View File

@ -0,0 +1,415 @@
<template>
<div class="work-task-detail-container">
<el-card class="box-card">
<div class="flex justify-between">
<div class="text-title">{{ $t('workTaskDetail.title') }}</div>
<div>
<el-button type="primary" size="small" style="margin-left:10px" @click="goBack">
<i class="el-icon-close"></i>{{ $t('common.back') }}
</el-button>
</div>
</div>
<!-- 基本信息 -->
<div class="margin-top">
<el-row :gutter="20">
<el-col :span="6">
<div class="form-group">
<label class="col-form-label">
{{ $t('workTaskDetail.workId') }}
</label>
<label>{{ workTaskDetailInfo.workId }}</label>
</div>
</el-col>
<el-col :span="6">
<div class="form-group">
<label class="col-form-label">
{{ $t('workTaskDetail.workName') }}
</label>
<label>{{ workTaskDetailInfo.workName }}</label>
</div>
</el-col>
<el-col :span="6">
<div class="form-group">
<label class="col-form-label">
{{ $t('workTaskDetail.typeName') }}
</label>
<label>{{ workTaskDetailInfo.typeName }}</label>
</div>
</el-col>
<el-col :span="6">
<div class="form-group">
<label class="col-form-label">
{{ $t('workTaskDetail.workCycle') }}
</label>
<label>{{ workTaskDetailInfo.workCycle == '1001' ? $t('workTaskDetail.once') :
$t('workTaskDetail.periodic') }}</label>
</div>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="6">
<div class="form-group">
<label class="col-form-label">
{{ $t('workTaskDetail.startTime') }}
</label>
<label>{{ workTaskDetailInfo.startTime }}</label>
</div>
</el-col>
<el-col :span="6">
<div class="form-group">
<label class="col-form-label">
{{ $t('workTaskDetail.endTime') }}
</label>
<label>{{ workTaskDetailInfo.endTime }}</label>
</div>
</el-col>
<el-col :span="6">
<div class="form-group">
<label class="col-form-label">
{{ $t('workTaskDetail.createUserName') }}
</label>
<label>{{ workTaskDetailInfo.createUserName }}</label>
</div>
</el-col>
<el-col :span="6">
<div class="form-group">
<label class="col-form-label">
{{ $t('workTaskDetail.curStaffName') }}
</label>
<label>{{ workTaskDetailInfo.curStaffName || '-' }}</label>
</div>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="6">
<div class="form-group">
<label class="col-form-label">
{{ $t('workTaskDetail.curCopyName') }}
</label>
<label>{{ workTaskDetailInfo.curCopyName || '-' }}</label>
</div>
</el-col>
<el-col :span="6">
<div class="form-group">
<label class="col-form-label">
{{ $t('workTaskDetail.stateName') }}
</label>
<label>{{ workTaskDetailInfo.stateName }}</label>
</div>
</el-col>
<el-col :span="6">
<div class="form-group">
<label class="col-form-label">
{{ $t('workTaskDetail.createTime') }}
</label>
<label>{{ workTaskDetailInfo.createTime }}</label>
</div>
</el-col>
<el-col :span="6">
<div class="form-group">
<label class="col-form-label">
{{ $t('workTaskDetail.attachment') }}
</label>
<label>
<el-link v-if="workTaskDetailInfo.pathUrl" :href="workTaskDetailInfo.pathUrl" target="_blank">
{{ $t('common.download') }}
</el-link>
<span v-else>-</span>
</label>
</div>
</el-col>
</el-row>
</div>
</el-card>
<!-- 工作单内容 -->
<el-card class="margin-top">
<el-table :data="workTaskDetailInfo.items" border style="width: 100%">
<el-table-column v-if="workTaskDetailInfo.todo == 'ON'" :label="$t('workTaskDetail.select')" width="250"
align="center">
<template slot-scope="{row}">
<el-radio v-if="row.state == 'W'" v-model="workTaskDetailInfo.audit.itemId" :label="row.itemId"
@change="selectContent(row)"></el-radio>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column :label="$t('workTaskDetail.content')" prop="content">
<template slot-scope="{row, $index}">
<div class="flex justify-start">
<div>{{ $index + 1 }}</div>
<div v-html="row.content"></div>
</div>
</template>
</el-table-column>
<el-table-column :label="$t('workTaskDetail.status')" width="100" align="center">
<template slot-scope="{row}">
{{ row.state == 'W' ? $t('workTaskDetail.pending') : $t('workTaskDetail.processed') }}
</template>
</el-table-column>
</el-table>
</el-card>
<!-- 工作单流转 -->
<el-card v-if="workTaskDetailInfo.todo != 'ON' && workTaskDetailInfo.events && workTaskDetailInfo.events.length > 0"
class="margin-top ">
<div slot="header" class="text-left">
<span>{{ $t('workTaskDetail.flow') }}</span>
</div>
<el-table :data="workTaskDetailInfo.events" border style="width: 100%">
<el-table-column :label="$t('workTaskDetail.preStaff')" align="center" prop="preStaffName"></el-table-column>
<el-table-column :label="$t('workTaskDetail.staff')" align="center" prop="staffName"></el-table-column>
<el-table-column :label="$t('workTaskDetail.validTime')" align="center" prop="startTime">
<template slot-scope="{row}">
{{ row.startTime }}<br>~{{ row.endTime }}
</template>
</el-table-column>
<el-table-column :label="$t('workTaskDetail.time')" align="center" prop="endTime"></el-table-column>
<el-table-column :label="$t('workTaskDetail.type')" align="center" prop="eventType">
<template slot-scope="{row}">
<span v-if="row.eventType == '1001'">{{ $t('workTaskDetail.handler') }}</span>
<span v-else-if="row.eventType == '2002'">{{ $t('workTaskDetail.copy') }}</span>
<span v-else>{{ $t('workTaskDetail.process') }}</span>
</template>
</el-table-column>
<el-table-column :label="$t('workTaskDetail.remark')" align="center" prop="remark"></el-table-column>
</el-table>
</el-card>
<!-- 工作单附件 -->
<el-card v-if="workTaskDetailInfo.todo != 'ON' && workTaskDetailInfo.files && workTaskDetailInfo.files.length > 0"
class="margin-top">
<div slot="header" class="text-left">
<span>{{ $t('workTaskDetail.attachmentList') }}</span>
</div>
<el-table :data="workTaskDetailInfo.files" border style="width: 100%">
<el-table-column :label="$t('workTaskDetail.staff')" align="center"></el-table-column>
<el-table-column :label="$t('workTaskDetail.attachment')" align="center">
<template slot-scope="{row}">
<el-link :href="row.pathUrl" target="_blank">{{ $t('common.download') }}</el-link>
</template>
</el-table-column>
</el-table>
</el-card>
<!-- 工单办理 -->
<el-card v-if="workTaskDetailInfo.todo == 'ON' && workTaskDetailInfo.audit.itemId" class="margin-top text-left">
<div slot="header" class="text-left">
<span>{{ $t('workTaskDetail.process') }}</span>
</div>
<el-form label-width="120px">
<el-form-item :label="$t('workTaskDetail.action')">
<el-select v-model="workTaskDetailInfo.audit.auditCode" style="width:100%">
<el-option :label="$t('workTaskDetail.pleaseSelect')" value="" disabled></el-option>
<el-option :label="$t('workTaskDetail.process')" value="C"></el-option>
<el-option :label="$t('workTaskDetail.transfer')" value="T"></el-option>
</el-select>
</el-form-item>
<el-form-item v-if="workTaskDetailInfo.audit.auditCode == 'T'" :label="$t('workTaskDetail.nextHandler')">
<el-input v-model="workTaskDetailInfo.audit.staffName" :placeholder="$t('workTaskDetail.selectNextHandler')"
disabled>
<el-button slot="append" icon="el-icon-search" @click="chooseStaff"></el-button>
</el-input>
</el-form-item>
<el-form-item :label="$t('workTaskDetail.attachment')">
<upload-file ref="uploadFile" @notify="handleNotifyFile"></upload-file>
</el-form-item>
<el-form-item :label="$t('workTaskDetail.remark')">
<el-input type="textarea" :placeholder="$t('workTaskDetail.inputRemark')"
v-model="workTaskDetailInfo.audit.auditMessage"></el-input>
</el-form-item>
<el-form-item class="text-right">
<el-button type="primary" @click="auditSubmit">{{ $t('common.submit') }}</el-button>
</el-form-item>
</el-form>
</el-card>
<select-staff ref="selectStaff" @selectStaff="handleStaffChange"></select-staff>
</div>
</template>
<script>
import { getWorkDetail, getWorkTaskItems, getWorkEvents, getWorkFiles, finishWorkTask } from '@/api/oa/workTaskDetailApi'
import UploadFile from '@/components/upload/uploadFile'
import SelectStaff from '@/components/staff/SelectStaff'
export default {
name: 'WorkTaskDetailList',
components: {
UploadFile,
SelectStaff
},
data() {
return {
workTaskDetailInfo: {
viewWorkFlag: '',
workId: "",
wtId: '',
workName: '',
typeName: "",
workCycle: "",
startTime: "",
endTime: "",
createUserName: "",
curStaffName: "",
curCopyName: "",
stateName: "",
createTime: '',
items: [],
pathUrl: '',
taskId: '',
todo: 'OFF',
events: [],
files: [],
audit: {
taskId: '',
auditCode: 'C',
auditMessage: this.$t('workTaskDetail.processed'),
staffId: '',
staffName: '',
pathUrl: '',
itemId: '',
}
}
}
},
created() {
this.workTaskDetailInfo.workId = this.$route.query.workId
this.workTaskDetailInfo.taskId = this.$route.query.taskId
const todo = this.$route.query.todo
if (todo) {
this.workTaskDetailInfo.todo = todo
this.workTaskDetailInfo.audit.taskId = this.$route.query.taskId
}
if (!this.workTaskDetailInfo.workId) return
this.loadWorkInfo()
this.loadWorkTaskItem()
this.loadWorkEventData()
this.loadWorkFileData()
},
methods: {
async loadWorkInfo() {
try {
const params = {
workId: this.workTaskDetailInfo.workId,
page: 1,
row: 1,
}
const { data } = await getWorkDetail(params)
Object.assign(this.workTaskDetailInfo, data[0])
} catch (error) {
console.error('获取工单详情失败:', error)
}
},
async loadWorkTaskItem() {
try {
const params = {
taskId: this.workTaskDetailInfo.taskId,
page: 1,
row: 100,
}
const { data } = await getWorkTaskItems(params)
this.workTaskDetailInfo.items = data
} catch (error) {
console.error('获取工单项失败:', error)
}
},
async loadWorkEventData() {
try {
const params = {
taskId: this.workTaskDetailInfo.taskId,
workId: this.workTaskDetailInfo.workId,
page: 1,
row: 100
}
const { data } = await getWorkEvents(params)
this.workTaskDetailInfo.events = data
} catch (error) {
console.error('获取工单事件失败:', error)
}
},
async loadWorkFileData() {
try {
const params = {
taskId: this.workTaskDetailInfo.taskId,
workId: this.workTaskDetailInfo.workId,
page: 1,
row: 100
}
const { data } = await getWorkFiles(params)
this.workTaskDetailInfo.files = data
} catch (error) {
console.error('获取工单文件失败:', error)
}
},
selectContent(item) {
if (item.state == 'C') return
this.workTaskDetailInfo.audit.itemId = item.itemId
},
chooseStaff() {
this.$refs.selectStaff.open(this.workTaskDetailInfo.audit)
},
handleStaffChange(staff) {
this.workTaskDetailInfo.audit.staffId = staff.staffId
this.workTaskDetailInfo.audit.staffName = staff.staffName
},
handleNotifyFile(file) {
this.workTaskDetailInfo.audit.pathUrl = file.realFileName
},
async auditSubmit() {
try {
await finishWorkTask(this.workTaskDetailInfo.audit)
this.$message.success(this.$t('workTaskDetail.submitSuccess'))
this.goBack()
} catch (error) {
this.$message.error(error.message || this.$t('workTaskDetail.submitFailed'))
}
},
goBack() {
this.$router.go(-1)
}
}
}
</script>
<style scoped>
.work-task-detail-container {
padding: 20px;
}
.margin-top {
margin-top: 20px;
}
.flex {
display: flex;
}
.justify-between {
justify-content: space-between;
}
.justify-start {
justify-content: flex-start;
}
.text-title {
font-size: 18px;
}
.form-group {
margin-bottom: 15px;
text-align: left;
}
.col-form-label {
margin-right: 10px;
}
</style>