Browse Source

添加组合出库的二维码生成功能

lwx_dev
erdanergou 3 years ago
parent
commit
5becebd7f4
  1. 32
      src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java
  2. 40
      src/main/java/com/dreamchaser/depository_manage/controller/GroupController.java
  3. 2
      src/main/java/com/dreamchaser/depository_manage/controller/PageController.java
  4. 30
      src/main/java/com/dreamchaser/depository_manage/mapper/GroupMapper.java
  5. 15
      src/main/java/com/dreamchaser/depository_manage/mapper/GroupMapper.xml
  6. 2
      src/main/java/com/dreamchaser/depository_manage/pojo/RestResponse.java
  7. 23
      src/main/java/com/dreamchaser/depository_manage/service/GroupService.java
  8. 30
      src/main/java/com/dreamchaser/depository_manage/service/impl/GroupServiceImpl.java
  9. 64
      src/main/java/com/dreamchaser/depository_manage/utils/CreateQrCodeUtil.java
  10. 1
      src/main/resources/templates/index_mobile.html
  11. 5
      src/main/resources/templates/pages/application/application-in.html
  12. 5
      src/main/resources/templates/pages/application/application_multi.html
  13. 89
      src/main/resources/templates/pages/group/group_edit.html
  14. 23
      src/test/java/com/dreamchaser/depository_manage/TestForOther.java
  15. 1
      target/classes/templates/index_mobile.html
  16. 5
      target/classes/templates/pages/application/application_multi.html
  17. 3
      target/classes/templates/pages/chart/chart-out_back.html
  18. 4
      target/classes/templates/pages/chart/chart-stock_back.html

32
src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java

