Browse Source

feat(eam): 添加缺陷工单审核和协助人功能

- 新增撤销审核删除协助人API接口
- 在缺陷工单页面添加是否同意和协助人字段
- 实现不同意时需填写理由的功能
- 添加协助人选择对话框和确认功能
- 针对03-RFID业务单元固定计划执行人员逻辑
- 完善工单审核流程和权限校验
- 优化到达人员选择和验证逻辑
master
qiankanghui 4 days ago
parent
commit
3f22412f4d
  1. 3
      src/api/eam/eam.js
  2. 127
      src/views/modules/eam/eamWorkOrderForDefect2.vue
  3. 168
      src/views/modules/reportWorkOrder/reportDefectOrder2.vue

3
src/api/eam/eam.js

@ -268,3 +268,6 @@ export const eamMaintainOrderExportExcel= data => createAPI(`/pms/eam/eamMaintai
// 废弃工单 // 废弃工单
export const abandonedEamWorkOrder = data => createAPI(`/pms/eam/abandonedEamWorkOrder`,'post',data) export const abandonedEamWorkOrder = data => createAPI(`/pms/eam/abandonedEamWorkOrder`,'post',data)
// 撤销审核删除协助人
export const cancelDefect = data => createAPI(`/pms/eam/cancelDefect`,'post',data)

127
src/views/modules/eam/eamWorkOrderForDefect2.vue

@ -286,7 +286,23 @@
<el-input v-model="submitData.difficultyRemark" style="width: 200px"></el-input> <el-input v-model="submitData.difficultyRemark" style="width: 200px"></el-input>
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-footer style="height:40px;margin-top: 10px;text-align:center">
<el-form :inline="true" label-position="top" style="margin-top: -10px">
<el-form-item :label="'是否同意'">
<el-select v-model="submitData.isAgreed" style="width: 130px" placeholder="请选择">
<el-option label="同意" value="Y"></el-option>
<el-option label="不同意" value="N"></el-option>
</el-select>
</el-form-item>
<el-form-item :label="'协助人'">
<el-input v-model="detailData.assistUserName" disabled style="width: 200px" placeholder="无协助人"></el-input>
</el-form-item>
</el-form>
<el-form :inline="true" label-position="top" style="margin-top: -10px">
<el-form-item :label="'理由'" v-if="submitData.isAgreed === 'N'">
<el-input type="textarea" v-model="submitData.disagreeReason" :rows="2" resize='none' style="width: 340px" placeholder="请填写不同意的理由"></el-input>
</el-form-item>
</el-form>
<el-footer style="height:40px;margin-top: 30px;text-align:center">
<el-button type="primary" @click="submitModel(1)">通过</el-button> <el-button type="primary" @click="submitModel(1)">通过</el-button>
<el-button type="primary" @click="submitModel(2)">退回</el-button> <el-button type="primary" @click="submitModel(2)">退回</el-button>
<el-button @click="submitModelFlag = false">取消</el-button> <el-button @click="submitModelFlag = false">取消</el-button>
@ -849,6 +865,7 @@ import {
queryHistoryRecord, // queryHistoryRecord, //
getSparPartImages, // getSparPartImages, //
getConfirmButtonOperator, // getConfirmButtonOperator, //
cancelDefect, //
} from "@/api/eam/eam.js" } from "@/api/eam/eam.js"
import { import {
downLoadObjectFile, downLoadObjectFile,
@ -1564,6 +1581,11 @@ export default {
feedbackBy: '', feedbackBy: '',
actualOperatorName: '', actualOperatorName: '',
knowledgeFlag: '', knowledgeFlag: '',
isAgreed: '',
disagreeReason: '',
assistUser: '',
assistUserName: '',
functionType: '',
}, },
abandonedData: { abandonedData: {
site: '', site: '',
@ -1588,6 +1610,8 @@ export default {
defectID: '', defectID: '',
defectDesc: '', defectDesc: '',
actualOperatorName: '', actualOperatorName: '',
assistUser: '',
assistUserName: '',
planDate: '', planDate: '',
reachDate: '', reachDate: '',
actualDate: '', actualDate: '',
@ -2542,6 +2566,13 @@ export default {
this.submitData.actualOperatorName = this.detailData.actualOperatorName this.submitData.actualOperatorName = this.detailData.actualOperatorName
this.submitData.knowledgeFlag = this.detailData.knowledgeFlag this.submitData.knowledgeFlag = this.detailData.knowledgeFlag
this.submitData.updateBy = this.$store.state.user.name this.submitData.updateBy = this.$store.state.user.name
this.submitData.isAgreed = ''
this.submitData.disagreeReason = ''
this.submitData.reachOperator = this.detailData.reachOperator || this.detailData.actualOperator || ''
this.submitData.reachOperatorName = this.detailData.reachOperatorName || this.detailData.actualOperatorName || ''
this.submitData.assistUser = this.detailData.assistUser
this.submitData.assistUserName = this.detailData.assistUserName
this.submitData.functionType = this.detailData.functionType
// if (this.detailData.status === '') { // if (this.detailData.status === '') {
// this.$confirm(`?`, '', { // this.$confirm(`?`, '', {
// confirmButtonText: '', // confirmButtonText: '',
@ -2622,11 +2653,20 @@ export default {
this.$message.warning('请选择难度等级!') this.$message.warning('请选择难度等级!')
return return
} }
if (this.submitData.isAgreed === '' || this.submitData.isAgreed == null) {
this.$message.warning('请选择是否同意!')
return
}
if (this.submitData.isAgreed === 'N' && (this.submitData.disagreeReason === '' || this.submitData.disagreeReason == null)) {
this.$message.warning('请填写不同意的理由!')
return
}
submitDefect(this.submitData).then(({data}) => { submitDefect(this.submitData).then(({data}) => {
if (data && data.code === 0) { if (data && data.code === 0) {
this.getDataList() this.getDataList()
this.detailData.status = '已完工' this.detailData.status = '已完工'
this.submitModelFlag = false this.submitModelFlag = false
this.detailModelFlag = false
this.$message({ this.$message({
message: '操作成功', message: '操作成功',
type: 'success', type: 'success',
@ -2663,7 +2703,7 @@ export default {
} }
}, },
revokeModel(){ revokeModel(){
this.$confirm(`是否撤销审核,回退到‘待审核’状态?`, '提示', {
this.$confirm(`是否撤销审核,回退到'待审核'状态?`, '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning'
@ -2672,35 +2712,62 @@ export default {
this.$message.warning('无审核权限!') this.$message.warning('无审核权限!')
return return
} }
this.submitData.site = this.detailData.site
this.submitData.buNo = this.detailData.buNo
this.submitData.orderNo = this.detailData.orderNo
this.submitData.planID = this.detailData.planID
this.submitData.objectID = this.detailData.objectID
this.submitData.planDesc = this.detailData.feedBackDesc
this.submitData.disposalMeasures = this.detailData.disposalMeasures
this.submitData.defectID = this.detailData.defectID
this.submitData.defectDesc = this.detailData.defectDesc
this.submitData.remark = this.detailData.remark
this.submitData.difficultyLevel = ''
this.submitData.difficultyRemark = ''
this.submitData.faultReason = this.detailData.faultReason
this.submitData.handlingMethod = this.detailData.handlingMethod
this.submitData.preventiveMeasure = this.detailData.preventiveMeasure
this.submitData.feedbackBy = this.detailData.createBy
this.submitData.actualOperatorName = this.detailData.actualOperatorName
this.submitData.knowledgeFlag = this.detailData.knowledgeFlag
this.submitData.updateBy = this.$store.state.user.name
this.submitData.status = '待审核'
submitDefect(this.submitData).then(({data}) => {
const deleteData = {
site: this.detailData.site,
buNo: this.detailData.buNo,
orderNo: this.detailData.orderNo,
functionType: this.detailData.functionType,
assistUser: this.detailData.assistUser
}
cancelDefect(deleteData).then(({data}) => {
if (data && data.code === 0) { if (data && data.code === 0) {
this.getDataList()
this.detailData.status = '待审核'
this.$message({
message: '操作成功',
type: 'success',
duration: 1500,
onClose: () => {
//
this.submitData.site = this.detailData.site
this.submitData.buNo = this.detailData.buNo
this.submitData.orderNo = this.detailData.orderNo
this.submitData.planID = this.detailData.planID
this.submitData.objectID = this.detailData.objectID
this.submitData.planDesc = this.detailData.feedBackDesc
this.submitData.disposalMeasures = this.detailData.disposalMeasures
this.submitData.defectID = this.detailData.defectID
this.submitData.defectDesc = this.detailData.defectDesc
this.submitData.remark = this.detailData.remark
this.submitData.difficultyLevel = ''
this.submitData.difficultyRemark = ''
this.submitData.faultReason = this.detailData.faultReason
this.submitData.handlingMethod = this.detailData.handlingMethod
this.submitData.preventiveMeasure = this.detailData.preventiveMeasure
this.submitData.feedbackBy = this.detailData.createBy
this.submitData.actualOperatorName = this.detailData.actualOperatorName
this.submitData.knowledgeFlag = this.detailData.knowledgeFlag
this.submitData.updateBy = this.$store.state.user.name
this.submitData.isAgreed = ''
this.submitData.disagreeReason = ''
this.submitData.reachOperator = this.detailData.reachOperator || this.detailData.actualOperator || ''
this.submitData.reachOperatorName = this.detailData.reachOperatorName || this.detailData.actualOperatorName || ''
this.submitData.assistUser = this.detailData.assistUser
this.submitData.assistUserName = this.detailData.assistUserName
this.submitData.functionType = this.detailData.functionType
this.submitData.status = '待审核'
submitDefect(this.submitData).then(({data}) => {
if (data && data.code === 0) {
this.getDataList()
this.detailData.status = '待审核'
this.detailModelFlag = false
this.$message({
message: '操作成功',
type: 'success',
duration: 1500,
onClose: () => {
}
})
} else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
} }
}) })
} else { } else {

168
src/views/modules/reportWorkOrder/reportDefectOrder2.vue

@ -246,11 +246,15 @@
<el-input v-model="saveData.defectID" style="width: 120px"></el-input> <el-input v-model="saveData.defectID" style="width: 120px"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="故障名称" style="margin-left: -10px"> <el-form-item label="故障名称" style="margin-left: -10px">
<el-input v-model="saveData.defectDesc" disabled style="width: 200px"></el-input>
<el-input v-model="saveData.defectDesc" disabled style="width: 180px"></el-input>
</el-form-item> </el-form-item>
<el-form-item prop="operatorName"> <el-form-item prop="operatorName">
<span slot="label" @click="getOperatorList"><a href="#">实际维修人员</a></span>
<el-input v-model="saveData.operatorName" style="width: 285px"></el-input>
<span slot="label" @click="saveData.buNo !== '03-RFID' && getOperatorList()"><a href="#">实际维修人员</a></span>
<el-input v-model="saveData.operatorName" style="width: 140px" :readonly="saveData.buNo === '03-RFID'"></el-input>
</el-form-item>
<el-form-item prop="assistUserName" v-if="saveData.buNo === '03-RFID'">
<span slot="label" @click="addAssistantModal"><a href="#">协助人</a></span>
<el-input v-model="saveData.assistUserName" style="width: 140px" readonly placeholder="点击选择协助人"></el-input>
</el-form-item> </el-form-item>
<el-form-item :label="' '"> <el-form-item :label="' '">
<el-button type="primary" @click="uploadFaultImageModal">故障图片</el-button> <el-button type="primary" @click="uploadFaultImageModal">故障图片</el-button>
@ -614,7 +618,10 @@
<el-dialog title="到达" :close-on-click-modal="false" v-drag :visible.sync="chooseReachModelFlag" width="410px"> <el-dialog title="到达" :close-on-click-modal="false" v-drag :visible.sync="chooseReachModelFlag" width="410px">
<el-form :inline="true" label-position="top"> <el-form :inline="true" label-position="top">
<el-form-item >
<el-form-item v-if="reachData.buNo === '03-RFID'" label="到达人员">
<el-input v-model="saveData.operatorName" style="width: 389px" readonly></el-input>
</el-form-item>
<el-form-item v-else>
<span slot="label" @click="getOperatorList()"><a>选择到达人员</a></span> <span slot="label" @click="getOperatorList()"><a>选择到达人员</a></span>
<el-input v-model="saveData.operatorName" style="width: 389px"></el-input> <el-input v-model="saveData.operatorName" style="width: 389px"></el-input>
</el-form-item> </el-form-item>
@ -625,6 +632,67 @@
</el-footer> </el-footer>
</el-dialog> </el-dialog>
<!-- 协助人选择对话框 -->
<el-dialog title="选择协助人" :close-on-click-modal="false" v-drag :visible.sync="assistantModelFlag" width="820px">
<div class="rq">
<el-form :inline="true" label-position="top" :model="operatorData">
<el-form-item :label="'所属角色'">
<el-select v-model="operatorData.roleId" placeholder="请选择" style="width: 120px">
<el-option
v-for = "i in roleList"
:key = "i.roleId"
:label = "i.roleName"
:value = "i.roleId">
</el-option>
</el-select>
</el-form-item>
<el-form-item :label="'人员编码'">
<el-input v-model="operatorData.adminID" clearable style="width: 120px"></el-input>
</el-form-item>
<el-form-item :label="'人员姓名'">
<el-input v-model="operatorData.adminName" clearable style="width: 120px"></el-input>
</el-form-item>
<el-form-item :label="' '">
<el-button type="primary" @click="getOperatorList2">查询</el-button>
</el-form-item>
</el-form>
<el-table
:height="300"
:data="operatorList"
ref="operatorTable"
@row-click="operatorClickRow"
@selection-change="selectionChangeHandle2"
border
style="width: 100%;">
<el-table-column
type="selection"
header-align="center"
align="center"
width="50">
</el-table-column>
<el-table-column
v-for="(item,index) in operatorDetailList" :key="index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed==''?false:item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<span v-if="!item.columnHidden">{{ scope.row[item.columnProp] }}</span>
<span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
</template>
</el-table-column>
</el-table>
</div>
<el-footer style="height:40px;margin-top: 20px;text-align:center">
<el-button type="primary" @click="confirmAssistant()">确认</el-button>
<el-button type="primary" @click="assistantModelFlag = false">关闭</el-button>
</el-footer>
</el-dialog>
<el-dialog title="核心备件" :close-on-click-modal="false" v-drag :visible.sync="coreComponentFlag" width="450px"> <el-dialog title="核心备件" :close-on-click-modal="false" v-drag :visible.sync="coreComponentFlag" width="450px">
<el-form :inline="true" label-position="top"> <el-form :inline="true" label-position="top">
<el-form-item label="备件编码"> <el-form-item label="备件编码">
@ -1163,6 +1231,8 @@ export default {
defectDesc: '', defectDesc: '',
operator: '', operator: '',
operatorName: '', operatorName: '',
assistUser: '',
assistUserName: '',
disposalMeasures: '', disposalMeasures: '',
objectID: '', objectID: '',
objectDesc: '', objectDesc: '',
@ -1195,6 +1265,7 @@ export default {
operatorModelFlag: false, operatorModelFlag: false,
operatorList: [], operatorList: [],
roleList: [], roleList: [],
assistantModelFlag: false,
dataListSelections2: [], dataListSelections2: [],
operatorDetailList: [ operatorDetailList: [
{ {
@ -2176,7 +2247,9 @@ export default {
// //
getOperatorList(this.operatorData).then(({data}) => { getOperatorList(this.operatorData).then(({data}) => {
if (data && data.code === 0) { if (data && data.code === 0) {
this.operatorList = data.rows
//
const actualOperators = (this.saveData.operator || '').split(';').filter(item => item.trim() !== '')
this.operatorList = data.rows.filter(item => !actualOperators.includes(item.adminID))
} else { } else {
this.operatorList = [] this.operatorList = []
} }
@ -2223,6 +2296,66 @@ export default {
this.operatorModelFlag = false this.operatorModelFlag = false
}, },
//
addAssistantModal () {
this.operatorData.bu = this.saveData.site + '_' + this.saveData.buNo
if (this.roleList.length > 0) {
let filterList = this.roleList.filter(item => item.roleName === '机修')
if (filterList.length > 0) {
this.operatorData.roleId = filterList[0].roleId
} else {
this.operatorData.roleId = this.roleList[0].roleId
}
} else {
this.operatorData.roleId = ''
}
//
this.$nextTick(() => this.$refs.operatorTable.clearSelection())
//
let tempDataList = (this.saveData.assistUser == null ? '' : this.saveData.assistUser).split(';')
//
getOperatorList(this.operatorData).then(({data}) => {
if (data && data.code === 0) {
//
const actualOperators = (this.saveData.operator || '').split(';').filter(item => item.trim() !== '')
this.operatorList = data.rows.filter(item => !actualOperators.includes(item.adminID))
this.operatorList.forEach(val => {
//
if (tempDataList.includes(val.adminID)) {
this.$nextTick(() => this.$refs.operatorTable.toggleRowSelection(val, true))
}
})
this.assistantModelFlag = true
} else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
}
})
},
//
confirmAssistant () {
if (!this.dataListSelections2 || this.dataListSelections2.length === 0) {
this.$message.warning('请选择协助人!')
return
}
// 使
let assistUsers = []
let assistUserNames = []
for (let i = 0; i < this.dataListSelections2.length; i++) {
assistUsers.push(this.dataListSelections2[i].adminID)
assistUserNames.push(this.dataListSelections2[i].adminName)
}
//
this.saveData.assistUser = assistUsers.join(';')
this.saveData.assistUserName = assistUserNames.join(';')
this.assistantModelFlag = false
},
// //
favoriteIsOk () { favoriteIsOk () {
let userFavorite = { let userFavorite = {
@ -2460,8 +2593,14 @@ export default {
chooseReachOperator (row) { chooseReachOperator (row) {
this.saveData.site = row.site this.saveData.site = row.site
this.saveData.buNo = row.buNo this.saveData.buNo = row.buNo
this.saveData.operator = ''
this.saveData.operatorName = ''
// 03-RFID BU
if (row.buNo === '03-RFID') {
this.saveData.operator = row.planOperator || ''
this.saveData.operatorName = row.planOperatorName || ''
} else {
this.saveData.operator = ''
this.saveData.operatorName = ''
}
this.operatorData.bu = row.site + '_' + row.buNo this.operatorData.bu = row.site + '_' + row.buNo
this.reachData = row this.reachData = row
this.chooseReachModelFlag = true this.chooseReachModelFlag = true
@ -2471,11 +2610,12 @@ export default {
// //
reach () { reach () {
if (this.saveData.operator === '' || this.saveData.operator == null) { // 2025-02-13
this.$message.warning('请选择到达人员!')
if (this.saveData.operator === '' || this.saveData.operator == null) {
this.$message.warning('到达人员不能为空!')
return return
} }
if (this.buNo != '01-Label' && this.planPeople){
// 03-RFID BU
if (this.buNo != '01-Label' && this.buNo != '03-RFID' && this.planPeople){
if (!this.saveData.operatorName.includes(this.planPeople)){ if (!this.saveData.operatorName.includes(this.planPeople)){
this.$message.warning('到达人员中不包含计划人员!') this.$message.warning('到达人员中不包含计划人员!')
return return
@ -2531,8 +2671,10 @@ export default {
checkWorkPlanId: row.checkWorkPlanId, checkWorkPlanId: row.checkWorkPlanId,
checkItemNo: row.checkItemNo, checkItemNo: row.checkItemNo,
reachDate: row.reachDate, reachDate: row.reachDate,
operator: row.result == null ? row.reachOperator : row.adminID,
operatorName: row.result == null ? row.reachOperatorName : row.operator,
operator: row.buNo === '03-RFID' ? (row.planOperator || row.reachOperator) : (row.result == null ? row.reachOperator : row.adminID),
operatorName: row.buNo === '03-RFID' ? (row.planOperatorName || row.reachOperatorName) : (row.result == null ? row.reachOperatorName : row.operator),
assistUser: row.assistUser || '',
assistUserName: row.assistUserName || '',
handlingMethod: row.handlingMethod, handlingMethod: row.handlingMethod,
feedBackDesc: row.feedBackDesc, feedBackDesc: row.feedBackDesc,
faultReason: row.faultReason, faultReason: row.faultReason,
@ -2579,7 +2721,7 @@ export default {
this.$message.warning('请填写处理方式,且大于十个字数!') this.$message.warning('请填写处理方式,且大于十个字数!')
return return
} }
if (this.buNo != '01-Label' && this.saveData.planOperatorName){
if (this.buNo != '01-Label' && this.buNo != '03-RFID' && this.saveData.planOperatorName){
if (!this.saveData.operatorName.includes(this.saveData.planOperatorName)){ if (!this.saveData.operatorName.includes(this.saveData.planOperatorName)){
this.$message.warning('实际执行人员中不包含计划人员,请检查!') this.$message.warning('实际执行人员中不包含计划人员,请检查!')
return return

Loading…
Cancel
Save