<template>
|
<a-modal
|
:title="title"
|
:width="width"
|
:visible="visible"
|
:footer="null"
|
@cancel="handCancel"
|
>
|
<a-card :bordered="false">
|
<div>
|
<b>{{ selectShenpiData.description }}</b>
|
<br>
|
<br>
|
<a-tag color="blue">
|
处理人 {{ selectShenpiData.assignee_dictText }}
|
</a-tag>
|
<a-tag color="blue">
|
创建时间 {{ selectShenpiData.createTime }}
|
</a-tag>
|
<br>
|
<br>
|
<button @click="fetchAndShowBmp" class="btn-custom">打开流程图</button>
|
<div v-if="imageSrc">
|
<img :src="imageSrc" alt="Fetched Image" />
|
</div>
|
<hr class="shallow-hr">
|
</div>
|
<div>
|
<b>报损详情</b>
|
<br>
|
<a-form :form="form">
|
<a-spin :spinning="spinning">
|
<a-tabs default-active-key="1" @change="callback">
|
<a-tab-pane key="1" tab="报损基本信息">
|
<a-form-model ref="form" :model="tableRowRecord">
|
<a-row>
|
<a-col :span="span">
|
<a-form-model-item label="报损单单号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="outNum">
|
<a-input disabled v-model="tableRowRecord.orderCode"></a-input>
|
</a-form-model-item>
|
</a-col>
|
<a-col :span="span">
|
<a-form-model-item label="报损人" :labelCol="labelCol" :wrapperCol="wrapperCol"
|
prop="outStorehouseType">
|
<j-dict-select-tag disabled
|
v-model="tableRowRecord.losser" dictCode="sys_user,realname,id"
|
placeholder="请选择" />
|
</a-form-model-item>
|
</a-col>
|
</a-row>
|
<a-row>
|
<a-col :span="span">
|
<a-form-model-item label="报损时间" :labelCol="labelCol" :wrapperCol="wrapperCol"
|
prop="outboundTime">
|
<j-date disabled v-model="tableRowRecord.lossTime" :show-time="true"
|
dateFormat="YYYY-MM-DD HH:mm" style="width: 100%" />
|
</a-form-model-item>
|
</a-col>
|
<a-col :span="span">
|
<a-form-model-item label="报损原因" :labelCol="labelCol" :wrapperCol="wrapperCol"
|
prop="subjectMatter">
|
<a-input disabled v-model="tableRowRecord.lossReason"></a-input>
|
</a-form-model-item>
|
</a-col>
|
</a-row>
|
<a-row>
|
<a-col :span="span">
|
<a-form-model-item label="经手人" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="handler">
|
<j-dict-select-tag disabled
|
v-model="tableRowRecord.handler" dictCode="sys_user,realname,id"
|
placeholder="请选择" />
|
</a-form-model-item>
|
</a-col>
|
<a-col :span="span">
|
<a-form-model-item label="备注" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="remark">
|
<a-textarea disabled v-model="tableRowRecord.remark" rows="4" />
|
</a-form-model-item>
|
</a-col>
|
</a-row>
|
</a-form-model>
|
</a-tab-pane>
|
<a-tab-pane key="2" tab="报损明细信息">
|
<a-table
|
ref="table"
|
size="middle"
|
bordered
|
rowKey="id"
|
:scroll="{x:'max-content'}"
|
:columns="columns"
|
:dataSource="dataSource"
|
:pagination="ipagination"
|
:loading="loading"
|
:rowSelection="null">
|
</a-table>
|
</a-tab-pane>
|
<a-tab-pane key="3" tab="流程节点">
|
<a-timeline>
|
<a-timeline-item v-for="(item,index) in hitaskDataSource" :key="index">
|
<div>
|
<h3 style="font-weight: bold;">{{ item.taskName }}</h3>
|
<div>处理人:{{ item.assignee_dictText }}</div>
|
<div v-if="index !==0">处理时长:{{ item.duration }}</div>
|
<div v-if="item.name !== '提交申请'">处理类型:{{ item.sequenceFlowName }}</div>
|
<div v-if="item.description">处理意见:{{ item.description }}</div>
|
</div>
|
</a-timeline-item>
|
</a-timeline>
|
</a-tab-pane>
|
</a-tabs>
|
</a-spin>
|
</a-form>
|
</div>
|
<div v-if="auditVisible">
|
<hr class="shallow-hr">
|
<br>
|
<b>审批详情</b>
|
<br>
|
<a-form-model ref="form" :model="approveData" :rules="validatorRules" slot="detail">
|
<a-row>
|
<a-col ::span="span">
|
<a-form-model-item label="申请人" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="handler_dictText">
|
<a-input :readOnly="inputReadOnly" v-model="tableRowRecord.handler_dictText"></a-input>
|
</a-form-model-item>
|
</a-col>
|
<a-col ::span="span">
|
<a-form-model-item label="申请时间" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="createTime">
|
<a-input :readOnly="inputReadOnly" v-model="tableRowRecord.createTime"></a-input>
|
</a-form-model-item>
|
</a-col>
|
<a-col :span="24" class="btxx">
|
<a-form-item label="审批状态" :labelCol="labelCol" :wrapperCol="wrapperCol">
|
<a-select :disabled="disableSubmit" v-model="assignFileStream.status" placeholder="请选择审批结果">
|
<a-select-option value="3">通过</a-select-option>
|
<a-select-option value="4">驳回</a-select-option>
|
</a-select>
|
</a-form-item>
|
</a-col>
|
<a-col :span="24" class="btxx">
|
<a-form-model-item label="审批意见" :labelCol="labelCol" :wrapperCol="wrapperCol">
|
<a-textarea :disabled="disableSubmit" v-model="assignFileStream.approvalOpinion" rows="4"
|
placeholder="请输入审批意见" />
|
</a-form-model-item>
|
</a-col>
|
</a-row>
|
<div class="table-operator" style="text-align: right;">
|
<a-button
|
@click="handleQueXiaoTask"
|
icon="close"
|
:disabled="isSubmitting"
|
:class="{'disabled-btn': isSubmitting}"
|
>取消</a-button>
|
<a-button
|
@click="submitForm"
|
type="primary"
|
:disabled="isSubmitting"
|
:loading="isSubmitting"
|
>
|
提 交
|
</a-button>
|
</div>
|
</a-form-model>
|
</div>
|
</a-card>
|
|
|
</a-modal>
|
</template>
|
|
<script>
|
|
import '@assets/less/TableExpand.less'
|
import { mixinDevice } from '@/utils/mixin'
|
import { downFile, getAction, httpAction } from '@api/manage'
|
|
export default {
|
name: 'lossBoundHandle',
|
mixins: [mixinDevice],
|
props: {
|
selectShenpiData: {
|
type: Object,
|
required: true
|
}
|
},
|
|
data() {
|
return {
|
form: this.$form.createForm(this),
|
span: 12,
|
span1: 8,
|
disableSubmit: false,
|
inputReadOnly: true,
|
spinning: false,
|
tableRowRecord: {},
|
assignFileStream: {},
|
tableDataSource: [],
|
usageDataSource: [],
|
hitaskDataSource: [],
|
dataSource: [],
|
bomForm: {},
|
imageSrc: null,
|
drawerVisible: true,
|
auditVisible: true,
|
loading: false,
|
labelCol: {
|
xs: { span: 24 },
|
sm: { span: 5 }
|
},
|
wrapperCol: {
|
xs: { span: 30 },
|
sm: { span: 16 }
|
},
|
/* 分页参数 */
|
ipagination: {
|
current: 1,
|
pageSize: 5,
|
pageSizeOptions: ['5', '10', '50'],
|
showTotal: (total, range) => {
|
return range[0] + '-' + range[1] + ' 共' + total + '条'
|
},
|
showQuickJumper: true,
|
showSizeChanger: true,
|
total: 0
|
},
|
columns: [
|
{
|
title: '#',
|
dataIndex: '',
|
key: 'rowIndex',
|
width: 60,
|
align: 'center',
|
customRender: function(t, r, index) {
|
return parseInt(index) + 1
|
}
|
},
|
{
|
title: '刀具编号',
|
align: 'center',
|
dataIndex: 'toolCode'
|
},
|
{
|
title: '工具类型',
|
align: 'center',
|
dataIndex: 'applicationType_dictText'
|
},
|
{
|
title: '报损原因',
|
align: 'center',
|
dataIndex: 'lossReason'
|
},
|
{
|
title: '报损数量',
|
align: 'center',
|
dataIndex: 'lossNumber'
|
},
|
{
|
title: '中文名称',
|
align: 'center',
|
dataIndex: 'chineseName'
|
},
|
{
|
title: '型号/图号',
|
align: 'center',
|
dataIndex: 'toolModel'
|
},
|
{
|
title: '刀具材料',
|
align: 'center',
|
dataIndex: 'toolMaterial'
|
},
|
{
|
title: '零件材料',
|
align: 'center',
|
dataIndex: 'partMaterial'
|
},
|
{
|
title: '厂家',
|
align: 'center',
|
dataIndex: 'supplierId'
|
},
|
{
|
title: '存储位置(库位号)',
|
align: 'center',
|
dataIndex: 'positionCode'
|
},
|
|
{
|
title: '创建时间',
|
align: 'center',
|
dataIndex: 'createTime'
|
},
|
{
|
title: '备注',
|
align: 'center',
|
dataIndex: 'remark'
|
}
|
],
|
validatorRules: {
|
status: {
|
rules: [
|
{ required: true, message: '请选择审批状态!' }
|
]
|
}
|
},
|
approveData: {},
|
flowData: {},
|
title: '审批页面',
|
width: 1200,
|
visible: false,
|
// 表头
|
url: {
|
queryLossBoundOrder: '/tms/toolsLossBound/queryById',
|
queryLossBoundDetailList: '/tms/toolsLossBound/listlossboundDetailByMainId',
|
diagramView: '/assign/flow/diagramView',
|
queryHisTaskList: '/assign/flow/queryHisTaskList',
|
approve: '/tms/toolsLossBound/approval'
|
},
|
dictOptions: {},
|
superFieldList: [],
|
workflowSource: [],
|
isSubmitting: false,
|
}
|
},
|
created() {
|
},
|
computed: {},
|
methods: {
|
callback() {
|
},
|
handCancel() {
|
this.visible = false
|
},
|
clearTableSource() {
|
this.tableDataSource = []
|
this.usageDataSource = []
|
},
|
fetchAndShowBmp() {
|
console.log('flowData----->', this.flowData)
|
try {
|
let parm = {
|
processDefinitionId: this.flowData.processDefinitionId,
|
processInstanceId: this.flowData.processInstanceId,
|
TaskDefinitionKey: this.flowData.processDefinitionKey
|
}
|
downFile(this.url.diagramView, parm, 'get').then((res => {
|
console.log('Pica------>', res)
|
const urlObject = window.URL.createObjectURL(new Blob([res]))
|
this.imageSrc = urlObject
|
}))
|
} catch (error) {
|
console.error('Error fetching image blob:', error)
|
alert('无法加载图片,请稍后再试。')
|
}
|
},
|
handleQueXiaoTask() {
|
// 如果正在提交,阻止取消操作
|
if (this.isSubmitting) return;
|
this.visible = false;
|
this.routeReload();
|
},
|
submitForm() {
|
// 如果正在提交,阻止重复点击
|
if (this.isSubmitting) return;
|
|
// 开启全局禁选
|
this.isSubmitting = true;
|
document.body.classList.add('submitting');
|
|
const that = this;
|
|
// 定义一个恢复状态的函数
|
const resetState = () => {
|
that.isSubmitting = false;
|
document.body.classList.remove('submitting');
|
};
|
|
if (!that.assignFileStream.status == null || that.assignFileStream.status === undefined) {
|
this.$message.warning('请选择审批状态!')
|
return false
|
}
|
if (!that.assignFileStream.approvalOpinion == null || that.assignFileStream.approvalOpinion === undefined) {
|
this.$message.warning('请输入审批意见!')
|
return false
|
}
|
// 触发表单验证
|
this.form.validateFields((err, values) => {
|
if (err) {
|
resetState(); // 验证失败,恢复状态
|
return;
|
}
|
if (!err) {
|
that.confirmLoading = true
|
let url = this.url.approve
|
let method = 'post'
|
let flowTaskVo = {}
|
flowTaskVo.status = that.assignFileStream.status
|
flowTaskVo.approvalOpinion = that.assignFileStream.approvalOpinion
|
flowTaskVo.comment = that.assignFileStream.approvalOpinion
|
flowTaskVo.dataId = this.selectShenpiData.dataId
|
flowTaskVo.taskId = this.selectShenpiData.id
|
flowTaskVo.userId = this.selectShenpiData.assignee
|
flowTaskVo.instanceId = this.selectShenpiData.procInstId
|
flowTaskVo.targetKey = this.selectShenpiData.taskDefKey
|
flowTaskVo.values = this.selectShenpiData.variables
|
flowTaskVo.assignee = this.selectShenpiData.assignee
|
console.log('表单提交数据', flowTaskVo)
|
httpAction(url, flowTaskVo, method).then((res) => {
|
if (res.success) {
|
that.$message.success(res.message)
|
that.visible = false
|
//刷新表格
|
that.$emit('searchReset')
|
} else {
|
that.$message.warning(res.message)
|
}
|
})
|
.catch((error) => {
|
console.error(error);
|
that.$message.error('提交失败');
|
})
|
.finally(() => {
|
that.confirmLoading = false;
|
resetState(); // 请求结束,恢复状态
|
});
|
}
|
|
})
|
},
|
/**
|
* 获取流程节点和流程图
|
* @param record 待办记录信息
|
*/
|
getAllApproveData(item) {
|
this.visible = true
|
this.loading = true
|
console.log('selectShenpiData----->', this.selectShenpiData)
|
this.flowData = item
|
getAction(this.url.queryHisTaskList, { procInstId: item.procInstId }).then(res => {
|
if (res.success) {
|
this.hitaskDataSource = res.result
|
}
|
})
|
getAction(this.url.queryLossBoundOrder, { id: item.dataId }).then((res => {
|
if (res.success) {
|
this.tableRowRecord = res.result
|
}
|
}))
|
getAction(this.url.queryLossBoundDetailList, { lossBoundId: item.dataId }).then(res => {
|
if (res.success) {
|
this.dataSource = res.result.records
|
if (res.result.total) {
|
this.ipagination.total = res.result.total
|
} else {
|
this.ipagination.total = 0
|
}
|
} else {
|
this.$message.warning(res.message)
|
}
|
}).finally(() => {
|
this.loading = false
|
})
|
}
|
}
|
}
|
</script>
|
<style scoped>
|
/* 全局禁选样式 - 作用于整个页面 */
|
html.submitting,
|
html.submitting body {
|
pointer-events: none !important;
|
cursor: wait !important;
|
}
|
|
/* 蒙层效果增强 */
|
html.submitting::before {
|
content: '';
|
position: fixed;
|
top: 0;
|
left: 0;
|
right: 0;
|
bottom: 0;
|
background: rgba(255, 255, 255, 0.5);
|
z-index: 9998;
|
}
|
|
/* 加载指示器 - 更明显的视觉反馈 */
|
html.submitting::after {
|
content: '提交中...';
|
position: fixed;
|
top: 50%;
|
left: 50%;
|
transform: translate(-50%, -50%);
|
background: #1890ff;
|
color: white;
|
padding: 10px 20px;
|
border-radius: 4px;
|
z-index: 9999;
|
}
|
|
/* 禁用状态按钮样式 */
|
.disabled-btn {
|
opacity: 0.6;
|
cursor: not-allowed !important;
|
}
|
.shallow-hr {
|
border: 0;
|
height: 1px; /* 分界线的高度 */
|
background-color: rgba(0, 0, 0, 0.1); /* 使用 RGBA 颜色,并设置较低的透明度 */
|
margin: 20px 0; /* 分界线上下的外边距 */
|
}
|
|
.btn-custom {
|
background-color: #4CAF50; /* 绿色背景 */
|
color: white; /* 白色文字 */
|
border: none; /* 无边框 */
|
padding: 5px 15px; /* 内边距 */
|
text-align: center; /* 文字居中 */
|
text-decoration: none; /* 无下划线 */
|
display: inline-block; /* 行内块元素 */
|
font-size: 12px; /* 字体大小 */
|
margin: 4px 2px; /* 外边距 */
|
cursor: pointer; /* 鼠标悬停时显示手型 */
|
border-radius: 4px; /* 圆角边框 */
|
}
|
|
.bold-large-label {
|
font-weight: bold;
|
font-size: 20px; /* 或你需要的任何大小 */
|
}
|
|
.left_qiu {
|
position: absolute;
|
left: -74px;
|
top: 0;
|
width: 54px;
|
border-radius: 50%;
|
height: 54px;
|
font-size: 13px;
|
margin: auto;
|
display: flex;
|
flex-wrap: wrap;
|
align-items: center;
|
justify-content: center;
|
background: #0099ff;
|
transform: translate(0, 0);
|
}
|
|
/deep/ .ant-timeline-item-tail {
|
left: -29px !important;
|
}
|
|
.left_qiu span {
|
width: 3em;
|
display: block;
|
color: #fff;
|
text-align: center;
|
}
|
|
.img {
|
width: 75%;
|
}
|
|
.wrap {
|
clear: both;
|
width: 100%;
|
display: flex;
|
height: 50px;
|
border: 1px solid #ccc;
|
/* background-color: aqua; */
|
}
|
|
.box {
|
width: 21%;
|
height: 50px;
|
border-right: 1px solid #ccc;
|
line-height: 50px;
|
/* background: red; */
|
text-align: center;
|
margin: auto;
|
}
|
|
@import '~@assets/less/common.less';
|
</style>
|