31 changed files with 2002 additions and 283 deletions
@ -0,0 +1,48 @@ |
|||||
|
package com.dreamchaser.depository_manage.controller; |
||||
|
|
||||
|
|
||||
|
import com.dreamchaser.depository_manage.exception.MyException; |
||||
|
import com.dreamchaser.depository_manage.pojo.RestResponse; |
||||
|
import com.dreamchaser.depository_manage.service.SplitUnitService; |
||||
|
import com.dreamchaser.depository_manage.utils.CrudUtil; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.web.bind.annotation.*; |
||||
|
|
||||
|
import javax.servlet.http.HttpServletRequest; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
@RestController |
||||
|
@RequestMapping("/split") |
||||
|
public class SplitController { |
||||
|
|
||||
|
@Autowired |
||||
|
SplitUnitService splitUnitService; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 用于添加一条拆单记录 |
||||
|
* @param map 待添加数据 |
||||
|
* @param request |
||||
|
* @return |
||||
|
*/ |
||||
|
@PostMapping("/splitAdd") |
||||
|
public RestResponse splitAdd(@RequestBody Map<String,Object> map, HttpServletRequest request){ |
||||
|
if(map.containsKey("quantity") && map.containsKey("newUnit")){ |
||||
|
return CrudUtil.postHandle(1,splitUnitService.addSplitInfo(map)); |
||||
|
}else{ |
||||
|
throw new MyException("缺少必要参数"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 用于根据条件查询拆单记录 |
||||
|
* @param map 待查询条件 |
||||
|
* @param request |
||||
|
* @return |
||||
|
*/ |
||||
|
@GetMapping("/split_out") |
||||
|
public RestResponse splitOut(@RequestParam Map<String,Object> map,HttpServletRequest request){ |
||||
|
return null; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,108 @@ |
|||||
|
package com.dreamchaser.depository_manage.pojo; |
||||
|
|
||||
|
import com.dreamchaser.depository_manage.entity.SplitInfo; |
||||
|
import lombok.Data; |
||||
|
|
||||
|
/** |
||||
|
* 用于展示拆单具体信息 |
||||
|
*/ |
||||
|
@Data |
||||
|
public class SplitInfoP { |
||||
|
/** |
||||
|
* 拆单id |
||||
|
*/ |
||||
|
private Integer id; |
||||
|
/** |
||||
|
* 物料id |
||||
|
*/ |
||||
|
private Integer mid; |
||||
|
/** |
||||
|
* 旧计量单位 |
||||
|
*/ |
||||
|
private String oldUnit; |
||||
|
/** |
||||
|
* 新计量单位 |
||||
|
*/ |
||||
|
private String newUnit; |
||||
|
/** |
||||
|
* 新旧单位映射数 |
||||
|
*/ |
||||
|
private Integer quantity; |
||||
|
/** |
||||
|
* 父级id |
||||
|
*/ |
||||
|
private Integer sparentId; |
||||
|
|
||||
|
/** |
||||
|
* 状态:1启用2禁用3删除 |
||||
|
*/ |
||||
|
private Integer sstate; |
||||
|
|
||||
|
/** |
||||
|
* 物料名称 |
||||
|
*/ |
||||
|
private String mname; |
||||
|
|
||||
|
/** |
||||
|
* 物料类型 |
||||
|
*/ |
||||
|
private String typeName; |
||||
|
|
||||
|
/** |
||||
|
* 物料规格型号 |
||||
|
*/ |
||||
|
private String version; |
||||
|
|
||||
|
/** |
||||
|
* 物料材质 |
||||
|
*/ |
||||
|
private String texture; |
||||
|
|
||||
|
/** |
||||
|
* 物料编码 |
||||
|
*/ |
||||
|
private String mcode; |
||||
|
|
||||
|
/** |
||||
|
* 物料保质期 |
||||
|
*/ |
||||
|
private Integer shelfLife; |
||||
|
|
||||
|
/** |
||||
|
* 用于展示的物料保质期 |
||||
|
*/ |
||||
|
private String showShelfLife; |
||||
|
|
||||
|
/** |
||||
|
* 物料生产地 |
||||
|
*/ |
||||
|
private String productionPlace; |
||||
|
|
||||
|
/** |
||||
|
* 物料品牌 |
||||
|
*/ |
||||
|
private String brand; |
||||
|
|
||||
|
/** |
||||
|
* 物料备注 |
||||
|
*/ |
||||
|
private String remark; |
||||
|
|
||||
|
/** |
||||
|
* 物料状态 |
||||
|
*/ |
||||
|
private Integer mstate; |
||||
|
|
||||
|
public SplitInfoP(SplitInfo splitInfo) { |
||||
|
this.id = splitInfo.getId(); |
||||
|
this.mid = splitInfo.getId(); |
||||
|
this.oldUnit = splitInfo.getOldUnit(); |
||||
|
this.newUnit = splitInfo.getNewUnit(); |
||||
|
this.sparentId = splitInfo.getParentId(); |
||||
|
this.sstate = splitInfo.getState(); |
||||
|
} |
||||
|
|
||||
|
public SplitInfoP(){ |
||||
|
|
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,468 @@ |
|||||
|
<!DOCTYPE html> |
||||
|
<html lang="en" xmlns:th="http://www.thymeleaf.org"> |
||||
|
<head> |
||||
|
<meta charset="utf-8"> |
||||
|
<title>layui</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"> |
||||
|
</head> |
||||
|
<body> |
||||
|
<div class="layuimini-container"> |
||||
|
<div class="layuimini-main"> |
||||
|
<fieldset class="table-search-fieldset"> |
||||
|
<legend>搜索信息</legend> |
||||
|
<div style="margin: 10px 10px 10px 10px"> |
||||
|
<form class="layui-form layui-form-pane" action=""> |
||||
|
<div class="layui-form-item"> |
||||
|
|
||||
|
<div class="layui-inline"> |
||||
|
<label class="layui-form-label">品牌</label> |
||||
|
<div class="layui-input-inline"> |
||||
|
<input type="text" class="layui-input" id="brand" name="brand" autocomplete="off"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="layui-inline"> |
||||
|
<label class="layui-form-label">状态</label> |
||||
|
<div class="layui-input-inline"> |
||||
|
<select name="state"> |
||||
|
<option value="">请选择状态</option> |
||||
|
<option value="1">启用</option> |
||||
|
<option value="2">禁用</option> |
||||
|
</select> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="layui-inline"> |
||||
|
<button type="submit" class="layui-btn layui-btn-primary" lay-submit |
||||
|
lay-filter="data-search-btn"><i class="layui-icon"></i> 搜 索 |
||||
|
</button> |
||||
|
</div> |
||||
|
</div> |
||||
|
</form> |
||||
|
</div> |
||||
|
</fieldset> |
||||
|
|
||||
|
|
||||
|
<!-- 状态展示--> |
||||
|
<script type="text/html" id="switchTpl"> |
||||
|
<input type="checkbox" name="state" value="{{d.id}}" lay-skin="switch" lay-text="启用|禁用" |
||||
|
lay-filter="changeState" {{ d.state== 1 ? 'checked' : '' }} > |
||||
|
</script> |
||||
|
|
||||
|
<script type="text/html" id="toolbarDemo"> |
||||
|
<div class="layui-btn-container"> |
||||
|
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" lay-event="add"> 添加</button> |
||||
|
<button class="layui-btn layui-btn-sm layui-btn-danger data-delete-btn" lay-event="delete"> 删除</button> |
||||
|
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" lay-event="applicationIn"> 入库申请 |
||||
|
</button> |
||||
|
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" id="u_fileUpload" |
||||
|
lay-event="import">导入数据 |
||||
|
</button> |
||||
|
</div> |
||||
|
</script> |
||||
|
|
||||
|
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter"></table> |
||||
|
|
||||
|
<script type="text/html" id="currentTableBar"> |
||||
|
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="detail">详情</a> |
||||
|
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a> |
||||
|
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" th:style="'display:'+${display}" |
||||
|
lay-event="realDelete">彻底删除</a> |
||||
|
</script> |
||||
|
</div> |
||||
|
</div> |
||||
|
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script> |
||||
|
<script> |
||||
|
layui.use(['form', 'table', 'upload'], function () { |
||||
|
var $ = layui.jquery, |
||||
|
form = layui.form, |
||||
|
table = layui.table, |
||||
|
upload = layui.upload; |
||||
|
|
||||
|
|
||||
|
table.render({ |
||||
|
elem: "#currentTableId", |
||||
|
url: '/split/split_out', |
||||
|
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 |
||||
|
}, |
||||
|
where: { |
||||
|
type: "0" |
||||
|
}, |
||||
|
response: { |
||||
|
statusName: 'status' //规定数据状态的字段名称,默认:code |
||||
|
, statusCode: 200 //规定成功的状态码,默认:0 |
||||
|
, msgName: 'message' //规定状态信息的字段名称,默认:msg |
||||
|
, countName: 'count' //规定数据总数的字段名称,默认:count |
||||
|
, dataName: 'data' //规定数据列表的字段名称,默认:data |
||||
|
}, |
||||
|
toolbar: '#toolbarDemo', |
||||
|
defaultToolbar: ['filter', 'exports', 'print'], |
||||
|
cols: [ |
||||
|
[ |
||||
|
{type: "checkbox", width: 50}, |
||||
|
|
||||
|
{field: 'state', title: '状态', minWidth: 80, templet: '#switchTpl'}, |
||||
|
{title: '操作', minWidth: 200, toolbar: '#currentTableBar', align: "center"} |
||||
|
] |
||||
|
], |
||||
|
limits: [10, 15, 20, 25, 50,100], |
||||
|
limit: 10, |
||||
|
page: true, |
||||
|
skin: 'line', |
||||
|
done: function () { |
||||
|
|
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
|
||||
|
|
||||
|
// 监听搜索操作 |
||||
|
form.on('submit(data-search-btn)', function (data) { |
||||
|
var req = {}; |
||||
|
data = data.field; |
||||
|
req.type = 1; |
||||
|
if (data.mname !== '') { |
||||
|
req.mname = data.mname; |
||||
|
} |
||||
|
if (data.brand !== '') { |
||||
|
req.brand = data.brand; |
||||
|
} |
||||
|
if (data.materialTypeId != '') { |
||||
|
req.materialTypeId = data.materialTypeId; |
||||
|
} |
||||
|
if (data.state != '') { |
||||
|
req.state = data.state; |
||||
|
} |
||||
|
if (data.code != '') { |
||||
|
req.code = data.code |
||||
|
} |
||||
|
|
||||
|
//执行搜索重载 |
||||
|
table.reload('currentTableId', { |
||||
|
url: '/material/material', |
||||
|
page: { |
||||
|
curr: 1 |
||||
|
}, |
||||
|
where: req |
||||
|
}, 'data'); |
||||
|
return false; |
||||
|
}); |
||||
|
|
||||
|
/** |
||||
|
* toolbar监听事件 |
||||
|
*/ |
||||
|
table.on('toolbar(currentTableFilter)', function (obj) { |
||||
|
if (obj.event === 'add') { // 监听添加操作 |
||||
|
var index = layer.open({ |
||||
|
title: '申请提交', |
||||
|
type: 2, |
||||
|
shade: 0.2, |
||||
|
maxmin: true, |
||||
|
shadeClose: true, |
||||
|
area: ['100%', '100%'], |
||||
|
content: '/material_add', |
||||
|
}); |
||||
|
$(window).on("resize", function () { |
||||
|
layer.full(index); |
||||
|
}); |
||||
|
} else if (obj.event === 'delete') { // 监听删除操作 |
||||
|
var checkStatus = table.checkStatus('currentTableId') |
||||
|
, data = checkStatus.data; |
||||
|
var req = {}; |
||||
|
req.ids = []; |
||||
|
for (i = 0, len = data.length; i < len; i++) { |
||||
|
req.ids[i] = data[i].id; |
||||
|
} |
||||
|
if (req.ids.length > 0) { |
||||
|
layer.confirm('真的删除么', {icon: 2, title: '提示'}, function (index) { |
||||
|
$.ajax({ |
||||
|
url: '/material/material_del', |
||||
|
dataType: 'json', |
||||
|
type: 'POST', |
||||
|
contentType: "application/json;charset=utf-8", |
||||
|
data: JSON.stringify(req), |
||||
|
beforeSend: function () { |
||||
|
this.layerIndex = layer.load(0, {shade: [0.5, '#393D49']}); |
||||
|
}, |
||||
|
success: function (data) { |
||||
|
layer.close(this.layerIndex); |
||||
|
if (data.status >= 300) { |
||||
|
layer.msg(data.statusInfo.message);//失败的表情 |
||||
|
|
||||
|
} else { |
||||
|
layer.msg("删除成功", { |
||||
|
icon: 6,//成功的表情 |
||||
|
time: 500 //1秒关闭(如果不配置,默认是3秒) |
||||
|
}); |
||||
|
//执行搜索重载 |
||||
|
table.reload('currentTableId', { |
||||
|
url: '/material/material', |
||||
|
page: { |
||||
|
curr: 1 |
||||
|
} |
||||
|
}, 'data'); |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
}) |
||||
|
}) |
||||
|
} else { |
||||
|
layer.msg("未选中记录,请确认!"); |
||||
|
return false; |
||||
|
} |
||||
|
} else if (obj.event === 'applicationIn') { |
||||
|
// 入库申请 |
||||
|
var checkStatus = table.checkStatus('currentTableId') |
||||
|
, data = checkStatus.data; |
||||
|
var req = {}; |
||||
|
req.mids = []; |
||||
|
// 获取所有选中的id |
||||
|
for (i = 0, len = data.length; i < len; i++) { |
||||
|
req.mids[i] = data[i].id; |
||||
|
} |
||||
|
$.ajax({ |
||||
|
url: "/material/temporaryValueForMaterial", |
||||
|
type: 'post', |
||||
|
dataType: 'json', |
||||
|
contentType: "application/json;charset=utf-8", |
||||
|
data: JSON.stringify(req), |
||||
|
beforeSend: function () { |
||||
|
this.layerIndex = layer.load(0, {shade: [0.5, '#393D49']}); |
||||
|
}, |
||||
|
success: function (d) { |
||||
|
layer.close(this.layerIndex); |
||||
|
if (d.status == 200) { |
||||
|
layer.open({ |
||||
|
type: 2, |
||||
|
title: '入库', |
||||
|
skin: 'layui-layer-rim', |
||||
|
maxmin: true, |
||||
|
shadeClose: true, //点击遮罩关闭层 |
||||
|
area: ['100%', '100%'], |
||||
|
move: '.layui-layer-title', |
||||
|
fixed: false, |
||||
|
content: '/applicationInByMaterial', |
||||
|
end: function () { |
||||
|
var index = parent.layer.getFrameIndex(window.name); |
||||
|
parent.layer.close(index); |
||||
|
} |
||||
|
}) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
}) |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
//用于导入数据 |
||||
|
var upLoader = upload.render({ |
||||
|
elem: "#u_fileUpload", // 绑定元素 |
||||
|
url: '/excel/importExcelByMaterial', // 上传接口 |
||||
|
accept: 'file', // 允许上传的格式, |
||||
|
before: function (obj) { //obj参数包含的信息,跟 choose回调完全一致,可参见上文。 |
||||
|
layer.load(); //上传loading |
||||
|
}, |
||||
|
exts: 'xls|xlsx|csv', |
||||
|
done: function (res) { |
||||
|
layer.closeAll('loading'); //关闭loading |
||||
|
|
||||
|
//如果上传成功 |
||||
|
var re = ""; |
||||
|
for (let i = 0; i < res.data.errMsg.length; i++) { |
||||
|
var show = "<p style='color: #ff211e'>" + res.data.errMsg[i] + ":错误" + "</p>"; |
||||
|
re += show |
||||
|
} |
||||
|
if (res.code === 200) { |
||||
|
for (let i = 0; i < res.data.dataList.length; i++) { |
||||
|
var mname = res.data.dataList[i]["mname"]; |
||||
|
var code = res.data.dataList[i]["code"] == null || res.data.dataList[i]["code"] == undefined ? "" : res.data.dataList[i]["code"]; |
||||
|
var version = res.data.dataList[i]["version"] == null || res.data.dataList[i]["version"] == undefined ? "" : res.data.dataList[i]["version"]; |
||||
|
var texture = res.data.dataList[i]["texture"] == null || res.data.dataList[i]["texture"] == undefined ? "" : res.data.dataList[i]["texture"]; |
||||
|
var unit = res.data.dataList[i]["unit"] == null || res.data.dataList[i]["unit"] == undefined ? "" : res.data.dataList[i]["unit"]; |
||||
|
var typeId = res.data.dataList[i]["typeId"] == null || res.data.dataList[i]["typeId"] == undefined ? "" : res.data.dataList[i]["typeId"]; |
||||
|
var show = "<p style='color: #00FF00'>" + mname + " " + version + " " + code + " " + texture + " " + unit + " " + typeId + " :成功" + "</p>"; |
||||
|
re += show |
||||
|
} |
||||
|
|
||||
|
layer.open({ |
||||
|
type: 1, |
||||
|
skin: 'layui-layer-rim', //加上边框 |
||||
|
area: ['500px', '500px'], //宽高 |
||||
|
content: re |
||||
|
}) |
||||
|
} else { |
||||
|
layer.msg(res.msg) |
||||
|
} |
||||
|
|
||||
|
}, |
||||
|
error: function () { |
||||
|
layer.closeAll('loading'); //关闭loading |
||||
|
var demoText = $('#demoText'); |
||||
|
demoText.html('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-xs demo-reload">重试</a>'); |
||||
|
demoText.find('.demo-reload').on('click', function () { |
||||
|
upLoader.upload() |
||||
|
}) |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
//监听表格复选框选择 |
||||
|
table.on('checkbox(currentTableFilter)', function (obj) { |
||||
|
console.log(obj) |
||||
|
}); |
||||
|
|
||||
|
table.on('tool(currentTableFilter)', function (obj) { |
||||
|
let data = obj.data; |
||||
|
|
||||
|
if (obj.event === 'detail') { |
||||
|
var index = layer.open({ |
||||
|
title: '仓库信息详情', |
||||
|
type: 2, |
||||
|
shade: 0.2, |
||||
|
maxmin: true, |
||||
|
shadeClose: true, |
||||
|
area: ['100%', '100%'], |
||||
|
content: '/material_view?id=' + data.id, |
||||
|
end: function () { |
||||
|
//执行搜索重载 |
||||
|
table.reload('currentTableId', { |
||||
|
url: '/material/material', |
||||
|
page: { |
||||
|
curr: 1 |
||||
|
} |
||||
|
}, 'data'); |
||||
|
} |
||||
|
}); |
||||
|
$(window).on("resize", function () { |
||||
|
layer.full(index); |
||||
|
}); |
||||
|
return false; |
||||
|
} else if (obj.event === 'delete') { |
||||
|
var req = {}; |
||||
|
req.id = data.id; |
||||
|
layer.confirm('真的删除么', {icon: 2, title: '提示'}, function (index) { |
||||
|
$.ajax({ |
||||
|
url: '/material/material_del', |
||||
|
dataType: 'json', |
||||
|
type: 'POST', |
||||
|
contentType: "application/json;charset=utf-8", |
||||
|
data: JSON.stringify(req), |
||||
|
beforeSend: function () { |
||||
|
this.layerIndex = layer.load(0, {shade: [0.5, '#393D49']}); |
||||
|
}, |
||||
|
success: function (data) { |
||||
|
layer.close(this.layerIndex); |
||||
|
if (data.status >= 300) { |
||||
|
layer.msg(data.statusInfo.message);//失败的表情 |
||||
|
|
||||
|
} else { |
||||
|
obj.del(); |
||||
|
layer.msg("删除成功", { |
||||
|
icon: 6,//成功的表情 |
||||
|
time: 500 //1秒关闭(如果不配置,默认是3秒) |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
}) |
||||
|
}); |
||||
|
} else if (obj.event === 'realDelete') { //彻底删除 |
||||
|
var req = {}; |
||||
|
req.id = data.id; |
||||
|
layer.confirm('该操作会造成不可逆后果,是否继续?', { |
||||
|
btn: ['继续', '取消'] //按钮 |
||||
|
}, function () { |
||||
|
$.ajax({ |
||||
|
url: '/material/realDeleteMaterial', |
||||
|
dataType: 'json', |
||||
|
type: 'POST', |
||||
|
contentType: "application/json;charset=utf-8", |
||||
|
data: JSON.stringify(req), |
||||
|
beforeSend: function () { |
||||
|
this.layerIndex = layer.load(0, {shade: [0.5, '#393D49']}); |
||||
|
}, |
||||
|
success: function (data) { |
||||
|
layer.close(this.layerIndex); |
||||
|
if (data.status >= 300) { |
||||
|
layer.msg(data.statusInfo.message);//失败的表情 |
||||
|
|
||||
|
} else { |
||||
|
obj.del(); |
||||
|
layer.msg("删除成功", { |
||||
|
icon: 6,//成功的表情 |
||||
|
time: 500 //1秒关闭(如果不配置,默认是3秒) |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
}) |
||||
|
}, function () { |
||||
|
// 执行重加载 |
||||
|
table.reload('currentTableId', { |
||||
|
url: '/repository/warehouseRecord', |
||||
|
page: { |
||||
|
curr: 1 |
||||
|
}, |
||||
|
where: {"parentId": parentId} |
||||
|
}); |
||||
|
}); |
||||
|
} else if (obj.event == 'manager') { |
||||
|
|
||||
|
layer.open({ |
||||
|
type: 2, |
||||
|
title: '仓管员信息', |
||||
|
shadeClose: true, |
||||
|
shade: false, |
||||
|
maxmin: true, //开启最大化最小化按钮 |
||||
|
area: ['893px', '600px'], |
||||
|
content: '/ManagerViewByMid?id=' + data.id |
||||
|
}); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
//监听状态操作 |
||||
|
form.on('switch(changeState)', function (obj) { |
||||
|
var req = new Map; |
||||
|
if (obj.elem.checked) { |
||||
|
req["state"] = 1 |
||||
|
} |
||||
|
req["id"] = this.value; |
||||
|
$.ajax({ |
||||
|
url: "/material/material_edit", |
||||
|
type: 'post', |
||||
|
dataType: 'json', |
||||
|
contentType: "application/json;charset=utf-8", |
||||
|
data: JSON.stringify(req), |
||||
|
beforeSend: function () { |
||||
|
this.layerIndex = layer.load(0, {shade: [0.5, '#393D49']}); |
||||
|
}, |
||||
|
success: function (data) { |
||||
|
layer.close(this.layerIndex); |
||||
|
if (data.status >= 300) { |
||||
|
layer.msg(data.statusInfo.message);//失败的表情 |
||||
|
|
||||
|
} else { |
||||
|
layer.msg("修改成功", { |
||||
|
icon: 6,//成功的表情 |
||||
|
time: 500 //1秒关闭(如果不配置,默认是3秒) |
||||
|
}, function () { |
||||
|
window.location = '/material_out' |
||||
|
}) |
||||
|
} |
||||
|
} |
||||
|
}) |
||||
|
}); |
||||
|
}); |
||||
|
</script> |
||||
|
|
||||
|
</body> |
||||
|
</html> |
||||
@ -0,0 +1,450 @@ |
|||||
|
<!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"> |
||||
|
</head> |
||||
|
<body> |
||||
|
<style> |
||||
|
.inputdiv { |
||||
|
display: flex; |
||||
|
background-color: #fff; |
||||
|
height: 38px; |
||||
|
line-height: 38px; |
||||
|
border: 1px solid rgb(238, 238, 238); |
||||
|
} |
||||
|
|
||||
|
.layui-form-label { |
||||
|
padding: 9px 0px; |
||||
|
text-align: left; |
||||
|
} |
||||
|
|
||||
|
.layui-input-block { |
||||
|
margin-left: 80px; |
||||
|
} |
||||
|
|
||||
|
.layui-fluid { |
||||
|
padding-left: 0px; |
||||
|
padding-right: 0px; |
||||
|
} |
||||
|
|
||||
|
.inputdiv .layui-unselect { |
||||
|
border-style: none; |
||||
|
width: 100%; |
||||
|
} |
||||
|
</style> |
||||
|
<div class="layuimini-container"> |
||||
|
<div class="layuimini-main"> |
||||
|
<fieldset class="table-search-fieldset" style="padding: 10px 2px 5px;"> |
||||
|
<legend>物料拆单</legend> |
||||
|
<div class="layui-fluid"> |
||||
|
<div class="layui-card"> |
||||
|
<div class="layui-card-body" style="padding-left:0px;padding-right:0px"> |
||||
|
<div> |
||||
|
<form class="layui-form layui-form-pane" |
||||
|
style="margin: 0 auto;max-width: 700px;padding-top: 5px; padding-bottom: 50px" |
||||
|
lay-filter="formStep"> |
||||
|
<div class="layui-form-item"> |
||||
|
<label class="layui-form-label">物料名称:</label> |
||||
|
|
||||
|
<div class="layui-input-block"> |
||||
|
<div class="inputdiv"> |
||||
|
<input type="text" placeholder="请选择物料" class="layui-input" |
||||
|
style="border-style: none" |
||||
|
id="mname" onblur="selectMaterialByName(this)" |
||||
|
lay-verify="required"/> |
||||
|
<i class="layui-icon layui-icon-search" style="display: inline;" |
||||
|
id="selectMaterial" onclick="selectMaterial(this)"></i> |
||||
|
</div> |
||||
|
<input type="text" name="mid" class="layui-input" id="mid" |
||||
|
style="display: none" lay-verify="required"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
<div class="layui-form-item"> |
||||
|
<label class="layui-form-label">物料编码:</label> |
||||
|
<div class="layui-input-block" style="margin: 0px;"> |
||||
|
<div class="inputdiv"> |
||||
|
<input id="code" name="code" type="text" placeholder="请填写入物料编码" value="" |
||||
|
onblur="selectCode(this)" |
||||
|
class="layui-input" lay-verify="required" |
||||
|
style="border-style: none"> |
||||
|
<img src="/static/images/search.ico" height="16" width="16" |
||||
|
id="qrCodeImg" |
||||
|
style="margin-top: 10px" onclick="scanCode(this)"> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="layui-form-item"> |
||||
|
<label class="layui-form-label">条形编码:</label> |
||||
|
<div class="layui-input-block" style="margin: 0px;"> |
||||
|
<div class="inputdiv"> |
||||
|
<input id="barCode" name="barCode" type="text" readonly |
||||
|
value="" |
||||
|
class="layui-input" |
||||
|
style="border-style: none"> |
||||
|
<img src="/static/images/search.ico" height="16" width="16" |
||||
|
id="barCodeImg" |
||||
|
style="margin-top: 10px" onclick="scanBarCode(this)"> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="layui-form-item"> |
||||
|
<label class="layui-form-label">规格型号:</label> |
||||
|
|
||||
|
<div class="layui-input-block"> |
||||
|
<input type="text" name="version" class="layui-input" id="version" readonly/> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
<div class="layui-form-item"> |
||||
|
<label class="layui-form-label">物料类型:</label> |
||||
|
|
||||
|
<div class="layui-input-block"> |
||||
|
<input type="text" name="typeName" class="layui-input" id="typeName" readonly |
||||
|
lay-verify="required"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="layui-form-item"> |
||||
|
<label class="layui-form-label">计量单位:</label> |
||||
|
|
||||
|
<div class="layui-input-block"> |
||||
|
<input type="text" name="oldUnit" class="layui-input" id="unit" readonly |
||||
|
lay-verify="required"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="layui-form-item"> |
||||
|
<label class="layui-form-label">拆单单位:</label> |
||||
|
<div class="layui-input-block"> |
||||
|
<input type="text" name="newUnit" class="layui-input" id="newUnit" |
||||
|
lay-verify="required"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="layui-form-item"> |
||||
|
<label class="layui-form-label">对应数目:</label> |
||||
|
|
||||
|
<div class="layui-input-block"> |
||||
|
<input type="text" name="quantity" class="layui-input" id="quantity" |
||||
|
lay-verify="number"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="layui-form-item"> |
||||
|
<div class="layui-input-block"> |
||||
|
<button class="layui-btn" type="button" lay-submit lay-filter="formStep"> |
||||
|
 提交  |
||||
|
</button> |
||||
|
</div> |
||||
|
</div> |
||||
|
</form> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</fieldset> |
||||
|
</div> |
||||
|
</div> |
||||
|
<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 selectMaterialByName() { |
||||
|
} |
||||
|
|
||||
|
// 打开物料选择树 |
||||
|
function selectMaterial() { |
||||
|
} |
||||
|
|
||||
|
// 用于编码查询 |
||||
|
function selectCode(obj) { |
||||
|
} |
||||
|
|
||||
|
// 用于扫描条形码 |
||||
|
function scanBarCode(obj) { |
||||
|
} |
||||
|
|
||||
|
|
||||
|
// 用于扫码入库 |
||||
|
function scanCode(obj) { |
||||
|
} |
||||
|
|
||||
|
layui.use(['form', 'layer'], function () { |
||||
|
var $ = layui.jquery, |
||||
|
form = layui.form, |
||||
|
layer = layui.layer; |
||||
|
form.on('submit(formStep)', function (data) { |
||||
|
data = data.field; |
||||
|
$.ajax({ |
||||
|
url:"/split/splitAdd", |
||||
|
data:JSON.stringify(data), |
||||
|
dataType:"json", |
||||
|
type:"post", |
||||
|
contentType: "application/json;charset=utf-8", |
||||
|
success:function (res) { |
||||
|
layer.close(this.layerIndex); |
||||
|
if (data.status >= 300) { |
||||
|
layer.msg(data.statusInfo.detail,{ |
||||
|
icon:6, |
||||
|
time:1000 |
||||
|
},function () { |
||||
|
window.location="/split_add" |
||||
|
});//失败的表情 |
||||
|
} else { |
||||
|
layer.msg("添加成功!", { |
||||
|
icon: 6,//成功的表情 |
||||
|
time: 1000 |
||||
|
}, //1秒关闭(如果不配置,默认是3秒) |
||||
|
function(){ |
||||
|
//do something |
||||
|
window.location="/split_add" |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
}) |
||||
|
}); |
||||
|
|
||||
|
// 通过名称查询物料 |
||||
|
selectMaterialByName = function (obj) { |
||||
|
let materialName = $("#mname"); |
||||
|
var data = materialName.val(); |
||||
|
var req = {}; |
||||
|
req.mname = data; |
||||
|
let materialId = $("#mid"); |
||||
|
let codeValue = $("#code"); |
||||
|
let version = $("#version"); |
||||
|
let typeName = $("#typeName"); |
||||
|
let unit = $("#unit"); |
||||
|
$.ajax({ |
||||
|
url: "/material/findMaterialByCondition", |
||||
|
type: "post", |
||||
|
dataType: 'json', |
||||
|
data: JSON.stringify(req), |
||||
|
contentType: "application/json;charset=utf-8", |
||||
|
success: function (d) { |
||||
|
if (d.count > 1) { |
||||
|
layer.msg("请点击右侧搜索确定物品"); |
||||
|
materialId.val(""); |
||||
|
codeValue.val(""); |
||||
|
version.val(""); |
||||
|
typeName.val(""); |
||||
|
unit.val(""); |
||||
|
return false; |
||||
|
} else if (d.count === 0) { |
||||
|
layer.msg("没有该物品,请确认输入是否正确"); |
||||
|
materialId.val(""); |
||||
|
codeValue.val(""); |
||||
|
materialName.val(""); |
||||
|
version.val(""); |
||||
|
typeName.val(""); |
||||
|
unit.val(""); |
||||
|
return false; |
||||
|
} else { |
||||
|
var material = d.data[0]; |
||||
|
materialName.val(material.mname); |
||||
|
materialId.val(material.mid); |
||||
|
codeValue.val(material.code); |
||||
|
version.val(material.version); |
||||
|
typeName.val(material.typeName); |
||||
|
unit.val(material.unit); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
// 打开物料选择树 |
||||
|
selectMaterial = function (obj) { |
||||
|
let mname = $("#mname").val(); |
||||
|
mname = mname.split(",")[0]; |
||||
|
layer.open({ |
||||
|
type: 2, |
||||
|
title: '弹窗内容', |
||||
|
skin: 'layui-layer-rim', |
||||
|
maxmin: true, |
||||
|
shadeClose: true, //点击遮罩关闭层 |
||||
|
area: ['70%', '70%'], |
||||
|
content: '/selectMaterial?mname=' + mname, |
||||
|
move: '.layui-layer-title', |
||||
|
fixed: false, |
||||
|
success: function (layero, index) { |
||||
|
let children = layero.children(); |
||||
|
let content = $(children[1]); |
||||
|
let iframeChildren = $(content.children()); |
||||
|
content.css('height', '100%'); |
||||
|
iframeChildren.css('height', '100%'); |
||||
|
}, |
||||
|
end: function () { |
||||
|
var mid = $("#mid").val(); |
||||
|
if (mid !== '') { |
||||
|
$.ajax({ |
||||
|
url: "/material/findMatrialById?mid=" + mid, |
||||
|
type: "get", |
||||
|
dataType: 'json', |
||||
|
contentType: "application/json;charset=utf-8", |
||||
|
success: function (d) { |
||||
|
var material = d.data.materialById; |
||||
|
var code = material.code; |
||||
|
if (code === undefined) { |
||||
|
code = ""; |
||||
|
} |
||||
|
$("#code").val(code); |
||||
|
$("#version").val(material.version); |
||||
|
$("#unit").val(material.unit); |
||||
|
$("#typeName").val(material.typeName); |
||||
|
var materialAndBarCodeList = material["materialAndBarCodeList"]; |
||||
|
if (materialAndBarCodeList.length > 0) { |
||||
|
// 如果有对应的条形码 |
||||
|
$("#barCode").remove(); |
||||
|
var barCodeSelect = ` |
||||
|
<select id="barCode" name= "barCode"></select>`; |
||||
|
$("#barCodeImg").before(barCodeSelect); |
||||
|
form.render(); |
||||
|
$.each(materialAndBarCodeList, function (index, item) { |
||||
|
$("#barCode").append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素 |
||||
|
}); |
||||
|
form.render(); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
scanCodeInStorage = function (obj) { |
||||
|
var objIdNumber = obj.id.split("qrCodeImg")[1]; |
||||
|
parent.wx.scanQRCode({ |
||||
|
desc: 'scanQRCode desc', |
||||
|
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果, |
||||
|
scanType: ["qrCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有 |
||||
|
success: function (res) { |
||||
|
// 回调 |
||||
|
var result = res.resultStr;//当needResult为1时返回处理结果 |
||||
|
var req = {}; |
||||
|
req.qrCode = result; |
||||
|
$("#qrCode" + objIdNumber).val(result); |
||||
|
$.ajax({ |
||||
|
url: "/material/qywxApplicationInScanQrCode", |
||||
|
type: "post", |
||||
|
dataType: 'json', |
||||
|
data: JSON.stringify(req), |
||||
|
contentType: "application/json;charset=utf-8", |
||||
|
success: function (d) { |
||||
|
|
||||
|
} |
||||
|
|
||||
|
}) |
||||
|
} |
||||
|
}) |
||||
|
}; |
||||
|
|
||||
|
scanBarCode = function (obj) { |
||||
|
parent.wx.scanQRCode({ |
||||
|
desc: 'scanQRCode desc', |
||||
|
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果, |
||||
|
scanType: ["barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有 |
||||
|
success: function (res) { |
||||
|
// 回调 |
||||
|
var result = res.resultStr;//当needResult为1时返回处理结果 |
||||
|
var req = {}; |
||||
|
req.qrCode = result; |
||||
|
$.ajax({ |
||||
|
url: "/material/qywxApplicationInScanBarCode", |
||||
|
type: "post", |
||||
|
dataType: 'json', |
||||
|
data: JSON.stringify(req), |
||||
|
contentType: "application/json;charset=utf-8", |
||||
|
success: function (d) { |
||||
|
|
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
}, |
||||
|
error: function (res) { |
||||
|
if (res.errMsg.indexOf('function_not_exist') > 0) { |
||||
|
alert('版本过低请升级') |
||||
|
} |
||||
|
alert(res) |
||||
|
|
||||
|
} |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
// 用于实现通过编码查询物料 |
||||
|
selectCode = function (obj) { |
||||
|
// 输入code |
||||
|
var code = obj.value; |
||||
|
var req = {}; |
||||
|
req.code = code; |
||||
|
req.type = "in"; |
||||
|
$.ajax({ |
||||
|
url: "/material/findMatrialByCode", |
||||
|
type: "get", |
||||
|
dataType: 'json', |
||||
|
data: req, |
||||
|
contentType: "application/json;charset=utf-8", |
||||
|
success: function (d) { |
||||
|
var d = d.data; |
||||
|
if (d == null) { |
||||
|
layer.msg("没有该编码,请确认是否输入正确"); |
||||
|
$("#mname").val(""); |
||||
|
$("#mid").val(""); |
||||
|
$("#code").val(""); |
||||
|
$("#barCode").val(""); |
||||
|
$("#version").val(""); |
||||
|
$("#unit").val(""); |
||||
|
$("#typeName").val(""); |
||||
|
form.render(); |
||||
|
|
||||
|
} else { |
||||
|
$("#mname").val(d.mname); |
||||
|
$("#mid").val( d.mid); |
||||
|
$("#version").val(d.version); |
||||
|
$("#unit").val(d.unit); |
||||
|
$("#typeName").val(d.typeName); |
||||
|
// 获取物料与条形码的对应关系 |
||||
|
var materialAndBarCodeList = d["materialAndBarCodeList"]; |
||||
|
if (materialAndBarCodeList.length > 0) { |
||||
|
// 如果有对应的条形码 |
||||
|
$("#barCode").remove(); |
||||
|
$(".layui-unselect").remove(); |
||||
|
var barCodeSelect = ` |
||||
|
<select id="barCode" name="barCode"> |
||||
|
</select>`; |
||||
|
$("#barCodeImg").before(barCodeSelect); |
||||
|
|
||||
|
form.render(); |
||||
|
$.each(materialAndBarCodeList, function (index, item) { |
||||
|
$("#barCode").append(new Option(item.bmcode, item.bmcode));//往下拉菜单里添加元素 |
||||
|
}); |
||||
|
form.render(); |
||||
|
} else { |
||||
|
$("#barCode").remove(); |
||||
|
$(".layui-unselect").remove(); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
}; |
||||
|
|
||||
|
}) |
||||
|
</script> |
||||
|
|
||||
|
</body> |
||||
|
</html> |
||||
@ -0,0 +1,273 @@ |
|||||
|
package com.dreamchaser.depository_manage; |
||||
|
|
||||
|
import com.alibaba.fastjson.JSONArray; |
||||
|
import com.alibaba.fastjson.JSONObject; |
||||
|
import com.dreamchaser.depository_manage.entity.Material; |
||||
|
import com.dreamchaser.depository_manage.entity.MaterialType; |
||||
|
import com.dreamchaser.depository_manage.mapper.MaterialMapper; |
||||
|
import com.dreamchaser.depository_manage.mapper.MaterialTypeMapper; |
||||
|
import com.dreamchaser.depository_manage.service.MaterialService; |
||||
|
import org.apache.poi.ss.formula.functions.T; |
||||
|
import org.junit.runner.RunWith; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.boot.test.context.SpringBootTest; |
||||
|
import org.springframework.data.redis.core.RedisTemplate; |
||||
|
import org.springframework.test.context.junit4.SpringRunner; |
||||
|
|
||||
|
import java.util.*; |
||||
|
import java.util.concurrent.*; |
||||
|
|
||||
|
@SpringBootTest |
||||
|
@RunWith(SpringRunner.class) |
||||
|
public class TestForSelectMaterialByName { |
||||
|
|
||||
|
@Autowired |
||||
|
MaterialService materialService; |
||||
|
|
||||
|
@Autowired |
||||
|
MaterialMapper materialMapper; |
||||
|
|
||||
|
@Autowired |
||||
|
MaterialTypeMapper materialTypeMapper; |
||||
|
|
||||
|
@Autowired |
||||
|
RedisTemplate<String, String> redisTemplate; |
||||
|
|
||||
|
@org.junit.Test |
||||
|
public void test1() { |
||||
|
List<Object> list = buildTreeForSelectName(InitTreeForSelectName("切四A菇")); |
||||
|
System.out.println(JSONObject.toJSONString(list)); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 用于深度拷贝列表 |
||||
|
* |
||||
|
* @param oldList |
||||
|
* @param <T> |
||||
|
* @return |
||||
|
*/ |
||||
|
public static <T> List<T> deepCopy(List<T> oldList) { |
||||
|
List<T> newList = (List<T>) Arrays.asList(new Object[oldList.size()]); |
||||
|
Collections.copy(newList, oldList); |
||||
|
return newList; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 用于构造物料树结构(通过物料名称搜索) |
||||
|
* |
||||
|
* @return |
||||
|
*/ |
||||
|
public List<Object> InitTreeForSelectName(String mname) { |
||||
|
// 获取所有物料类型
|
||||
|
List<MaterialType> materialTypeAll = materialTypeMapper.findMaterialTypeAll(); |
||||
|
// 物料总数
|
||||
|
Integer totalVal = materialTypeAll.size(); |
||||
|
|
||||
|
// 定义分页数量
|
||||
|
double size = 100.0; |
||||
|
|
||||
|
// 定义线程数
|
||||
|
Integer threadSize = (int) Math.ceil(totalVal / size); |
||||
|
|
||||
|
// 开启对应数量的线程
|
||||
|
ExecutorService exs = Executors.newFixedThreadPool(threadSize); |
||||
|
// 树结构结果集
|
||||
|
List<Object> list = new ArrayList<>(); |
||||
|
// 线程结果集
|
||||
|
List<Future<Object>> futureList = new ArrayList<Future<Object>>(); |
||||
|
|
||||
|
// 1.定义CompletionService
|
||||
|
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs); |
||||
|
// 物料类型id列表
|
||||
|
List<Long> materialTypeList = new ArrayList<>(); |
||||
|
for (int i = 0; i < materialTypeAll.size(); i++) { |
||||
|
// 获取当前类型
|
||||
|
MaterialType materialType = materialTypeAll.get(i); |
||||
|
if (((i + 1) % 100) == 0) { // 如果有100个开启线程进行处理
|
||||
|
materialTypeList.add(materialType.getOldId()); |
||||
|
Future<Object> future = completionService.submit(new TaskTestForSelectMname(materialTypeList, mname)); |
||||
|
futureList.add(future); // 添加到结果集
|
||||
|
materialTypeList = new ArrayList<>(); // 情况列表
|
||||
|
} else { |
||||
|
// 添加id到列表中
|
||||
|
materialTypeList.add(materialType.getOldId()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
if (materialTypeList.size() > 0) { |
||||
|
// 如果有剩余,开启线程进行处理
|
||||
|
Future<Object> future = completionService.submit(new TaskTestForSelectMname(materialTypeList, mname)); |
||||
|
futureList.add(future); |
||||
|
} |
||||
|
|
||||
|
// 3.获取结果
|
||||
|
for (int i = 0; i < threadSize; i++) { |
||||
|
Object result = null; |
||||
|
try { |
||||
|
result = completionService.take().get(); |
||||
|
} catch (InterruptedException e) { |
||||
|
e.printStackTrace(); |
||||
|
} catch (ExecutionException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
list.addAll((Collection<?>) result); |
||||
|
} |
||||
|
// 进行最终的封装
|
||||
|
return list; |
||||
|
} |
||||
|
|
||||
|
// 用于执行测试新算法(通过物料名称搜索)
|
||||
|
class TaskTestForSelectMname implements Callable<Object> { |
||||
|
|
||||
|
// 待处理的物料类型id列表
|
||||
|
List<Long> materialTypeIdList; |
||||
|
String mname; |
||||
|
|
||||
|
public TaskTestForSelectMname(List<Long> materialTypeByCondition, String mname) { |
||||
|
this.materialTypeIdList = materialTypeByCondition; |
||||
|
this.mname = mname; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public Object call() throws Exception { |
||||
|
|
||||
|
// 定义树结构结果集
|
||||
|
List<Object> list = new ArrayList<>(); |
||||
|
// 查询当前物料类型id列表中的物料类型
|
||||
|
Map<String, Object> paramForMnameAndMtid = new HashMap<>(); |
||||
|
paramForMnameAndMtid.put("list", materialTypeIdList); |
||||
|
paramForMnameAndMtid.put("mname", mname); |
||||
|
List<Material> materialByTypeIds = materialMapper.findMaterialByTypeIdsAndMname(paramForMnameAndMtid); |
||||
|
// 查询当前物料类型所包含的物料
|
||||
|
List<MaterialType> materialTypeByOldIds = materialTypeMapper.findMaterialTypeByOldIds(materialTypeIdList); |
||||
|
|
||||
|
// 定义线程集
|
||||
|
ExecutorService exs = Executors.newFixedThreadPool(materialTypeByOldIds.size()); |
||||
|
// 定义线程结果集
|
||||
|
List<Future<Object>> futureList = new ArrayList<Future<Object>>(); |
||||
|
|
||||
|
// 1.定义CompletionService
|
||||
|
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs); |
||||
|
|
||||
|
for (int i = 0; i < materialTypeByOldIds.size(); i++) { |
||||
|
// 获取当前物料类型
|
||||
|
MaterialType mt = materialTypeByOldIds.get(i); |
||||
|
// 开启对应线程
|
||||
|
Future<Object> future = completionService.submit(new MtTaskTestForSelectMname(mt, materialByTypeIds, mname)); |
||||
|
// 添加到线程结果列表
|
||||
|
futureList.add(future); |
||||
|
} |
||||
|
// 3.获取结果
|
||||
|
for (int i = 0; i < materialTypeIdList.size(); i++) { |
||||
|
Object result = null; |
||||
|
try { |
||||
|
result = completionService.take().get(); |
||||
|
} catch (InterruptedException e) { |
||||
|
e.printStackTrace(); |
||||
|
} catch (ExecutionException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
list.add(result); |
||||
|
} |
||||
|
return list; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
// 用于执行测试新算法(通过物料名称搜索)
|
||||
|
class MtTaskTestForSelectMname implements Callable<Object> { |
||||
|
|
||||
|
MaterialType mt; // 物料类型
|
||||
|
List<Material> materiaList; // 物料列表
|
||||
|
String mname; |
||||
|
|
||||
|
public MtTaskTestForSelectMname(MaterialType mt, List<Material> materiaList, String mname) { |
||||
|
this.mt = mt; |
||||
|
this.materiaList = materiaList; |
||||
|
this.mname = mname; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public Object call() throws Exception { |
||||
|
|
||||
|
// 开启对应数量的线程
|
||||
|
List<Material> materialList = new ArrayList<>(); |
||||
|
for (int i = 0; i < materiaList.size(); i++) { |
||||
|
Material material = materiaList.get(i); |
||||
|
// 如果当前物料是当前物料类型下的物料
|
||||
|
if (Long.compare(material.getMaterialTypeId(), mt.getOldId()) == 0) { |
||||
|
materialList.add(material); |
||||
|
} |
||||
|
} |
||||
|
// 将物料打包成树结构对应结果
|
||||
|
List<Object> objectList = AddMaterialByTypeForSelectMname(materialList); |
||||
|
// 封装成对应的结构
|
||||
|
Map<String, Object> objectMap = InitTreeMenusForSelectName(mt, objectList); |
||||
|
return objectMap; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 构造树形组件数据模板(通过物料名称搜索)
|
||||
|
public Map<String, Object> InitTreeMenusForSelectName(MaterialType mt, List<Object> children) { |
||||
|
if (mt != null) { |
||||
|
Map<String, Object> map = new HashMap<>(); |
||||
|
map.put("title", mt.getTname()); |
||||
|
map.put("id", mt.getOldId()); |
||||
|
map.put("parentId", mt.getParentId()); |
||||
|
map.put("children", children); |
||||
|
return map; |
||||
|
} else { |
||||
|
return null; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 在类别后添加物料名称(通过物料名称搜索)
|
||||
|
public List<Object> AddMaterialByTypeForSelectMname(List<Material> materialList) { |
||||
|
List<Object> result = new ArrayList<>(); |
||||
|
for (int i = 0; i < materialList.size(); i++) { |
||||
|
Material material = materialList.get(i); |
||||
|
Map<String, Object> map = new HashMap<>(); |
||||
|
String version = material.getVersion(); |
||||
|
if (version == null) { |
||||
|
version = ""; |
||||
|
} |
||||
|
|
||||
|
String title = material.getMname() + ",规格型号: " + version; |
||||
|
map.put("title", title); |
||||
|
map.put("id", material.getId()); |
||||
|
result.add(map); |
||||
|
} |
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 用于构造树结构(通过物料名称搜索) |
||||
|
* |
||||
|
* @param list 树列表 |
||||
|
* @return |
||||
|
*/ |
||||
|
public List<Object> buildTreeForSelectName(List<Object> list) { |
||||
|
// 定义树结构
|
||||
|
List<Object> result = new ArrayList<>(); |
||||
|
for (int i = 0; i < list.size(); i++) { |
||||
|
// 构造为jsonObject类
|
||||
|
JSONObject jsonObject = new JSONObject((Map<String, Object>) list.get(i)); |
||||
|
JSONArray children = jsonObject.getJSONArray("children"); |
||||
|
if(children.size() > 0){ |
||||
|
result.add(jsonObject); |
||||
|
} |
||||
|
// // 获取当前父级id
|
||||
|
// Long parentId1 = jsonObject.getLong("parentId");
|
||||
|
// if (Long.compare(parentId, parentId1) == 0) { // 如果当前类型是其父类
|
||||
|
// List<Object> objectList = buildTreeForSelectName(list, jsonObject.getLong("id")); // 获取当前类型的子类
|
||||
|
// JSONArray children = jsonObject.getJSONArray("children");
|
||||
|
// children.addAll(objectList);
|
||||
|
// result.add(jsonObject);
|
||||
|
// }
|
||||
|
|
||||
|
} |
||||
|
return result; |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue