<template>
|
<default-header-page-layout ref="page" title="平库组盘入库">
|
<view
|
class="page-frame with-action-user-row"
|
:style="{ height: pageBodyHeight + 'px' }"
|
v-if="pageBodyHeight"
|
>
|
<action-user-row />
|
<view class="with-action-user-row-page-content">
|
<!-- step 1 start -->
|
<scan-input-form-item
|
class="forma-item"
|
label="托盘编码"
|
v-model="form.containterCode"
|
:msg="msg.containter"
|
:msg-type="msgType.containter"
|
@search="onSearchContainter"
|
@clear="onClearContainter"
|
/>
|
|
<scan-input-form-item
|
placeholder="请选择"
|
:disabled="disabledContainerType"
|
:clearable="false"
|
:hasScan="false"
|
:hasSearch="false"
|
@click.native="ctVisible = true"
|
class="forma-item"
|
label="托盘类型"
|
v-model="form.containerType"
|
/>
|
<EasyPicker
|
:visible.sync="ctVisible"
|
:list="ContainerType"
|
labelField="value"
|
valueField="code"
|
@select="getTypeVal"
|
/>
|
|
<selectItem
|
v-show="Boolean(containerInfo.containerNo)"
|
:selectData="areaData"
|
:value.sync="form.areaNo"
|
label="库区编码"
|
labelField="areaName"
|
valueField="areaNo"
|
/>
|
|
<!-- <selectItem
|
:selectData="placeList"
|
:value.sync="form.placeNo"
|
label="库位编码"
|
labelField="placeNo"
|
valueField="placeNo"
|
@getCurrentData="getCurrentData"
|
:isShowSearch="true"
|
/> -->
|
|
<!-- @confirmHc="getStockPageHandle" -->
|
<selectItemWc2
|
v-show="Boolean(containerInfo.containerNo)"
|
:selectData="placeList"
|
:value.sync="form.placeNo"
|
label="库位编码"
|
labelField="placeNo"
|
valueField="placeNo"
|
@getPropData="getCurrentData"
|
/>
|
|
<scan-input-form-item
|
v-show="Boolean(containerInfo.containerNo)"
|
class="forma-item"
|
label="物料二维码"
|
v-model="form.materialNo"
|
:msg="msg.material"
|
:msg-type="msgType.material"
|
@search="onSearchMaterial"
|
@clear="onClearMaterial"
|
/>
|
<materialList
|
:materialData="materialData"
|
@delMaterialData="delMaterialData"
|
/>
|
</view>
|
</view>
|
<template v-slot:footer>
|
<view class="bottom-btns-row">
|
<template v-if="abled && materialData.length > 0">
|
<div class="btn-frame">
|
<u-button
|
type="primary"
|
text="组 盘"
|
@click="onSubmit(1)"
|
:disabled="!abled"
|
></u-button>
|
</div>
|
<div class="btn-frame">
|
<u-button
|
type="primary"
|
text="组盘入库"
|
@click="AddInBoundForFlat(1)"
|
:disabled="!abled"
|
></u-button>
|
</div>
|
<!-- <div class="btn-frame" style="margin-left:10rpx"><u-button type="primary" text="自制件入库"
|
@click="addVirtual(1)" :disabled="!abled"></u-button></div> -->
|
</template>
|
</view>
|
</template>
|
</default-header-page-layout>
|
</template>
|
|
<script>
|
import DefaultHeaderPageLayout from "@/components/DefaultHeaderPageLayout.vue";
|
import ActionUserRow from "@/components/ActionUserRow.vue";
|
import ScanInputFormItem from "@/components/ScanInputFormItem.vue";
|
import EasySelectFormItem from "@/components/EasySelectFormItem.vue";
|
import EasyPicker from "@/components/EasyPicker.vue";
|
import materialList from "./modules/materialList.vue";
|
import selectItem from "@/components/selectItem.vue";
|
import { getAreaInfo } from "@/api/common.js";
|
import selectItemWc2 from "@/components/selectItemWithSearchWc2.vue";
|
|
import {
|
parseDic,
|
$alert,
|
$successInfo,
|
getDicList,
|
} from "@/static/js/utils/index.js";
|
import { palceList } from "@/service/mixins/mixins.js";
|
import {
|
getForContainerCode,
|
getForMaterialNo,
|
bindMaterialContainer,
|
AddInBoundForFlat,
|
addInVirtualPlace,
|
addAGVTask,
|
} from "@/api/bind.js";
|
let initInterVal = null;
|
export default {
|
name: "receiveInPage",
|
components: {
|
DefaultHeaderPageLayout,
|
ActionUserRow,
|
ScanInputFormItem,
|
EasySelectFormItem,
|
materialList,
|
EasyPicker,
|
selectItem,
|
selectItemWc2
|
},
|
data() {
|
return {
|
pageBodyHeight: 0,
|
containter: null,
|
form: {
|
containterCode: "",
|
materialNo: "",
|
site: "",
|
containerTypeCode: 0,
|
containerType: "",
|
placeNo: "",
|
},
|
msg: {
|
containter: "",
|
material: "",
|
site: "",
|
},
|
msgType: {
|
containter: "info",
|
material: "error",
|
site: "error",
|
},
|
containerInfo: {},
|
materialData: [],
|
ContainerType: [],
|
visible: false,
|
ctVisible: false,
|
disabledContainerType: false,
|
areaData: [],
|
placeList: [],
|
};
|
},
|
computed: {
|
abled() {
|
let { containerStatus } = this.containerInfo;
|
return (
|
containerStatus != 0 &&
|
containerStatus != 3 &&
|
this.materialData.length > 0
|
);
|
},
|
},
|
watch: {
|
//选择区 重新获取库位
|
"form.areaNo": {
|
handler(val, oldVal) {
|
if (val != "") {
|
this.form.placeNo = "";
|
this.placeList = [];
|
// 获取库存
|
this.getPalceList({
|
areaCode: val,
|
});
|
}
|
},
|
},
|
},
|
methods: {
|
// 选择站点返回值
|
getSiteVal(val, valObj, index) {
|
this.form.site = val;
|
},
|
// 选择托盘类型返回值
|
getTypeVal(val, valObj, index) {
|
this.form.containerTypeCode = valObj.code;
|
this.form.containerType = valObj.value;
|
},
|
/* 托盘编码搜索 */
|
async onSearchContainter() {
|
|
if (!this.form.containterCode) {
|
this.msgType.containter = "error";
|
this.msg.containter = "请输入托盘编号!";
|
return false;
|
}
|
// 获取代码
|
try {
|
this.materialData =[];
|
let { result } = await getForContainerCode({
|
code: this.form.containterCode,
|
});
|
this.containerInfo = result;
|
// 托盘详情
|
let containerStatusName = parseDic(
|
this.$store,
|
"container_status",
|
result?.containerStatus
|
);
|
containerStatusName =
|
containerStatusName == "无此字典" ? "" : containerStatusName;
|
this.msg.containter = `状态:${containerStatusName}, 尺寸:${result?.specLength}*${result?.specWidth}*${result?.specHeight}`;
|
|
if (result.containerType) {
|
//如果托盘存在 赋值托盘类型
|
var arr = this.ContainerType.filter(
|
(v) => v.code == result.containerType
|
);
|
this.form.containerType = arr[0]?.value || "";
|
this.form.containerTypeCode = arr[0]?.code || "";
|
this.disabledContainerType = true;
|
} else {
|
this.disabledContainerType = false;
|
this.form.containerType = "";
|
this.form.containerTypeCode = "";
|
}
|
|
result?.materialContainers.forEach((item) => {
|
let isExist = this.materialData.some(
|
(item1) => item1.materialId == item.materialId
|
);
|
if (!isExist) {
|
this.materialData.push(item);
|
}
|
});
|
} catch (e) {
|
//TODO handle the exception
|
console.log(e);
|
}
|
},
|
/* 清除托盘编码 */
|
onClearContainter() {
|
this.form = {
|
containterCode: "",
|
containerType: "",
|
areaNo: "",
|
materialNo: "",
|
site: "",
|
containerTypeCode: 0,
|
placeNo: "",
|
};
|
this.disabledContainerType = false;
|
this.$set(this.form, "site", "");
|
this.resetContainerNo();
|
},
|
resetContainerNo() {
|
this.msg = {
|
containter: "",
|
material: "",
|
site: "",
|
};
|
this.msgType = {
|
containter: "info",
|
material: "error",
|
site: "error",
|
};
|
this.containerStatus = null;
|
this.materialData = [];
|
this.form.materialNo = "";
|
this.form.site = "";
|
this.form.containerTypeCode = 0;
|
this.form.areaNo = "";
|
this.form.placeNo = "";
|
this.form.containerType = "";
|
this.containerInfo = {};
|
},
|
/* 物料编码搜索 */
|
async onSearchMaterial() {
|
if (!this.form.materialNo) {
|
this.msg.material = "请输入物料编号!";
|
return false;
|
}
|
this.msg.material = "";
|
try {
|
let { result } = await getForMaterialNo({
|
code: this.form.materialNo,
|
});
|
const isExist = this.materialData.some(
|
(item) => item.materialId == result.materialId
|
);
|
if (!isExist) {
|
this.materialData.push(result);
|
} else {
|
$alert(`物料唯一码已存在,请删除后再输入!`);
|
}
|
} catch (e) {
|
//TODO handle the exception
|
console.log(e);
|
}
|
},
|
/* 物料编码清除 */
|
onClearMaterial() {
|
this.form.materialNo = "";
|
},
|
//删除物料
|
delMaterialData(materialId) {
|
this.materialData = this.materialData.filter(
|
(item) => item.materialId != materialId
|
);
|
},
|
// 组盘
|
async onSubmit(param) {
|
if (this.containerInfo.isExist == 2 && this.form.containerTypeCode == 0) {
|
return $alert("请选择托盘类型!");
|
}
|
|
if (param) {
|
this.valateType("组盘");
|
return;
|
}
|
const data = {
|
containerNo: this.form.containterCode,
|
containerType: this.form.containerTypeCode,
|
materialContainerList: this.materialData,
|
};
|
try {
|
await bindMaterialContainer(data);
|
this.$modal("组盘成功");
|
this.onClearContainter();
|
} catch (e) {
|
//TODO handle the exception
|
console.log(e);
|
}
|
},
|
|
//方法 提示 托盘类型 和 物料类型 不一致 是否确认组盘
|
valateType(name) {
|
if (this.materialData.length <= 0) {
|
return $alert("请扫物料!");
|
}
|
var flag = false;
|
//物料类型:机体3 缸盖1; 容器:自制件机体托盘4 自制件缸盖托盘5
|
if (
|
this.materialData[0].materialType == 3 &&
|
this.form.containerTypeCode != 4
|
) {
|
//机体3
|
flag = true;
|
}
|
|
if (
|
this.materialData[0].materialType == 1 &&
|
this.form.containerTypeCode != 5
|
) {
|
//缸盖1
|
flag = true;
|
}
|
|
if (flag) {
|
uni.showModal({
|
title: "确认" + name,
|
content: "托盘类型和物料类型不一致,是否确认继续?",
|
showCancel: true,
|
confirmText: "确认",
|
cancelText: "取消",
|
success: async ({ confirm }) => {
|
if (confirm) {
|
if (name == "组盘") {
|
this.onSubmit();
|
}
|
if (name == "入库") {
|
this.AddInBoundForFlat();
|
}
|
if (name == "自制件入库") {
|
this.addVirtual();
|
}
|
}
|
},
|
});
|
} else {
|
if (name == "组盘") {
|
this.onSubmit();
|
}
|
if (name == "入库") {
|
this.AddInBoundForFlat();
|
}
|
if (name == "自制件入库") {
|
this.addVirtual();
|
}
|
}
|
},
|
// 入库
|
async AddInBoundForFlat(param) {
|
if (this.containerInfo.isExist == 2 && this.form.containerTypeCode == 0) {
|
return $alert("请选择托盘类型!");
|
}
|
if (!this.form.placeNo) {
|
return $alert("请选择库位!");
|
}
|
if (param) {
|
this.valateType("入库");
|
return;
|
}
|
const data = {
|
type: 1,
|
stationNo: this.form.site,
|
placeNo: this.form.placeNo,
|
containerNo: this.form.containterCode,
|
containerType: this.form.containerTypeCode,
|
materialContainerList: this.materialData,
|
};
|
|
try {
|
await AddInBoundForFlat(data);
|
this.$modal("入库成功");
|
this.onClearContainter();
|
} catch (e) {
|
//TODO handle the exception
|
console.log(e);
|
}
|
},
|
// 自制件入库
|
async addVirtual(param) {
|
if (param) {
|
this.valateType("自制件入库");
|
return;
|
}
|
const data = {
|
containerNo: this.form.containterCode,
|
placeNo: this.form.placeNo,
|
containerType: this.form.containerTypeCode,
|
materialContainerList: this.materialData,
|
};
|
try {
|
await addInVirtualPlace(data);
|
this.$modal("自制件入库成功");
|
this.onClearContainter();
|
} catch (e) {
|
//TODO handle the exception
|
console.log(e);
|
}
|
},
|
|
/* 页面初始化获取页面body高度的定时器 */
|
startInitInterval(callback) {
|
initInterVal = setInterval(() => {
|
if (this.pageBodyHeight) {
|
this.clearInitInterval();
|
callback && callback();
|
} else {
|
this.pageBodyHeight = this.$refs.page.getBodyHeight();
|
}
|
}, 200);
|
},
|
/* 清除定时器 */
|
clearInitInterval() {
|
try {
|
clearInterval(initInterVal);
|
initInterVal = null;
|
} catch (e) {
|
//TODO handle the exception
|
}
|
},
|
// 获取库区数据
|
async getAreaList() {
|
try {
|
let { result } = await getAreaInfo();
|
this.areaData = result.filter((item) => item.areaType == 3);
|
} catch (e) {
|
console.log(e);
|
}
|
},
|
//库位模糊查询
|
async getCurrentData(PlaceNo) {
|
await this.getPalceList({
|
areaCode: this.form.areaNo,
|
PlaceNo: PlaceNo,
|
});
|
},
|
},
|
mixins: [palceList],
|
onReady() {
|
this.startInitInterval(async () => {
|
/* 页面初始化后需要执行的代码在这边调用 */
|
// this.getPalceList({
|
// areaCode: 'LTK-SDCR'
|
// })
|
this.getAreaList();
|
this.ContainerType = getDicList(
|
this.$store,
|
"container_type"
|
).sysDictDatas;
|
});
|
},
|
onUnload() {
|
this.clearInitInterval();
|
},
|
};
|
</script>
|
|
<style scoped lang="scss">
|
.bottom-btns-row {
|
display: flex;
|
justify-content: center;
|
padding: 10rpx 10rpx;
|
background-color: #fff;
|
|
.btn-frame {
|
flex: 1;
|
box-sizing: border-box;
|
}
|
|
.btn-frame:nth-child(1) {
|
margin-right: 10rpx;
|
}
|
|
.left-btn-frame {
|
padding-left: 20rpx;
|
padding-right: 8rpx;
|
}
|
|
.right-btn-frame {
|
padding-right: 20rpx;
|
padding-left: 8rpx;
|
}
|
}
|
|
.forma-item {
|
margin-bottom: 24rpx;
|
}
|
|
.material-item-group {
|
background-color: $uni-bg-color;
|
padding-top: 10rpx;
|
|
.material-list-item {
|
border-bottom: 2rpx solid $uni-border-color;
|
padding-bottom: 10rpx;
|
padding-left: 60rpx;
|
margin-bottom: 10rpx;
|
position: relative;
|
|
&:last-child {
|
border-bottom: 0;
|
}
|
|
.item-row {
|
display: flex;
|
|
& > .label {
|
flex-shrink: 0;
|
color: $u-tips-color;
|
width: 144rpx;
|
}
|
|
& > .content {
|
flex-grow: 1;
|
color: $u-content-color;
|
|
uni-input {
|
font: inherit;
|
color: $u-primary;
|
text-decoration: underline;
|
}
|
}
|
}
|
|
.badge-box {
|
position: absolute;
|
top: 8rpx;
|
left: 8rpx;
|
z-index: 1;
|
}
|
|
.close-btn {
|
$closeBtnSize: 70rpx;
|
width: $closeBtnSize;
|
height: $closeBtnSize;
|
z-index: 1;
|
position: absolute;
|
top: 0rpx;
|
right: 8rpx;
|
background-color: $u-error;
|
opacity: 0.6;
|
border-radius: 25rpx;
|
|
.icon-layer {
|
position: absolute;
|
width: 100%;
|
height: 100%;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
z-index: 2;
|
}
|
}
|
}
|
}
|
</style>
|