@ -33,8 +33,6 @@ public class DepositoryRecordController {
@Autowired
private CompanyService companyService;
@Autowired
private RedisTemplate<Object,Object> redisTemplate;
@Autowired
private RedisTemplate<String,String> redisTemplateForHash;
@Autowired
private PlaceService placeService;
@ -620,19 +618,19 @@ public class DepositoryRecordController {
List<Integer> mids = (List<Integer>) map.get("mids");
List<Integer> depositoryIds = (List<Integer>) map.get("depositoryIds");
List<String> placeCodes = (List<String>) map.get("placeCodes");
List<Object> nowmids = redisTemplate.opsForList().range("mids"+userToken.getId(), 0, -1);
List<String> nowmids = redisTemplateForHash.opsForList().range("mids"+userToken.getId(), 0, -1);
for (int i = 0; i < mids.size(); i++) {
if(nowmids.contains(mids.get(i))){
continue;
}
redisTemplate.opsForList().leftPush("mids"+userToken.getId(), mids.get(i));
redisTemplate.opsForList().leftPush("depositoryIds"+userToken.getId(), depositoryIds.get(i));
redisTemplate.opsForList().leftPush("placeCodes"+userToken.getId(), placeCodes.get(i));
redisTemplateForHash.opsForList().leftPush("mids"+userToken.getId(), mids.get(i).toString());
redisTemplateForHash.opsForList().leftPush("depositoryIds"+userToken.getId(), depositoryIds.get(i).toString());
redisTemplateForHash.opsForList().leftPush("placeCodes"+userToken.getId(), placeCodes.get(i).toString());
}
redisTemplate.expire("mids"+userToken.getId(),24 * 60 * 60, TimeUnit.SECONDS);
redisTemplate.expire("depositoryIds"+userToken.getId(),24 * 60 * 60, TimeUnit.SECONDS);
redisTemplate.expire("placeCodes"+userToken.getId(),24 * 60 * 60, TimeUnit.SECONDS);
redisTemplateForHash.expire("mids"+userToken.getId(),24 * 60 * 60, TimeUnit.SECONDS);
redisTemplateForHash.expire("depositoryIds"+userToken.getId(),24 * 60 * 60, TimeUnit.SECONDS);
redisTemplateForHash.expire("placeCodes"+userToken.getId(),24 * 60 * 60, TimeUnit.SECONDS);
return CrudUtil.postHandle(1,1);
}
@ -645,17 +643,17 @@ public class DepositoryRecordController {
@PostMapping("/deleteApplicationToRedis")
public RestResponse deleteApplicationToRedis(@RequestBody Map<String,Object> map,HttpServletRequest request){
UserByPort userToken= (UserByPort) request.getAttribute("userToken");
List<Integer> mids = (List<Integer>) map.get("mids");
List<Integer> mids = (List<Integer>) map.get("iids");
List<Integer> depositoryIds = (List<Integer>) map.get("depositoryIds");
List<String> placeCodes = (List<String>) map.get("placeCodes");
for (int i = 0; i < mids.size(); i++) {
redisTemplate.opsForList().remove("mids"+userToken.getId(),1,mids.get(i));
redisTemplateForHash.opsForList().remove("mids"+userToken.getId(),1,mids.get(i).toString());
}
for (int i = 0; i < depositoryIds.size(); i++) {
redisTemplate.opsForList().remove("depositoryIds"+userToken.getId(),1,depositoryIds.get(i));
redisTemplateForHash.opsForList().remove("depositoryIds"+userToken.getId(),1,depositoryIds.get(i).toString());
}
for (int i = 0; i < placeCodes.size(); i++) {
redisTemplate.opsForList().remove("placeCodes"+userToken.getId(),1,placeCodes.get(i));
redisTemplateForHash.opsForList().remove("placeCodes"+userToken.getId(),1,placeCodes.get(i).toString());
}
return CrudUtil.postHandle(1,1);
}
@ -833,18 +831,18 @@ public class DepositoryRecordController {
Integer start = (page - 1) * pagesize;
Integer end = page * 10;
UserByPort userToken= (UserByPort) request.getAttribute("userToken");
Long size = redisTemplate.boundListOps("mids"+userToken.getId()).size();
Long size = redisTemplateForHash.boundListOps("mids"+userToken.getId()).size();
if(end > size){
end = ObjectFormatUtil.toInteger(size);
}
List<ApplicationModel> list = new ArrayList<>();
for (int i = start; i < end; i++) {
// 获取物料编号
Integer mid =ObjectFormatUtil.toInteger(redisTemplate.opsForList().index("mids"+userToken.getId(),i));
Integer mid =ObjectFormatUtil.toInteger(redisTemplateForHash.opsForList().index("mids"+userToken.getId(),i));
// 获取仓库编号
Integer depositoryId =ObjectFormatUtil.toInteger(redisTemplate.opsForList().index("depositoryIds"+userToken.getId(),i));
Integer depositoryId =ObjectFormatUtil.toInteger(redisTemplateForHash.opsForList().index("depositoryIds"+userToken.getId(),i));
// 获取库位编码
String placeCode =(String)(redisTemplate.opsForList().index("placeCodes"+userToken.getId(),i));
String placeCode =(String)(redisTemplateForHash.opsForList().index("placeCodes"+userToken.getId(),i));
// 获取物料信息
Inventory materialById = materialService.findInventoryByMid(mid);
// 获取仓库信息

40
src/main/java/com/dreamchaser/depository_manage/controller/GroupController.java

@ -1,9 +1,9 @@
package com.dreamchaser.depository_manage.controller;
import cn.hutool.core.lang.Snowflake;
import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.exception.MyException;
import com.dreamchaser.depository_manage.pojo.ApplicationModel;
import com.dreamchaser.depository_manage.pojo.GroupInfoP;
import com.dreamchaser.depository_manage.pojo.RestResponse;
import com.dreamchaser.depository_manage.pojo.StatusInfo;
@ -12,15 +12,12 @@ import com.dreamchaser.depository_manage.service.GroupService;
import com.dreamchaser.depository_manage.service.MaterialService;
import com.dreamchaser.depository_manage.service.impl.QyWxOperationService;
import com.dreamchaser.depository_manage.utils.*;
import com.sun.org.apache.xpath.internal.operations.Bool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.sql.Time;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.TimeUnit;
@ -452,6 +449,12 @@ public class GroupController {
}
/**
* 用于构造组合出库单
* @param map 出库数据
* @param request
* @return
*/
@PostMapping("/applicationOutForGroup")
public RestResponse applicationOutForGroup(@RequestBody Map<String, Object> map, HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
@ -520,6 +523,33 @@ public class GroupController {
}
// 构造组合二维码
@PostMapping("/createQrCode")
public RestResponse createQrCode(@RequestBody Map<String, Object> map) {
// 通过雪花算法计算随机数
Snowflake snowflake = new Snowflake(10, 10, true);
String qrCode = snowflake.nextIdStr();
Integer gid = ObjectFormatUtil.toInteger(map.get("gid"));
String qrCodeByMcode = groupService.findQrCodeByGid(gid);
if (qrCodeByMcode == null) {
Map<String, Object> param = new HashMap<>();
param.put("gid", gid);
param.put("code", qrCode);
groupService.addQrCodeByGroup(param);
} else {
qrCode = qrCodeByMcode;
}
try {
// 二维码保存信息
return RestResponse.CreateQrCode(qrCode);
} catch (IOException e) {
return new RestResponse("err: " + e.getMessage(), 678, new StatusInfo("失败", "请联系开发人员"));
}
}
/**
* 用于判断当前组合的数量是否合法

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

@ -812,7 +812,9 @@ public class PageController {
public ModelAndView groupEdit(Integer id){
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/group/group_edit");
Group group = groupService.findGroupOnlyById(id);
mv.addObject("id",id);
mv.addObject("record",group);
return mv;
}

30
src/main/java/com/dreamchaser/depository_manage/mapper/GroupMapper.java

@ -12,7 +12,6 @@ import java.util.Map;
@Mapper
public interface GroupMapper {
/**
* 用于查找所有组合不包含其他
* @return
@ -20,6 +19,14 @@ public interface GroupMapper {
List<Group> findAllGroupOnly(String gname);
/**
* 根据组合id获取具体信息
* @param gid 组合id
* @return
*/
Group findGroupOnlyById(Integer gid);
/**
* 用于查找所有组合
* @return
@ -33,12 +40,6 @@ public interface GroupMapper {
*/
GroupInfo findGroupById(Integer id);
/**
* 根据主键查询组合不包含其他数据
* @param id 主键
* @return
*/
Group findGroupOnlyById(Integer id);
/**
@ -168,4 +169,19 @@ public interface GroupMapper {
*/
Integer delGroup(Integer id);
/**
* 用于添加组合与二维码的对应关系
* @param map 具体添加数据
* @return
*/
Integer addQrCodeByGroup(Map<String,Object> map);
/**
* 用于通过组合id查询对应的码值
* @param gid 组合id
* @return
*/
String findQrCodeByGid(Integer gid);
}

15
src/main/java/com/dreamchaser/depository_manage/mapper/GroupMapper.xml

@ -316,6 +316,21 @@
where id = #{id}
</update>
<select id="findQrCodeByGid" parameterType="int" resultType="String">
select code
from gidandcode
where gid = #{gid}
</select>
<insert id="addQrCodeByGroup">
insert into gidandcode(id,gid,code)
values (
#{id},
#{gid},
#{code}
)
</insert>
<update id="updateGroupOnly">
update

2
src/main/java/com/dreamchaser/depository_manage/pojo/RestResponse.java

@ -78,6 +78,8 @@ public class RestResponse implements Serializable {
return new RestResponse(qrCode,200,new StatusInfo("成功!","二维码生成成功"));
}
/**
* 将base64编码转为图片
* @param imgStr

23
src/main/java/com/dreamchaser/depository_manage/service/GroupService.java

@ -20,6 +20,27 @@ public interface GroupService {
*/
List<GroupInfo> findAllGroup();
/**
* 根据组合id获取具体信息
* @param gid 组合id
* @return
*/
Group findGroupOnlyById(Integer gid);
/**
* 用于通过组合id查询对应的码值
* @param gid 组合id
* @return
*/
String findQrCodeByGid(Integer gid);
/**
* 用于添加组合与二维码的对应关系
* @param map 具体添加数据
* @return
*/
Integer addQrCodeByGroup(Map<String,Object> map);
/**
* 根据组合id查询对应组合
* @param id 组合id
@ -179,4 +200,6 @@ public interface GroupService {
*/
List<GroupInfo> findGroupInfoByGid(Integer gid);
}

30
src/main/java/com/dreamchaser/depository_manage/service/impl/GroupServiceImpl.java

@ -54,6 +54,36 @@ public class GroupServiceImpl implements GroupService {
return null;
}
/**
* 根据组合id获取具体信息
* @param gid 组合id
* @return
*/
@Override
public Group findGroupOnlyById(Integer gid) {
return groupMapper.findGroupOnlyById(gid);
}
/**
* 根据组合id查询对应组合
* @param gid 组合id
* @return
*/
@Override
public String findQrCodeByGid(Integer gid) {
return groupMapper.findQrCodeByGid(gid);
}
/**
* 用于添加组合与二维码的对应关系
* @param map 具体添加数据
* @return
*/
@Override
public Integer addQrCodeByGroup(Map<String, Object> map) {
return groupMapper.addQrCodeByGroup(map);
}
/**
* 根据组合id查询对应组合
*

64
src/main/java/com/dreamchaser/depository_manage/utils/CreateQrCodeUtil.java

@ -3,10 +3,16 @@ package com.dreamchaser.depository_manage.utils;
import cn.hutool.core.codec.Base64;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.oned.Code128Writer;
import com.google.zxing.oned.EAN13Writer;
import com.google.zxing.pdf417.encoder.BarcodeMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import org.apache.http.util.TextUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
@ -15,13 +21,25 @@ import javax.servlet.ServletOutputStream;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
/*
** 二维码生成
** 二维码生成或条形码生成
*/
public class CreateQrCodeUtil {
/**
* 生成二维码
* @param content 对应数据
* @param width
* @param height
* @return base64格式的字符串
* @throws IOException
*/
public static String createQrCode(String content, int width, int height) throws IOException {
String resultImage = "";
if (!StringUtils.isEmpty(content)) {
@ -56,5 +74,49 @@ public class CreateQrCodeUtil {
}
/**
* 用于创建code_128类型的条形码
* @param content 条形码存储的数据
* @param height 高度
* @param width 宽度
* @return base64格式的字符串
*/
public static String CreateBarCodeCode128(String content, int height, int width){
String resultImage = "";
if (!StringUtils.isEmpty(content)) {
ServletOutputStream stream = null;
ByteArrayOutputStream os = new ByteArrayOutputStream();
Hashtable hints = new Hashtable();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); // 指定字符编码为“utf-8”
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); // 指定二维码的纠错等级为中级
hints.put(EncodeHintType.MARGIN, 2); // 设置图片的边距
Code128Writer writer = new Code128Writer();
BitMatrix bitMatrix = null;
try {
bitMatrix = writer.encode(content, BarcodeFormat.CODE_128, width, height,hints);
} catch (WriterException e) {
e.printStackTrace();
}
BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix);
try {
ImageIO.write(bufferedImage, "png", os);
} catch (IOException e) {
e.printStackTrace();
}
/**
* 原生转码前面没有 data:image/png;base64 这些字段返回给前端是无法被解析可以让前端加也可以在下面加上
*/
resultImage = new String("data:image/png;base64," + Base64.encode(os.toByteArray()));
return resultImage;
}
return null;
}
}

1
src/main/resources/templates/index_mobile.html

@ -39,7 +39,6 @@
.layui-nav-item {
color: #1b1d21;
height: 35px !important;
line-height: 35px !important;
}
.layui-layout-admin .layui-body{

5
src/main/resources/templates/pages/application/application-in.html

@ -598,6 +598,7 @@
},
end: function () {
var mid = materialId.value;
if(mid !== ''){
$.ajax({
url: "/material/findMatrialById?mid=" + mid,
type: "get",
@ -641,6 +642,8 @@
}
}
});
}
}
});
@ -895,8 +898,6 @@
}
});
};
// 用于扫描入库位置
scanLocationByQrCode = function (obj) {
parent.wx.scanQRCode({

5
src/main/resources/templates/pages/application/application_multi.html

@ -88,11 +88,11 @@
//监听表格复选框选择
table.on('checkbox(currentTableFilter)', function (obj) {
console.log(obj)
// console.log(obj)
});
table.on('edit(currentTableFilter)', function(obj){ //注:edit是固定事件名,test是table原始容器的属性 lay-filter="对应的值"
console.log(obj.data); //所在行的所有相关数据
// console.log(obj.data); //所在行的所有相关数据
});
/**
@ -300,7 +300,6 @@
}
else if(obj.event === 'selectDepository'){
console.log(data)
}
});
});

89
src/main/resources/templates/pages/group/group_edit.html

@ -13,6 +13,42 @@
<div class="layuimini-container">
<div class="layuimini-main">
<input id="id" th:value="${id}" style="display:none;">
<fieldset class="layui-elem-field layui-field-title">
<legend>基本信息</legend>
<div style="margin: 10px 10px 10px 10px">
<form class="layui-form layui-form-pane" action="">
<div class="layui-inline">
<label class="layui-form-label">组合名称</label>
<div class="layui-input-block">
<input type="text" name="gname" id="gname" placeholder="请输入组合名称" th:value="${record.getGname()}" onblur="editGroupName(this)"
autocomplete="off" class="layui-input">
<input type="text" name="gid" id="gid" placeholder="请输入组合名称" th:value="${record.getId()}" style="display:none;"
autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">组合编码</label>
<div class="layui-input-block">
<input type="text" name="gcode" id="gcode" placeholder="请输入组合编码" th:value="${record.getCode()}" readonly
autocomplete="off" class="layui-input">
</div>
</div>
<!-- 二维码生成-->
<div class="layui-form-item" style="display: none">
<label class="layui-form-label">二维码</label>
<div class="layui-input-inline">
<input id="createCode" type="button" class="layui-btn layui-btn-radius layui-btn-normal" onclick="createQrCode()" value="生成二维码"/>
<img id="qrCode" style="display:none;">
</div>
</div>
</form>
</div>
</fieldset>
<script id="toolbarDemo" type="text/html">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" lay-event="add">添加</button>
@ -35,6 +71,11 @@
// 用于点击搜索按钮
function selectMaterial(obj) {
}
// 用于修改组合名称
function editGroupName(obj){}
// 用于创建二维码
function createQrCode(obj){}
layui.use(['form', 'table'], function () {
var $ = layui.jquery,
form = layui.form,
@ -234,6 +275,54 @@
});
// 用于修改组合名称
editGroupName = function (obj) {
let gid = $("#gid").val();
let gname = obj.value;
let req = {};
req.id = gid;
req.gname = gname;
$.ajax({
url:'/group/editGroupInfo',
dataType:"json",
type:"post",
data:JSON.stringify(req),
contentType: "application/json;charset=utf-8",
success: function (data) {
if (data.status >= 300) {
layer.msg(data.statusInfo.message);//失败的表情
} else {
}
}
});
};
// 用于创建二维码
createQrCode = function () {
var gid = $("#gid").val();
var req = {};
req.gid = gid;
$.ajax({
url: "/group/createQrCode",
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) {
var data = d.data;
layer.close(this.layerIndex);
$("#qrCode").attr("src",data);
$("#qrCode").show();
$("#createCode").hide();
}
})
}
})
</script>

23
src/test/java/com/dreamchaser/depository_manage/TestForOther.java

@ -1,16 +1,16 @@
package com.dreamchaser.depository_manage;
import com.dreamchaser.depository_manage.entity.Depository;
import com.dreamchaser.depository_manage.entity.UserByPort;
import com.dreamchaser.depository_manage.service.DepositoryService;
import com.dreamchaser.depository_manage.utils.LinkInterfaceUtil;
import com.dreamchaser.depository_manage.utils.CreateQrCodeUtil;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import sun.misc.BASE64Decoder;
import java.util.List;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
@ -21,11 +21,14 @@ import java.util.List;
public class TestForOther {
@Autowired
DepositoryService depositoryService;
@Test
public void Test(){
public void Test() throws IOException {
try {
String s = CreateQrCodeUtil.CreateBarCodeCode128("1603198268619399168", 100, 200);
System.out.println(s);
} catch (Exception e) {
e.printStackTrace();
}
}
}

1
target/classes/templates/index_mobile.html

@ -39,7 +39,6 @@
.layui-nav-item {
color: #1b1d21;
height: 35px !important;
line-height: 35px !important;
}
.layui-layout-admin .layui-body{

5
target/classes/templates/pages/application/application_multi.html

@ -88,11 +88,11 @@
//监听表格复选框选择
table.on('checkbox(currentTableFilter)', function (obj) {
console.log(obj)
// console.log(obj)
});
table.on('edit(currentTableFilter)', function(obj){ //注:edit是固定事件名,test是table原始容器的属性 lay-filter="对应的值"
console.log(obj.data); //所在行的所有相关数据
// console.log(obj.data); //所在行的所有相关数据
});
/**
@ -300,7 +300,6 @@
}
else if(obj.event === 'selectDepository'){
console.log(data)
}
});
});

3
target/classes/templates/pages/chart/chart-out_back.html

@ -278,9 +278,6 @@
xAxis: {type: 'category'},
yAxis: {},
series: [
{type: 'bar'},
{type: 'bar'},
{type: 'bar'}
]
};

4
target/classes/templates/pages/chart/chart-stock_back.html

@ -207,8 +207,6 @@
xAxis: {type: 'category'},
yAxis: {},
series: [
{type: 'bar'},
{type: 'bar'}
]
};
@ -249,7 +247,7 @@
},
success: function (result) {
layer.close(this.layerIndex);
if (result.code == 0) {
if (result.code === 0) {
echartsRecords.setOption(optionRecords);
echartsPies.setOption(optionPies);
echartsDataset.setOption(optionDataset);

Loading…
Cancel
Save