<!--
|
Description: 工作流-出库申请单审批处理页面 List
|
Author: 作者 liuyh
|
Date: 2025-02-27
|
-->
|
<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='coldisabled' v-model='tableRowRecord.outNum'></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="coldisabled" type="list" v-model="tableRowRecord.outStorehouseType" dictCode="out_storehouse_type" />
|
</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="coldisabled" v-model="tableRowRecord.outboundTime" :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='coldisabled' v-model='tableRowRecord.subjectMatter'></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'>
|
<a-input :disabled='coldisabled' 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='remark'>
|
<a-textarea :disabled="coldisabled" 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 :disabled='coldisabled' 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 :disabled='coldisabled' 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 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 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 { getAction, deleteAction, postAction, downFile, httpAction } from '@api/manage'
|
export default {
|
name: 'FlowShenPi',
|
mixins: [mixinDevice],
|
props: {
|
selectShenpiData: {
|
type: Object,
|
required: true
|
}
|
},
|
|
data() {
|
return {
|
form: this.$form.createForm(this),
|
span: 12,
|
span1: 8,
|
coldisabled: 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:"left",
|
dataIndex: 'toolNum'
|
},
|
{
|
title:'工具编号',
|
align:"left",
|
dataIndex: 'toolId'
|
},
|
{
|
title:'工具类型',
|
align:"center",
|
dataIndex: 'applicationType_dictText'
|
},
|
{
|
title:'中文名称',
|
align:"center",
|
dataIndex: 'chineseName'
|
},
|
{
|
title:'型号/图号',
|
align:"left",
|
dataIndex: 'toolModel'
|
},
|
{
|
title:'刀具材料',
|
align:"center",
|
dataIndex: 'toolMaterial'
|
},
|
{
|
title:'零件材料',
|
align:"center",
|
dataIndex: 'partMaterial'
|
},
|
{
|
title:'厂家',
|
align:"center",
|
dataIndex: 'supplierId'
|
},
|
{
|
title:'仓库',
|
align:"center",
|
dataIndex: 'warehouseName'
|
},
|
{
|
title:'出库库位',
|
align:"center",
|
dataIndex: 'outboundLocation'
|
},
|
{
|
title:'可用库存数量',
|
align:"left",
|
dataIndex: 'quantity'
|
},
|
{
|
title:'申请出库数量',
|
align:"left",
|
dataIndex: 'outboundQuantity'
|
},
|
{
|
title:'创建时间',
|
align:"left",
|
dataIndex: 'createTime'
|
}
|
],
|
validatorRules: {
|
status: {
|
rules: [
|
{ required: true, message: '请选择审批状态!'},
|
]
|
},
|
},
|
approveData: {},
|
flowData: {},
|
title: '审批页面',
|
width: 1200,
|
visible: false,
|
// 表头
|
url: {
|
queryOutBoundOrder: '/tms/outboundOrder/queryById',
|
queryOutBoundDetailList: '/tms/outboundOrder/listOutboundDetailByMainId',
|
diagramView: '/assign/flow/diagramView',
|
queryHisTaskList:'/assign/flow/queryHisTaskList',
|
approve:"/tms/outboundOrder/approval",
|
},
|
dictOptions: {},
|
superFieldList: [],
|
workflowSource: [],
|
isSubmitting: false,
|
}
|
},
|
created() {
|
},
|
computed: {},
|
methods: {
|
callback() {
|
},
|
handCancel() {
|
this.assignFileStream = {}
|
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);
|
this.handCancel()
|
//刷新表格
|
that.$emit('searchReset')
|
}else{
|
that.$message.warning(res.message);
|
}
|
})
|
.catch((error) => {
|
console.error(error);
|
that.$message.error('提交失败');
|
})
|
.finally(() => {
|
that.confirmLoading = false;
|
resetState(); // 请求结束,恢复状态
|
});
|
}
|
})
|
},
|
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.queryOutBoundOrder, {id: item.dataId}).then((res => {
|
if (res.success) {
|
this.tableRowRecord = res.result
|
}
|
}))
|
getAction(this.url.queryOutBoundDetailList, {outStorehouseId: 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>
|