Browse Source

领料退料添加样式

master
shenzhouyu 4 months ago
parent
commit
ac0adfed91
  1. 2
      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

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

@ -21,3 +21,5 @@ export const printReturnLabel = data => createAPI(`/pda/production/issue/print
export const getUnissueNotifyHeaderInfo = data => createAPI(`/pda/production/return/getUnissueNotifyHeaderInfo`,'post',data) export const getUnissueNotifyHeaderInfo = data => createAPI(`/pda/production/return/getUnissueNotifyHeaderInfo`,'post',data)
export const getUnissueNotifyHeaderOrderMaterialList = data => createAPI(`/pda/production/return/getUnissueNotifyHeaderOrderMaterialList`,'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: "/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: "/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: "/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', {path: '/production-return/pick/:orderNo',
name: 'ProductionIssuePick',component: resolve => require(["@/views/modules/production-return/pick.vue"], resolve), name: 'ProductionIssuePick',component: resolve => require(["@/views/modules/production-return/pick.vue"], resolve),
meta: { transition: 'instant' ,preload: true,keepAlive: true}}, 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 class="work-order-list" v-if="workOrderList.length > 0">
<div <div
v-for="(workOrder, index) in workOrderList"
v-for="(workOrder, index) in displayWorkOrderList"
:key="index" :key="index"
class="work-order-card"
:class="['work-order-card', { selected: selectedWorkOrder && isSameWorkOrder(selectedWorkOrder, workOrder) }]"
@click="selectWorkOrder(workOrder)" @click="selectWorkOrder(workOrder)"
> >
<div class="card-title"> <div class="card-title">
@ -131,8 +131,17 @@ export default {
materialList: [], materialList: [],
selectedMaterial: null, selectedMaterial: null,
loading: false, loading: false,
showOnlySelected: false,
}; };
}, },
computed: {
displayWorkOrderList() {
if (this.showOnlySelected && this.selectedWorkOrder) {
return [this.selectedWorkOrder];
}
return this.workOrderList;
},
},
methods: { methods: {
formatDate(date) { formatDate(date) {
return date ? moment(date).format("YYYY-MM-DD") : ""; return date ? moment(date).format("YYYY-MM-DD") : "";
@ -164,11 +173,13 @@ export default {
this.workOrderList = data.workOrders; this.workOrderList = data.workOrders;
this.selectedWorkOrder = null; this.selectedWorkOrder = null;
this.materialList = []; this.materialList = [];
this.showOnlySelected = false;
} else { } else {
this.$message.error("未找到该工单信息"); this.$message.error("未找到该工单信息");
this.workOrderList = []; this.workOrderList = [];
this.selectedWorkOrder = null; this.selectedWorkOrder = null;
this.materialList = []; this.materialList = [];
this.showOnlySelected = false;
} }
}) })
.catch((error) => { .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) { 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.selectedWorkOrder = workOrder;
this.showOnlySelected = true;
this.loadMaterialList(); 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 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"> <div class="card-title">
<span class="title-label">申请单号{{ material.notifyNo }} &nbsp;&nbsp; 行号{{ <span class="title-label">申请单号{{ material.notifyNo }} &nbsp;&nbsp; 行号{{
material.itemNo material.itemNo
@ -135,12 +135,19 @@ export default {
selectedRequestMaterial: null, selectedRequestMaterial: null,
selectedWorkOrder:'', selectedWorkOrder:'',
materialList: [], // materialList: [], //
showOnlySelected: false,
} }
}, },
computed: { computed: {
functionTitle() { functionTitle() {
return '申请单退料' return '申请单退料'
}, },
displayReturnRequestMaterials() {
if (this.showOnlySelected && this.selectedRequestMaterial) {
return [this.selectedRequestMaterial]
}
return this.returnRequestMaterials
}
}, },
methods: { methods: {
goBack() { goBack() {
@ -168,6 +175,8 @@ export default {
this.loadingText = '加载申请单物料...' this.loadingText = '加载申请单物料...'
this.returnRequestMaterials = [] this.returnRequestMaterials = []
this.materialList = [] this.materialList = []
this.selectedRequestMaterial = null
this.showOnlySelected = false
getUnissueNotifyHeaderInfo({ getUnissueNotifyHeaderInfo({
site: this.$store.state.user.site, 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) { 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.selectedRequestMaterial = material
this.selectedWorkOrder = material.notifyNo this.selectedWorkOrder = material.notifyNo
//
this.showOnlySelected = true
this.getUnissueNotifyHeaderOrderMaterialList(material) this.getUnissueNotifyHeaderOrderMaterialList(material)
}, },
getUnissueNotifyHeaderOrderMaterialList(material){ getUnissueNotifyHeaderOrderMaterialList(material){

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

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

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

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

Loading…
Cancel
Save