Commit c8479d2ed605d53e7b00cbed40e4120941d1a6bc
1 parent
2061c5fb
优化工作单pc 端办理bug
Showing
9 changed files
with
707 additions
and
99 deletions
src/api/oa/workTaskDetailApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | |
| 2 | +import { getCommunityId } from '@/api/community/communityApi' | |
| 3 | + | |
| 4 | +// 获取工单详情 | |
| 5 | +export function getWorkDetail(params) { | |
| 6 | + return new Promise((resolve, reject) => { | |
| 7 | + request({ | |
| 8 | + url: '/work.listWorkPool', | |
| 9 | + method: 'get', | |
| 10 | + params: { | |
| 11 | + ...params, | |
| 12 | + communityId: getCommunityId() | |
| 13 | + } | |
| 14 | + }).then(response => { | |
| 15 | + const res = response.data | |
| 16 | + resolve(res) | |
| 17 | + }).catch(error => { | |
| 18 | + reject(error) | |
| 19 | + }) | |
| 20 | + }) | |
| 21 | +} | |
| 22 | + | |
| 23 | +// 获取工单项列表 | |
| 24 | +export function getWorkTaskItems(params) { | |
| 25 | + return new Promise((resolve, reject) => { | |
| 26 | + request({ | |
| 27 | + url: '/task.listWorkTaskItem', | |
| 28 | + method: 'get', | |
| 29 | + params: { | |
| 30 | + ...params, | |
| 31 | + communityId: getCommunityId() | |
| 32 | + } | |
| 33 | + }).then(response => { | |
| 34 | + const res = response.data | |
| 35 | + resolve(res) | |
| 36 | + }).catch(error => { | |
| 37 | + reject(error) | |
| 38 | + }) | |
| 39 | + }) | |
| 40 | +} | |
| 41 | + | |
| 42 | +// 获取工单事件列表 | |
| 43 | +export function getWorkEvents(params) { | |
| 44 | + return new Promise((resolve, reject) => { | |
| 45 | + request({ | |
| 46 | + url: '/workEvent.listWorkEvent', | |
| 47 | + method: 'get', | |
| 48 | + params: { | |
| 49 | + ...params, | |
| 50 | + communityId: getCommunityId() | |
| 51 | + } | |
| 52 | + }).then(response => { | |
| 53 | + const res = response.data | |
| 54 | + resolve(res) | |
| 55 | + }).catch(error => { | |
| 56 | + reject(error) | |
| 57 | + }) | |
| 58 | + }) | |
| 59 | +} | |
| 60 | + | |
| 61 | +// 获取工单文件列表 | |
| 62 | +export function getWorkFiles(params) { | |
| 63 | + return new Promise((resolve, reject) => { | |
| 64 | + request({ | |
| 65 | + url: '/work.listWorkPoolFile', | |
| 66 | + method: 'get', | |
| 67 | + params: { | |
| 68 | + ...params, | |
| 69 | + communityId: getCommunityId() | |
| 70 | + } | |
| 71 | + }).then(response => { | |
| 72 | + const res = response.data | |
| 73 | + resolve(res) | |
| 74 | + }).catch(error => { | |
| 75 | + reject(error) | |
| 76 | + }) | |
| 77 | + }) | |
| 78 | +} | |
| 79 | + | |
| 80 | +// 完成工单任务 | |
| 81 | +export function finishWorkTask(data) { | |
| 82 | + return new Promise((resolve, reject) => { | |
| 83 | + request({ | |
| 84 | + url: '/work.finishWorkTask', | |
| 85 | + method: 'post', | |
| 86 | + data: { | |
| 87 | + ...data, | |
| 88 | + communityId: getCommunityId() | |
| 89 | + } | |
| 90 | + }).then(response => { | |
| 91 | + const res = response.data | |
| 92 | + resolve(res) | |
| 93 | + }).catch(error => { | |
| 94 | + reject(error) | |
| 95 | + }) | |
| 96 | + }) | |
| 97 | +} | |
| 98 | + | |
| 99 | +// 获取组织树 | |
| 100 | +export function getOrgTree(params) { | |
| 101 | + return new Promise((resolve, reject) => { | |
| 102 | + request({ | |
| 103 | + url: '/org.listOrgTree', | |
| 104 | + method: 'get', | |
| 105 | + params: { | |
| 106 | + ...params, | |
| 107 | + communityId: getCommunityId() | |
| 108 | + } | |
| 109 | + }).then(response => { | |
| 110 | + const res = response.data | |
| 111 | + resolve(res) | |
| 112 | + }).catch(error => { | |
| 113 | + reject(error) | |
| 114 | + }) | |
| 115 | + }) | |
| 116 | +} | |
| 117 | + | |
| 118 | +// 获取员工列表 | |
| 119 | +export function getStaffList(params) { | |
| 120 | + return new Promise((resolve, reject) => { | |
| 121 | + request({ | |
| 122 | + url: '/query.staff.infos', | |
| 123 | + method: 'get', | |
| 124 | + params: { | |
| 125 | + ...params, | |
| 126 | + communityId: getCommunityId() | |
| 127 | + } | |
| 128 | + }).then(response => { | |
| 129 | + const res = response.data | |
| 130 | + resolve(res) | |
| 131 | + }).catch(error => { | |
| 132 | + reject(error) | |
| 133 | + }) | |
| 134 | + }) | |
| 135 | +} | |
| 136 | + | |
| 137 | +// 上传文件 | |
| 138 | +export function uploadFile(data, config) { | |
| 139 | + return new Promise((resolve, reject) => { | |
| 140 | + const formData = new FormData() | |
| 141 | + formData.append('uploadFile', data.get('uploadFile')) | |
| 142 | + | |
| 143 | + request({ | |
| 144 | + url: '/uploadVedio/upload', | |
| 145 | + method: 'post', | |
| 146 | + data: formData, | |
| 147 | + headers: { | |
| 148 | + 'Content-Type': 'multipart/form-data' | |
| 149 | + }, | |
| 150 | + ...config | |
| 151 | + }).then(response => { | |
| 152 | + const res = response.data | |
| 153 | + resolve(res) | |
| 154 | + }).catch(error => { | |
| 155 | + reject(error) | |
| 156 | + }) | |
| 157 | + }) | |
| 158 | +} | |
| 0 | 159 | \ No newline at end of file | ... | ... |
src/components/oa/WorkDetailTask.vue
src/i18n/commonLang.js
| ... | ... | @@ -62,7 +62,8 @@ export const messages = { |
| 62 | 62 | file:'File', |
| 63 | 63 | hide:'Hide', |
| 64 | 64 | viewDetail:'View Detail', |
| 65 | - yuan:'yuan' | |
| 65 | + yuan:'yuan', | |
| 66 | + process:'Process' | |
| 66 | 67 | } |
| 67 | 68 | }, |
| 68 | 69 | zh: { |
| ... | ... | @@ -128,7 +129,8 @@ export const messages = { |
| 128 | 129 | file:'附件', |
| 129 | 130 | hide:'隐藏', |
| 130 | 131 | viewDetail:'查看详情', |
| 131 | - yuan:'元' | |
| 132 | + yuan:'元', | |
| 133 | + process:'处理' | |
| 132 | 134 | } |
| 133 | 135 | } |
| 134 | 136 | } |
| 135 | 137 | \ No newline at end of file | ... | ... |
src/i18n/oaI18n.js
| ... | ... | @@ -56,6 +56,7 @@ import { messages as visitUndoMessages } from '../views/oa/visitUndoLang' |
| 56 | 56 | import { messages as doHistoryComplaintsMessages } from '../views/oa/doHistoryComplaintsLang' |
| 57 | 57 | import { messages as myAuditHistoryOrdersMessages } from '../views/resource/myAuditHistoryOrdersLang' |
| 58 | 58 | import { messages as visitFinishMessages } from '../views/oa/visitFinishLang' |
| 59 | +import { messages as workTaskDetailMessages } from '../views/oa/workTaskDetailLang' | |
| 59 | 60 | |
| 60 | 61 | |
| 61 | 62 | export const messages ={ |
| ... | ... | @@ -117,6 +118,7 @@ export const messages ={ |
| 117 | 118 | ...doHistoryComplaintsMessages.en, |
| 118 | 119 | ...myAuditHistoryOrdersMessages.en, |
| 119 | 120 | ...visitFinishMessages.en, |
| 121 | + ...workTaskDetailMessages.en, | |
| 120 | 122 | }, |
| 121 | 123 | zh:{ |
| 122 | 124 | ...activitiesTypeManageMessages.zh, |
| ... | ... | @@ -176,5 +178,6 @@ export const messages ={ |
| 176 | 178 | ...doHistoryComplaintsMessages.zh, |
| 177 | 179 | ...myAuditHistoryOrdersMessages.zh, |
| 178 | 180 | ...visitFinishMessages.zh, |
| 181 | + ...workTaskDetailMessages.zh, | |
| 179 | 182 | } |
| 180 | 183 | } |
| 181 | 184 | \ No newline at end of file | ... | ... |
src/router/oaRouter.js
| ... | ... | @@ -269,4 +269,9 @@ export default [ |
| 269 | 269 | name:'/pages/property/visitFinish', |
| 270 | 270 | component: () => import('@/views/oa/visitFinishList.vue') |
| 271 | 271 | }, |
| 272 | + { | |
| 273 | + path:'/pages/oa/workTaskDetail', | |
| 274 | + name:'/pages/oa/workTaskDetail', | |
| 275 | + component: () => import('@/views/oa/workTaskDetailList.vue') | |
| 276 | + }, | |
| 272 | 277 | ] |
| 273 | 278 | \ No newline at end of file | ... | ... |
src/views/oa/doWorkList.vue
| ... | ... | @@ -4,12 +4,9 @@ |
| 4 | 4 | <el-col :span="4"> |
| 5 | 5 | <el-card class="tree-card"> |
| 6 | 6 | <ul class="state-list"> |
| 7 | - <li | |
| 8 | - v-for="(item,index) in doWorkInfo.states" | |
| 9 | - :key="index" | |
| 10 | - @click="swatchWorkState(item)" | |
| 11 | - :class="{'active-state':doWorkInfo.conditions.state === item.state}"> | |
| 12 | - {{item.name}} | |
| 7 | + <li v-for="(item, index) in doWorkInfo.states" :key="index" @click="swatchWorkState(item)" | |
| 8 | + :class="{ 'active-state': doWorkInfo.conditions.state === item.state }"> | |
| 9 | + {{ item.name }} | |
| 13 | 10 | </li> |
| 14 | 11 | </ul> |
| 15 | 12 | </el-card> |
| ... | ... | @@ -21,31 +18,21 @@ |
| 21 | 18 | </div> |
| 22 | 19 | <el-row :gutter="20"> |
| 23 | 20 | <el-col :span="4"> |
| 24 | - <el-input | |
| 25 | - v-model.trim="doWorkInfo.conditions.workNameLike" | |
| 26 | - :placeholder="$t('doWork.search.workNameLike')" | |
| 27 | - clearable /> | |
| 21 | + <el-input v-model.trim="doWorkInfo.conditions.workNameLike" | |
| 22 | + :placeholder="$t('doWork.search.workNameLike')" clearable /> | |
| 28 | 23 | </el-col> |
| 29 | 24 | <el-col :span="4"> |
| 30 | - <el-input | |
| 31 | - v-model.trim="doWorkInfo.conditions.staffNameLike" | |
| 32 | - :placeholder="$t('doWork.search.staffNameLike')" | |
| 33 | - clearable /> | |
| 25 | + <el-input v-model.trim="doWorkInfo.conditions.staffNameLike" | |
| 26 | + :placeholder="$t('doWork.search.staffNameLike')" clearable /> | |
| 34 | 27 | </el-col> |
| 35 | 28 | <el-col :span="4"> |
| 36 | - <el-date-picker | |
| 37 | - v-model="doWorkInfo.conditions.queryStartTime" | |
| 38 | - type="datetime" | |
| 39 | - :placeholder="$t('doWork.search.queryStartTime')" | |
| 40 | - value-format="yyyy-MM-dd HH:mm:ss"> | |
| 29 | + <el-date-picker v-model="doWorkInfo.conditions.queryStartTime" type="datetime" | |
| 30 | + :placeholder="$t('doWork.search.queryStartTime')" value-format="yyyy-MM-dd HH:mm:ss"> | |
| 41 | 31 | </el-date-picker> |
| 42 | 32 | </el-col> |
| 43 | 33 | <el-col :span="4"> |
| 44 | - <el-date-picker | |
| 45 | - v-model="doWorkInfo.conditions.queryEndTime" | |
| 46 | - type="datetime" | |
| 47 | - :placeholder="$t('doWork.search.queryEndTime')" | |
| 48 | - value-format="yyyy-MM-dd HH:mm:ss" | |
| 34 | + <el-date-picker v-model="doWorkInfo.conditions.queryEndTime" type="datetime" | |
| 35 | + :placeholder="$t('doWork.search.queryEndTime')" value-format="yyyy-MM-dd HH:mm:ss" | |
| 49 | 36 | :disabled="!doWorkInfo.conditions.queryStartTime"> |
| 50 | 37 | </el-date-picker> |
| 51 | 38 | </el-col> |
| ... | ... | @@ -66,104 +53,53 @@ |
| 66 | 53 | <div slot="header" class="flex justify-between"> |
| 67 | 54 | <span>{{ $t('doWork.table.title') }}</span> |
| 68 | 55 | </div> |
| 69 | - <el-table | |
| 70 | - :data="doWorkInfo.works" | |
| 71 | - border | |
| 72 | - style="width: 100%" | |
| 73 | - v-loading="loading"> | |
| 74 | - <el-table-column | |
| 75 | - prop="workId" | |
| 76 | - :label="$t('doWork.table.workId')" | |
| 77 | - align="center"> | |
| 56 | + <el-table :data="doWorkInfo.works" border style="width: 100%" v-loading="loading"> | |
| 57 | + <el-table-column prop="workId" :label="$t('doWork.table.workId')" align="center"> | |
| 78 | 58 | </el-table-column> |
| 79 | - <el-table-column | |
| 80 | - prop="workName" | |
| 81 | - :label="$t('doWork.table.workName')" | |
| 82 | - align="center"> | |
| 59 | + <el-table-column prop="workName" :label="$t('doWork.table.workName')" align="center"> | |
| 83 | 60 | </el-table-column> |
| 84 | - <el-table-column | |
| 85 | - prop="typeName" | |
| 86 | - :label="$t('doWork.table.typeName')" | |
| 87 | - align="center"> | |
| 61 | + <el-table-column prop="typeName" :label="$t('doWork.table.typeName')" align="center"> | |
| 88 | 62 | </el-table-column> |
| 89 | - <el-table-column | |
| 90 | - prop="workCycle" | |
| 91 | - :label="$t('doWork.table.workCycle')" | |
| 92 | - align="center"> | |
| 63 | + <el-table-column prop="workCycle" :label="$t('doWork.table.workCycle')" align="center"> | |
| 93 | 64 | <template slot-scope="scope"> |
| 94 | 65 | {{ scope.row.workCycle === '1001' ? $t('doWork.workCycle.once') : $t('doWork.workCycle.periodic') }} |
| 95 | 66 | </template> |
| 96 | 67 | </el-table-column> |
| 97 | - <el-table-column | |
| 98 | - prop="startTime" | |
| 99 | - :label="$t('doWork.table.startTime')" | |
| 100 | - align="center"> | |
| 68 | + <el-table-column prop="startTime" :label="$t('doWork.table.startTime')" align="center"> | |
| 101 | 69 | </el-table-column> |
| 102 | - <el-table-column | |
| 103 | - prop="endTime" | |
| 104 | - :label="$t('doWork.table.endTime')" | |
| 105 | - align="center"> | |
| 70 | + <el-table-column prop="endTime" :label="$t('doWork.table.endTime')" align="center"> | |
| 106 | 71 | </el-table-column> |
| 107 | - <el-table-column | |
| 108 | - prop="createUserName" | |
| 109 | - :label="$t('doWork.table.createUserName')" | |
| 110 | - align="center"> | |
| 72 | + <el-table-column prop="createUserName" :label="$t('doWork.table.createUserName')" align="center"> | |
| 111 | 73 | </el-table-column> |
| 112 | - <el-table-column | |
| 113 | - prop="curStaffName" | |
| 114 | - :label="$t('doWork.table.curStaffName')" | |
| 115 | - align="center"> | |
| 74 | + <el-table-column prop="curStaffName" :label="$t('doWork.table.curStaffName')" align="center"> | |
| 116 | 75 | <template slot-scope="scope"> |
| 117 | 76 | {{ scope.row.curStaffName || '-' }} |
| 118 | 77 | </template> |
| 119 | 78 | </el-table-column> |
| 120 | - <el-table-column | |
| 121 | - prop="curCopyName" | |
| 122 | - :label="$t('doWork.table.curCopyName')" | |
| 123 | - align="center"> | |
| 79 | + <el-table-column prop="curCopyName" :label="$t('doWork.table.curCopyName')" align="center"> | |
| 124 | 80 | <template slot-scope="scope"> |
| 125 | 81 | {{ scope.row.curCopyName || '-' }} |
| 126 | 82 | </template> |
| 127 | 83 | </el-table-column> |
| 128 | - <el-table-column | |
| 129 | - prop="stateName" | |
| 130 | - :label="$t('doWork.table.stateName')" | |
| 131 | - align="center"> | |
| 84 | + <el-table-column prop="stateName" :label="$t('doWork.table.stateName')" align="center"> | |
| 132 | 85 | </el-table-column> |
| 133 | - <el-table-column | |
| 134 | - prop="createTime" | |
| 135 | - :label="$t('doWork.table.createTime')" | |
| 136 | - align="center"> | |
| 86 | + <el-table-column prop="createTime" :label="$t('doWork.table.createTime')" align="center"> | |
| 137 | 87 | </el-table-column> |
| 138 | - <el-table-column | |
| 139 | - :label="$t('common.operation')" | |
| 140 | - align="center" | |
| 141 | - width="180"> | |
| 88 | + <el-table-column :label="$t('common.operation')" align="center" width="180"> | |
| 142 | 89 | <template slot-scope="scope"> |
| 143 | - <el-button | |
| 144 | - v-if="scope.row.state === 'W' || scope.row.state === 'D'" | |
| 145 | - type="text" | |
| 146 | - size="small" | |
| 90 | + <el-button v-if="scope.row.state === 'W' || scope.row.state === 'D'" type="text" size="small" | |
| 147 | 91 | @click="_openTodoTaskDetail(scope.row)"> |
| 148 | 92 | {{ $t('common.process') }} |
| 149 | 93 | </el-button> |
| 150 | - <el-button | |
| 151 | - type="text" | |
| 152 | - size="small" | |
| 153 | - @click="_toWorkDetailPage(scope.row)"> | |
| 94 | + <el-button type="text" size="small" @click="_toWorkDetailPage(scope.row)"> | |
| 154 | 95 | {{ $t('common.detail') }} |
| 155 | 96 | </el-button> |
| 156 | 97 | </template> |
| 157 | 98 | </el-table-column> |
| 158 | 99 | </el-table> |
| 159 | - <el-pagination | |
| 160 | - @size-change="handleSizeChange" | |
| 161 | - @current-change="handleCurrentChange" | |
| 162 | - :current-page="pagination.current" | |
| 163 | - :page-sizes="[10, 20, 30, 50]" | |
| 164 | - :page-size="pagination.size" | |
| 165 | - layout="total, sizes, prev, pager, next, jumper" | |
| 166 | - :total="pagination.total"> | |
| 100 | + <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" | |
| 101 | + :current-page="pagination.current" :page-sizes="[10, 20, 30, 50]" :page-size="pagination.size" | |
| 102 | + layout="total, sizes, prev, pager, next, jumper" :total="pagination.total"> | |
| 167 | 103 | </el-pagination> |
| 168 | 104 | </el-card> |
| 169 | 105 | </el-col> |
| ... | ... | @@ -272,7 +208,7 @@ export default { |
| 272 | 208 | }, |
| 273 | 209 | _toWorkDetailPage(work) { |
| 274 | 210 | this.$router.push({ |
| 275 | - path: '/pages/oa/workDetail', | |
| 211 | + path: '/views/oa/workDetail', | |
| 276 | 212 | query: { |
| 277 | 213 | workId: work.workId |
| 278 | 214 | } | ... | ... |
src/views/oa/workDetailList.vue
| ... | ... | @@ -14,7 +14,7 @@ |
| 14 | 14 | |
| 15 | 15 | <!-- 业主信息 --> |
| 16 | 16 | <div class="margin-top"> |
| 17 | - <el-row :gutter="20" > | |
| 17 | + <el-row :gutter="20"> | |
| 18 | 18 | <el-col :span="24" class="text-left"> |
| 19 | 19 | <el-row :gutter="20"> |
| 20 | 20 | <el-col :span="6"> |
| ... | ... | @@ -150,7 +150,7 @@ |
| 150 | 150 | <div v-if="workDetailInfo._currentTab == 'workDetailContent'"> |
| 151 | 151 | <div class="padding flex justify-start" v-for="(item, index) in workDetailInfo.contents" :key="index"> |
| 152 | 152 | <div>{{ item.seqNum }}、</div> |
| 153 | - <div v-html="item.content" style="width: 80%;"></div> | |
| 153 | + <div v-html="item.content" style="width: 80%;" class="text-left"></div> | |
| 154 | 154 | </div> |
| 155 | 155 | </div> |
| 156 | 156 | <div v-if="workDetailInfo._currentTab == 'workDetailTask'"> | ... | ... |
src/views/oa/workTaskDetailLang.js
0 → 100644
| 1 | +export const messages = { | |
| 2 | + en: { | |
| 3 | + workTaskDetail: { | |
| 4 | + title: 'Work Task Detail', | |
| 5 | + workId: 'Work ID', | |
| 6 | + workName: 'Work Name', | |
| 7 | + typeName: 'Type Name', | |
| 8 | + workCycle: 'Work Cycle', | |
| 9 | + once: 'One-time', | |
| 10 | + periodic: 'Periodic', | |
| 11 | + startTime: 'Start Time', | |
| 12 | + endTime: 'End Time', | |
| 13 | + createUserName: 'Creator', | |
| 14 | + curStaffName: 'Handler', | |
| 15 | + curCopyName: 'CC', | |
| 16 | + stateName: 'Status', | |
| 17 | + createTime: 'Create Time', | |
| 18 | + attachment: 'Attachment', | |
| 19 | + select: 'Select', | |
| 20 | + content: 'Content', | |
| 21 | + status: 'Status', | |
| 22 | + pending: 'Pending', | |
| 23 | + processed: 'Processed', | |
| 24 | + flow: 'Work Flow', | |
| 25 | + preStaff: 'Previous Handler', | |
| 26 | + staff: 'Handler', | |
| 27 | + validTime: 'Valid Time', | |
| 28 | + time: 'Time', | |
| 29 | + type: 'Type', | |
| 30 | + handler: 'Handler Process', | |
| 31 | + copy: 'CC Process', | |
| 32 | + process: 'Process', | |
| 33 | + remark: 'Remark', | |
| 34 | + attachmentList: 'Attachments', | |
| 35 | + action: 'Action', | |
| 36 | + pleaseSelect: 'Please Select', | |
| 37 | + | |
| 38 | + transfer: 'Transfer', | |
| 39 | + nextHandler: 'Next Handler', | |
| 40 | + selectNextHandler: 'Please select next handler', | |
| 41 | + inputRemark: 'Please input remark', | |
| 42 | + submitSuccess: 'Submit success', | |
| 43 | + submitFailed: 'Submit failed' | |
| 44 | + } | |
| 45 | + }, | |
| 46 | + zh: { | |
| 47 | + workTaskDetail: { | |
| 48 | + title: '任务单详情', | |
| 49 | + workId: '工单编号', | |
| 50 | + workName: '工单名称', | |
| 51 | + typeName: '类型名称', | |
| 52 | + workCycle: '标识', | |
| 53 | + once: '一次性工单', | |
| 54 | + periodic: '周期性工单', | |
| 55 | + startTime: '开始时间', | |
| 56 | + endTime: '结束时间', | |
| 57 | + createUserName: '发起人', | |
| 58 | + curStaffName: '处理人', | |
| 59 | + curCopyName: '抄送人', | |
| 60 | + stateName: '状态', | |
| 61 | + createTime: '创建时间', | |
| 62 | + attachment: '附件', | |
| 63 | + select: '选择', | |
| 64 | + content: '工作单内容', | |
| 65 | + status: '状态', | |
| 66 | + pending: '待处理', | |
| 67 | + processed: '已处理', | |
| 68 | + flow: '工作单流转', | |
| 69 | + preStaff: '前处理人', | |
| 70 | + staff: '处理人', | |
| 71 | + validTime: '任务有效期', | |
| 72 | + time: '时间', | |
| 73 | + type: '类型', | |
| 74 | + handler: '处理人办理', | |
| 75 | + copy: '抄送人办理', | |
| 76 | + remark: '意见', | |
| 77 | + attachmentList: '工作单附件', | |
| 78 | + action: '动作', | |
| 79 | + pleaseSelect: '请选择', | |
| 80 | + process: '办理', | |
| 81 | + transfer: '转单', | |
| 82 | + nextHandler: '下一处理人', | |
| 83 | + selectNextHandler: '必填,请选择下一处理人', | |
| 84 | + inputRemark: '必填,请填写工单说明', | |
| 85 | + submitSuccess: '办理成功', | |
| 86 | + submitFailed: '办理失败' | |
| 87 | + } | |
| 88 | + } | |
| 89 | +} | |
| 0 | 90 | \ No newline at end of file | ... | ... |
src/views/oa/workTaskDetailList.vue
0 → 100644
| 1 | +<template> | |
| 2 | + <div class="work-task-detail-container"> | |
| 3 | + <el-card class="box-card"> | |
| 4 | + <div class="flex justify-between"> | |
| 5 | + <div class="text-title">{{ $t('workTaskDetail.title') }}</div> | |
| 6 | + <div> | |
| 7 | + <el-button type="primary" size="small" style="margin-left:10px" @click="goBack"> | |
| 8 | + <i class="el-icon-close"></i>{{ $t('common.back') }} | |
| 9 | + </el-button> | |
| 10 | + </div> | |
| 11 | + </div> | |
| 12 | + | |
| 13 | + <!-- 基本信息 --> | |
| 14 | + <div class="margin-top"> | |
| 15 | + <el-row :gutter="20"> | |
| 16 | + <el-col :span="6"> | |
| 17 | + <div class="form-group"> | |
| 18 | + <label class="col-form-label"> | |
| 19 | + {{ $t('workTaskDetail.workId') }}: | |
| 20 | + </label> | |
| 21 | + <label>{{ workTaskDetailInfo.workId }}</label> | |
| 22 | + </div> | |
| 23 | + </el-col> | |
| 24 | + <el-col :span="6"> | |
| 25 | + <div class="form-group"> | |
| 26 | + <label class="col-form-label"> | |
| 27 | + {{ $t('workTaskDetail.workName') }}: | |
| 28 | + </label> | |
| 29 | + <label>{{ workTaskDetailInfo.workName }}</label> | |
| 30 | + </div> | |
| 31 | + </el-col> | |
| 32 | + <el-col :span="6"> | |
| 33 | + <div class="form-group"> | |
| 34 | + <label class="col-form-label"> | |
| 35 | + {{ $t('workTaskDetail.typeName') }}: | |
| 36 | + </label> | |
| 37 | + <label>{{ workTaskDetailInfo.typeName }}</label> | |
| 38 | + </div> | |
| 39 | + </el-col> | |
| 40 | + <el-col :span="6"> | |
| 41 | + <div class="form-group"> | |
| 42 | + <label class="col-form-label"> | |
| 43 | + {{ $t('workTaskDetail.workCycle') }}: | |
| 44 | + </label> | |
| 45 | + <label>{{ workTaskDetailInfo.workCycle == '1001' ? $t('workTaskDetail.once') : | |
| 46 | + $t('workTaskDetail.periodic') }}</label> | |
| 47 | + </div> | |
| 48 | + </el-col> | |
| 49 | + </el-row> | |
| 50 | + | |
| 51 | + <el-row :gutter="20"> | |
| 52 | + <el-col :span="6"> | |
| 53 | + <div class="form-group"> | |
| 54 | + <label class="col-form-label"> | |
| 55 | + {{ $t('workTaskDetail.startTime') }}: | |
| 56 | + </label> | |
| 57 | + <label>{{ workTaskDetailInfo.startTime }}</label> | |
| 58 | + </div> | |
| 59 | + </el-col> | |
| 60 | + <el-col :span="6"> | |
| 61 | + <div class="form-group"> | |
| 62 | + <label class="col-form-label"> | |
| 63 | + {{ $t('workTaskDetail.endTime') }}: | |
| 64 | + </label> | |
| 65 | + <label>{{ workTaskDetailInfo.endTime }}</label> | |
| 66 | + </div> | |
| 67 | + </el-col> | |
| 68 | + <el-col :span="6"> | |
| 69 | + <div class="form-group"> | |
| 70 | + <label class="col-form-label"> | |
| 71 | + {{ $t('workTaskDetail.createUserName') }}: | |
| 72 | + </label> | |
| 73 | + <label>{{ workTaskDetailInfo.createUserName }}</label> | |
| 74 | + </div> | |
| 75 | + </el-col> | |
| 76 | + <el-col :span="6"> | |
| 77 | + <div class="form-group"> | |
| 78 | + <label class="col-form-label"> | |
| 79 | + {{ $t('workTaskDetail.curStaffName') }}: | |
| 80 | + </label> | |
| 81 | + <label>{{ workTaskDetailInfo.curStaffName || '-' }}</label> | |
| 82 | + </div> | |
| 83 | + </el-col> | |
| 84 | + </el-row> | |
| 85 | + | |
| 86 | + <el-row :gutter="20"> | |
| 87 | + <el-col :span="6"> | |
| 88 | + <div class="form-group"> | |
| 89 | + <label class="col-form-label"> | |
| 90 | + {{ $t('workTaskDetail.curCopyName') }}: | |
| 91 | + </label> | |
| 92 | + <label>{{ workTaskDetailInfo.curCopyName || '-' }}</label> | |
| 93 | + </div> | |
| 94 | + </el-col> | |
| 95 | + <el-col :span="6"> | |
| 96 | + <div class="form-group"> | |
| 97 | + <label class="col-form-label"> | |
| 98 | + {{ $t('workTaskDetail.stateName') }}: | |
| 99 | + </label> | |
| 100 | + <label>{{ workTaskDetailInfo.stateName }}</label> | |
| 101 | + </div> | |
| 102 | + </el-col> | |
| 103 | + <el-col :span="6"> | |
| 104 | + <div class="form-group"> | |
| 105 | + <label class="col-form-label"> | |
| 106 | + {{ $t('workTaskDetail.createTime') }}: | |
| 107 | + </label> | |
| 108 | + <label>{{ workTaskDetailInfo.createTime }}</label> | |
| 109 | + </div> | |
| 110 | + </el-col> | |
| 111 | + <el-col :span="6"> | |
| 112 | + <div class="form-group"> | |
| 113 | + <label class="col-form-label"> | |
| 114 | + {{ $t('workTaskDetail.attachment') }}: | |
| 115 | + </label> | |
| 116 | + <label> | |
| 117 | + <el-link v-if="workTaskDetailInfo.pathUrl" :href="workTaskDetailInfo.pathUrl" target="_blank"> | |
| 118 | + {{ $t('common.download') }} | |
| 119 | + </el-link> | |
| 120 | + <span v-else>-</span> | |
| 121 | + </label> | |
| 122 | + </div> | |
| 123 | + </el-col> | |
| 124 | + </el-row> | |
| 125 | + </div> | |
| 126 | + </el-card> | |
| 127 | + | |
| 128 | + <!-- 工作单内容 --> | |
| 129 | + <el-card class="margin-top"> | |
| 130 | + <el-table :data="workTaskDetailInfo.items" border style="width: 100%"> | |
| 131 | + <el-table-column v-if="workTaskDetailInfo.todo == 'ON'" :label="$t('workTaskDetail.select')" width="250" | |
| 132 | + align="center"> | |
| 133 | + <template slot-scope="{row}"> | |
| 134 | + <el-radio v-if="row.state == 'W'" v-model="workTaskDetailInfo.audit.itemId" :label="row.itemId" | |
| 135 | + @change="selectContent(row)"></el-radio> | |
| 136 | + <span v-else>-</span> | |
| 137 | + </template> | |
| 138 | + </el-table-column> | |
| 139 | + <el-table-column :label="$t('workTaskDetail.content')" prop="content"> | |
| 140 | + <template slot-scope="{row, $index}"> | |
| 141 | + <div class="flex justify-start"> | |
| 142 | + <div>{{ $index + 1 }}、</div> | |
| 143 | + <div v-html="row.content"></div> | |
| 144 | + </div> | |
| 145 | + </template> | |
| 146 | + </el-table-column> | |
| 147 | + <el-table-column :label="$t('workTaskDetail.status')" width="100" align="center"> | |
| 148 | + <template slot-scope="{row}"> | |
| 149 | + {{ row.state == 'W' ? $t('workTaskDetail.pending') : $t('workTaskDetail.processed') }} | |
| 150 | + </template> | |
| 151 | + </el-table-column> | |
| 152 | + </el-table> | |
| 153 | + </el-card> | |
| 154 | + | |
| 155 | + <!-- 工作单流转 --> | |
| 156 | + <el-card v-if="workTaskDetailInfo.todo != 'ON' && workTaskDetailInfo.events && workTaskDetailInfo.events.length > 0" | |
| 157 | + class="margin-top "> | |
| 158 | + <div slot="header" class="text-left"> | |
| 159 | + <span>{{ $t('workTaskDetail.flow') }}</span> | |
| 160 | + </div> | |
| 161 | + <el-table :data="workTaskDetailInfo.events" border style="width: 100%"> | |
| 162 | + <el-table-column :label="$t('workTaskDetail.preStaff')" align="center" prop="preStaffName"></el-table-column> | |
| 163 | + <el-table-column :label="$t('workTaskDetail.staff')" align="center" prop="staffName"></el-table-column> | |
| 164 | + <el-table-column :label="$t('workTaskDetail.validTime')" align="center" prop="startTime"> | |
| 165 | + <template slot-scope="{row}"> | |
| 166 | + {{ row.startTime }}<br>~{{ row.endTime }} | |
| 167 | + </template> | |
| 168 | + </el-table-column> | |
| 169 | + <el-table-column :label="$t('workTaskDetail.time')" align="center" prop="endTime"></el-table-column> | |
| 170 | + <el-table-column :label="$t('workTaskDetail.type')" align="center" prop="eventType"> | |
| 171 | + <template slot-scope="{row}"> | |
| 172 | + <span v-if="row.eventType == '1001'">{{ $t('workTaskDetail.handler') }}</span> | |
| 173 | + <span v-else-if="row.eventType == '2002'">{{ $t('workTaskDetail.copy') }}</span> | |
| 174 | + <span v-else>{{ $t('workTaskDetail.process') }}</span> | |
| 175 | + </template> | |
| 176 | + </el-table-column> | |
| 177 | + <el-table-column :label="$t('workTaskDetail.remark')" align="center" prop="remark"></el-table-column> | |
| 178 | + </el-table> | |
| 179 | + </el-card> | |
| 180 | + | |
| 181 | + <!-- 工作单附件 --> | |
| 182 | + <el-card v-if="workTaskDetailInfo.todo != 'ON' && workTaskDetailInfo.files && workTaskDetailInfo.files.length > 0" | |
| 183 | + class="margin-top"> | |
| 184 | + <div slot="header" class="text-left"> | |
| 185 | + <span>{{ $t('workTaskDetail.attachmentList') }}</span> | |
| 186 | + </div> | |
| 187 | + <el-table :data="workTaskDetailInfo.files" border style="width: 100%"> | |
| 188 | + <el-table-column :label="$t('workTaskDetail.staff')" align="center"></el-table-column> | |
| 189 | + <el-table-column :label="$t('workTaskDetail.attachment')" align="center"> | |
| 190 | + <template slot-scope="{row}"> | |
| 191 | + <el-link :href="row.pathUrl" target="_blank">{{ $t('common.download') }}</el-link> | |
| 192 | + </template> | |
| 193 | + </el-table-column> | |
| 194 | + </el-table> | |
| 195 | + </el-card> | |
| 196 | + | |
| 197 | + <!-- 工单办理 --> | |
| 198 | + <el-card v-if="workTaskDetailInfo.todo == 'ON' && workTaskDetailInfo.audit.itemId" class="margin-top text-left"> | |
| 199 | + <div slot="header" class="text-left"> | |
| 200 | + <span>{{ $t('workTaskDetail.process') }}</span> | |
| 201 | + </div> | |
| 202 | + <el-form label-width="120px"> | |
| 203 | + <el-form-item :label="$t('workTaskDetail.action')"> | |
| 204 | + <el-select v-model="workTaskDetailInfo.audit.auditCode" style="width:100%"> | |
| 205 | + <el-option :label="$t('workTaskDetail.pleaseSelect')" value="" disabled></el-option> | |
| 206 | + <el-option :label="$t('workTaskDetail.process')" value="C"></el-option> | |
| 207 | + <el-option :label="$t('workTaskDetail.transfer')" value="T"></el-option> | |
| 208 | + </el-select> | |
| 209 | + </el-form-item> | |
| 210 | + | |
| 211 | + <el-form-item v-if="workTaskDetailInfo.audit.auditCode == 'T'" :label="$t('workTaskDetail.nextHandler')"> | |
| 212 | + <el-input v-model="workTaskDetailInfo.audit.staffName" :placeholder="$t('workTaskDetail.selectNextHandler')" | |
| 213 | + disabled> | |
| 214 | + <el-button slot="append" icon="el-icon-search" @click="chooseStaff"></el-button> | |
| 215 | + </el-input> | |
| 216 | + </el-form-item> | |
| 217 | + | |
| 218 | + <el-form-item :label="$t('workTaskDetail.attachment')"> | |
| 219 | + <upload-file ref="uploadFile" @notify="handleNotifyFile"></upload-file> | |
| 220 | + </el-form-item> | |
| 221 | + | |
| 222 | + <el-form-item :label="$t('workTaskDetail.remark')"> | |
| 223 | + <el-input type="textarea" :placeholder="$t('workTaskDetail.inputRemark')" | |
| 224 | + v-model="workTaskDetailInfo.audit.auditMessage"></el-input> | |
| 225 | + </el-form-item> | |
| 226 | + | |
| 227 | + <el-form-item class="text-right"> | |
| 228 | + <el-button type="primary" @click="auditSubmit">{{ $t('common.submit') }}</el-button> | |
| 229 | + </el-form-item> | |
| 230 | + </el-form> | |
| 231 | + </el-card> | |
| 232 | + | |
| 233 | + <select-staff ref="selectStaff" @selectStaff="handleStaffChange"></select-staff> | |
| 234 | + </div> | |
| 235 | +</template> | |
| 236 | + | |
| 237 | +<script> | |
| 238 | +import { getWorkDetail, getWorkTaskItems, getWorkEvents, getWorkFiles, finishWorkTask } from '@/api/oa/workTaskDetailApi' | |
| 239 | +import UploadFile from '@/components/upload/uploadFile' | |
| 240 | +import SelectStaff from '@/components/staff/SelectStaff' | |
| 241 | + | |
| 242 | +export default { | |
| 243 | + name: 'WorkTaskDetailList', | |
| 244 | + components: { | |
| 245 | + UploadFile, | |
| 246 | + SelectStaff | |
| 247 | + }, | |
| 248 | + data() { | |
| 249 | + return { | |
| 250 | + workTaskDetailInfo: { | |
| 251 | + viewWorkFlag: '', | |
| 252 | + workId: "", | |
| 253 | + wtId: '', | |
| 254 | + workName: '', | |
| 255 | + typeName: "", | |
| 256 | + workCycle: "", | |
| 257 | + startTime: "", | |
| 258 | + endTime: "", | |
| 259 | + createUserName: "", | |
| 260 | + curStaffName: "", | |
| 261 | + curCopyName: "", | |
| 262 | + stateName: "", | |
| 263 | + createTime: '', | |
| 264 | + items: [], | |
| 265 | + pathUrl: '', | |
| 266 | + taskId: '', | |
| 267 | + todo: 'OFF', | |
| 268 | + events: [], | |
| 269 | + files: [], | |
| 270 | + audit: { | |
| 271 | + taskId: '', | |
| 272 | + auditCode: 'C', | |
| 273 | + auditMessage: this.$t('workTaskDetail.processed'), | |
| 274 | + staffId: '', | |
| 275 | + staffName: '', | |
| 276 | + pathUrl: '', | |
| 277 | + itemId: '', | |
| 278 | + } | |
| 279 | + } | |
| 280 | + } | |
| 281 | + }, | |
| 282 | + created() { | |
| 283 | + this.workTaskDetailInfo.workId = this.$route.query.workId | |
| 284 | + this.workTaskDetailInfo.taskId = this.$route.query.taskId | |
| 285 | + const todo = this.$route.query.todo | |
| 286 | + if (todo) { | |
| 287 | + this.workTaskDetailInfo.todo = todo | |
| 288 | + this.workTaskDetailInfo.audit.taskId = this.$route.query.taskId | |
| 289 | + } | |
| 290 | + if (!this.workTaskDetailInfo.workId) return | |
| 291 | + | |
| 292 | + this.loadWorkInfo() | |
| 293 | + this.loadWorkTaskItem() | |
| 294 | + this.loadWorkEventData() | |
| 295 | + this.loadWorkFileData() | |
| 296 | + }, | |
| 297 | + methods: { | |
| 298 | + async loadWorkInfo() { | |
| 299 | + try { | |
| 300 | + const params = { | |
| 301 | + workId: this.workTaskDetailInfo.workId, | |
| 302 | + page: 1, | |
| 303 | + row: 1, | |
| 304 | + } | |
| 305 | + const { data } = await getWorkDetail(params) | |
| 306 | + Object.assign(this.workTaskDetailInfo, data[0]) | |
| 307 | + } catch (error) { | |
| 308 | + console.error('获取工单详情失败:', error) | |
| 309 | + } | |
| 310 | + }, | |
| 311 | + async loadWorkTaskItem() { | |
| 312 | + try { | |
| 313 | + const params = { | |
| 314 | + taskId: this.workTaskDetailInfo.taskId, | |
| 315 | + page: 1, | |
| 316 | + row: 100, | |
| 317 | + } | |
| 318 | + const { data } = await getWorkTaskItems(params) | |
| 319 | + this.workTaskDetailInfo.items = data | |
| 320 | + } catch (error) { | |
| 321 | + console.error('获取工单项失败:', error) | |
| 322 | + } | |
| 323 | + }, | |
| 324 | + async loadWorkEventData() { | |
| 325 | + try { | |
| 326 | + const params = { | |
| 327 | + taskId: this.workTaskDetailInfo.taskId, | |
| 328 | + workId: this.workTaskDetailInfo.workId, | |
| 329 | + page: 1, | |
| 330 | + row: 100 | |
| 331 | + } | |
| 332 | + const { data } = await getWorkEvents(params) | |
| 333 | + this.workTaskDetailInfo.events = data | |
| 334 | + } catch (error) { | |
| 335 | + console.error('获取工单事件失败:', error) | |
| 336 | + } | |
| 337 | + }, | |
| 338 | + async loadWorkFileData() { | |
| 339 | + try { | |
| 340 | + const params = { | |
| 341 | + taskId: this.workTaskDetailInfo.taskId, | |
| 342 | + workId: this.workTaskDetailInfo.workId, | |
| 343 | + page: 1, | |
| 344 | + row: 100 | |
| 345 | + } | |
| 346 | + const { data } = await getWorkFiles(params) | |
| 347 | + this.workTaskDetailInfo.files = data | |
| 348 | + } catch (error) { | |
| 349 | + console.error('获取工单文件失败:', error) | |
| 350 | + } | |
| 351 | + }, | |
| 352 | + selectContent(item) { | |
| 353 | + if (item.state == 'C') return | |
| 354 | + this.workTaskDetailInfo.audit.itemId = item.itemId | |
| 355 | + }, | |
| 356 | + chooseStaff() { | |
| 357 | + this.$refs.selectStaff.open(this.workTaskDetailInfo.audit) | |
| 358 | + }, | |
| 359 | + handleStaffChange(staff) { | |
| 360 | + this.workTaskDetailInfo.audit.staffId = staff.staffId | |
| 361 | + this.workTaskDetailInfo.audit.staffName = staff.staffName | |
| 362 | + }, | |
| 363 | + handleNotifyFile(file) { | |
| 364 | + this.workTaskDetailInfo.audit.pathUrl = file.realFileName | |
| 365 | + }, | |
| 366 | + async auditSubmit() { | |
| 367 | + try { | |
| 368 | + await finishWorkTask(this.workTaskDetailInfo.audit) | |
| 369 | + this.$message.success(this.$t('workTaskDetail.submitSuccess')) | |
| 370 | + this.goBack() | |
| 371 | + } catch (error) { | |
| 372 | + this.$message.error(error.message || this.$t('workTaskDetail.submitFailed')) | |
| 373 | + } | |
| 374 | + }, | |
| 375 | + goBack() { | |
| 376 | + this.$router.go(-1) | |
| 377 | + } | |
| 378 | + } | |
| 379 | +} | |
| 380 | +</script> | |
| 381 | + | |
| 382 | +<style scoped> | |
| 383 | +.work-task-detail-container { | |
| 384 | + padding: 20px; | |
| 385 | +} | |
| 386 | + | |
| 387 | +.margin-top { | |
| 388 | + margin-top: 20px; | |
| 389 | +} | |
| 390 | + | |
| 391 | +.flex { | |
| 392 | + display: flex; | |
| 393 | +} | |
| 394 | + | |
| 395 | +.justify-between { | |
| 396 | + justify-content: space-between; | |
| 397 | +} | |
| 398 | + | |
| 399 | +.justify-start { | |
| 400 | + justify-content: flex-start; | |
| 401 | +} | |
| 402 | + | |
| 403 | +.text-title { | |
| 404 | + font-size: 18px; | |
| 405 | +} | |
| 406 | + | |
| 407 | +.form-group { | |
| 408 | + margin-bottom: 15px; | |
| 409 | + text-align: left; | |
| 410 | +} | |
| 411 | + | |
| 412 | +.col-form-label { | |
| 413 | + margin-right: 10px; | |
| 414 | +} | |
| 415 | +</style> | |
| 0 | 416 | \ No newline at end of file | ... | ... |