mirror of
https://gitee.com/java110/MicroCommunityWeb.git
synced 2026-02-23 21:36:37 +08:00
Compare commits
5 Commits
373313bf4b
...
0a3f3db0ed
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0a3f3db0ed | ||
|
|
c8479d2ed6 | ||
|
|
2061c5fb0a | ||
|
|
b9b17c9e20 | ||
|
|
5870b43f63 |
158
src/api/oa/workTaskDetailApi.js
Normal file
158
src/api/oa/workTaskDetailApi.js
Normal 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)
|
||||
})
|
||||
})
|
||||
}
|
||||
@ -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
|
||||
|
||||
@ -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:'处理'
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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,
|
||||
}
|
||||
}
|
||||
@ -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')
|
||||
},
|
||||
]
|
||||
@ -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()
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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'">
|
||||
|
||||
89
src/views/oa/workTaskDetailLang.js
Normal file
89
src/views/oa/workTaskDetailLang.js
Normal 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: '办理失败'
|
||||
}
|
||||
}
|
||||
}
|
||||
415
src/views/oa/workTaskDetailList.vue
Normal file
415
src/views/oa/workTaskDetailList.vue
Normal 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>
|
||||
Loading…
Reference in New Issue
Block a user