Browse Source

委外修改

master
shenzhouyu 4 months ago
parent
commit
e4d1622232
  1. 2
      src/router/index.js
  2. 15
      src/views/modules/outsourcing-return/outsourcingReturn.vue
  3. 342
      src/views/modules/outsourcing-return/outsourcingReturnPDAIssueList.vue
  4. 12
      src/views/modules/outsourcing-return/outsourcingReturnPDAList.vue

2
src/router/index.js

@ -79,7 +79,7 @@ const globalRoutes = [
{ path: "/outsourcingPickingDetail/:outsourcingNo", name: "outsourcingPickingDetail", component: resolve => require(["@/views/modules/outsourcing-issue/outsourcingPickingDetail.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } },
// 委外退料
{ path: "/outsourcingReturn", name: "outsourcingReturn", component: resolve => require(["@/views/modules/outsourcing-return/index.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } },
{ path: "/outsourcingReturn", name: "outsourcingReturn", component: resolve => require(["@/views/modules/outsourcing-return/outsourcingReturn.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } },
{ path: "/outsourcingReturnPDAList/:orderNo/:partNo/:unissureQty/:itemNo", name: "outsourcingReturnPDAList", component: resolve => require(["@/views/modules/outsourcing-return/outsourcingReturnPDAList.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } },
{ path: "/outsourcingReturnPDAIssueList/:outsourcingOrderNo/:material", name: "outsourcingReturnPDAIssueList", component: resolve => require(["@/views/modules/outsourcing-return/outsourcingReturnPDAIssueList.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } },

15
src/views/modules/outsourcing-return/index.vue → src/views/modules/outsourcing-return/outsourcingReturn.vue

@ -68,7 +68,7 @@
@click="goToDetail(material)"
>
<div class="card-title">
<span class="title-label">物料编码{{ material.componentPartNo }} &nbsp;&nbsp; 行号{{ material.lineNo }}</span>
<span class="title-label">物料编码{{ material.componentPartNo }} &nbsp;&nbsp; 行号{{ material.lineItemNo }} </span>
</div>
<div class="part-desc-row">
<span class="desc-text">{{ material.componentPartDescription }}</span>
@ -199,7 +199,8 @@ export default {
let params = {
outsourcingNo:order.orderNo,
site:this.$store.state.user.site,
lineNo: order.lineNo
lineNo: order.lineNo,
releaseNo: order.releaseNo,
}
getOutsourcingReturnOrderLineInfo(params).then(({ data }) => {
@ -222,7 +223,7 @@ export default {
},
goToDetail(item) {
const returnableQty = item.inventoryQty - (item.invQtyToReceive || 0);
const returnableQty = item.qtyRequired - (item.reservedQty || 0);
if (returnableQty <= 0) {
this.$message.warning('该物料已无可退数量');
return;
@ -232,9 +233,13 @@ export default {
name: 'outsourcingReturnPDAList',
params: {
orderNo: item.orderNo,
partNo: item.partNo,
partNo: item.componentPartNo,
unissureQty: returnableQty,
itemNo: item.lineNo,
itemNo: {
lineNo: item.lineNo,
lineItemNo: item.lineItemNo,
releaseNo: item.releaseNo,
}
},
});
},

342
src/views/modules/outsourcing-return/outsourcingReturnPDAIssueList.vue

@ -11,22 +11,10 @@
<!-- 搜索框 -->
<div class="search-container">
<el-input
clearable
class="compact-input"
v-model="scanCode"
placeholder="请扫描物料标签"
prefix-icon="el-icon-search"
@keyup.enter.native="handleScan"
ref="scanInput"
/>
<el-input clearable class="compact-input" v-model="scanCode" placeholder="请扫描物料标签" prefix-icon="el-icon-search"
@keyup.enter.native="handleScan" ref="scanInput" />
<div class="mode-switch">
<el-switch
class="custom-switch"
v-model="isRemoveMode"
active-color="#ff4949"
inactive-color="#13ce66"
>
<el-switch class="custom-switch" v-model="isRemoveMode" active-color="#ff4949" inactive-color="#13ce66">
</el-switch>
<span v-if="isRemoveMode" class="switch-text">{{ "移除" }}</span>
<span v-else class="switch-text2">{{ "添加" }}</span>
@ -34,22 +22,19 @@
</div>
<!-- 订单信息卡片对齐直接发料明细样式 -->
<div class="work-order-list" v-if="orderInfo.orderNo">
<div class="work-order-list" v-if="orderNo">
<div class="work-order-card">
<div class="card-title">
<span class="title-label"
>{{
orderInfo.type === "outsourcingOrder" ? "委外订单号" : "退料申请单号"
<span class="title-label">{{
orderInfo.type === "outsourcingOrder" ? "委外单号" : "退料申请单号"
}}{{ orderInfo.orderNo }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;批次号{{ batchNo }}</span>
</div>
<!-- 关联信息单独一行 -->
<div class="part-desc-row">
<span class="desc-text"
>{{ orderInfo.type === "outsourcingOrder" ? "关联单号" : "关联委外订单" }}{{
<span class="desc-text">{{ orderInfo.type === "outsourcingOrder" ? "关联单号" : "关联委外订单" }}{{
orderInfo.transactionId
}}</span
>
}}</span>
</div>
<div class="part-desc-row">
<span class="desc-text">{{ orderInfo.partNo }}</span>
@ -82,9 +67,7 @@
<span>退料信息确认</span>
</div>
<div class="title-right">
<span class="material-list-link" @click="showMaterialListDialog"
>物料清单</span
>
<span class="material-list-link" @click="showMaterialListDialog">物料清单</span>
</div>
</div>
@ -98,11 +81,7 @@
<div class="col-qty">退料数量</div>
</div>
<div
v-for="(label, index) in labelList"
:key="label.id"
class="list-item"
>
<div v-for="(label, index) in labelList" :key="label.id" class="list-item">
<div class="col-no">{{ index+1 }}</div>
<div class="col-label">{{ label.labelCode }}</div>
<!-- <div class="col-batch">{{ label.batchNo }}</div> -->
@ -121,20 +100,11 @@
<!-- 底部操作按钮 -->
<div class="bottom-actions">
<el-button
class="action-btn primary"
style="margin-left: 10px"
:loading="loading"
@click="confirmReturn"
>
<el-button class="action-btn primary" style="margin-left: 10px" :loading="loading" @click="confirmReturn">
确定退料
</el-button>
<button
class="action-btn secondary"
style="margin-left: 10px"
@click="cancelReturn"
>
<button class="action-btn secondary" style="margin-left: 10px" @click="cancelReturn">
取消
</button>
</div>
@ -164,11 +134,7 @@
</div>
<div class="table-body">
<div
v-for="(item, index) in materialList"
:key="index"
class="table-row"
>
<div v-for="(item, index) in materialList" :key="index" class="table-row">
<div class="col-no">{{ index + 1 }}</div>
<div class="col-material-code">
{{ item.materialCode || item.partNo }}
@ -205,40 +171,22 @@
<div class="modal-body">
<div class="form-group">
<label class="form-label">物料标签</label>
<el-input
v-model="editForm.labelCode"
disabled
class="form-input"
/>
<el-input v-model="editForm.labelCode" disabled class="form-input" />
</div>
<div class="form-group">
<label class="form-label">批次号</label>
<el-input
v-model="editForm.batchNo"
disabled
class="form-input"
/>
<el-input v-model="editForm.batchNo" disabled class="form-input" />
</div>
<div class="form-group">
<label class="form-label">库位 <span class="required">*</span></label>
<el-input
v-model="editForm.locationId"
placeholder="请输入库位"
class="form-input"
/>
<el-input v-model="editForm.locationId" placeholder="请输入库位" class="form-input" />
</div>
<div class="form-group">
<label class="form-label">退料数量 <span class="required">*</span></label>
<el-input
v-model="editForm.quantity"
type="number"
:min="0"
placeholder="请输入退料数量"
class="form-input"
/>
<el-input v-model="editForm.quantity" type="number" :min="0" placeholder="请输入退料数量" class="form-input" />
</div>
</div>
@ -256,66 +204,66 @@ import {
getInventoryPartForOutsourcing,
scanMaterialLabelForOutsourcing,
outsourcingReturnUnissueConfirm,
} from "@/api/outsourcing/outsourcing-return";
import moment from "moment";
} from '@/api/outsourcing/outsourcing-return'
import moment from 'moment'
export default {
data() {
return {
scanCode: "",
scanCode: '',
orderInfo: {},
labelList: [],
orderNo: "",
orderType: "",
orderNo: '',
orderType: '',
showMaterialDialog: false,
materialList: [],
materialListLoading: false,
isRemoveMode: false, //
returnReason: "",
partNo:"", //
transactionId:"", //
accountingId:"", //
quantity:"", // 退
returnReason: '',
partNo: '', //
transactionId: '', //
accountingId: '', //
quantity: '', // 退
qtyReversed: 0, // 退
batchNo:"", //
batchNo: '', //
//
showEditDialog: false,
editForm: {
labelCode: '',
batchNo: '',
locationId: '',
quantity: 0
quantity: 0,
},
editIndex: -1, //
unissureQty: 0, //
itemNo:'', // ID
itemNo: {}, // ID
loading: false, //
};
}
},
computed: {
totalScannedQty() {
return this.labelList.reduce(
(sum, l) => sum + (Number(l.quantity) || 0),
0
);
)
},
},
methods: {
formatDate(date) {
return date ? moment(date).format("YYYY-MM-DD") : "";
return date ? moment(date).format('YYYY-MM-DD') : ''
},
//
handleScan() {
if (!this.scanCode.trim()) {
return;
return
}
if (this.isRemoveMode) {
this.removeLabelByCode(this.scanCode.trim());
this.removeLabelByCode(this.scanCode.trim())
} else {
this.validateAndAddLabel(this.scanCode.trim());
this.validateAndAddLabel(this.scanCode.trim())
}
this.scanCode = "";
this.scanCode = ''
},
// 退
@ -327,18 +275,19 @@ export default {
site: this.$store.state.user.site,
batchNo: this.batchNo,
componentPartNo: this.partNo,
};
}
// 退
scanMaterialLabelForOutsourcing(params).then(({data}) => {
scanMaterialLabelForOutsourcing(params)
.then(({ data }) => {
if (data.code === 0 && data.labelInfo) {
//
const exists = this.labelList.find(
(item) => item.labelCode === labelCode
);
)
if (exists) {
this.$message.warning("该标签已扫描,请勿重复扫描");
return;
this.$message.warning('该标签已扫描,请勿重复扫描')
return
}
//
@ -351,30 +300,28 @@ export default {
returnReason: data.labelInfo.returnReason,
locationId: data.labelInfo.locationId,
warehouseId: data.labelInfo.warehouseId,
});
})
this.$message.success("操作成功");
this.$message.success('操作成功')
} else {
this.$message.error(
data.message || "该标签不符合退料要求,请检查"
);
this.$message.error(data.message || '该标签不符合退料要求,请检查')
}
})
.catch(() => {
this.$message.error("操作失败");
});
this.$message.error('操作失败')
})
},
//
removeLabelByCode(labelCode) {
const index = this.labelList.findIndex(
(item) => item.labelCode === labelCode
);
)
if (index !== -1) {
this.labelList.splice(index, 1);
this.$message.success("操作成功");
this.labelList.splice(index, 1)
this.$message.success('操作成功')
} else {
this.$message.warning("未找到该标签");
this.$message.warning('未找到该标签')
}
},
@ -384,150 +331,162 @@ export default {
labelCode: label.labelCode,
batchNo: label.batchNo,
locationId: label.locationId || '',
quantity: label.quantity
};
this.editIndex = index;
this.showEditDialog = true;
quantity: label.quantity,
}
this.editIndex = index
this.showEditDialog = true
},
//
closeEditDialog() {
this.showEditDialog = false;
this.showEditDialog = false
this.editForm = {
labelCode: '',
batchNo: '',
locationId: '',
quantity: 0
};
this.editIndex = -1;
quantity: 0,
}
this.editIndex = -1
},
//
confirmEdit() {
//
if (!this.editForm.locationId.trim()) {
this.$message.warning('请输入库位');
return;
this.$message.warning('请输入库位')
return
}
if (!this.editForm.quantity || this.editForm.quantity <= 0) {
this.$message.warning('请输入有效的退料数量');
return;
this.$message.warning('请输入有效的退料数量')
return
}
//
if (this.editIndex >= 0 && this.editIndex < this.labelList.length) {
this.labelList[this.editIndex].locationId = this.editForm.locationId;
this.labelList[this.editIndex].quantity = Number(this.editForm.quantity);
this.$message.success('修改成功');
this.labelList[this.editIndex].locationId = this.editForm.locationId
this.labelList[this.editIndex].quantity = Number(this.editForm.quantity)
this.$message.success('修改成功')
}
this.closeEditDialog();
this.closeEditDialog()
},
// 退
confirmReturn() {
if (this.labelList.length === 0) {
this.$message.warning("请先扫描退料标签");
return;
this.$message.warning('请先扫描退料标签')
return
}
if(this.totalScannedQty > this.orderInfo.quantity){
this.$message.warning('请先扫描退料数量大于发料数量')
return
}
this.loading = true;
this.loading = true
const returnParams = {
site: this.$store.state.user.site,
outsourcingOrderNo: this.orderNo,
orderType: this.orderType,
batchNo: this.batchNo,
componentPartNo: this.partNo,
warehouseId: '1',
warehouseId: localStorage.getItem('selectedWarehouse'),
transactionId: this.transactionId,
accountingId: this.accountingId,
itemNo:this.itemNo,
lineNo: this.itemNo.lineNo,
lineItemNo:this.itemNo.lineItemNo,
releaseNo: this.itemNo.releaseNo,
ifsReversedQty: this.qtyReversed,
issueQty: this.quantity,
// 退
selectedMaterials: this.labelList.map((label) => ({
selectedMaterials: this.labelList.map((label,index) => ({
labelCode: label.labelCode,
issueQty: label.quantity,
batchNo: label.batchNo,
partNo: label.partNo,
locationId: label.locationId,
warehouseId: label.warehouseId,
wdrNo: label.wdrNo || '*',
itemNo: index+1
})),
};
}
// 退API
outsourcingReturnUnissueConfirm(returnParams).then(({data}) => {
outsourcingReturnUnissueConfirm(returnParams)
.then(({ data }) => {
if (data.code === 0 && data) {
this.$message.success("委外退料成功");
this.$router.push({ name: 'outsourcingReturn' });
this.$message.success('委外退料成功')
this.$router.push({ name: 'outsourcingReturn' })
} else {
this.$message.error(data.message || "操作失败");
this.$message.error(data.message || '操作失败')
}
}).catch(() => {
this.$message.error("操作失败");
}).finally(() => {
this.loading = false;
});
})
.catch(() => {
this.$message.error('操作失败')
})
.finally(() => {
this.loading = false
})
},
// 退
cancelReturn() {
if (this.labelList.length > 0) {
this.$confirm("取消后将清空已扫描的标签,确定取消吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "继续操作",
type: "warning",
this.$confirm('取消后将清空已扫描的标签,确定取消吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '继续操作',
type: 'warning',
})
.then(() => {
this.$router.back();
this.$router.back()
})
.catch(() => {
//
});
})
} else {
this.$router.back();
this.$router.back()
}
},
//
showMaterialListDialog() {
this.showMaterialDialog = true;
this.loadMaterialList();
this.showMaterialDialog = true
this.loadMaterialList()
},
//
loadMaterialList() {
console.log("加载委外退料物料清单", this.orderInfo, this.orderNo);
console.log('加载委外退料物料清单', this.orderInfo, this.orderNo)
if (!this.$store.state.user.site || !this.orderNo) {
this.$message.error("缺少必要参数,无法获取物料清单");
return;
this.$message.error('缺少必要参数,无法获取物料清单')
return
}
this.materialListLoading = true;
this.materialListLoading = true
const params = {
site: this.$store.state.user.site,
orderNo: this.orderNo,
orderType: this.orderType,
};
}
//
this.simulateMaterialList(params)
.then((data) => {
this.materialListLoading = false;
this.materialListLoading = false
if (data && data.code === 0) {
this.materialList = data.materials || [];
this.materialList = data.materials || []
} else {
this.$message.error(data.msg || "获取物料清单失败");
this.materialList = [];
this.$message.error(data.msg || '获取物料清单失败')
this.materialList = []
}
})
.catch(() => {
this.materialListLoading = false;
this.$message.error("获取物料清单失败");
this.materialList = [];
});
this.materialListLoading = false
this.$message.error('获取物料清单失败')
this.materialList = []
})
},
// API
@ -536,71 +495,56 @@ export default {
setTimeout(() => {
const mockMaterials = [
{
materialCode: "MAT001",
partNo: "MAT001",
materialCode: 'MAT001',
partNo: 'MAT001',
returnableQty: 100,
returnedQty: 20,
},
{
materialCode: "MAT002",
partNo: "MAT002",
materialCode: 'MAT002',
partNo: 'MAT002',
returnableQty: 200,
returnedQty: 50,
},
{
materialCode: "MAT003",
partNo: "MAT003",
materialCode: 'MAT003',
partNo: 'MAT003',
returnableQty: 150,
returnedQty: 0,
},
];
]
resolve({
code: 0,
materials: mockMaterials,
});
}, 500);
});
})
}, 500)
})
},
//
closeMaterialDialog() {
this.showMaterialDialog = false;
this.showMaterialDialog = false
},
//
loadOrderDetails() {
const params = {
orderNo: this.orderNo,
orderType: this.orderType,
site: this.$store.state.user.site,
partNo:this.partNo
};
console.log("加载订单详情参数:", params);
//
getInventoryPartForOutsourcing(params).then(({data}) => {
if (data && data.code === 0) {
this.orderInfo = data.inventoryPart[0]
this.orderInfo.type = this.orderType
this.orderInfo.orderNo = this.orderNo
this.orderInfo.transactionId = this.transactionId
this.orderInfo.quantity = this.quantity
} else {
this.$message.error(data.msg || "获取订单详情失败");
}
}).catch(() => {
this.$message.error("获取订单详情失败");
});
this.orderInfo.partNo = this.partNo
console.log(this.orderInfo);
},
},
mounted() {
//
console.log("路由参数:", this.$route.params.material);
console.log('路由参数:', this.$route.params.material)
this.orderNo = this.$route.params.outsourcingOrderNo;
this.orderType = this.$route.params.material.orderType || "outsourcingOrder";
this.orderNo = this.$route.params.outsourcingOrderNo
this.orderType = this.$route.params.material.orderType || 'outsourcingOrder'
this.partNo = this.$route.params.material.partNo
this.transactionId = this.$route.params.material.ifsTransactionID
this.accountingId = this.$route.params.material.ifsAccountingID
@ -611,22 +555,22 @@ export default {
this.qtyReversed = this.$route.params.material.qtyReversedBy || 0
if (!this.orderNo) {
this.$message.error("参数错误");
this.$router.back();
return;
this.$message.error('参数错误')
this.$router.back()
return
}
//
this.$nextTick(() => {
if (this.$refs.scanInput) {
this.$refs.scanInput.focus();
this.$refs.scanInput.focus()
}
});
})
//
this.loadOrderDetails();
this.loadOrderDetails()
},
};
}
</script>
<style scoped>
@ -831,7 +775,7 @@ export default {
}
.detail-value .total::before {
content: "/";
content: '/';
color: #333;
}

12
src/views/modules/outsourcing-return/outsourcingReturnPDAList.vue

@ -76,7 +76,9 @@ export default {
loading: false,
issueList: [],
unissureQty: 0,
itemNo: '',
itemNo: {},
lineNo: '',
lineItemNo: '',
};
},
methods: {
@ -86,9 +88,12 @@ export default {
}
this.loading = true;
const params = {
outsourcingOrderNo: this.outsourcingOrderNo,
orderNo: this.outsourcingOrderNo,
site: this.$store.state.user.site,
partNo: this.partNo,
releaseNo: this.lineNo,
sequenceNo: this.releaseNo,
lineItemNo: this.lineItemNo
};
getUnissueMatericalForOutsourcingOrder(params)
.then(({ data }) => {
@ -130,6 +135,9 @@ export default {
this.partNo = this.$route.params.partNo;
this.unissureQty = this.$route.params.unissureQty;
this.itemNo = this.$route.params.itemNo;
this.lineNo = this.$route.params.itemNo.lineNo;
this.lineItemNo = this.$route.params.itemNo.lineItemNo;
this.releaseNo = this.$route.params.itemNo.releaseNo;
this.loadIssueList();
},
};

Loading…
Cancel
Save