From 0f8473285bcbbe7f8cf07f952bb7017640a6144e Mon Sep 17 00:00:00 2001 From: cuilei <ray_tsu1@163.com> Date: 星期四, 22 五月 2025 13:48:11 +0800 Subject: [PATCH] 工具管理-工具出库申请流程审批页面 --- src/views/tms/OutboundOrderList.vue | 8 src/views/tms/OutboundDetailList.vue | 22 + src/views/tms/modules/outBound/OutboundOrderModal.vue | 2 src/views/flowable/workflow/FlowTodo.vue | 18 + src/views/flowable/workflow/outBoundOrder/OutBoundOrderHandle.vue | 513 +++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 550 insertions(+), 13 deletions(-) diff --git a/src/views/flowable/workflow/FlowTodo.vue b/src/views/flowable/workflow/FlowTodo.vue index c488506..4a2f84c 100644 --- a/src/views/flowable/workflow/FlowTodo.vue +++ b/src/views/flowable/workflow/FlowTodo.vue @@ -111,6 +111,8 @@ @searchReset="searchReset"></week-maintenance-approval-modal> <repair-order-approval-modal ref="repairOrderApprovalModal" @searchReset="searchReset" :selectShenpiData="selectRepairOrderData"></repair-order-approval-modal> + <out-bound-order-handle ref="outBoundOrderHandle" :selectShenpiData="selectOutBoundOrderData" + @searchReset="searchReset"></out-bound-order-handle> <!--鎵归噺澶勭悊--> <inspection-order-batch-handle ref="inspectionOrderBatchHandleRef" @searchReset="searchReset" @@ -143,7 +145,7 @@ import AssignFileStreamHandle from '@views/flowable/workflow/assignFileStream/AssignFileStreamHandle.vue' import DispatchFileHandle from '@views/flowable/workflow/dispatchFile/DispatchFileHandle.vue' import DispatchFileBachHandleStyle from '@views/flowable/workflow/dispatchFile/DispatchFileBachHandleStyle#Drawer.vue' - + import OutBoundOrderHandle from '@views/flowable/workflow/outBoundOrder/OutBoundOrderHandle.vue' import EquipmentLeanOutApprovalModal from '@views/flowable/workflow/leanOut/EquipmentLeanOutApprovalModal.vue' import SecondMaintenanceApprovalModal from '@views/flowable/workflow/secondMaintenance/SecondMaintenanceApprovalModal.vue' import ThirdMaintenanceApprovalModal from '@views/flowable/workflow/thirdMaintenance/ThirdMaintenanceApprovalModal.vue' @@ -163,7 +165,8 @@ InspectionOrderHandle, EquipmentLeanOutApprovalModal, SecondMaintenanceApprovalModal, - ThirdMaintenanceApprovalModal + ThirdMaintenanceApprovalModal, + OutBoundOrderHandle }, data() { return { @@ -245,6 +248,7 @@ selectThirdMaintenanceData: {}, selectBachData: {}, selectRepairOrderData: {}, + selectOutBoundOrderData: {}, //涓氬姟淇℃伅ID dataId: undefined } @@ -324,6 +328,9 @@ break case 'third_maintenance': this.handleThirdMaintenance(item) + break + case 'toolOutStorageApproval': + this.handleToolOutStorageApproval(item) break default: alert('娌℃壘鍒拌娴佺▼') @@ -431,6 +438,13 @@ this.$refs.thirdMaintenanceApprovalModal.disableSubmit = false } }, + handleToolOutStorageApproval(item) { + if (item && item.dataId) { + this.selectOutBoundOrderData = Object.assign({}, item) + this.$refs.outBoundOrderHandle.clearTableSource() + this.$refs.outBoundOrderHandle.getAllApproveData(item) + } + } } } </script> diff --git a/src/views/flowable/workflow/outBoundOrder/OutBoundOrderHandle.vue b/src/views/flowable/workflow/outBoundOrder/OutBoundOrderHandle.vue new file mode 100644 index 0000000..4fb9b29 --- /dev/null +++ b/src/views/flowable/workflow/outBoundOrder/OutBoundOrderHandle.vue @@ -0,0 +1,513 @@ +<!-- + 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 }} + </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' :rules='validatorRules'> + <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" :show-time="true" dateFormat="YYYY-MM-DD HH:mm" v-model="tableRowRecord.outboundTime"/> + </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'> + <j-select-user-by-dep :disabled='coldisabled' v-model="tableRowRecord.handler" :store="'id'" :text="'realname'" :multi="false"/> + </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> + <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"> + <j-dict-select-tag type='list' v-model='assignFileStream.status' dictCode='dnc_assign_stream_status' placeholder="璇烽�夋嫨瀹℃壒鐘舵��" /> + </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.approveContent" rows="4" placeholder="璇疯緭鍏ュ鎵规剰瑙�"/> + </a-form-model-item > + </a-col> + </a-row> + <div class="table-operator" style="text-align: right;"> + <a-button @click="handleQueXiaoTask" type="primary" icon="close">鍙栨秷</a-button> + <a-button @click="submitForm">鎻� 浜�</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: {}, + approveContent:"", + imageSrc: null, + drawerVisible: 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: { + version: { + rules: [ + { required: true, message: '璇疯緭鍏ユ枃妗g増鏈�!'}, + ] + }, + applyUser: { + rules: [ + { required: true, message: '璇烽�夋嫨鐢宠浜�!'}, + ] + }, + approveContent: { + rules: [ + { required: true, message: '璇疯緭鍏ュ鎵规剰瑙�!'}, + ] + }, + docName: { + rules: [ + { required: true, message: '璇疯緭鍏ユ枃妗e悕绉�!'}, + ] + }, + status: { + rules: [ + { required: true, message: '璇烽�夋嫨瀹℃壒鐘舵��!'}, + ] + }, + }, + approveData: {}, + flowData: {}, + title: '瀹℃壒椤甸潰', + width: 1200, + visible: false, + // 琛ㄥご + url: { + queryOutBoundOrder: '/tms/outboundOrder/queryById', + queryOutBoundDetailList: '/tms/outboundOrder/listOutboundDetailByMainId', + queryBomDataById: '/nc/activit/selectVoById', + diagramView: '/assign/flow/diagramView', + queryHisTaskList:'/assign/flow/queryHisTaskList', + approve:"/nc/activit/assign/file/approve", + }, + dictOptions: {}, + superFieldList: [], + workflowSource: [] + } + }, + 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(){ + this.visible = false + this.routeReload() + }, + submitForm () { + const that = this; + if (!that.assignFileStream.status==null || that.assignFileStream.status===undefined){ + this.$message.warning('璇烽�夋嫨瀹℃壒鐘舵�侊紒') + return false; + } + if (!that.assignFileStream.approveContent==null || that.assignFileStream.approveContent===undefined) { + this.$message.warning('璇疯緭鍏ュ鎵规剰瑙侊紒') + return false; + } + // 瑙﹀彂琛ㄥ崟楠岃瘉 + this.form.validateFields((err, values) => { + if (!err) { + that.confirmLoading = true; + let url=this.url.approve + let method = 'post'; + let flowTaskVo = {} + flowTaskVo.status=that.assignFileStream.status; + flowTaskVo.approveContent =that.assignFileStream.approveContent; + flowTaskVo.comment =that.assignFileStream.approveContent; + flowTaskVo.secretLevel = that.assignFileStream.secretLevel; + 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 + flowTaskVo.secretLevel = that.assignFileStream.secretLevel; + 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); + } + }).finally(() => { + that.confirmLoading = false; + }) + } + + }) + }, + 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> +.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> \ No newline at end of file diff --git a/src/views/tms/OutboundDetailList.vue b/src/views/tms/OutboundDetailList.vue index 94181cc..623cd6d 100644 --- a/src/views/tms/OutboundDetailList.vue +++ b/src/views/tms/OutboundDetailList.vue @@ -131,9 +131,14 @@ } }, { - title:'鍒�鍏风紪鐮�', - align:"center", + title:'宸ュ叿缂栫爜', + align:"left", dataIndex: 'toolNum' + }, + { + title:'宸ュ叿缂栧彿', + align:"left", + dataIndex: 'toolId' }, { title:'宸ュ叿绫诲瀷', @@ -147,7 +152,7 @@ }, { title:'鍨嬪彿/鍥惧彿', - align:"center", + align:"left", dataIndex: 'toolModel' }, { @@ -176,13 +181,18 @@ dataIndex: 'outboundLocation' }, { + title:'鍙敤搴撳瓨鏁伴噺', + align:"left", + dataIndex: 'quantity' + }, + { title:'鐢宠鍑哄簱鏁伴噺', - align:"center", + align:"left", dataIndex: 'outboundQuantity' }, { title:'瀹為檯鍑哄簱鏁伴噺', - align:"center", + align:"left", dataIndex: 'outActualCount' }, { @@ -192,7 +202,7 @@ }, { title:'鍒涘缓鏃堕棿', - align:"center", + align:"left", dataIndex: 'createTime' }, // { diff --git a/src/views/tms/OutboundOrderList.vue b/src/views/tms/OutboundOrderList.vue index 0b58b9c..e6faa94 100644 --- a/src/views/tms/OutboundOrderList.vue +++ b/src/views/tms/OutboundOrderList.vue @@ -154,7 +154,7 @@ }, { title:'鍑哄簱鍗曠紪鍙�', - align:"center", + align:"left", dataIndex: 'outNum' }, { @@ -174,7 +174,7 @@ }, { title:'瀹℃牳鏃堕棿', - align:"center", + align:"left", dataIndex: 'auditDate' }, { @@ -184,7 +184,7 @@ }, { title:'鐢宠鍑哄簱鏃堕棿', - align:"center", + align:"left", dataIndex: 'outboundTime' }, { @@ -209,7 +209,7 @@ }, { title:'鍒涘缓鏃堕棿', - align:"center", + align:"left", dataIndex: 'createTime' }, { diff --git a/src/views/tms/modules/outBound/OutboundOrderModal.vue b/src/views/tms/modules/outBound/OutboundOrderModal.vue index fc2e217..ec09ece 100644 --- a/src/views/tms/modules/outBound/OutboundOrderModal.vue +++ b/src/views/tms/modules/outBound/OutboundOrderModal.vue @@ -37,7 +37,7 @@ <a-row> <a-col :span="12"> <a-form-model-item label="瀹℃牳浜�" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="reviewer"> - <j-select-user-by-dep :disabled="disableSubmit" v-model="model.reviewer" :store="'id'" :text="'realname'" :multi="false" /> + <j-select-user-by-dep :disabled="disableSubmit" v-model="model.reviewer" :store="'username'" :text="'realname'" :multi="false" /> </a-form-model-item> </a-col> <a-col :span="12"> -- Gitblit v1.9.3