网页版领料工单跳转,材料站退料单

This commit is contained in:
hongchao 2025-09-15 18:01:40 +08:00
parent c3765dac48
commit 6869c3a1a8
8 changed files with 682 additions and 44 deletions

View File

@ -82,6 +82,14 @@ export function getBackApplyInfo(id) {
})
}
// 查询材料站退料详情
export function getBackApplyInfoClz(id) {
return request({
url: '/material/back_apply_info/clz/' + id,
method: 'get'
})
}
// 退料新增
export function editBackApply(data) {
return request({

View File

@ -41,3 +41,12 @@ export function submitAuditingDirectApi(data) {
data
})
}
// 获取审核状态
export function getNodeAuditStatusAPI(query) {
return request({
url: '/material/sysWorkflowRecordHistory/getAuditStatus',
method: 'get',
params: query
})
}

View File

@ -128,7 +128,10 @@
<script>
import TitleTip from './components/title-tip.vue'
import { getLeaseTaskDetail } from '@/api/business/index'
import { submitAuditingApi, getAuditingDetailsApi } from '@/api/receive-apply/index.js'
import { submitAuditingApi, getAuditingDetailsApi,getNodeAuditStatusAPI} from '@/api/receive-apply/index.js'
import { getInfo,iwsLogin } from '@/api/login'
import { getConfig } from '@/api/config';
import { setToken, setExpiresIn } from '@/utils/auth'
export default {
components: {
TitleTip
@ -157,19 +160,98 @@ export default {
}
}
},
created() {
//
if (this.$route.query) {
const { id, taskId, type, nodeId } = this.$route.query
this.auditingParams.taskId = taskId
this.pagesType = type
this.currentNodeId = nodeId
this.getLeaseTaskDetailFun(id, taskId)
}
async created() {
const origin = window.location.href
console.log("xxxxxxxxxxxxxxxxxxxxxxxxxxxxx",origin)
// if (origin.indexOf('ticket') != -1) {
// console.log("11111111111111111111111111",origin)
// await this.getConfigApi() //
// try {
// console.log("hhhhhhhhhhhhhhhhhhhhhh",origin)
// const urlParams = new URLSearchParams(origin);
// console.log("urlParamshhhhhhhhhhhhhhh",urlParams)
// this.auditingParams.taskId = urlParams.get('taskId');
// const id = urlParams.get('id');
// console.log("idhhhhhhhhhhhhhhh",id)
// const ticketMatch = origin.match(/ticket=([^&]*)/);
// console.log("ticket11111111111111111111",ticketMatch)
// const ticket = ticketMatch ? ticketMatch[1] : '';
// const res = await iwsLogin({
// ticket: ticket,
// sysType: 0
// })
// console.log('🚀 ~ created ~ resxxxxxxxxxxxxxxx:', res)
// // 1. token
// if (res.code == 200) {
// setToken(res.data.access_token)
// this.$store.commit('SET_TOKEN', res.data.access_token)
// setExpiresIn(1800)
// this.$store.commit('SET_EXPIRES_IN', 1800)
// }
// // 2.
// const resUser = await getInfo()
// // userId
// sessionStorage.setItem('userId', resUser.user?.userId)
// sessionStorage.setItem('deptName', resUser.user?.dept?.deptName)
// // sessionStorage.setItem('userName', resUser.user?.userName)
this.userId = sessionStorage.getItem('userId')
// this.userId = sessionStorage.getItem('userId')
// console.log("yyyyyyyyyyyyyyyuserId",this.userId)
// await this.getLeaseTaskDetailFun(id, this.auditingParams.taskId)
// // setExpiresIn(res.data.expires_in)
// // this.$store.commit('SET_EXPIRES_IN', res.data.expires_in)
// } catch (error) {
// console.log('🚀 ~ created ~ error:', error)
// this.$message({
// message: ', ',
// type: 'error'
// })
// // setTimeout(() => {
// // //
// // window.close()
// // }, 1500)
// }
// }else{
//
if (this.$route.query) {
const { id, taskId, type } = this.$route.query
console.log('路由参数:', id, taskId, type)
this.auditingParams.taskId = taskId
// typepagesType
if (type !== undefined) {
this.pagesType = type
}else{
this.getNodeAuditStatus()
}
// this.currentNodeId = nodeId
await this.getLeaseTaskDetailFun(id, taskId)
}
this.userId = sessionStorage.getItem('userId')
},
methods: {
// async getConfigApi(){
// getConfig().then(response => {
// // console.log(response)
// localStorage.setItem('systemConfig', JSON.stringify(response.data || {}))
// sessionStorage.setItem('systemConfig', JSON.stringify(response.data || {}))
// })
// .catch(error => {
// console.error('Failed to fetch config:', error);
// });
// },
async getNodeAuditStatus(){
const res = await getNodeAuditStatusAPI({taskId:this.auditingParams.taskId})
if(res.data){
this.pagesType = res.data.auditStatus
}else{
this.pagesType = 0
}
},
//
async onHandleAuditing(type) {
//

View File

@ -161,7 +161,7 @@
</template>
<script>
import { getCodeImg, iwsLogin } from '@/api/login'
import { getCodeImg, iwsLogin, getInfo } from '@/api/login'
import Cookies from 'js-cookie'
import { decrypt, encrypt } from '@/utils/jsencrypt'
import dingding from '@/assets/images/dingding.svg'
@ -258,24 +258,60 @@ export default {
text: '登录中',
})
try {
const res = await iwsLogin({
ticket: origin.split('ticket=')[1].split('#/')[0] || origin.split('ticket%3D')[1].split('%26')[0],
sysType: 0
})
console.log('🚀 ~ created ~ res:', res)
if (res.code == 200) {
setToken(res.data.access_token)
this.$store.commit('SET_TOKEN', res.data.access_token)
setExpiresIn(1800)
this.$store.commit('SET_EXPIRES_IN', 1800)
if(origin.indexOf('business-details')!= -1){ //
console.log("11111111111111111111111111",origin)
const ticket = origin.split('ticket%3D')[1].split('%26')[0]
const taskId = origin.split('taskId%3D')[1].split('%26')[0]
const id = origin.split('id%3D')[1].split('%26')[0]
const res = await iwsLogin({
ticket: ticket,
sysType: 0
})
console.log('🚀 ~ created ~ res:', res)
// 1. token
if (res.code == 200) {
setToken(res.data.access_token)
this.$store.commit('SET_TOKEN', res.data.access_token)
setExpiresIn(1800)
this.$store.commit('SET_EXPIRES_IN', 1800)
}
// 2.
const resUser = await getInfo()
// userId
sessionStorage.setItem('userId', resUser.user?.userId)
sessionStorage.setItem('deptName', resUser.user?.dept?.deptName)
sessionStorage.setItem('userName', resUser.user?.userName)
loading.close()
//
setTimeout(() => {
//
this.$router.push({
name: 'receive-apply-details',
query: {
id: id,
taskId: taskId,
}
}) //
}, 300)
}else{
const res = await iwsLogin({
ticket: origin.split('ticket=')[1].split('#/')[0] || origin.split('ticket%3D')[1].split('%26')[0],
sysType: 0
})
console.log('🚀 ~ created ~ res:', res)
if (res.code == 200) {
setToken(res.data.access_token)
this.$store.commit('SET_TOKEN', res.data.access_token)
setExpiresIn(1800)
this.$store.commit('SET_EXPIRES_IN', 1800)
}
loading.close()
//
setTimeout(() => {
this.$router.push({ path: '/' })
}, 300)
}
// setExpiresIn(res.data.expires_in)
// this.$store.commit('SET_EXPIRES_IN', res.data.expires_in)
loading.close()
//
setTimeout(() => {
this.$router.push({ path: '/' })
}, 300)
} catch (error) {
console.log('🚀 ~ created ~ error:', error)
this.$message({

View File

@ -0,0 +1,496 @@
<template>
<el-dialog
v-dialogDrag
v-loading.fullscreen.lock="fullscreenLoading"
:before-close="cancel"
:title="dialogTitle"
:visible.sync="dialogShowFlag"
append-to-body
width="1090px"
>
<div id="printcontent" style="height: 600px; overflow-y: scroll; padding: 0 20px">
<!-- <vue-easy-print tableShow ref="printRef"> -->
<div id="checkId">
<div style="text-align: center; font-weight: 600; font-size: 16px">机具设备退料单</div>
<div class="info" style="margin-top: 10px; display: flex; align-items: center">
<div class="item" style="width: 50%; flex-shrink: 0; margin-bottom: 5px; font-size: 14px">
<div>
<span>工程名称</span>
<span>{{ rowObj.proName }}</span>
</div>
<div>
<span>退料时间</span>
<span>{{ rowObj.createTime }}</span>
</div>
</div>
<div class="item" style="width: 50%; flex-shrink: 0; margin-bottom: 5px; font-size: 14px; text-align: right">
<div>
<span>退料单位</span>
<span>{{ rowObj.unitName }}</span>
</div>
<div>
<span>单号</span>
<span>{{ rowObj.code }}</span>
</div>
</div>
</div>
<table border="1.5" cellspacing="0" cellpadding="8" style="width: 100%; border-collapse: collapse">
<thead>
<tr>
<th style="width: 60px; text-align: center">编号</th>
<th style="width: 120px; text-align: center">物资类型</th>
<th style="text-align: center">物资名称</th>
<th style="text-align: center">规格型号</th>
<th style="text-align: center">计量单位</th>
<th style="width: 200px; text-align: center">退料数量</th>
<th style="width: 200px; text-align: center">编号</th>
</tr>
</thead>
<tbody>
<tr v-for="(row, index) in tableData" :key="index">
<!-- 序号 -->
<td style="text-align: center">{{ index + 1 }}</td>
<!-- 物资类型 -->
<td style="text-align: center" :title="row.materialType">{{ row.materialType }}</td>
<!-- 物资名称 -->
<td style="text-align: center" :title="row.typeName">{{ row.typeName }}</td>
<!-- 规格型号 -->
<td style="text-align: center" :title="row.typeModel">{{ row.typeModel }}</td>
<!-- 计量单位 -->
<td style="text-align: center" :title="row.unitName">{{ row.unitName }}</td>
<!-- 退料数量 -->
<td style="text-align: center">{{ row.preNum }}</td>
<!-- 编号 -->
<td style="text-align: center">
<span v-if="row.manageType == 1">无编码</span>
<span
v-if="row.manageType == 0"
style="color: rgb(2, 167, 240); cursor: pointer"
@click="checkDetail(row)"
>
查看明细
</span>
</td>
</tr>
</tbody>
</table>
<div class="order_footer">
<!-- <div>审核人</div> -->
<div class="item" style="width: 28%; display: flex; align-items: center; flex-wrap: wrap">
<div style="width: 30%">审核人</div>
<div
style="width: 70%; display: flex; align-items: center; flex-wrap: wrap"
v-if="backApplyInfo.directAuditSignUrl"
>
<div style="width: 80%; margin-left: 10px">
<img
:src="backApplyInfo.directAuditSignUrl"
style="width: 40px; height: 100px"
:class="{ 'is-rotate': backApplyInfo.directAuditSignType == 0 }"
alt=""
/>
</div>
</div>
</div>
<div class="item" style="width: 28%; display: flex; align-items: center; flex-wrap: wrap">
<div style="width: 30%">退料人</div>
<div
style="width: 70%; display: flex; align-items: center; flex-wrap: wrap"
v-if="backApplyInfo.backSignUrl"
>
<div style="width: 80%; margin-left: 20px">
<img
:src="backApplyInfo.backSignUrl"
style="width: 40px; height: 100px; max-width: 100%"
:class="{ 'is-rotate': backApplyInfo.backSignType == 0 }"
alt=""
/>
</div>
</div>
</div>
<div class="item" style="width: 28%; display: flex; align-items: center; flex-wrap: wrap">
<div style="width: 30%">制单</div>
<div style="width: 70%; display: flex; align-items: center; flex-wrap: wrap" v-if="backApplyInfo.signUrl">
<div style="width: 80%; margin-left: 20px">
<img
:src="backApplyInfo.signUrl"
style="width: 40px; height: 100px; max-width: 100%"
:class="{ 'is-rotate': backApplyInfo.signType == 0 }"
alt=""
/>
</div>
</div>
</div>
</div>
</div>
<!-- </vue-easy-print> -->
</div>
<el-dialog :title="title" :visible.sync="open" width="1000px" append-to-body>
<div style="height: 500px; overflow-y: scroll; padding: 0 20px">
<!-- <vue-easy-print tableShow ref="remarksPrintRef"> -->
<div id="checkIdTwo">
<div class="remarks_box">
<div class="remarks_box_title">退料编码明细</div>
</div>
<div class="info" style="margin-top: 10px; display: flex; align-items: center">
<div class="item" style="width: 50%; flex-shrink: 0; margin-bottom: 5px; font-size: 14px">
<div>
<span>工程名称</span>
<span>{{ rowObj.proName }}</span>
</div>
<div>
<span>退料时间</span>
<span>{{ rowObj.createTime }}</span>
</div>
</div>
<div
class="item"
style="width: 50%; flex-shrink: 0; margin-bottom: 5px; font-size: 14px; text-align: right"
>
<div>
<span>退料单位</span>
<span>{{ rowObj.unitName }}</span>
</div>
<div>
<span>单号</span>
<span>{{ rowObj.code }}</span>
</div>
</div>
</div>
<table border="1.5" cellspacing="0" cellpadding="8" style="width: 100%; border-collapse: collapse">
<thead>
<tr>
<th style="width: 60px; text-align: center">序号</th>
<th style="text-align: center">物资类型</th>
<th style="text-align: center">物资名称</th>
<th style="text-align: center">规格型号</th>
<th style="text-align: center">设备编号</th>
</tr>
</thead>
<tbody>
<tr v-for="(row, index) in tableSubData" :key="index">
<!-- 序号 -->
<td style="text-align: center">{{ index + 1 }}</td>
<!-- 物资类型 -->
<td style="text-align: center">{{ row.materialType }}</td>
<!-- 物资名称 -->
<td style="text-align: center">{{ row.typeName }}</td>
<!-- 规格型号 -->
<td style="text-align: center">{{ row.materialName }}</td>
<!-- 设备编号 -->
<td style="text-align: center">{{ row.maCode }}</td>
</tr>
</tbody>
</table>
<div class="order_footer">
<!-- <div>审核人</div> -->
<div class="item" style="width: 28%; display: flex; align-items: center; flex-wrap: wrap">
<div style="width: 30%">审核人</div>
<div
style="width: 70%; display: flex; align-items: center; flex-wrap: wrap"
v-if="backApplyInfo.directAuditSignUrl"
>
<div style="width: 80%; margin-left: 10px">
<img
:src="backApplyInfo.directAuditSignUrl"
style="width: 40px; height: 100px"
:class="{ 'is-rotate': backApplyInfo.directAuditSignType == 0 }"
alt=""
/>
</div>
</div>
</div>
<div class="item" style="width: 28%; display: flex; align-items: center; flex-wrap: wrap">
<div style="width: 30%">退料人</div>
<div
style="width: 70%; display: flex; align-items: center; flex-wrap: wrap"
v-if="backApplyInfo.backSignUrl"
>
<div style="width: 80%; margin-left: 20px">
<img
:src="backApplyInfo.backSignUrl"
style="width: 40px; height: 100px; max-width: 100%"
:class="{ 'is-rotate': backApplyInfo.backSignType == 0 }"
alt=""
/>
</div>
</div>
</div>
<div class="item" style="width: 28%; display: flex; align-items: center; flex-wrap: wrap">
<div style="width: 30%">制单</div>
<div style="width: 70%; display: flex; align-items: center; flex-wrap: wrap" v-if="backApplyInfo.signUrl">
<div style="width: 80%; margin-left: 20px">
<img
:src="backApplyInfo.signUrl"
style="width: 40px; height: 100px; max-width: 100%"
:class="{ 'is-rotate': backApplyInfo.signType == 0 }"
alt=""
/>
</div>
</div>
</div>
</div>
</div>
<!-- </vue-easy-print> -->
</div>
<div slot="footer" class="dialog-footer" style="text-align: center">
<el-button type="primary" @click="remarksPrint">打印</el-button>
<el-button @click="open = false"> </el-button>
</div>
</el-dialog>
<div slot="footer" class="dialog-footer" style="text-align: center">
<el-button type="primary" @click="print">打印</el-button>
<el-button @click="dialogShowFlag = false"> </el-button>
</div>
</el-dialog>
</template>
<script>
import vueEasyPrint from 'vue-easy-print'
import { getBackApplyInfoClz, updatePrintStatus } from '@/api/back/index.js'
import html2canvas from 'html2canvas'
import jsPDF from 'jspdf'
import printJS from 'print-js'
import request from '@/utils/request'
// import { getViewByApply,materialReturnNoteByApply } from "@/api/claimAndRefund/return.js"
export default {
components: { vueEasyPrint },
props: {
//
isShowFlag: {
type: Boolean,
default: false
},
//
priKey: {
type: [String, Number],
default: ''
},
//
dialogTitle: {
type: String,
default: ''
},
rowObj: {
type: Object,
default: {}
}
},
watch: {
isShowFlag(val) {
if (val) {
this.init()
}
}
},
computed: {
dialogShowFlag: {
get() {
return this.isShowFlag
},
set(v) {
this.$emit('update:isShowFlag', v)
}
}
},
data() {
return {
fullscreenLoading: false,
tableData: [],
tableSubData: [],
open: false,
title: '',
backApplyInfo: {}
}
},
methods: {
init() {
// let params = {
// id: this.rowObj.id,
// }
getBackApplyInfoClz(this.rowObj.id).then(res => {
console.log(res)
this.tableData = res.data.backApplyDetailsList
this.backApplyInfo = res.data.backApplyInfo
console.log('🚀 ~ init ~ this.backApplyInfo:', this.backApplyInfo)
})
},
//
cancel() {
this.dialogShowFlag = false
},
print() {
const element = document.getElementById('checkId')
//
if (!element) {
this.$message.error('未找到要打印的元素')
return
}
printJS({
printable: 'checkId',
type: 'html',
targetStyles: ['*'],
maxWidth: '1400'
})
},
checkDetail(row) {
this.title = '查看'
this.tableSubData = row.maCodeList
this.open = true
},
remarksPrint() {
const element = document.getElementById('checkIdTwo')
//
if (!element) {
this.$message.error('未找到要打印的元素')
return
}
// API - 使request
printJS({
printable: 'checkIdTwo',
type: 'html',
targetStyles: ['*'],
maxWidth: '1400'
})
}
}
}
</script>
<style lang="scss" scoped>
// .order_box {
// display: flex;
// flex-direction: column;
// .order_box_one {
// width: 100%;
// display: flex;
// align-content: center;
// justify-content: space-between;
// margin-bottom: 10px;
// :last-child {
// margin-right: 20px;
// }
// }
// }
.is-rotate {
transform: rotate(-90deg);
}
.order_footer {
margin-top: 10px;
display: flex;
justify-content: space-around;
align-items: center;
}
.remarks_box {
display: flex;
// align-items: center;
justify-content: center;
.remarks_box_title {
margin-bottom: 10px;
font-size: 18px;
}
}
@media screen {
body {
font-family: 'Microsoft YaHei', sans-serif;
background-color: #f5f5f5;
padding: 20px;
}
.print-container {
max-width: 1000px;
margin: 0 auto;
background: white;
padding: 20px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
.action-buttons {
text-align: center;
margin: 20px 0;
}
button {
padding: 10px 20px;
margin: 0 10px;
background: #409eff;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 16px;
}
button:hover {
background: #66b1ff;
}
}
/* 通用样式 */
.text-center {
text-align: center;
}
.text-bold {
font-weight: bold;
}
.title {
font-size: 20px;
font-weight: bold;
margin: 15px 0;
text-align: center;
}
.info-row {
display: flex;
justify-content: space-between;
margin: 10px 0;
}
.info-item {
flex: 1;
}
.signature-area {
display: flex;
justify-content: space-between;
margin-top: 30px;
}
.signature-box {
width: 30%;
min-height: 100px;
border-bottom: 1px solid #000;
text-align: center;
padding-top: 60px;
}
.is-rotate {
transform: rotate(90deg);
transform-origin: center center;
}
</style>

View File

@ -124,15 +124,15 @@
<el-table-column label="操作" align="center" width="220">
<template slot-scope="{ row }">
<el-button type="text" size="mini" icon="el-icon-zoom-in" @click="handleView(row)">查看</el-button>
<!-- <el-button
<el-button
type="text"
size="mini"
icon="el-icon-document"
style="color: #67c23a"
@click="handleMaterial(row)"
@click="handleLld(row)"
>
退料单
</el-button> -->
</el-button>
</template>
</el-table-column>
</el-table>
@ -146,6 +146,9 @@
@pagination="getList"
/>
<!-- 退料单 -->
<dialogFormByClz :dialogTitle="title" :isShowFlag.sync="isShowOneFlag" :priKey="priKey" :rowObj="rowObj"></dialogFormByClz>
<!-- 弹框 -->
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="60%">
<el-table :data="dialogList" fit highlight-current-row style="width: 100%">
@ -183,10 +186,11 @@
<script>
import { getBackTotalListApi, getBackDetailsListApi } from '@/api/materialsStation'
import dialogFormByClz from '@/views/materialsStation/equipment/totalReturnRecord/dialogFormByClz.vue'
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
export default {
components: { Treeselect },
components: { dialogFormByClz,Treeselect },
data() {
return {
showSearch: true,
@ -239,7 +243,13 @@ export default {
deptList: [], //
unitList: [], // 退
proList: [], // 退
typeModelList: [] //
typeModelList: [] ,//
//退
isShowOneFlag: false,
rowObj: {},
priKey: '',
title: '',
}
},
created() {
@ -329,12 +339,9 @@ export default {
}, 100)
},
// 退
handleMaterial(row) {
console.log('退料单', row)
this.$message({
type: 'warning',
message: '退料单功能开发中,敬请期待!'
})
handleLld(row) {
this.isShowOneFlag = true
this.rowObj = row
},
//
handleExport() {

View File

@ -34,9 +34,9 @@
/>
</el-form-item>
<el-form-item label="分包单位" prop="unit">
<el-form-item label="分包单位" prop="subUnitName">
<el-input
v-model="queryParams.unit"
v-model="queryParams.subUnitName"
placeholder="请输入分包单位"
clearable
maxlength="50"

View File

@ -35,8 +35,8 @@ module.exports = {
proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: {
// target: `http://sgwpdm.ah.sgcc.com.cn/iws/jiju-api`, // 产线
target: `http://192.168.0.96:18080`,//马
target: `http://sgwpdm.ah.sgcc.com.cn/iws/jiju-api`, // 产线
// target: `http://192.168.0.96:18080`,//马
// target: `http://192.168.0.244:18580`,//测试
// target: `http://192.168.2.223:18080`,//山
// target: `http://192.168.2.23:18080`,//洪