Browse Source

添加扫码实现库位查询功能

lwx_dev
erdanergou 3 years ago
parent
commit
eb6e103591
  1. 10
      src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java
  2. 39
      src/main/java/com/dreamchaser/depository_manage/controller/PageController.java
  3. 30
      src/main/java/com/dreamchaser/depository_manage/controller/PlaceController.java
  4. 20
      src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java
  5. 265
      src/main/resources/templates/pages/scanQrCode/ScanQrCode.html
  6. 246
      src/main/resources/templates/pages/showInventory/showInventoryForLocation.html
  7. 261
      src/main/resources/templates/pages/showInventory/showInventoryForMaterial.html
  8. 265
      target/classes/templates/pages/scanQrCode/ScanQrCode.html

10
src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java

@ -321,6 +321,16 @@ public class MaterialController {
return new RestResponse(list);
}
/**
* 用于根据物料id获取物料基础信息
* @param map
* @return
*/
@PostMapping("/findOnlyMaterialById")
public RestResponse findOnlyMaterialById(@RequestBody Map<String,String> map){
Material materialById = materialService.findMaterialById(ObjectFormatUtil.toInteger(map.get("id")));
return new RestResponse(materialById);
}
/**
* 根据id获取物料

39
src/main/java/com/dreamchaser/depository_manage/controller/PageController.java

@ -339,10 +339,10 @@ public class PageController {
}
mv.addObject("depositoryCount", depositoryIdList.size());
Integer inventoryCountByDepository = materialService.findInventoryCountByDepository(depositoryIdList);
if(inventoryCountByDepository == null){
if (inventoryCountByDepository == null) {
inventoryCountByDepository = 0;
}
mv.addObject("allPrice",(int)(inventoryCountByDepository / 100));
mv.addObject("allPrice", (int) (inventoryCountByDepository / 100));
mv.addObject("allMaterial", materialService.findMaterialCount(new HashMap<>()));
/**
* 获取当天日期
@ -586,7 +586,7 @@ public class PageController {
Inventory inventoryById = materialService.findInventoryById(mid);
if (inventoryById.getUnit().equals(unit)) {
// 如果转移的基础单位
mv.addObject("quantity", (int)(placeAndMaterialByMidAndPid.getQuantity() / 100));
mv.addObject("quantity", (int) (placeAndMaterialByMidAndPid.getQuantity() / 100));
} else {
// 获取当前的拆单记录
Map<String, Object> paramForSplitInfo = new HashMap<>();
@ -596,10 +596,10 @@ public class PageController {
SplitInfo splitInfo = splitUnitService.findSplitInfoByMidAndUnit(paramForSplitInfo);
SplitInventory splitInventory = splitUnitService.findSplitInventoryByIidAndSid(placeAndMaterialByMidAndPid.getId(), splitInfo.getId());
if (splitInventory != null) {
mv.addObject("quantity",(int)(splitInventory.getSaveQuantity() / 100));
mv.addObject("quantity", (int) (splitInventory.getSaveQuantity() / 100));
} else {
int Scale = splitUnitService.findSplitInfoScaleQuantity(splitInfo, -1);
mv.addObject("quantity", (int)(inventoryById.getQuantity() * Scale / 100));
mv.addObject("quantity", (int) (inventoryById.getQuantity() * Scale / 100));
}
}
mv.addObject("depositoryId", depositoryId);
@ -840,7 +840,7 @@ public class PageController {
role = 1;
}
mv.setViewName("pages/application/application-out");
if (Integer.compare(userToken.getMaindeparment(), 361) == 0 || Integer.compare(4,role) == 0) {
if (Integer.compare(userToken.getMaindeparment(), 361) == 0 || Integer.compare(4, role) == 0) {
mv.setViewName("pages/applicationForStorageCenter/application-out");
}
return mv;
@ -859,7 +859,7 @@ public class PageController {
if (role == null) {
role = 1;
}
if (Integer.compare(userToken.getMaindeparment(), 361) == 0 || Integer.compare(4,role) == 0) {
if (Integer.compare(userToken.getMaindeparment(), 361) == 0 || Integer.compare(4, role) == 0) {
mv.setViewName("pages/applicationForStorageCenter/application-out_back");
}
InventoryP inventoryP = new InventoryP();
@ -2088,7 +2088,7 @@ public class PageController {
}
mv.addObject("gidList", gidList);
mv.setViewName("pages/group/applicationOutForGroup");
if (Integer.compare(userToken.getMaindeparment(), 361) == 0 || Integer.compare(role,4) == 0) {
if (Integer.compare(userToken.getMaindeparment(), 361) == 0 || Integer.compare(role, 4) == 0) {
mv.setViewName("pages/applicationForStorageCenter/applicationOutForGroup");
}
return mv;
@ -3025,4 +3025,27 @@ public class PageController {
mv.addObject("record", constructionUnitById);
return mv;
}
@GetMapping("/toShowInventory")
public ModelAndView toShowInventory(@RequestParam Map<String, String> param) {
ModelAndView mv = new ModelAndView();
if (param.containsKey("id")) {
String type = param.get("type");
mv.addObject("id",param.get("id"));
if("m".equals(type)){
// 如果是物料
mv.setViewName("pages/showInventory/showInventoryForMaterial");
}else if("d".equals(type) || "p".equals(type)){
mv.addObject("type",type);
// 如果是位置
mv.setViewName("pages/showInventory/showInventoryForLocation");
}
return mv;
} else {
throw new MyException("缺少必要参数");
}
}
}

30
src/main/java/com/dreamchaser/depository_manage/controller/PlaceController.java

@ -484,4 +484,34 @@ public class PlaceController {
}
return new RestResponse(result);
}
@PostMapping("/findLocationById")
public RestResponse findLocationById(@RequestBody Map<String, String> map) {
if (map.containsKey("id") && map.containsKey("type")) {
String type = map.get("type");
String id = map.get("id");
if ("d".equals(type)) {
// 如果是仓库
Depository depositoryById = depositoryService.findDepositoryById(ObjectFormatUtil.toInteger(id));
return new RestResponse(depositoryById);
} else if ("p".equals(type)) {
// 如果是库位
Place placeById = placeService.findPlaceById(ObjectFormatUtil.toInteger(id));
if (placeById != null) {
PlaceP placeP = new PlaceP(placeById);
Depository depositoryById = depositoryService.findDepositoryById(placeById.getDid());
placeP.setDepositoryName(depositoryById.getDname());
placeP.setDepositoryCode(depositoryById.getCode());
return new RestResponse(placeP);
} else {
return new RestResponse(placeById);
}
} else {
return new RestResponse(null);
}
} else {
throw new MyException("缺少必要参数");
}
}
}

20
src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java

@ -438,17 +438,19 @@ public class MaterialServiceImpl implements MaterialService {
@Override
public Material findMaterialById(int id) {
Material material = materialMapper.findMaterialById(id);
if (material.getMaterialTypeId() != null) {
MaterialType materialTypeByOldId = materialTypeMapper.findMaterialTypeByOldId(material.getMaterialTypeId());
material.setTypeName(materialTypeByOldId.getTname());
}
if (material.getPrice() != null) {
if(material != null) {
if (material.getMaterialTypeId() != null) {
MaterialType materialTypeByOldId = materialTypeMapper.findMaterialTypeByOldId(material.getMaterialTypeId());
material.setTypeName(materialTypeByOldId.getTname());
}
if (material.getPrice() != null) {
material.setPrice(material.getPrice() / 100);
} else {
material.setPrice(0.0);
material.setPrice(material.getPrice() / 100);
} else {
material.setPrice(0.0);
}
material.setAmounts(material.getPrice() * material.getQuantity());
}
material.setAmounts(material.getPrice() * material.getQuantity());
return material;
}

265
src/main/resources/templates/pages/scanQrCode/ScanQrCode.html

@ -17,33 +17,6 @@
<script src="../static/js/vue/vue-router.js"></script>
<script src="../static/lib/http-vue-loader/src/httpVueLoader.js"></script>
<script src="../static/js/VueQrcodeReader.umd.min.js"></script>
<style>
.validation-success,
.validation-failure,
.validation-pending {
position: absolute;
width: 100%;
height: 100%;
background-color: rgba(255, 255, 255, .8);
text-align: center;
font-weight: bold;
font-size: 1.4rem;
padding: 10px;
display: flex;
flex-flow: column nowrap;
justify-content: center;
}
.validation-success {
color: green;
}
.validation-failure {
color: red;
}
</style>
</head>
<body>
@ -53,21 +26,26 @@
function outboundLogic() {
};
function temporaryScanValue() {
}
function chooseInOrOut() {
}
var materialList = [],
depository= null,
place=null;
let params = {}; // 用于暂存扫描结果
var material = null,
depository = null,
place = null;
let wxScan = parent;
layui.$(function () {
parent.wx.scanQRCode({
if (wxScan.wx === undefined) {
wxScan = wxScan.parent.wx;
} else {
wxScan = wxScan.wx;
}
wxScan.scanQRCode({
desc: 'scanQRCode desc',
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
@ -84,8 +62,7 @@
}
}
});
})
});
outboundLogic = function (req) {
@ -101,202 +78,46 @@
var flag = data.flag;
if (flag === 0) {
// 如果是无效码
layer.msg("扫描失败,请确认扫描是否正确");
}
else if (flag === 1) {
// 如果是物料
material = data.material;
materialList.push(material);
layer.confirm("是否继续扫描",
{
btn: ["继续", "取消"]
},
function () { // 继续扫描物料
layer.close(layer.index); // 关闭弹窗
parent.wx.scanQRCode({
desc: 'scanQRCode desc',
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
success: function (res) {
// 回调
var result = res.resultStr;//当needResult为1时返回处理结果
var param = {};
param.qrCode = result;
outboundLogic(param);
},
error: function (res) {
if (res.errMsg.indexOf('function_not_exist') > 0) {
alert('版本过低请升级')
}
}
});
},
function () {
// 不扫描物料
params.materialList = materialList;
params.depository = depository;
params.place = place;
temporaryScanValue(params); // 将物料暂存
if (depository !== null || place !== null) {
// 如果已经扫描了仓库或库位
// 弹出选择框
chooseInOrOut();
} else {
// 如果没有扫描仓库或库位
layer.confirm("暂未扫描仓库,是否继续该操作",
{
btn: ["继续", "取消"]
},
function () {// 继续
// 弹出选择框
chooseInOrOut();
},
function () { // 取消当前操作
layer.close(layer.index); // 关闭弹窗
parent.wx.scanQRCode({
desc: 'scanQRCode desc',
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
success: function (res) {
// 回调
var result = res.resultStr;//当needResult为1时返回处理结果
var param = {};
param.qrCode = result;
outboundLogic(param);
},
error: function (res) {
if (res.errMsg.indexOf('function_not_exist') > 0) {
alert('版本过低请升级')
}
}
});
}
)
layer.confirm("扫描失败,是否重新扫描", {
btn: ["确定", "取消"]
}, function () {
wxScan.scanQRCode({
desc: 'scanQRCode desc',
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
scanType: ["barCode", "qrCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
success: function (res) {
// 回调
var result = res.resultStr;//当needResult为1时返回处理结果
var req = {};
req.qrCode = result;
outboundLogic(req);
}
})
}
else if (flag === 2) {
// 如果扫描的为库位
place = data.place;// 暂存扫描结果
params.depository = depository;
params.place = place;
params.materialList = materialList;
if (materialList.length > 0) {
// 如果有物料
temporaryScanValue(params); // 将数据暂存至redis中
chooseInOrOut(); // 弹出选择框
} else {
// 如果没有
layer.confirm("当前并未扫描物料,是否继续扫描",
{btn:["继续","取消"]},
function () { // 继续扫描
layer.close(layer.index); // 关闭弹窗
parent.wx.scanQRCode({
desc: 'scanQRCode desc',
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
success: function (res) {
// 回调
var result = res.resultStr;//当needResult为1时返回处理结果
var req = {};
req.qrCode = result;
outboundLogic(req);
},
error: function (res) {
if (res.errMsg.indexOf('function_not_exist') > 0) {
alert('版本过低请升级')
}
}
})
},
function () {
temporaryScanValue(params); // 将数据暂存
chooseInOrOut(); // 弹出选择框
}
)
}
}, function () {
// 关闭当前页
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
})
} else if (flag === 1) {
// 如果是物料
material = data.material;
window.location.href = "/toShowInventory?id="+material.id+"&type=m";
} else if (flag === 2) {
// 如果扫描的为库位
place = data.place;// 将扫描结果保存到vue中
window.location.href = "/toShowInventory?id="+place.id+"&type=p";
} else if (flag === 3) {
// 如果是仓库
depository = data.depository;
params.depository = depository;
params.place = place;
params.materialList = materialList;
if (materialList.length > 0) {
// 如果有物料
temporaryScanValue(params); // 将数据暂存至redis中
chooseInOrOut(); // 弹出选择框
} else {
// 如果没有
layer.confirm("暂未选择物料,是否继续扫描", {
btn:["继续","取消"]
},function () { // 继续
layer.close(layer.index); // 关闭弹窗
parent.wx.scanQRCode({
desc: 'scanQRCode desc',
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
success: function (res) {
// 回调
var result = res.resultStr;//当needResult为1时返回处理结果
var req = {};
req.qrCode = result;
outboundLogic(req);
},
error: function (res) {
if (res.errMsg.indexOf('function_not_exist') > 0) {
alert('版本过低请升级')
}
}
});
},function () { // 取消
temporaryScanValue(params); // 将数据暂存
chooseInOrOut(); // 弹出选择框
})
}
depository = data.depository;// 将扫描结果保存到vue中
window.location.href = "/toShowInventory?id="+depository.id+"&type=d";
}
}
})
};
temporaryScanValue = function (params) {
layui.$.ajax({
url: "/material/temporaryValue",
type: 'post',
dataType: 'json',
contentType: "application/json;charset=utf-8",
data: JSON.stringify(params)
});
};
// 弹出入库|出库选择框
chooseInOrOut = function () {
layer.confirm("是否入库", {
btn: ["入库", "取消"]
},
function () { // 选择入库
layer.open({
type: 2,
title: '入库',
skin: 'layui-layer-rim',
maxmin: true,
shadeClose: true, //点击遮罩关闭层
area: ['100%', '100%'],
move: '.layui-layer-title',
fixed: false,
content: '/application_in_scanQrCode',
end: function () {
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}
})
},
function () { // 选择取消
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
})
}
</script>

246
src/main/resources/templates/pages/showInventory/showInventoryForLocation.html

@ -0,0 +1,246 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>仓库盘点</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="/static/lib/layui-v2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="/static/css/public.css" media="all">
<link rel="stylesheet" href="/static/js/lay-module/step-lay/step.css" media="all">
<link rel="stylesheet" href="/static/css/inputTag.css">
<style>
.inputdiv {
display: flex;
background-color: #fff;
height: 38px;
line-height: 38px;
border: 1px solid rgb(238, 238, 238);
}
.layui-card-body {
padding: 0px;
}
.layui-form-label {
padding: 9px 0px;
text-align: left;
}
.layui-input-block {
margin-left: 80px;
}
.layui-form-select {
width: 100%;
height: 38px;
}
.lay-step {
display: none;
}
</style>
</head>
<body>
<div class="layuimini-container">
<div class="layuimini-main">
<div class="layui-fluid">
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
<div carousel-item style="overflow: inherit">
<div>
<form class="layui-form"
style="margin: 0 auto;max-width: 700px;"
id="form1">
<div class="layui-card-body" id="takingHeader" style="padding-right: 0px">
<input th:value="${id}" style="display: none" id="id">
<input th:value="${type}" style="display: none" id="type">
<div class="layui-form-item">
<label class="layui-form-label">查看位置</label>
<div class="layui-input-block">
<input type="text" name="localtion" id="localtion" autocomplete="off"
class="layui-input">
</div>
</div>
</div>
</form>
<table class="layui-hide" id="currentTableForLocation"
lay-filter="currentTableFilterForLocation"
style="margin-top: 123px"></table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script id="changeUnit" type="text/html">
<a class="layui-btn layui-btn-xs" lay-event="more">{{d.unit}}<i class="layui-icon layui-icon-down"></i></a>
</script>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script src="/static/js/lay-config.js?v=1.0.4" charset="utf-8"></script>
<script>
function updateTableShowForLocation() {
}
var depositoryId = "-1";
var placeId = "0";
layui.use(['form', 'step', 'flow', 'table', 'inputTag'], function () {
var $ = layui.$,
table = layui.table,
inputTag = layui.inputTag,
dropdown = layui.dropdown, //下拉菜单
step = layui.step;
let id = $("#id").val();
let type = $("#type").val();
$(function () {
$.ajax({
url: "/place/findLocationById",
data: JSON.stringify({"id": id, "type": type}),
type: 'post',
dataType: 'json',
contentType: "application/json;charset=utf-8",
beforeSend: function () {
this.layerIndex = layer.load(0, {shade: [0.5, '#393D49']});
},
success: function (res) {
layer.close(this.layerIndex);
let location = res.data;
if (location === null) {
layer.msg("该位置不存在,请重试", {
icon: 5,
time: 1000
}, function () {
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
})
} else {
if ("d" === type) {
depositoryId = id;
$("#localtion").val(location.dname);
} else {
placeId = id;
depositoryId = location.did;
$("#localtion").val(location.depositoryName + "-" + location.kingdeecode);
}
updateTableShowForLocation();
}
}
});
});
table.render({
elem: "#currentTableForLocation",
url: '/material/findInventoryForStockTaking',
parseData: function (res) { //res 即为原始返回的数据
return {
"status": res.status, //解析接口状态
"message": res.statusInfo.message, //解析提示文本
"count": res.count, //解析数据长度
"data": res.data //解析数据列表
};
},
request: {
pageName: 'page', //页码的参数名称,默认:page
limitName: 'size' //每页数据量的参数名,默认:limit
},
response: {
statusName: 'status' //规定数据状态的字段名称,默认:code
, statusCode: 200 //规定成功的状态码,默认:0
, msgName: 'message' //规定状态信息的字段名称,默认:msg
, countName: 'count' //规定数据总数的字段名称,默认:count
, dataName: 'data' //规定数据列表的字段名称,默认:data
},
where: {
depositoryId: "-1"
},
height: 'full-255',//固定高度-即固定表头固定第一行首行
cols: [
[
{field: 'mcode', width: 150, title: '存货编码', fixed: 'left'},
{field: 'mname', width: 150, title: '物料名称'},
{field: 'typeName', width: 100, title: '物料种类'},
{field: 'version', width: 150, title: '规格型号',},
{field: 'kingdeecode', width: 150, title: '所处库位',},
{title: '计量单位', width: 200, templet: '#changeUnit', align: "center"},
{field: 'inventory', width: 100, title: '库存数'},
]
],
limits: [10, 15, 20, 25, 50, 100],
limit: 10,
page: true,
skin: 'line',
done: function (res, curr, count) {
$.each(res['data'], function (i, j) {
let takingUnit = j["takingUnit"];
if (takingUnit !== null) {
let parentItem = $("[lay-id='currentTableForLocation'] tr:eq(" + (i + 1) + ")");
let unitHandleItem = parentItem.children()[5];
let quantityHandleItem = parentItem.children()[6];
unitHandleItem.childNodes[0].childNodes[1].childNodes[0].data = takingUnit;
quantityHandleItem.childNodes[0].innerText = j["splitInventory"][takingUnit];
}
});
}
});
updateTableShowForLocation = function () {
let req = {};
req.depositoryId = depositoryId;
req.placeId = placeId;
table.reload('currentTableForLocation', {
url: '/material/findInventoryForStockTaking',
page: {
curr: 1
},
where: req
}, 'data');
};
// 用于监听下拉菜单
table.on('tool(currentTableFilter)', function (obj) { //注:tool 是工具条事件名,test 是 table 原始容器的属性 lay-filter="对应的值"
var data = obj.data //获得当前行数据
, layEvent = obj.event; //获得 lay-event 对应的值
if (layEvent === 'more') {
let splitInfoList = obj.data.splitInfoList;
if (splitInfoList.length > 0) {
let dropDownDataList = [];
for (var i = 0; i < splitInfoList.length; i++) {
let dropDownData = {};
dropDownData.title = splitInfoList[i].newUnit;
dropDownData.id = obj.data.id;
dropDownDataList.push(dropDownData);
}
dropdown.render({
elem: this //触发事件的 DOM 对象
, show: true //外部事件触发即显示
, data: dropDownDataList
, click: function (unit) {
this.elem[0].childNodes[0].data = unit.title;
obj.tr[0].childNodes[6].childNodes[0].innerText = obj.data.splitInventory[unit.title];
}
, align: 'right' //右对齐弹出(v2.6.8 新增)
, style: 'box-shadow: 1px 1px 10px rgb(0 0 0 / 12%);' //设置额外样式
})
}
//下拉菜单
}
});
})
</script>
</body>
</html>

261
src/main/resources/templates/pages/showInventory/showInventoryForMaterial.html

@ -0,0 +1,261 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>仓库盘点</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="/static/lib/layui-v2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="/static/css/public.css" media="all">
<link rel="stylesheet" href="/static/js/lay-module/step-lay/step.css" media="all">
<link rel="stylesheet" href="/static/css/inputTag.css">
<style>
.inputdiv {
display: flex;
background-color: #fff;
height: 38px;
line-height: 38px;
border: 1px solid rgb(238, 238, 238);
}
.layui-card-body {
padding: 0px;
}
.layui-form-label {
padding: 9px 0px;
text-align: left;
}
.layui-input-block {
margin-left: 80px;
}
.layui-form-select {
width: 100%;
height: 38px;
}
.lay-step {
display: none;
}
</style>
</head>
<body>
<div class="layuimini-container">
<div class="layuimini-main">
<div class="layui-fluid">
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
<div carousel-item style="overflow: inherit">
<div>
<form class="layui-form"
style="margin: 0 auto;max-width: 700px;"
id="form1">
<div class="layui-card-body" id="takingHeader" style="padding-right: 0px">
<input th:value="${id}" style="display: none" id="id">
<div class="layui-form-item">
<label class="layui-form-label">物料编码</label>
<div class="layui-input-block">
<input type="text" name="mcode" id="mcode" autocomplete="off"
class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料名称</label>
<div class="layui-input-block">
<input type="text" name="mname" id="mname"
autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料型号</label>
<div class="layui-input-block">
<input type="text" name="version" id="version"
autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料类型</label>
<div class="layui-input-block">
<input type="text" name="mtype" id="mtype"
autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料材质</label>
<div class="layui-input-block">
<input type="text" name="texture" id="texture"
autocomplete="off" class="layui-input">
</div>
</div>
</div>
</form>
<table class="layui-hide" id="currentTableForMaterial"
lay-filter="currentTableFilterForMaterial"
style="margin-top: 123px"></table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script id="changeUnit" type="text/html">
<a class="layui-btn layui-btn-xs" lay-event="more">{{d.unit}}<i class="layui-icon layui-icon-down"></i></a>
</script>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script src="/static/js/lay-config.js?v=1.0.4" charset="utf-8"></script>
<script>
function updateTableShowForMaterial() {
}
layui.use(['form', 'step', 'flow', 'table', 'inputTag'], function () {
var $ = layui.$,
table = layui.table,
inputTag = layui.inputTag,
dropdown = layui.dropdown, //下拉菜单
step = layui.step;
let id = $("#id").val();
$(function () {
$.ajax({
url: "/material/findOnlyMaterialById",
data: JSON.stringify({"id": id}),
type: 'post',
dataType: 'json',
contentType: "application/json;charset=utf-8",
beforeSend: function () {
this.layerIndex = layer.load(0, {shade: [0.5, '#393D49']});
},
success: function (res) {
layer.close(this.layerIndex);
let material = res.data;
if (material === null) {
layer.msg("该物料不存在,请重试", {
icon: 5,
time: 1000
}, function () {
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
})
} else {
$("#mname").val(material.mname);
$("#mcode").val(material.code);
$("#version").val(material.version);
$("#mtype").val(material.typeName);
$("#texture").val(material.texture);
}
}
});
updateTableShowForMaterial();
});
table.render({
elem: "#currentTableForMaterial",
url: '/material/findMaterialByConditionForStockTaking',
parseData: function (res) { //res 即为原始返回的数据
return {
"status": res.status, //解析接口状态
"message": res.statusInfo.message, //解析提示文本
"count": res.count, //解析数据长度
"data": res.data //解析数据列表
};
},
request: {
pageName: 'page', //页码的参数名称,默认:page
limitName: 'size' //每页数据量的参数名,默认:limit
},
response: {
statusName: 'status' //规定数据状态的字段名称,默认:code
, statusCode: 200 //规定成功的状态码,默认:0
, msgName: 'message' //规定状态信息的字段名称,默认:msg
, countName: 'count' //规定数据总数的字段名称,默认:count
, dataName: 'data' //规定数据列表的字段名称,默认:data
},
where: {
depositoryId: "-1"
},
height: 'full-255',//固定高度-即固定表头固定第一行首行
cols: [
[
{field: 'dname', width: 150, title: '所处仓库'},
{field: 'kingdeecode', width: 80, title: '所处库位',},
{title: '计量单位', width: 200, templet: '#changeUnit', align: "center"},
{field: 'inventory', width: 100, title: '库存数'}
]
],
limits: [10, 15, 20, 25, 50, 100],
limit: 10,
page: true,
skin: 'line',
done: function (res, curr, count) {
$.each(res['data'], function (i, j) {
let takingUnit = j["takingUnit"];
if (takingUnit !== null) {
let parentItem = $("[lay-id='currentTableForMaterial'] tr:eq(" + (i + 1) + ")");
let unitHandleItem = parentItem.children()[6];
let quantityHandleItem = parentItem.children()[7];
unitHandleItem.childNodes[0].childNodes[1].childNodes[0].data = takingUnit;
quantityHandleItem.childNodes[0].innerText = j["splitInventory"][takingUnit];
}
});
}
});
updateTableShowForMaterial = function () {
let req = {};
req.mid = id;
table.reload('currentTableForMaterial', {
url: '/material/findMaterialByConditionForStockTaking',
page: {
curr: 1
},
where: req
}, 'data');
};
// 用于监听下拉菜单
table.on('tool(currentTableFilter)', function (obj) { //注:tool 是工具条事件名,test 是 table 原始容器的属性 lay-filter="对应的值"
var data = obj.data //获得当前行数据
, layEvent = obj.event; //获得 lay-event 对应的值
if (layEvent === 'more') {
let splitInfoList = obj.data.splitInfoList;
if (splitInfoList.length > 0) {
let dropDownDataList = [];
for (var i = 0; i < splitInfoList.length; i++) {
let dropDownData = {};
dropDownData.title = splitInfoList[i].newUnit;
dropDownData.id = obj.data.id;
dropDownDataList.push(dropDownData);
}
dropdown.render({
elem: this //触发事件的 DOM 对象
, show: true //外部事件触发即显示
, data: dropDownDataList
, click: function (unit) {
this.elem[0].childNodes[0].data = unit.title;
obj.tr[0].childNodes[6].childNodes[0].innerText = obj.data.splitInventory[unit.title];
}
, align: 'right' //右对齐弹出(v2.6.8 新增)
, style: 'box-shadow: 1px 1px 10px rgb(0 0 0 / 12%);' //设置额外样式
})
}
//下拉菜单
}
});
})
</script>
</body>
</html>

265
target/classes/templates/pages/scanQrCode/ScanQrCode.html

@ -17,33 +17,6 @@
<script src="../static/js/vue/vue-router.js"></script>
<script src="../static/lib/http-vue-loader/src/httpVueLoader.js"></script>
<script src="../static/js/VueQrcodeReader.umd.min.js"></script>
<style>
.validation-success,
.validation-failure,
.validation-pending {
position: absolute;
width: 100%;
height: 100%;
background-color: rgba(255, 255, 255, .8);
text-align: center;
font-weight: bold;
font-size: 1.4rem;
padding: 10px;
display: flex;
flex-flow: column nowrap;
justify-content: center;
}
.validation-success {
color: green;
}
.validation-failure {
color: red;
}
</style>
</head>
<body>
@ -53,21 +26,26 @@
function outboundLogic() {
};
function temporaryScanValue() {
}
function chooseInOrOut() {
}
var materialList = [],
depository= null,
place=null;
let params = {}; // 用于暂存扫描结果
var material = null,
depository = null,
place = null;
let wxScan = parent;
layui.$(function () {
parent.wx.scanQRCode({
if (wxScan.wx === undefined) {
wxScan = wxScan.parent.wx;
} else {
wxScan = wxScan.wx;
}
wxScan.scanQRCode({
desc: 'scanQRCode desc',
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
@ -84,8 +62,7 @@
}
}
});
})
});
outboundLogic = function (req) {
@ -101,202 +78,46 @@
var flag = data.flag;
if (flag === 0) {
// 如果是无效码
layer.msg("扫描失败,请确认扫描是否正确");
}
else if (flag === 1) {
// 如果是物料
material = data.material;
materialList.push(material);
layer.confirm("是否继续扫描",
{
btn: ["继续", "取消"]
},
function () { // 继续扫描物料
layer.close(layer.index); // 关闭弹窗
parent.wx.scanQRCode({
desc: 'scanQRCode desc',
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
success: function (res) {
// 回调
var result = res.resultStr;//当needResult为1时返回处理结果
var param = {};
param.qrCode = result;
outboundLogic(param);
},
error: function (res) {
if (res.errMsg.indexOf('function_not_exist') > 0) {
alert('版本过低请升级')
}
}
});
},
function () {
// 不扫描物料
params.materialList = materialList;
params.depository = depository;
params.place = place;
temporaryScanValue(params); // 将物料暂存
if (depository !== null || place !== null) {
// 如果已经扫描了仓库或库位
// 弹出选择框
chooseInOrOut();
} else {
// 如果没有扫描仓库或库位
layer.confirm("暂未扫描仓库,是否继续该操作",
{
btn: ["继续", "取消"]
},
function () {// 继续
// 弹出选择框
chooseInOrOut();
},
function () { // 取消当前操作
layer.close(layer.index); // 关闭弹窗
parent.wx.scanQRCode({
desc: 'scanQRCode desc',
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
success: function (res) {
// 回调
var result = res.resultStr;//当needResult为1时返回处理结果
var param = {};
param.qrCode = result;
outboundLogic(param);
},
error: function (res) {
if (res.errMsg.indexOf('function_not_exist') > 0) {
alert('版本过低请升级')
}
}
});
}
)
layer.confirm("扫描失败,是否重新扫描", {
btn: ["确定", "取消"]
}, function () {
wxScan.scanQRCode({
desc: 'scanQRCode desc',
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
scanType: ["barCode", "qrCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
success: function (res) {
// 回调
var result = res.resultStr;//当needResult为1时返回处理结果
var req = {};
req.qrCode = result;
outboundLogic(req);
}
})
}
else if (flag === 2) {
// 如果扫描的为库位
place = data.place;// 暂存扫描结果
params.depository = depository;
params.place = place;
params.materialList = materialList;
if (materialList.length > 0) {
// 如果有物料
temporaryScanValue(params); // 将数据暂存至redis中
chooseInOrOut(); // 弹出选择框
} else {
// 如果没有
layer.confirm("当前并未扫描物料,是否继续扫描",
{btn:["继续","取消"]},
function () { // 继续扫描
layer.close(layer.index); // 关闭弹窗
parent.wx.scanQRCode({
desc: 'scanQRCode desc',
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
success: function (res) {
// 回调
var result = res.resultStr;//当needResult为1时返回处理结果
var req = {};
req.qrCode = result;
outboundLogic(req);
},
error: function (res) {
if (res.errMsg.indexOf('function_not_exist') > 0) {
alert('版本过低请升级')
}
}
})
},
function () {
temporaryScanValue(params); // 将数据暂存
chooseInOrOut(); // 弹出选择框
}
)
}
}, function () {
// 关闭当前页
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
})
} else if (flag === 1) {
// 如果是物料
material = data.material;
window.location.href = "/toShowInventory?id="+material.id+"&type=m";
} else if (flag === 2) {
// 如果扫描的为库位
place = data.place;// 将扫描结果保存到vue中
window.location.href = "/toShowInventory?id="+place.id+"&type=p";
} else if (flag === 3) {
// 如果是仓库
depository = data.depository;
params.depository = depository;
params.place = place;
params.materialList = materialList;
if (materialList.length > 0) {
// 如果有物料
temporaryScanValue(params); // 将数据暂存至redis中
chooseInOrOut(); // 弹出选择框
} else {
// 如果没有
layer.confirm("暂未选择物料,是否继续扫描", {
btn:["继续","取消"]
},function () { // 继续
layer.close(layer.index); // 关闭弹窗
parent.wx.scanQRCode({
desc: 'scanQRCode desc',
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
success: function (res) {
// 回调
var result = res.resultStr;//当needResult为1时返回处理结果
var req = {};
req.qrCode = result;
outboundLogic(req);
},
error: function (res) {
if (res.errMsg.indexOf('function_not_exist') > 0) {
alert('版本过低请升级')
}
}
});
},function () { // 取消
temporaryScanValue(params); // 将数据暂存
chooseInOrOut(); // 弹出选择框
})
}
depository = data.depository;// 将扫描结果保存到vue中
window.location.href = "/toShowInventory?id="+depository.id+"&type=d";
}
}
})
};
temporaryScanValue = function (params) {
layui.$.ajax({
url: "/material/temporaryValue",
type: 'post',
dataType: 'json',
contentType: "application/json;charset=utf-8",
data: JSON.stringify(params)
});
};
// 弹出入库|出库选择框
chooseInOrOut = function () {
layer.confirm("是否入库", {
btn: ["入库", "取消"]
},
function () { // 选择入库
layer.open({
type: 2,
title: '入库',
skin: 'layui-layer-rim',
maxmin: true,
shadeClose: true, //点击遮罩关闭层
area: ['100%', '100%'],
move: '.layui-layer-title',
fixed: false,
content: '/application_in_scanQrCode',
end: function () {
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}
})
},
function () { // 选择取消
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
})
}
</script>

Loading…
Cancel
Save