PDA版本更新为V1.4

1、PDA强制输入批次,且为6位数字
2、产线呼叫只能呼叫按批次排序后的第一行
后端接口
产线呼叫功能搜索物料按物料批次排序,未绑定位置的货架不会被搜索到
This commit is contained in:
hehaibing-1996
2025-04-02 13:32:54 +08:00
parent ba4a73e2ce
commit 7bd48ebe63
10 changed files with 143 additions and 59 deletions

View File

@ -51,10 +51,11 @@
<view style="flex: 3;"></view>
<view style="flex: 32;">
<button class="mini-btn" style="font-size: 25rpx;" type="warn" size="mini" @click="callEmptyShelf">呼叫货架</button>
<button class="mini-btn" style="font-size: 25rpx;" type="warn" size="mini"
@click="callEmptyShelf">呼叫货架</button>
</view>
</view>
<view style="border-bottom: 1rpx solid black; /* 分隔线的颜色和粗细 */"></view>
<view class="diy-flex-inforow" style="flex: 1;">
@ -111,10 +112,10 @@
<view style="flex: 5;"></view>
<view style="flex: 35;">物料批次</view>
<view style="flex: 35;font-weight: 800;" @click="matBatchClick">物料批次</view>
<view class="uni-input-wrapper" style="flex: 80;">
<input class="uni-input" style="font-size: 40rpx; " placeholder="请输入批次" v-model="matBatch"></input>
<input class="uni-input" style="font-size: 40rpx; " placeholder="请输入批次(或点'物料批次')" v-model="matBatch"></input>
</view>
<view style="flex: 10;"></view>
@ -302,14 +303,14 @@
if (typeIndex + 1 < this.shelfTypeOptions.length) {
this.selectedShelfTypeIndex = typeIndex;
}
this.shelfAreaOptions = res.data.data.locationArea;
var index = getConfig("bindSelectedShelfAreaIndex", 0);
if (index + 1 < this.shelfAreaOptions.length) {
this.selectedShelfAreaIndex = index;
}
if (this.shelfId != null && this.shelfCode != null && this
.shelfCode.includes('运输中')) {
this.placeholderText = '请等待货架运输';
@ -376,9 +377,35 @@
this.matQty = item.matDefaultQty;
this.matBaseInfoId = item.id;
},
isEightDigits: function(str) {
return /^[0-9]{6}$/.test(str);
},
//点击物料批次字样 自动带出当前批次
matBatchClick: function() {
var currentTime = new Date();
const year = currentTime.getFullYear().toString().slice(-2); // 获取年份的最后两位
const month = (currentTime.getMonth() + 1).toString().padStart(2, '0'); // 获取月份,并确保是两位数
const date = currentTime.getDate().toString().padStart(2, '0'); // 获取日期,并确保是两位数
this.matBatch = year + month + date;
},
//物料绑定
bind: function() {
if (this.matBatch == null || this.matBatch == '') {
uni.showToast({
title: '请输入批次!',
icon: 'none',
duration: 1500
});
return;
}
if (this.isEightDigits(this.matBatch) == false) {
uni.showToast({
title: '批次需要输入6位数字\r\n如250101',
icon: 'none',
duration: 1500
});
return;
}
this.userName = getConfig('userName', '');
var serverIPAndPort = getServerIPAndPort();
uni.request({
@ -445,7 +472,7 @@
},
queryMatList: function() {
//支持手动输入
const regex = /^\d{6}XY\d{6}$/;
if (regex.test(this.matCodeCondition)) {
@ -454,7 +481,7 @@
this.analysisScanCode(this.locationCode);
return;
}
const regex1 = /^\d{6}xy\d{6}$/;
if (regex1.test(this.matCodeCondition)) {
this.locationCode = this.matCodeCondition.toUpperCase();
@ -462,7 +489,7 @@
this.analysisScanCode(this.locationCode);
return;
}
const regex2 = /^[1-9]\d{5}$/;
//只有在未扫码的时候输入货架编码有用
if (regex2.test(this.matCodeCondition) && this.isNeedScanLocationCode) {
@ -471,8 +498,8 @@
this.analysisScanCode(this.shelfCode);
return;
}
if (this.isNeedScanLocationCode) {
uni.showToast({
title: '请先扫描工位码!',

View File

@ -80,7 +80,7 @@
userName: '',
passWord: '',
serverIPAndPort: '',
version: 'V1.3',
version: 'V1.4',
downloadProgress: 0, // 下载进度
showProgressBar: false, // 控制进度条是否显示
}

View File

@ -60,7 +60,7 @@
<view class="diy-flex-column" style="margin-top: 5rpx;">
<scroll-view class="scroll-view" scroll-y="true">
<view v-for="(item, index) in cardData" :key="index" @touchstart="cardTouchStart"
@touchmove="cardTouchMove" @longpress="longpress(item)">
@touchmove="cardTouchMove" @longpress="longpress(item,index)">
<Card :item="item" :currentIndex="index" :cardData="cardData" />
</view>
</scroll-view>
@ -116,13 +116,17 @@
const fixedInfo = {
shelfId: 0,
shelfCode: '',
index:-1,
};
const popup = ref(null);
const inputValue = ref('');
const showPopup = (info) => {
const showPopup = (info,index) => {
fixedInfo.shelfId = info.shelfId;
fixedInfo.shelfCode = info.shelfCode;
fixedInfo.index = index;
popup.value.open();
};
@ -132,6 +136,17 @@
};
const saveData = () => {
console.log('111:'+fixedInfo.index);
if(fixedInfo.index != 0)
{
uni.showToast({
title: '目前采取严格按照批次先进先出。\r\n请选择搜索结果第一条进行呼叫',
icon: 'none',
duration: 4000
});
return;
}
var serverIPAndPort = getServerIPAndPort();
//调用接口进行货架的呼叫
@ -493,9 +508,9 @@
}
},
//长按
longpress(item) {
longpress(item,index) {
if (this.isMove == false) {
this.showPopup(item);
this.showPopup(item,index);
}
},
}

View File

@ -1,8 +1,8 @@
{
"hash": "e52075f4",
"configHash": "469f15e9",
"lockfileHash": "418b0517",
"browserHash": "dfed43e0",
"hash": "f663bba1",
"configHash": "e12fdbcd",
"lockfileHash": "d2aaf416",
"browserHash": "5c516658",
"optimized": {},
"chunks": {}
}

View File

@ -1,7 +1,7 @@
;(function(){
let u=void 0,isReady=false,onReadyCallbacks=[],isServiceReady=false,onServiceReadyCallbacks=[];
const __uniConfig = {"pages":[],"globalStyle":{"backgroundColor":"#F8F8F8","navigationBar":{"backgroundColor":"#F8F8F8","titleText":"智慧物流系统-移动端","type":"default","titleColor":"#000000"},"isNVue":false},"nvue":{"compiler":"uni-app","styleCompiler":"uni-app","flex-direction":"column"},"renderer":"auto","appname":"智慧物流","splashscreen":{"alwaysShowBeforeRender":true,"autoclose":true},"compilerVersion":"4.45","entryPagePath":"pages/index/index","entryPageQuery":"","realEntryPagePath":"","networkTimeout":{"request":60000,"connectSocket":60000,"uploadFile":60000,"downloadFile":60000},"locales":{},"darkmode":false,"themeConfig":{}};
const __uniConfig = {"pages":[],"globalStyle":{"backgroundColor":"#F8F8F8","navigationBar":{"backgroundColor":"#F8F8F8","titleText":"智慧物流系统-移动端","type":"default","titleColor":"#000000"},"isNVue":false},"nvue":{"compiler":"uni-app","styleCompiler":"uni-app","flex-direction":"column"},"renderer":"auto","appname":"智慧物流","splashscreen":{"alwaysShowBeforeRender":true,"autoclose":true},"compilerVersion":"4.57","entryPagePath":"pages/index/index","entryPageQuery":"","realEntryPagePath":"","networkTimeout":{"request":60000,"connectSocket":60000,"uploadFile":60000,"downloadFile":60000},"locales":{},"darkmode":false,"themeConfig":{}};
const __uniRoutes = [{"path":"pages/index/index","meta":{"isQuit":true,"isEntry":true,"navigationBar":{"titleText":"智慧物流系统-登录","type":"default"},"isNVue":false}},{"path":"pages/config/config","meta":{"navigationBar":{"titleText":"智慧物流系统-用户配置","type":"default"},"isNVue":false}},{"path":"pages/main/main","meta":{"navigationBar":{"titleText":"智慧物流系统-主页","type":"default"},"isNVue":false}},{"path":"pages/bind/bind","meta":{"navigationBar":{"titleText":"智慧物流系统-物料绑定","type":"default"},"isNVue":false}},{"path":"pages/bindSelectMat/bindSelectMat","meta":{"navigationBar":{"titleText":"智慧物流系统-物料绑定选择物料","type":"default"},"isNVue":false}},{"path":"pages/queryBindList/queryBindList","meta":{"navigationBar":{"titleText":"智慧物流系统-绑定查询","type":"default"},"isNVue":false}},{"path":"pages/stockTaking/stockTaking","meta":{"navigationBar":{"titleText":"智慧物流系统-库存盘点","type":"default"},"isNVue":false}},{"path":"pages/shelfLocationBindUnbind/shelfLocationBindUnbind","meta":{"navigationBar":{"titleText":"智慧物流系统-货架位置绑定解绑","type":"default"},"isNVue":false}},{"path":"pages/productionLineCallIn/productionLineCallIn","meta":{"navigationBar":{"titleText":"智慧物流系统-产线呼叫","type":"default"},"isNVue":false}},{"path":"pages/productionLineCallOut/productionLineCallOut","meta":{"navigationBar":{"titleText":"智慧物流系统-货架送回","type":"default"},"isNVue":false}},{"path":"pages/agvTasks/agvTasks","meta":{"navigationBar":{"titleText":"智慧物流系统-任务管理","type":"default"},"isNVue":false}},{"path":"pages/allBindQuery/allBindQuery","meta":{"navigationBar":{"titleText":"智慧物流系统-厂内物料查询","type":"default"},"isNVue":false}},{"path":"pages/shelfLocationCallSendBack/shelfLocationCallSendBack","meta":{"navigationBar":{"titleText":"智慧物流系统-货架库区","type":"default"},"isNVue":false}}].map(uniRoute=>(uniRoute.meta.route=uniRoute.path,__uniConfig.pages.push(uniRoute.path),uniRoute.path='/'+uniRoute.path,uniRoute));
__uniConfig.styles=[];//styles
__uniConfig.onReady=function(callback){if(__uniConfig.ready){callback()}else{onReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"ready",{get:function(){return isReady},set:function(val){isReady=val;if(!isReady){return}const callbacks=onReadyCallbacks.slice(0);onReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});

View File

@ -988,36 +988,36 @@ if (uni.restoreGlobal) {
this.userName = getConfig("userName", "admin");
const self = this;
recive(function(res) {
formatAppLog("log", "at pages/bind/bind.vue:233", "Success:" + res.data);
formatAppLog("log", "at pages/bind/bind.vue:234", "Success:" + res.data);
self.analysisScanCode(res.data);
}, function(err) {
formatAppLog("log", "at pages/bind/bind.vue:236", "Error:", JSON.stringify(err));
formatAppLog("log", "at pages/bind/bind.vue:237", "Error:", JSON.stringify(err));
});
},
methods: {
handleFocus() {
formatAppLog("log", "at pages/bind/bind.vue:241", "foucus");
formatAppLog("log", "at pages/bind/bind.vue:242", "foucus");
this.isMatConditionFoucused = true;
},
handleBlur() {
formatAppLog("log", "at pages/bind/bind.vue:245", "bulur");
formatAppLog("log", "at pages/bind/bind.vue:246", "bulur");
this.isMatConditionFoucused = false;
},
//摄像头扫码
cameraScanCode() {
uni.scanCode({
success: (res) => {
formatAppLog("log", "at pages/bind/bind.vue:252", "扫码结果:", res.result);
formatAppLog("log", "at pages/bind/bind.vue:253", "扫码结果:", res.result);
this.analysisScanCode(res.result);
},
fail: (err) => {
formatAppLog("error", "at pages/bind/bind.vue:256", "扫码失败:", err);
formatAppLog("error", "at pages/bind/bind.vue:257", "扫码失败:", err);
}
});
},
//扫码枪扫码
analysisScanCode: function(encodedString) {
formatAppLog("log", "at pages/bind/bind.vue:263", this.isMatConditionFoucused);
formatAppLog("log", "at pages/bind/bind.vue:264", this.isMatConditionFoucused);
if (this.isMatConditionFoucused) {
return;
}
@ -1106,20 +1106,47 @@ if (uni.restoreGlobal) {
}
},
complete: (event) => {
formatAppLog("log", "at pages/bind/bind.vue:366", "请求完成", event);
formatAppLog("log", "at pages/bind/bind.vue:367", "请求完成", event);
}
});
},
bindSelectedMat: function(item) {
formatAppLog("log", "at pages/bind/bind.vue:372", "用户选择了项目:", item);
formatAppLog("log", "at pages/bind/bind.vue:373", "用户选择了项目:", item);
this.matCode = item.matCode;
this.matName = item.matName;
this.matSpec = item.matSpec;
this.matQty = item.matDefaultQty;
this.matBaseInfoId = item.id;
},
isEightDigits: function(str) {
return /^[0-9]{6}$/.test(str);
},
//点击物料批次字样 自动带出当前批次
matBatchClick: function() {
var currentTime = /* @__PURE__ */ new Date();
const year = currentTime.getFullYear().toString().slice(-2);
const month = (currentTime.getMonth() + 1).toString().padStart(2, "0");
const date = currentTime.getDate().toString().padStart(2, "0");
this.matBatch = year + month + date;
},
//物料绑定
bind: function() {
if (this.matBatch == null || this.matBatch == "") {
uni.showToast({
title: "请输入批次!",
icon: "none",
duration: 1500
});
return;
}
if (this.isEightDigits(this.matBatch) == false) {
uni.showToast({
title: "批次需要输入6位数字\r\n如250101",
icon: "none",
duration: 1500
});
return;
}
this.userName = getConfig("userName", "");
var serverIPAndPort = getServerIPAndPort();
uni.request({
@ -1176,7 +1203,7 @@ if (uni.restoreGlobal) {
});
},
complete: (event) => {
formatAppLog("log", "at pages/bind/bind.vue:441", "请求完成", event);
formatAppLog("log", "at pages/bind/bind.vue:468", "请求完成", event);
}
});
},
@ -1302,7 +1329,7 @@ if (uni.restoreGlobal) {
});
},
complete: (event) => {
formatAppLog("log", "at pages/bind/bind.vue:583", "请求完成", event);
formatAppLog("log", "at pages/bind/bind.vue:610", "请求完成", event);
}
});
},
@ -1393,7 +1420,7 @@ if (uni.restoreGlobal) {
});
},
complete: (event) => {
formatAppLog("log", "at pages/bind/bind.vue:685", "请求完成", event);
formatAppLog("log", "at pages/bind/bind.vue:712", "请求完成", event);
}
});
},
@ -1421,7 +1448,7 @@ if (uni.restoreGlobal) {
this.matQty = 0;
},
handlePopupClose() {
formatAppLog("log", "at pages/bind/bind.vue:717", "弹出层已关闭");
formatAppLog("log", "at pages/bind/bind.vue:744", "弹出层已关闭");
}
}
};
@ -1598,7 +1625,10 @@ if (uni.restoreGlobal) {
style: { "flex": "1" }
}, [
vue.createElementVNode("view", { style: { "flex": "5" } }),
vue.createElementVNode("view", { style: { "flex": "35" } }, "物料批次:"),
vue.createElementVNode("view", {
style: { "flex": "35", "font-weight": "800" },
onClick: _cache[7] || (_cache[7] = (...args) => $options.matBatchClick && $options.matBatchClick(...args))
}, "物料批次:"),
vue.createElementVNode("view", {
class: "uni-input-wrapper",
style: { "flex": "80" }
@ -1608,8 +1638,8 @@ if (uni.restoreGlobal) {
{
class: "uni-input",
style: { "font-size": "40rpx" },
placeholder: "请输入批次",
"onUpdate:modelValue": _cache[7] || (_cache[7] = ($event) => $data.matBatch = $event)
placeholder: "请输入批次(或点'物料批次')",
"onUpdate:modelValue": _cache[8] || (_cache[8] = ($event) => $data.matBatch = $event)
},
null,
512
@ -1637,7 +1667,7 @@ if (uni.restoreGlobal) {
type: "number",
style: { "font-size": "40rpx" },
placeholder: "请输入物料数量",
"onUpdate:modelValue": _cache[8] || (_cache[8] = ($event) => $data.matQty = $event)
"onUpdate:modelValue": _cache[9] || (_cache[9] = ($event) => $data.matQty = $event)
},
null,
512
@ -1648,7 +1678,7 @@ if (uni.restoreGlobal) {
]),
vue.createElementVNode("view", { style: { "flex": "40" } }, [
vue.createElementVNode("button", {
onClick: _cache[9] || (_cache[9] = (...args) => $options.bind && $options.bind(...args)),
onClick: _cache[10] || (_cache[10] = (...args) => $options.bind && $options.bind(...args)),
class: "mini-btn",
style: { "margin-left": "11rpx", "font-size": "28rpx" },
type: "warn",
@ -1666,7 +1696,7 @@ if (uni.restoreGlobal) {
range: $data.shelfAreaOptions,
"range-key": "locationAreaName",
value: $data.selectedShelfAreaIndex,
onChange: _cache[10] || (_cache[10] = (...args) => $options.onShelfAreaChange && $options.onShelfAreaChange(...args)),
onChange: _cache[11] || (_cache[11] = (...args) => $options.onShelfAreaChange && $options.onShelfAreaChange(...args)),
style: { "font-size": "35rpx" }
}, [
vue.createElementVNode(
@ -1681,7 +1711,7 @@ if (uni.restoreGlobal) {
vue.createElementVNode("button", {
style: { "font-size": "40rpx", "margin": "15rpx", "background-color": "green", "color": "aliceblue" },
size: "mini",
onClick: _cache[11] || (_cache[11] = (...args) => $options.sendShelfBack && $options.sendShelfBack(...args))
onClick: _cache[12] || (_cache[12] = (...args) => $options.sendShelfBack && $options.sendShelfBack(...args))
}, "送 货 架")
])
])
@ -4683,19 +4713,30 @@ if (uni.restoreGlobal) {
} = vue.getCurrentInstance();
const fixedInfo = {
shelfId: 0,
shelfCode: ""
shelfCode: "",
index: -1
};
const popup = vue.ref(null);
const inputValue = vue.ref("");
const showPopup = (info) => {
const showPopup = (info, index) => {
fixedInfo.shelfId = info.shelfId;
fixedInfo.shelfCode = info.shelfCode;
fixedInfo.index = index;
popup.value.open();
};
const hidePopup = () => {
popup.value.close();
};
const saveData = () => {
formatAppLog("log", "at pages/productionLineCallIn/productionLineCallIn.vue:139", "111:" + fixedInfo.index);
if (fixedInfo.index != 0) {
uni.showToast({
title: "目前采取严格按照批次先进先出。\r\n请选择搜索结果第一条进行呼叫",
icon: "none",
duration: 4e3
});
return;
}
var serverIPAndPort = getServerIPAndPort();
uni.request({
url: "http://" + serverIPAndPort + "/pdaProductionLineCallIn/callIn",
@ -4788,30 +4829,30 @@ if (uni.restoreGlobal) {
this.userName = getConfig("userName", "admin");
const self = this;
recive(function(res) {
formatAppLog("log", "at pages/productionLineCallIn/productionLineCallIn.vue:233", "Success:" + res.data);
formatAppLog("log", "at pages/productionLineCallIn/productionLineCallIn.vue:248", "Success:" + res.data);
self.analysisScanCode(res.data);
}, function(err) {
formatAppLog("log", "at pages/productionLineCallIn/productionLineCallIn.vue:237", "Error:", JSON.stringify(err));
formatAppLog("log", "at pages/productionLineCallIn/productionLineCallIn.vue:252", "Error:", JSON.stringify(err));
});
},
methods: {
handleFocus() {
formatAppLog("log", "at pages/productionLineCallIn/productionLineCallIn.vue:242", "foucus");
formatAppLog("log", "at pages/productionLineCallIn/productionLineCallIn.vue:257", "foucus");
this.isMatConditionFoucused = true;
},
handleBlur() {
formatAppLog("log", "at pages/productionLineCallIn/productionLineCallIn.vue:246", "bulur");
formatAppLog("log", "at pages/productionLineCallIn/productionLineCallIn.vue:261", "bulur");
this.isMatConditionFoucused = false;
},
//摄像头扫码
cameraScanCode() {
uni.scanCode({
success: (res) => {
formatAppLog("log", "at pages/productionLineCallIn/productionLineCallIn.vue:253", "扫码结果:", res.result);
formatAppLog("log", "at pages/productionLineCallIn/productionLineCallIn.vue:268", "扫码结果:", res.result);
this.analysisScanCode(res.result);
},
fail: (err) => {
formatAppLog("error", "at pages/productionLineCallIn/productionLineCallIn.vue:257", "扫码失败:", err);
formatAppLog("error", "at pages/productionLineCallIn/productionLineCallIn.vue:272", "扫码失败:", err);
}
});
},
@ -4879,7 +4920,7 @@ if (uni.restoreGlobal) {
this.clearLocation();
},
complete: (event) => {
formatAppLog("log", "at pages/productionLineCallIn/productionLineCallIn.vue:341", "请求完成", event);
formatAppLog("log", "at pages/productionLineCallIn/productionLineCallIn.vue:356", "请求完成", event);
}
});
},
@ -4985,7 +5026,7 @@ if (uni.restoreGlobal) {
}
},
complete: (event) => {
formatAppLog("log", "at pages/productionLineCallIn/productionLineCallIn.vue:462", "请求完成", event);
formatAppLog("log", "at pages/productionLineCallIn/productionLineCallIn.vue:477", "请求完成", event);
}
});
},
@ -5016,9 +5057,9 @@ if (uni.restoreGlobal) {
}
},
//长按
longpress(item) {
longpress(item, index) {
if (this.isMove == false) {
this.showPopup(item);
this.showPopup(item, index);
}
}
}
@ -5145,7 +5186,7 @@ if (uni.restoreGlobal) {
key: index,
onTouchstart: _cache[7] || (_cache[7] = (...args) => $options.cardTouchStart && $options.cardTouchStart(...args)),
onTouchmove: _cache[8] || (_cache[8] = (...args) => $options.cardTouchMove && $options.cardTouchMove(...args)),
onLongpress: ($event) => $options.longpress(item)
onLongpress: ($event) => $options.longpress(item, index)
}, [
vue.createVNode(_component_Card, {
item,

View File

@ -117,7 +117,7 @@
"uni-app": {
"control": "uni-v3",
"vueVersion": "3",
"compilerVersion": "4.45",
"compilerVersion": "4.57",
"nvueCompiler": "uni-app",
"renderer": "auto",
"nvue": {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -178,10 +178,11 @@ namespace WCS.WebApi.Controllers
.LeftJoin<ShelfInfo>((mci, si) => mci.ShelfId == si.Id)
//货架状态是静止的 代表这个货架没有被呼叫走哦
.LeftJoin<LocationInfo>((mci, si, li) => (si.TransStatus == TransStatusEnum. && si.CurrentLocationId == li.Id))
.Where((mci, si, li) => li.Id != 0)//货架未绑定位置的不参与呼叫 不然按【强批次管理】业务会在这里卡死
.WhereIF(!string.IsNullOrEmpty(request.MatCodeCondition), (mci, si, li) => mci.MatCode.Contains(request.MatCodeCondition) || mci.MatName.Contains(request.MatCodeCondition))
.OrderBy((mci, si, li) => mci.MatBatch)//【强批次管理】按批次排序 实现先进先出
.OrderBy((mci, si, li) => mci.ShelfCode)//排序规则
.OrderBy((mci, si, li) => mci.MatCode)
.OrderBy((mci, si, li) => mci.MatBatch)
.Select((mci, si, li) => new MatDetailCurrentInfoModel()
{
Id = mci.Id,