Browse Source

领料退料添加样式

master
shenzhouyu 4 months ago
parent
commit
ac0adfed91
  1. 4
      src/api/production/production-return.js
  2. 2
      src/router/index.js
  3. 41
      src/views/modules/production-issue/directIssue.vue
  4. 37
      src/views/modules/production-return/productionReturnPDA.vue
  5. 81
      src/views/modules/production-return/productionReturnPDAIssueList.vue
  6. 40
      src/views/modules/production-return/productionReturnPicking.vue

4
src/api/production/production-return.js

@ -20,4 +20,6 @@ export const printReturnLabel = data => createAPI(`/pda/production/issue/print
//申请单退料接口
export const getUnissueNotifyHeaderInfo = data => createAPI(`/pda/production/return/getUnissueNotifyHeaderInfo`,'post',data)
export const getUnissueNotifyHeaderOrderMaterialList = data => createAPI(`/pda/production/return/getUnissueNotifyHeaderOrderMaterialList`,'post',data)
export const getUnissueMatericalForShopOrder = data => createAPI(`/pda/production/return/getUnissueMatericalForShopOrder`,'post',data)
export const getUnissueMatericalForShopOrder = data => createAPI(`/pda/production/return/getUnissueMatericalForShopOrder`,'post',data)
export const scanMaterialLabel = data => createAPI(`/pda/production/return/scanMaterialLabel`,'post',data)
export const productionReturnUnissueConfirm = data => createAPI(`/pda/production/return/productionReturnUnissueConfirm`,'post',data)

2
src/router/index.js

@ -55,7 +55,7 @@ const globalRoutes = [
{path: "/productionReturnPickingDetail/:orderNo/:orderType/:partNo/:transactionId/:quantity/:batchNo", name: "productionReturnPickingDetail", component: resolve => require(["@/views/modules/production-return/productionReturnPickingDetail.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } },
{path: "/productionReturnPDA", name: "productionReturnPDA", component: resolve => require(["@/views/modules/production-return/productionReturnPDA.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } },
{path: "/productionReturnPDAList/:workOrderNo/:partNo/:unissureQty", name: "productionReturnPDAList", component: resolve => require(["@/views/modules/production-return/productionReturnPDAList.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } },
{path: "/productionReturnPDAIssueList/:notifyNo/:itemNo/:workOrderNo", name: "productionReturnPDAIssueList", component: resolve => require(["@/views/modules/production-return/productionReturnPDAIssueList.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } },
{path: "/productionReturnPDAIssueList/:notifyNo/:itemNo/:workOrderNo/:unissureQty", name: "productionReturnPDAIssueList", component: resolve => require(["@/views/modules/production-return/productionReturnPDAIssueList.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } },
{path: '/production-return/pick/:orderNo',
name: 'ProductionIssuePick',component: resolve => require(["@/views/modules/production-return/pick.vue"], resolve),
meta: { transition: 'instant' ,preload: true,keepAlive: true}},

41
src/views/modules/production-issue/directIssue.vue

@ -24,9 +24,9 @@
<!-- 工单信息卡片列表 -->
<div class="work-order-list" v-if="workOrderList.length > 0">
<div
v-for="(workOrder, index) in workOrderList"
v-for="(workOrder, index) in displayWorkOrderList"
:key="index"
class="work-order-card"
:class="['work-order-card', { selected: selectedWorkOrder && isSameWorkOrder(selectedWorkOrder, workOrder) }]"
@click="selectWorkOrder(workOrder)"
>
<div class="card-title">
@ -131,8 +131,17 @@ export default {
materialList: [],
selectedMaterial: null,
loading: false,
showOnlySelected: false,
};
},
computed: {
displayWorkOrderList() {
if (this.showOnlySelected && this.selectedWorkOrder) {
return [this.selectedWorkOrder];
}
return this.workOrderList;
},
},
methods: {
formatDate(date) {
return date ? moment(date).format("YYYY-MM-DD") : "";
@ -164,11 +173,13 @@ export default {
this.workOrderList = data.workOrders;
this.selectedWorkOrder = null;
this.materialList = [];
this.showOnlySelected = false;
} else {
this.$message.error("未找到该工单信息");
this.workOrderList = [];
this.selectedWorkOrder = null;
this.materialList = [];
this.showOnlySelected = false;
}
})
.catch((error) => {
@ -178,9 +189,33 @@ export default {
});
},
//
//
isSameWorkOrder(a, b) {
if (!a || !b) return false;
return (
a.orderNo === b.orderNo &&
a.releaseNo === b.releaseNo &&
a.sequenceNo === b.sequenceNo
);
},
//
selectWorkOrder(workOrder) {
if (
this.showOnlySelected &&
this.selectedWorkOrder &&
this.isSameWorkOrder(this.selectedWorkOrder, workOrder)
) {
//
this.selectedWorkOrder = null;
this.materialList = [];
this.showOnlySelected = false;
return;
}
//
this.selectedWorkOrder = workOrder;
this.showOnlySelected = true;
this.loadMaterialList();
},

37
src/views/modules/production-return/productionReturnPDA.vue

@ -17,8 +17,8 @@
<!-- 申请单物料列表 -->
<div class="work-order-list" v-if="returnRequestMaterials.length > 0 ">
<div v-for="material in returnRequestMaterials" :key="`${material.partNo}-${material.itemNo}`"
class="work-order-card" @click="selectRequestMaterial(material)">
<div v-for="material in displayReturnRequestMaterials" :key="`${material.partNo}-${material.itemNo}`"
:class="['work-order-card', { selected: selectedRequestMaterial && isSameRequestMaterial(selectedRequestMaterial, material) }]" @click="selectRequestMaterial(material)">
<div class="card-title">
<span class="title-label">申请单号{{ material.notifyNo }} &nbsp;&nbsp; 行号{{
material.itemNo
@ -135,12 +135,19 @@ export default {
selectedRequestMaterial: null,
selectedWorkOrder:'',
materialList: [], //
showOnlySelected: false,
}
},
computed: {
functionTitle() {
return '申请单退料'
},
displayReturnRequestMaterials() {
if (this.showOnlySelected && this.selectedRequestMaterial) {
return [this.selectedRequestMaterial]
}
return this.returnRequestMaterials
}
},
methods: {
goBack() {
@ -168,6 +175,8 @@ export default {
this.loadingText = '加载申请单物料...'
this.returnRequestMaterials = []
this.materialList = []
this.selectedRequestMaterial = null
this.showOnlySelected = false
getUnissueNotifyHeaderInfo({
site: this.$store.state.user.site,
@ -189,10 +198,32 @@ export default {
})
},
isSameRequestMaterial(a, b) {
if (!a || !b) return false
return (
a.notifyNo === b.notifyNo &&
a.itemNo === b.itemNo &&
a.soorderNo === b.soorderNo
)
},
selectRequestMaterial(material) {
if (
this.showOnlySelected &&
this.selectedRequestMaterial &&
this.isSameRequestMaterial(this.selectedRequestMaterial, material)
) {
//
this.selectedRequestMaterial = null
this.selectedWorkOrder = ''
this.materialList = []
this.showOnlySelected = false
return
}
//
this.selectedRequestMaterial = material
this.selectedWorkOrder = material.notifyNo
//
this.showOnlySelected = true
this.getUnissueNotifyHeaderOrderMaterialList(material)
},
getUnissueNotifyHeaderOrderMaterialList(material){

81
src/views/modules/production-return/productionReturnPDAIssueList.vue

@ -15,7 +15,7 @@
clearable
class="compact-input"
v-model="scanCode"
placeholder="请扫描物料标签或批次号"
placeholder="请扫描物料标签"
prefix-icon="el-icon-search"
@keyup.enter.native="handleScan"
ref="scanInput"
@ -40,8 +40,7 @@
<span class="title-label"
>{{
orderInfo.type === "workOrder" ? "工单号" : "退料申请单号"
}}{{ orderInfo.orderNo }}</span
>
}}{{ orderInfo.orderNo }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;批次号{{ batchNo }}</span>
</div>
<!-- 关联信息单独一行 -->
@ -61,8 +60,8 @@
<div class="card-details">
<div class="detail-item">
<div class="detail-label">退料物料</div>
<div class="detail-value">{{ orderInfo.qtyToUnissue }}</div>
<div class="detail-label">所需退量</div>
<div class="detail-value">{{ unissureQty }}</div>
</div>
<div class="detail-item">
<div class="detail-label">领料数量</div>
@ -94,7 +93,7 @@
<div class="list-header">
<div class="col-no">NO.</div>
<div class="col-label">物料标签</div>
<div class="col-batch">批次号</div>
<!-- <div class="col-batch">批次号</div> -->
<div class="col-part">库位</div>
<div class="col-qty">退料数量</div>
</div>
@ -104,9 +103,9 @@
:key="label.id"
class="list-item"
>
<div class="col-no">{{ labelList.length - index }}</div>
<div class="col-no">{{ index+1 }}</div>
<div class="col-label">{{ label.labelCode }}</div>
<div class="col-batch">{{ label.batchNo }}</div>
<!-- <div class="col-batch">{{ label.batchNo }}</div> -->
<div class="col-part">{{ label.locationId }}</div>
<div class="col-qty" @click="openEditDialog(label, index)">
<span class="quantity-display">{{ label.quantity }}</span>
@ -121,7 +120,7 @@
</div>
<!-- 退料原因选择 -->
<div class="return-reason-section">
<!-- <div class="return-reason-section">
<div class="reason-title">退料原因</div>
<el-select
v-model="returnReason"
@ -134,7 +133,7 @@
<el-option label="生产变更" value="PRODUCTION_CHANGE"></el-option>
<el-option label="其他原因" value="OTHER"></el-option>
</el-select>
</div>
</div> -->
<!-- 底部操作按钮 -->
<div class="bottom-actions">
@ -365,7 +364,9 @@ import {
// getWorkOrderMaterials,
// parseMaterialLabel,
// directReturn,
getInventoryPart
getInventoryPart,
scanMaterialLabel,
productionReturnUnissueConfirm,
} from "@/api/production/production-return";
import moment from "moment";
@ -398,6 +399,7 @@ export default {
quantity: 0
},
editIndex: -1, //
unissureQty:0, //
};
},
computed: {
@ -429,16 +431,15 @@ export default {
// 退
validateAndAddLabel(labelCode) {
const params = {
labelCode: labelCode,
scannedLabel: labelCode,
orderNo: this.orderNo,
orderType: this.orderType,
site: this.$store.state.user.site,
};
// 退
this.simulateReturnLabelScan(params)
.then((result) => {
if (result.success) {
scanMaterialLabel(params).then(({data}) => {
if (data.code === 0 && data) {
//
const exists = this.labelList.find(
(item) => item.labelCode === labelCode
@ -452,10 +453,10 @@ export default {
this.labelList.push({
id: Date.now(),
labelCode: labelCode,
partNo: result.data.partNo,
quantity: result.data.quantity,
batchNo: result.data.batchNo,
returnReason: result.data.returnReason,
partNo: data.labelInfo.partNo,
quantity: data.labelInfo.quantity,
batchNo: data.labelInfo.batchNo,
returnReason: data.labelInfo.returnReason,
});
this.$message.success("操作成功");
@ -561,10 +562,9 @@ export default {
}
const returnParams = {
site: this.orderInfo.site,
site: this.$store.state.user.site,
orderNo: this.orderNo,
orderType: this.orderType,
returnReason: this.returnReason,
labels: this.labelList.map((label) => ({
labelCode: label.labelCode,
quantity: label.quantity,
@ -574,32 +574,18 @@ export default {
};
// 退API
this.simulateReturnConfirm(returnParams)
.then((result) => {
if (result.success) {
productionReturnUnissueConfirm(returnParams).then(({data}) => {
if (data.code === 0 && data) {
this.$message.success("生产退料成功");
this.$router.back();
} else {
this.$message.error(result.message || "操作失败");
this.$message.error(data.message || "操作失败");
}
})
.catch(() => {
}).catch(() => {
this.$message.error("操作失败");
});
},
// 退API
simulateReturnConfirm() {
return new Promise((resolve) => {
setTimeout(() => {
resolve({
success: true,
message: "生产退料成功",
});
}, 1000);
});
},
//
printLabels() {
@ -812,6 +798,7 @@ export default {
this.transactionId = this.$route.params.transactionId
this.quantity = this.$route.params.quantity
this.batchNo = this.$route.params.batchNo
this.unissureQty = this.$route.params.unissureQty
console.log("订单号:", this.orderNo, "订单类型:", this.orderType,"物料编码:",this.partNo);
if (!this.orderNo) {
@ -1046,7 +1033,7 @@ export default {
justify-content: space-between;
padding: 6px 8px;
background: white;
margin: 0 16px;
margin: 0 10px;
margin-top: 4px;
border-radius: 8px 8px 0 0;
border-bottom: 2px solid #17b3a3;
@ -1056,7 +1043,7 @@ export default {
/* 工单列表容器背景与间距 */
.work-order-list {
overflow-y: auto;
padding: 12px 16px;
padding: 10px 10px;
}
/* 工单卡片具有白色背景、圆角、阴影与边框一致性 */
@ -1064,7 +1051,7 @@ export default {
background: white;
border-radius: 8px;
margin-bottom: 12px;
padding: 16px;
padding: 10px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
transition: all 0.2s ease;
border: 2px solid transparent;
@ -1130,9 +1117,11 @@ export default {
/* 标签列表 */
.label-list {
background: white;
margin: 0 16px 12px;
margin: 0 10px 12px;
border-radius: 0 0 8px 8px;
overflow: hidden;
max-height: 300px;
overflow-y: auto;
}
.list-header {
@ -1143,6 +1132,9 @@ export default {
font-size: 12px;
color: #666;
font-weight: 500;
position: sticky;
top: 0;
z-index: 1;
}
.list-item {
@ -1163,7 +1155,7 @@ export default {
}
.col-label {
flex: 2;
flex: 4;
text-align: center;
}
@ -1242,7 +1234,6 @@ export default {
padding: 16px;
gap: 20px;
background: white;
margin-top: auto;
}
.action-btn {

40
src/views/modules/production-return/productionReturnPicking.vue

@ -6,7 +6,9 @@
<i class="el-icon-arrow-left"></i>
<span>生产退仓</span>
</div>
<div class="header-right" @click="$router.push({ path: '/' })">首页</div>
<div class="header-right" @click="$router.push({ path: '/' })">
首页
</div>
</div>
<!-- 工单号输入 -->
@ -31,6 +33,7 @@
>
<div class="card-title">
<span class="title-label">工单号{{ workOrder.orderNo }}</span>
</div>
<div class="part-desc-row">
<span class="title-value">{{ workOrder.partNo }}</span>
@ -117,12 +120,9 @@
</template>
<script>
import { getWorkOrderMaterials } from "@/api/production/production-issue";
import {
getReturnWorkOrderInfo,
getIssueForShopOrder,
} from "@/api/production/production-return";
import moment from "moment";
import { getWorkOrderMaterials } from '@/api/production/production-issue';
import { getReturnWorkOrderInfo,getIssueForShopOrder } from '@/api/production/production-return';
import moment from 'moment';
export default {
data() {
@ -137,7 +137,7 @@ export default {
},
methods: {
formatDate(date) {
return date ? moment(date).format("YYYY-MM-DD") : "";
return date ? moment(date).format('YYYY-MM-DD') : '';
},
//
handleSearchWorkOrder() {
@ -152,8 +152,7 @@ export default {
site: this.$store.state.user.site,
};
getReturnWorkOrderInfo(params)
.then(({ data }) => {
getReturnWorkOrderInfo(params).then(({ data }) => {
this.loading = false;
console.log("工单信息", data);
@ -205,26 +204,27 @@ export default {
id: index + 1,
}));
} else {
this.$message.error(data.msg || "获取材料清单失败");
this.$message.error(data.msg || '获取材料清单失败');
this.materialList = [];
}
})
.catch((error) => {
console.error("获取材料清单失败:", error);
this.$message.error("获取材料清单失败");
console.error('获取材料清单失败:', error);
this.$message.error('获取材料清单失败');
});
},
//
openIssueList(material) {
this.$router.push({
name: "productionReturnIssueList",
name: 'productionReturnIssueList',
params: {
workOrderNo: this.selectedWorkOrder.orderNo,
partNo: material.componentPartNo,
},
});
},
},
mounted() {
@ -253,7 +253,7 @@ export default {
justify-content: space-between;
align-items: center;
padding: 8px 16px;
background: #17b3a3;
background: #17B3A3;
color: white;
height: 40px;
min-height: 40px;
@ -445,7 +445,7 @@ export default {
align-items: center;
justify-content: center;
padding: 60px 20px;
color: #17b3a3;
color: #17B3A3;
}
.loading-state i {
@ -455,12 +455,8 @@ export default {
}
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.loading-state p {

Loading…
Cancel
Save