打印二维码实现

This commit is contained in:
wangcl 2022-01-14 15:10:42 +08:00
parent bdcf096d99
commit 24b561af81
12 changed files with 1870 additions and 289 deletions

View File

@ -63,13 +63,26 @@ public class BusiProductOperateController extends BaseController {
}
/**
* 新增成品操作流水
* 入库或退回
*/
@GetMapping("/add")
public String add() {
return prefix + "/add";
@GetMapping("/addIn")
public String addIn(@RequestParam(name = "operType", required = false) String operType, @RequestParam(name = "inTab", required = false) String inTab, ModelMap mmap) {
mmap.put("operType",operType);
mmap.put("inTab",inTab);
return prefix + "/addIn";
}
/**
* 出库
*/
@GetMapping("/addOut")
public String addOut(@RequestParam(name = "operType", required = false) String operType, @RequestParam(name = "inTab", required = false) String inTab, ModelMap mmap) {
mmap.put("operType",operType);
mmap.put("inTab",inTab);
return prefix + "/addOut";
}
/**
* 新增保存成品操作流水
*/
@ -132,4 +145,24 @@ public class BusiProductOperateController extends BaseController {
List<Map<String, String>> list = busiProductOperateService.selProductColorByLineIdAndSize(queryMap);
return success(list);
}
/**
* 通过订单ID查询库存尺码列表
*/
@PostMapping("/selProductSizeByOrderId")
@ResponseBody
public AjaxResult selProductSizeByOrderId(@RequestParam(name = "orderId", required = false) String orderId) {
List<Map<String, String>> list = busiProductOperateService.selProductSizeByOrderId(orderId);
return success(list);
}
/**
* 通过订单ID和产品尺码查询库存颜色列表
*/
@PostMapping("/selProductColorByOrderIdAndSize")
@ResponseBody
public AjaxResult selProductColorByOrderIdAndSize(@RequestParam Map<String, String> queryMap) {
List<Map<String, String>> list = busiProductOperateService.selProductColorByOrderIdAndSize(queryMap);
return success(list);
}
}

View File

@ -65,5 +65,9 @@ public interface BusiProductOperateMapper
public List<Map<String, String>> selProductColorByLineIdAndSize(Map<String, String> map);
public List<Map<String, String>> selProductSizeByOrderId(String lineId);
public List<Map<String, String>> selProductColorByOrderIdAndSize(Map<String, String> map);
}

View File

@ -64,4 +64,8 @@ public interface IBusiProductOperateService
public List<Map<String, String>> selProductSizeByLineId(String lineId);
public List<Map<String, String>> selProductColorByLineIdAndSize(Map<String, String> map);
public List<Map<String, String>> selProductSizeByOrderId(String lineId);
public List<Map<String, String>> selProductColorByOrderIdAndSize(Map<String, String> map);
}

View File

@ -76,6 +76,7 @@ public class BusiProductOperateServiceImpl implements IBusiProductOperateService
if ("1".equals(busiProductOperate.getOprateType())) { //1为入库
busiProductStock.setAmount(busiProductStock.getAmount() + busiProductOperate.getAmount());
updateCompletedAmount(busiProductOperate.getSubTaskId(), busiProductOperate.getAmount()); // 更新子任务完成量
} else {// 出库或退回
if (busiProductOperate.getAmount() > busiProductStock.getAmount()) {
throw new ServiceException("操作值超过库存,当前库存值:" + busiProductStock.getAmount());
@ -86,6 +87,9 @@ public class BusiProductOperateServiceImpl implements IBusiProductOperateService
busiProductOperate.setProductValue(-busiProductOperate.getProductValue());
updateCompletedAmount(busiProductOperate.getSubTaskId(), -busiProductOperate.getAmount()); // 更新子任务完成量
}
if ("2".equals(busiProductOperate.getOprateType())) {//出库时还要考虑下订单状态
}
}
busiProductStock.setUpdateTime(new Date());
busiProductStockMapper.updateBusiProductStock(busiProductStock);
@ -108,6 +112,15 @@ public class BusiProductOperateServiceImpl implements IBusiProductOperateService
private void updateCompletedAmount(String subTaskId, long operateAmount) {
BusiSubTask busiSubTask = subTaskMapper.selectBusiSubTaskById(subTaskId);
long completedAmount = busiSubTask.getCompletedAmount();
if (operateAmount > 0) {// 若果操作为入库
if(completedAmount > busiSubTask.getTargetAmount()){
busiSubTask.setStatus("2"); //子任务完成
//若子任务为完成检查任务是否完成任务若完成则更新状态同时释放产线为空闲
//若任务完成则同时要检查订单状态若订单所有任务完成更新订单状态为生产完成
}
}
busiSubTask.setCompletedAmount(completedAmount + operateAmount);
subTaskMapper.updateBusiSubTask(busiSubTask); // 更新子任务完成量
}
@ -186,4 +199,14 @@ public class BusiProductOperateServiceImpl implements IBusiProductOperateService
public List<Map<String, String>> selProductColorByLineIdAndSize(Map<String, String> map) {
return busiProductOperateMapper.selProductColorByLineIdAndSize(map);
}
@Override
public List<Map<String, String>> selProductSizeByOrderId(String orderId) {
return busiProductOperateMapper.selProductSizeByOrderId(orderId);
}
@Override
public List<Map<String, String>> selProductColorByOrderIdAndSize(Map<String, String> map) {
return busiProductOperateMapper.selProductColorByOrderIdAndSize(map);
}
}

View File

@ -39,6 +39,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="size != null and size != ''"> and bps.size = #{size}</if>
<if test="oprateType != null and oprateType != ''"> and bpo.oprate_type = #{oprateType}</if>
</where>
order by create_time DESC
</select>
<select id="selectBusiProductOperateById" parameterType="String" resultMap="BusiProductOperateResult">
@ -107,11 +108,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select>
<select id="selProductColorByLineIdAndSize" parameterType="java.util.Map" resultType="java.util.Map">
SELECT bpr.color,bpr.amount,bst.completed_amount completedAmount,bst.target_amount targetAmount,bt.order_id orderId,bst.id subTaskId,bst.task_id taskId from busi_sub_task bst
SELECT bpr.color,bpr.amount,bst.completed_amount completedAmount,bst.target_amount targetAmount,bt.order_id orderId,bo.identification_code orderName,bst.id subTaskId,bst.task_id taskId from busi_sub_task bst
left JOIN busi_product_require bpr on bst.product_require_id = bpr.id
left JOIN busi_task bt on bt.id = bst.task_id
left JOIN busi_order bo on bo.id = bt.order_id
WHERE bt.prison_line_id = #{lineId} and bt.`status`=1 and bpr.size = #{size}
</select>
<select id="selProductSizeByOrderId" parameterType="String" resultType="java.util.Map">
SELECT bps.size from busi_product_stock bps
WHERE bps.order_id = #{orderId}
</select>
<select id="selProductColorByOrderIdAndSize" parameterType="java.util.Map" resultType="java.util.Map">
SELECT bps.color,bps.order_id orderId,bps.id productStockId from busi_product_stock bps
WHERE bps.order_id = #{orderId} and bps.size = #{size}
</select>
</mapper>

View File

@ -0,0 +1,89 @@
(function( $ ){
$.fn.qrcode = function(options) {
// if options is string,
if( typeof options === 'string' ){
options = { text: options };
}
// set default values
// typeNumber < 1 for automatic calculation
options = $.extend( {}, {
render : "canvas",
width : 256,
height : 256,
typeNumber : -1,
correctLevel : QRErrorCorrectLevel.H,
background : "#ffffff",
foreground : "#000000"
}, options);
var createCanvas = function(){
// create the qrcode itself
var qrcode = new QRCode(options.typeNumber, options.correctLevel);
qrcode.addData(options.text);
qrcode.make();
// create canvas element
var canvas = document.createElement('canvas');
canvas.width = options.width;
canvas.height = options.height;
var ctx = canvas.getContext('2d');
// compute tileW/tileH based on options.width/options.height
var tileW = options.width / qrcode.getModuleCount();
var tileH = options.height / qrcode.getModuleCount();
// draw in the canvas
for( var row = 0; row < qrcode.getModuleCount(); row++ ){
for( var col = 0; col < qrcode.getModuleCount(); col++ ){
ctx.fillStyle = qrcode.isDark(row, col) ? options.foreground : options.background;
var w = (Math.ceil((col+1)*tileW) - Math.floor(col*tileW));
var h = (Math.ceil((row+1)*tileH) - Math.floor(row*tileH));
ctx.fillRect(Math.round(col*tileW),Math.round(row*tileH), w, h);
}
}
// return just built canvas
return canvas;
}
// from Jon-Carlos Rivera (https://github.com/imbcmdth)
var createTable = function(){
// create the qrcode itself
var qrcode = new QRCode(options.typeNumber, options.correctLevel);
qrcode.addData(options.text);
qrcode.make();
// create table element
var $table = $('<table></table>')
.css("width", options.width+"px")
.css("height", options.height+"px")
.css("border", "0px")
.css("border-collapse", "collapse")
.css('background-color', options.background);
// compute tileS percentage
var tileW = options.width / qrcode.getModuleCount();
var tileH = options.height / qrcode.getModuleCount();
// draw in the table
for(var row = 0; row < qrcode.getModuleCount(); row++ ){
var $row = $('<tr></tr>').css('height', tileH+"px").appendTo($table);
for(var col = 0; col < qrcode.getModuleCount(); col++ ){
$('<td></td>')
.css('width', tileW+"px")
.css('background-color', qrcode.isDark(row, col) ? options.foreground : options.background)
.appendTo($row);
}
}
// return just built canvas
return $table;
}
return this.each(function(){
var element = options.render == "canvas" ? createCanvas() : createTable();
$(element).appendTo(this);
});
};
})( jQuery );

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,101 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>Demo page</title>
</head>
<body>
<p></p>
<div class="demo">
<div>
<span id="code"></span>
</div>
<button id="btn" onclick="addText(150,12,2)">添加文字</button>
<button id="print" onclick="print()">打印</button>
</div>
<script src="jquery.min.js"></script>
<script type="text/javascript" src="qrcode.js"></script>
<script type="text/javascript" src="jquery.qrcode.js"></script>
<script>
var arr = [];//作为全局变量,可以通过遍历数组来实现批量生成二维码功能
arr.push(['1区1线|HS0001|XXXXS|红色|30', '1区1线|HS001|XXS|红色|30'])
// arr.push(['https://http://www.sina.com.cn/','新浪'])
$(function () {
for (var i = 0; i < arr.length; i++) {
var urlstr = arr[i][0];
console.log(urlstr)
$("#code").qrcode({
render: "canvas",
width: 180,
height: 150,
text: toUtf8(urlstr),
foreground: "#FE007F" //前景颜色
});
}
addText();
})
function addText(text, canvassize = 150, fontsize = 12, padding = 1, divBackground = "#fff", fontColor = "#a50054") {
var canvases = document.getElementsByTagName('canvas');
var fontsizeH = fontsize + padding * 3; //文字高度
var rectW = 0; //长方形背景宽度
var width = 0;
var centerx = canvassize / 2 - rectW / 2; //居中的x
var centery = canvassize / 2 - fontsizeH / 2; //居中的y
for (var i = 0; i < canvases.length; i++) {
var ctx = canvases[i].getContext("2d");
width = ctx.measureText(arr[i][1]).width; //文字长度,不知道为什么这里的width是中文字数的10倍故需要乘上fontsize/10获取到真实的文字宽度
rectW = width * fontsize / 10 + padding * 2; //长方形背景宽度应左右留padding
centerx = canvassize / 2 - rectW / 2; //长方形背景居中的x
centery = canvassize / 2 - fontsizeH / 2 //长方形背景居中的y
ctx.fillStyle = divBackground; //长方形背景颜色
ctx.fillRect(centerx + 10, centery, rectW, fontsizeH);
ctx.font = fontsize + "px Calibri"; //设置文字大小
ctx.fillStyle = fontColor;
ctx.fillText(arr[i][1], centerx + padding + 10, centery + fontsize + padding / 2)
//经测试若参数y只填centery则文字显示在长方形背景的上边所以需要加上fontsize长方形背景才能包裹文字
}
}
function toUtf8(str) {
var out, i, len, c;
out = "";
len = str.length;
for (i = 0; i < len; i++) {
c = str.charCodeAt(i);
if ((c >= 0x0001) && (c <= 0x007F)) {
out += str.charAt(i);
} else if (c > 0x07FF) {
out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
} else {
out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
}
}
return out;
}
function printNewWindow() {
var canvas = document.getElementsByTagName("canvas")[0]; /// get canvas element
var imgSrc = canvas.toDataURL();
let oWin = window.open('', 'pringwindow', 'menubar=no,location=no,resizable=yes,scrollbars=no,status=no,width=600,height=400')
oWin.document.fn = function () {
if (oWin) {
oWin.print()
oWin.close()
}
}
let html = '<div style="height: 100%;width: 100%;">' + `<img src="${imgSrc}" onload="fn()" style="max-height:100%;max-width: 100%;" />` + '</div>'
oWin.document.open()
oWin.document.write(html)
oWin.document.close()
}
</script>
</body>
</html>

View File

@ -1,14 +1,15 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
<head>
<th:block th:include="include :: header('成品入库')" />
<th:block th:include="include :: header('成品操作')" />
</head>
<body class="white-bg">
<div class="wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m" id="form-productOperate-add">
<input type="hidden" name="oprateType" value="1" />
<input type="hidden" name="oprateType" th:value="${operType}" />
<input id="taskId" type="hidden" name="taskId" />
<input id="orderId" type="hidden" name="orderId"/>
<input id="orderName" type="hidden" />
<input id="subTaskId" type="hidden" name="subTaskId"/>
<div class="form-group">
@ -41,13 +42,14 @@
<!-- <input name="productValue" class="form-control" type="text">-->
<!-- </div>-->
<!-- </div>-->
<div class="form-group">
<label class="col-sm-3 control-label">每包数量:</label>
<div class="form-group" th:if="${operType == '1'}">
<label class="col-sm-3 control-label is-required">每包数量:</label>
<div class="col-sm-6">
<input name="amountPerPackage" class="form-control digits" type="text">
<input name="amountPerPackage" id="amountPerPackage" class="form-control digits" type="text" required>
</div>
<div class="col-sm-2">
<a class="btn btn-info" >生成二维码</a>
<a class="btn btn-info" id="printQrcode" >打印二维码</a>
<span id="code" style="display: none" ></span>
</div>
</div>
<div class="form-group">
@ -59,6 +61,8 @@
</form>
</div>
<th:block th:include="include :: footer" />
<th:block th:include="include :: jquery-qrcode-js" />
<script th:inline="javascript">
var prefix = ctx + "busi/productOperate"
var sizeDatas = [[${@dict.getType('busi_size')}]];
@ -83,9 +87,11 @@
var orderId = $("#color :selected").attr("orderId");
var taskId = $("#color :selected").attr("taskId");
var subTaskId = $("#color :selected").attr("subTaskId");
var orderName = $("#color :selected").attr("orderName");
$("#orderId").val(orderId);
$("#taskId").val(taskId);
$("#subTaskId").val(subTaskId);
$("#orderName").val(orderName);
})
/*监区产线-新增-选择父监区产线树*/
function selectPrisonLineTree() {
@ -135,10 +141,95 @@
var orderId = data[i].orderId;
var taskId = data[i].taskId;
var subTaskId = data[i].subTaskId;
$("#color").append("<option orderId='" + orderId + "' taskId='" + taskId + + "' subTaskId='" + subTaskId + " 'value='" + val + "'>" + text + "</option>");
var orderName = data[i].orderName;
var ss = "<option orderId='%s' orderName='%s' taskId='%s' subTaskId='%s' value='%s'>%s</option>"
var option = $.common.sprintf(ss,orderId,orderName,taskId,subTaskId,val,text)
$("#color").append(option);
}
})
}
$("#printQrcode").click(function(){
if (!$.validate.form()) {
return;
}
var lineName = $("#lineTreeName").val();
var orerName = $("#orderName").val();
var color = $("#color :selected").text();
var size = $("#size :selected").text();
var amount = $("#amountPerPackage").val();
var text = $.common.sprintf('%s|%s|%s|%s|%s', lineName, orerName, color, size, amount);
var width = 180;
var height = 180 * 0.8;
$("#code").qrcode({
render: "canvas",
width: width,
height: height,
text: toUtf8(text),
foreground: "#FE007F" //前景颜色
});
addText(text, height);
printInWindow();
});
function addText(text, canvassize = 150, fontsize = 12, padding = 1, divBackground = "#fff", fontColor = "#a50054") {
var canvases = document.getElementsByTagName('canvas');
var fontsizeH = fontsize + padding * 3; //文字高度
var rectW = 0; //长方形背景宽度
var width = 0;
var centerx = canvassize / 2 - rectW / 2; //居中的x
var centery = canvassize / 2 - fontsizeH / 2; //居中的y
for (var i = 0; i < canvases.length; i++) {
var ctx = canvases[i].getContext("2d");
width = ctx.measureText(text).width; //文字长度,不知道为什么这里的width是中文字数的10倍故需要乘上fontsize/10获取到真实的文字宽度
rectW = width * fontsize / 10 + padding * 2; //长方形背景宽度应左右留padding
centerx = canvassize / 2 - rectW / 2; //长方形背景居中的x
centery = canvassize / 2 - fontsizeH / 2 //长方形背景居中的y
ctx.fillStyle = divBackground; //长方形背景颜色
ctx.fillRect(centerx + 10, centery, rectW, fontsizeH);
ctx.font = fontsize + "px Calibri"; //设置文字大小
ctx.fillStyle = fontColor;
ctx.fillText(text, centerx + padding + 10, centery + fontsize + padding / 2)
//经测试若参数y只填centery则文字显示在长方形背景的上边所以需要加上fontsize长方形背景才能包裹文字
}
}
function toUtf8(str) {
var out, i, len, c;
out = "";
len = str.length;
for (i = 0; i < len; i++) {
c = str.charCodeAt(i);
if ((c >= 0x0001) && (c <= 0x007F)) {
out += str.charAt(i);
} else if (c > 0x07FF) {
out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
} else {
out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
}
}
return out;
}
function printInWindow() {
var canvas = document.getElementsByTagName("canvas")[0]; /// get canvas element
var imgSrc = canvas.toDataURL();
let oWin = window.open('', 'pringwindow', 'menubar=no,location=no,resizable=yes,scrollbars=no,status=no,width=800,height=600')
oWin.document.fn = function () {
if (oWin) {
oWin.print()
oWin.close()
}
}
let html = '<div style="height: 100%;width: 100%;">' + `<img src="${imgSrc}" onload="fn()" style="max-height:100%;max-width: 100%;" />` + '</div>'
oWin.document.open()
oWin.document.write(html)
oWin.document.close()
}
</script>
</body>
</html>

View File

@ -1,25 +1,23 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
<head>
<th:block th:include="include :: header('成品库')" />
<th:block th:include="include :: header('成品库')" />
</head>
<body class="white-bg">
<div class="wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m" id="form-productOperate-add">
<input type="hidden" name="oprateType" value="1" />
<input id="taskId" type="hidden" name="taskId" />
<input id="orderId" type="hidden" name="orderId"/>
<input id="subTaskId" type="hidden" name="subTaskId"/>
<input type="hidden" name="oprateType" th:value="${operType}" />
<input id="productStockId" type="hidden" name="productStockId"/>
<div class="form-group">
<label class="col-sm-3 control-label is-required">产线</label>
<label class="col-sm-3 control-label is-required">订单</label>
<div class="col-sm-8">
<input id="lineTreeId" name="prisonLineId" type="hidden" />
<input class="form-control" type="text" onclick="selectPrisonLineTree()" id="lineTreeName" readonly="true" required>
<input id="treeId" name="orderId" type="text" style="display: none;">
<input class="form-control" id="treeName" name="orderName" type="text" onclick="selectOrder()" readonly="true" required>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label" title="产品选择源于任务,若无对应的选项,请在任务中添加">产品选择:<i class="fa fa-question-circle-o"></i></label>
<label class="col-sm-3 control-label" title="出库产品选择源于库存,若无对应的选项,请先进行入库操作">产品选择:<i class="fa fa-question-circle-o"></i></label>
<div class="col-sm-4">
<select id="size" name="size" class="form-control required" >
</select>
@ -30,26 +28,11 @@
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label is-required">操作数量:</label>
<label class="col-sm-3 control-label is-required">出库数量:</label>
<div class="col-sm-8">
<input name="amount" class="form-control digits" type="text" required>
</div>
</div>
<!-- <div class="form-group"> -->
<!-- <label class="col-sm-3 control-label">价值:</label>-->
<!-- <div class="col-sm-8">-->
<!-- <input name="productValue" class="form-control" type="text">-->
<!-- </div>-->
<!-- </div>-->
<div class="form-group">
<label class="col-sm-3 control-label">每包数量:</label>
<div class="col-sm-6">
<input name="amountPerPackage" class="form-control digits" type="text">
</div>
<div class="col-sm-2">
<a class="btn btn-info" >生成二维码</a>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">备注信息:</label>
<div class="col-sm-8">
@ -74,30 +57,27 @@
}
$("#size").change(function(){
var lineId = $("#lineTreeId").val();
var orderId = $("#treeId").val();
var size = $("#size").val();
queryColorList(lineId, size);
queryColorList(orderId, size);
})
$("#color").change(function(){
var orderId = $("#color :selected").attr("orderId");
var taskId = $("#color :selected").attr("taskId");
var subTaskId = $("#color :selected").attr("subTaskId");
$("#orderId").val(orderId);
$("#taskId").val(taskId);
$("#subTaskId").val(subTaskId);
var productStockId = $("#color :selected").attr("productStockId");
$("#productStockId").val(productStockId);
})
/*监区产线-新增-选择父监区产线树*/
function selectPrisonLineTree() {
/*订单选择*/
function selectOrder() {
var options = {
title: '产线选择',
title: '选择订单',
width: "380",
url: ctx + "busi/prisonLine/selectPrisonLineTree/" + $("#lineTreeId").val()+"?status=1",
callBack: function(index, layer){
height: "400",
url: ctx + "busi/order/selectOrder/" ,
callBack: function(index, layero){
var body = $.modal.getChildFrame(index);
console.log(body);
$("#lineTreeId").val(body.find('#treeId').val());
$("#lineTreeName").val(body.find('#treeName').val());
$("#treeId").val(body.find('#treeId').val());
$("#treeName").val(body.find('#treeName').val());
$.modal.close(index);
querySizeList(body.find('#treeId').val());
}
@ -105,9 +85,9 @@
$.modal.openOptions(options);
}
/*产品任务尺码查询*/
function querySizeList(lineId) {
var url = prefix + "/selProductSizeByLineId?lineId=" + lineId;
/*库存尺码查询*/
function querySizeList(orderId) {
var url = prefix + "/selProductSizeByOrderId?orderId=" + orderId;
$.operate.ajaxPost(url, {}, function (result) {
var data = result.data;
$("#color").empty();
@ -120,11 +100,11 @@
})
}
/*产品任务颜色查询*/
function queryColorList(lineId, size) {
var url = prefix + "/selProductColorByLineIdAndSize";
/*库存颜色查询*/
function queryColorList(orderId, size) {
var url = prefix + "/selProductColorByOrderIdAndSize";
$.operate.ajaxPost(url, {
lineId:lineId,
orderId:orderId,
size:size
}, function (result) {
var data = result.data;
@ -132,10 +112,10 @@
for (var i = 0; i < data.length; i++) {
var val = data[i].color;
var text = $.table.getDictText(colorDatas, val);
var orderId = data[i].orderId;
var taskId = data[i].taskId;
var subTaskId = data[i].subTaskId;
$("#color").append("<option orderId='" + orderId + "' taskId='" + taskId + + "' subTaskId='" + subTaskId + " 'value='" + val + "'>" + text + "</option>");
var productStockId = data[i].productStockId;
var ss = "<option productStockId='%s' value='%s'>%s</option>";
var option = $.common.sprintf(ss, productStockId, val, text);
$("#color").append(option);
}
})
}

View File

@ -201,13 +201,13 @@
}
function addIn(){
$.modal.open("添加入库", prefix + "/add?operType=1");
$.modal.open("添加入库", prefix + "/addIn?operType=1");
}
function addOut(){
$.modal.open("添加出库", prefix + "/add?operType=2");
$.modal.open("添加出库", prefix + "/addOut?operType=2");
}
function addBack(){
$.modal.open("添加退回", prefix + "/add?operType=3");
$.modal.open("添加退回", prefix + "/addIn?operType=3");
}
</script>
</body>

View File

@ -1,222 +1,229 @@
<!-- 通用CSS -->
<head th:fragment=header(title)>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="keywords" content="">
<meta name="description" content="">
<title th:text="${title}"></title>
<link th:href="@{/css/bootstrap.min.css?v=3.3.7}" rel="stylesheet"/>
<link th:href="@{/css/font-awesome.min.css?v=4.7.0}" rel="stylesheet"/>
<!-- bootstrap-table 表格插件样式 -->
<link th:href="@{/ajax/libs/bootstrap-table/bootstrap-table.min.css?v=1.18.3}" rel="stylesheet"/>
<link th:href="@{/css/animate.min.css?v=20210831}" rel="stylesheet"/>
<link th:href="@{/css/style.min.css?v=20210831}" rel="stylesheet"/>
<link th:href="@{/ruoyi/css/ry-ui.css?v=4.7.0}" rel="stylesheet"/>
</head>
<!-- 通用JS -->
<div th:fragment="footer">
<script th:inline="javascript"> var ctx = [[@{/}]]; var lockscreen = [[${session.lockscreen}]]; if(lockscreen){window.top.location=ctx+"lockscreen";} </script>
<a id="scroll-up" href="#" class="btn btn-sm display"><i class="fa fa-angle-double-up"></i></a>
<script th:src="@{/js/jquery.min.js?v=3.6.0}"></script>
<script th:src="@{/js/bootstrap.min.js?v=3.3.7}"></script>
<!-- bootstrap-table 表格插件 -->
<script th:src="@{/ajax/libs/bootstrap-table/bootstrap-table.min.js?v=1.18.3}"></script>
<script th:src="@{/ajax/libs/bootstrap-table/locale/bootstrap-table-zh-CN.min.js?v=1.18.3}"></script>
<script th:src="@{/ajax/libs/bootstrap-table/extensions/mobile/bootstrap-table-mobile.js?v=1.18.3}"></script>
<!-- jquery-validate 表单验证插件 -->
<script th:src="@{/ajax/libs/validate/jquery.validate.min.js?v=1.19.3}"></script>
<script th:src="@{/ajax/libs/validate/jquery.validate.extend.js?v=1.19.3}"></script>
<script th:src="@{/ajax/libs/validate/messages_zh.js?v=1.19.3}"></script>
<!-- bootstrap-table 表格树插件 -->
<script th:src="@{/ajax/libs/bootstrap-table/extensions/tree/bootstrap-table-tree.min.js?v=1.18.3}"></script>
<!-- 遮罩层 -->
<script th:src="@{/ajax/libs/blockUI/jquery.blockUI.js?v=2.70.0}"></script>
<script th:src="@{/ajax/libs/iCheck/icheck.min.js?v=1.0.3}"></script>
<script th:src="@{/ajax/libs/layer/layer.min.js?v=3.5.1}"></script>
<script th:src="@{/ajax/libs/layui/layui.min.js?v=2.6.8}"></script>
<script th:src="@{/ruoyi/js/common.js?v=4.7.0}"></script>
<script th:src="@{/ruoyi/js/ry-ui.js?v=4.7.0}"></script>
</div>
<!-- ztree树插件 -->
<div th:fragment="ztree-css">
<link th:href="@{/ajax/libs/jquery-ztree/3.5/css/metro/zTreeStyle.css}" rel="stylesheet"/>
</div>
<div th:fragment="ztree-js">
<script th:src="@{/ajax/libs/jquery-ztree/3.5/js/jquery.ztree.all-3.5.js}"></script>
</div>
<!-- select2下拉框插件 -->
<div th:fragment="select2-css">
<link th:href="@{/ajax/libs/select2/select2.min.css?v=4.0.13}" rel="stylesheet"/>
<link th:href="@{/ajax/libs/select2/select2-bootstrap.min.css?v=4.0.13}" rel="stylesheet"/>
</div>
<div th:fragment="select2-js">
<script th:src="@{/ajax/libs/select2/select2.min.js?v=4.0.13}"></script>
</div>
<!-- bootstrap-select下拉框插件 -->
<div th:fragment="bootstrap-select-css">
<link th:href="@{/ajax/libs/bootstrap-select/bootstrap-select.min.css?v=1.13.18}" rel="stylesheet"/>
</div>
<div th:fragment="bootstrap-select-js">
<script th:src="@{/ajax/libs/bootstrap-select/bootstrap-select.min.js?v=1.13.18}"></script>
</div>
<!-- datetimepicker日期和时间插件 -->
<div th:fragment="datetimepicker-css">
<link th:href="@{/ajax/libs/datapicker/bootstrap-datetimepicker.min.css?v=2.4.4}" rel="stylesheet"/>
</div>
<div th:fragment="datetimepicker-js">
<script th:src="@{/ajax/libs/datapicker/bootstrap-datetimepicker.min.js?v=2.4.4}"></script>
</div>
<!-- ui布局插件 -->
<div th:fragment="layout-latest-css">
<link th:href="@{/ajax/libs/jquery-layout/jquery.layout-latest.css?v=1.4.4}" rel="stylesheet"/>
</div>
<div th:fragment="layout-latest-js">
<script th:src="@{/ajax/libs/jquery-layout/jquery.layout-latest.js?v=1.4.4}"></script>
</div>
<!-- summernote富文本编辑器插件 -->
<div th:fragment="summernote-css">
<link th:href="@{/ajax/libs/summernote/summernote.css?v=0.8.18}" rel="stylesheet"/>
</div>
<div th:fragment="summernote-js">
<script th:src="@{/ajax/libs/summernote/summernote.min.js?v=0.8.18}"></script>
<script th:src="@{/ajax/libs/summernote/summernote-zh-CN.js?v=0.8.18}"></script>
</div>
<!-- cropper图像裁剪插件 -->
<div th:fragment="cropper-css">
<link th:href="@{/ajax/libs/cropper/cropper.min.css?v=1.5.12}" rel="stylesheet"/>
</div>
<div th:fragment="cropper-js">
<script th:src="@{/ajax/libs/cropper/cropper.min.js?v=1.5.12}"></script>
</div>
<!-- jasny功能扩展插件 -->
<div th:fragment="jasny-bootstrap-css">
<link th:href="@{/ajax/libs/jasny/jasny-bootstrap.min.css?v=3.1.3}" rel="stylesheet"/>
</div>
<div th:fragment="jasny-bootstrap-js">
<script th:src="@{/ajax/libs/jasny/jasny-bootstrap.min.js?v=3.1.3}"></script>
</div>
<!-- fileinput文件上传插件 -->
<div th:fragment="bootstrap-fileinput-css">
<link th:href="@{/ajax/libs/bootstrap-fileinput/fileinput.min.css?v=5.2.4}" rel="stylesheet"/>
</div>
<div th:fragment="bootstrap-fileinput-js">
<script th:src="@{/ajax/libs/bootstrap-fileinput/fileinput.min.js?v=5.2.4}"></script>
</div>
<!-- duallistbox双列表框插件 -->
<div th:fragment="bootstrap-duallistbox-css">
<link th:href="@{/ajax/libs/duallistbox/bootstrap-duallistbox.min.css?v=3.0.9}" rel="stylesheet"/>
</div>
<div th:fragment="bootstrap-duallistbox-js">
<script th:src="@{/ajax/libs/duallistbox/bootstrap-duallistbox.min.js?v=3.0.9}"></script>
</div>
<!-- suggest搜索自动补全 -->
<div th:fragment="bootstrap-suggest-js">
<script th:src="@{/ajax/libs/suggest/bootstrap-suggest.min.js?v=0.1.29}"></script>
</div>
<!-- typeahead搜索自动补全 -->
<div th:fragment="bootstrap-typeahead-js">
<script th:src="@{/ajax/libs/typeahead/bootstrap-typeahead.min.js?v=4.0.2}"></script>
</div>
<!-- 多级联动下拉 -->
<div th:fragment="jquery-cxselect-js">
<script th:src="@{/ajax/libs/cxselect/jquery.cxselect.min.js?v=1.4.2}"></script>
</div>
<!-- jsonview格式化和语法高亮JSON格式数据查看插件 -->
<div th:fragment="jsonview-css">
<link th:href="@{/ajax/libs/jsonview/jquery.jsonview.css?v=1.2.0}" rel="stylesheet"/>
</div>
<div th:fragment="jsonview-js">
<script th:src="@{/ajax/libs/jsonview/jquery.jsonview.js?v=1.2.0}"></script>
</div>
<!-- jquery.smartwizard表单向导插件 -->
<div th:fragment="jquery-smartwizard-css">
<link th:href="@{/ajax/libs/smartwizard/smart_wizard_all.min.css?v=5.1.1}" rel="stylesheet"/>
</div>
<div th:fragment="jquery-smartwizard-js">
<script th:src="@{/ajax/libs/smartwizard/jquery.smartWizard.min.js?v=5.1.1}"></script>
</div>
<!-- ECharts百度统计图表插件 -->
<div th:fragment="echarts-js">
<script th:src="@{/ajax/libs/report/echarts/echarts-all.min.js?v=4.2.1}"></script>
</div>
<!-- peity图表组合插件 -->
<div th:fragment="peity-js">
<script th:src="@{/ajax/libs/report/peity/jquery.peity.min.js?v=2.0.3}"></script>
</div>
<!-- sparkline线状图插件 -->
<div th:fragment="sparkline-js">
<script th:src="@{/ajax/libs/report/sparkline/jquery.sparkline.min.js?v=2.1.2}"></script>
</div>
<!-- 表格行拖拽插件 -->
<div th:fragment="bootstrap-table-reorder-rows-js">
<script th:src="@{/ajax/libs/bootstrap-table/extensions/reorder-rows/bootstrap-table-reorder-rows.js?v=1.18.3}"></script>
<script th:src="@{/ajax/libs/bootstrap-table/extensions/reorder-rows/jquery.tablednd.js?v=1.0.3}"></script>
</div>
<!-- 表格列拖拽插件 -->
<div th:fragment="bootstrap-table-reorder-columns-js">
<script th:src="@{/ajax/libs/bootstrap-table/extensions/reorder-columns/jquery.dragtable.js?v=5.3.5}"></script>
<script th:src="@{/ajax/libs/bootstrap-table/extensions/reorder-columns/bootstrap-table-reorder-columns.js?v=1.18.3}"></script>
</div>
<!-- 表格列宽拖动插件 -->
<div th:fragment="bootstrap-table-resizable-js">
<script th:src="@{/ajax/libs/bootstrap-table/extensions/resizable/jquery.resizableColumns.min.js?v=0.1.0}"></script>
<script th:src="@{/ajax/libs/bootstrap-table/extensions/resizable/bootstrap-table-resizable.js?v=1.18.3}"></script>
</div>
<!-- 表格行内编辑插件 -->
<div th:fragment="bootstrap-editable-css">
<link th:href="@{/ajax/libs/bootstrap-table/extensions/editable/bootstrap-editable.css?v=1.5.1}" rel="stylesheet"/>
</div>
<div th:fragment="bootstrap-table-editable-js">
<script th:src="@{/ajax/libs/bootstrap-table/extensions/editable/bootstrap-editable.min.js?v=1.5.1}"></script>
<script th:src="@{/ajax/libs/bootstrap-table/extensions/editable/bootstrap-table-editable.js?v=1.18.3}"></script>
</div>
<!-- 表格导出插件 -->
<div th:fragment="bootstrap-table-export-js">
<script th:src="@{/ajax/libs/bootstrap-table/extensions/export/bootstrap-table-export.js?v=1.18.3}"></script>
<script th:src="@{/ajax/libs/bootstrap-table/extensions/export/tableExport.min.js?v=1.10.24}"></script>
</div>
<!-- 表格冻结列插件 -->
<div th:fragment="bootstrap-table-fixed-columns-js">
<script th:src="@{/ajax/libs/bootstrap-table/extensions/columns/bootstrap-table-fixed-columns.js?v=1.18.3}"></script>
</div>
<!-- 表格自动刷新插件 -->
<div th:fragment="bootstrap-table-auto-refresh-js">
<script th:src="@{/ajax/libs/bootstrap-table/extensions/auto-refresh/bootstrap-table-auto-refresh.js?v=1.18.3}"></script>
</div>
<!-- 表格打印插件 -->
<div th:fragment="bootstrap-table-print-js">
<script th:src="@{/ajax/libs/bootstrap-table/extensions/print/bootstrap-table-print.js?v=1.18.3}"></script>
</div>
<!-- 表格视图分页插件 -->
<div th:fragment="bootstrap-table-custom-view-js">
<script th:src="@{/ajax/libs/bootstrap-table/extensions/custom-view/bootstrap-table-custom-view.js?v=1.18.3}"></script>
</div>
<!-- 通用CSS -->
<head th:fragment=header(title)>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="keywords" content="">
<meta name="description" content="">
<title th:text="${title}"></title>
<link th:href="@{/css/bootstrap.min.css?v=3.3.7}" rel="stylesheet"/>
<link th:href="@{/css/font-awesome.min.css?v=4.7.0}" rel="stylesheet"/>
<!-- bootstrap-table 表格插件样式 -->
<link th:href="@{/ajax/libs/bootstrap-table/bootstrap-table.min.css?v=1.18.3}" rel="stylesheet"/>
<link th:href="@{/css/animate.min.css?v=20210831}" rel="stylesheet"/>
<link th:href="@{/css/style.min.css?v=20210831}" rel="stylesheet"/>
<link th:href="@{/ruoyi/css/ry-ui.css?v=4.7.0}" rel="stylesheet"/>
</head>
<!-- 通用JS -->
<div th:fragment="footer">
<script th:inline="javascript"> var ctx = [[@{/}]]; var lockscreen = [[${session.lockscreen}]]; if(lockscreen){window.top.location=ctx+"lockscreen";} </script>
<a id="scroll-up" href="#" class="btn btn-sm display"><i class="fa fa-angle-double-up"></i></a>
<script th:src="@{/js/jquery.min.js?v=3.6.0}"></script>
<script th:src="@{/js/bootstrap.min.js?v=3.3.7}"></script>
<!-- bootstrap-table 表格插件 -->
<script th:src="@{/ajax/libs/bootstrap-table/bootstrap-table.min.js?v=1.18.3}"></script>
<script th:src="@{/ajax/libs/bootstrap-table/locale/bootstrap-table-zh-CN.min.js?v=1.18.3}"></script>
<script th:src="@{/ajax/libs/bootstrap-table/extensions/mobile/bootstrap-table-mobile.js?v=1.18.3}"></script>
<!-- jquery-validate 表单验证插件 -->
<script th:src="@{/ajax/libs/validate/jquery.validate.min.js?v=1.19.3}"></script>
<script th:src="@{/ajax/libs/validate/jquery.validate.extend.js?v=1.19.3}"></script>
<script th:src="@{/ajax/libs/validate/messages_zh.js?v=1.19.3}"></script>
<!-- bootstrap-table 表格树插件 -->
<script th:src="@{/ajax/libs/bootstrap-table/extensions/tree/bootstrap-table-tree.min.js?v=1.18.3}"></script>
<!-- 遮罩层 -->
<script th:src="@{/ajax/libs/blockUI/jquery.blockUI.js?v=2.70.0}"></script>
<script th:src="@{/ajax/libs/iCheck/icheck.min.js?v=1.0.3}"></script>
<script th:src="@{/ajax/libs/layer/layer.min.js?v=3.5.1}"></script>
<script th:src="@{/ajax/libs/layui/layui.min.js?v=2.6.8}"></script>
<script th:src="@{/ruoyi/js/common.js?v=4.7.0}"></script>
<script th:src="@{/ruoyi/js/ry-ui.js?v=4.7.0}"></script>
</div>
<!-- ztree树插件 -->
<div th:fragment="ztree-css">
<link th:href="@{/ajax/libs/jquery-ztree/3.5/css/metro/zTreeStyle.css}" rel="stylesheet"/>
</div>
<div th:fragment="ztree-js">
<script th:src="@{/ajax/libs/jquery-ztree/3.5/js/jquery.ztree.all-3.5.js}"></script>
</div>
<!-- select2下拉框插件 -->
<div th:fragment="select2-css">
<link th:href="@{/ajax/libs/select2/select2.min.css?v=4.0.13}" rel="stylesheet"/>
<link th:href="@{/ajax/libs/select2/select2-bootstrap.min.css?v=4.0.13}" rel="stylesheet"/>
</div>
<div th:fragment="select2-js">
<script th:src="@{/ajax/libs/select2/select2.min.js?v=4.0.13}"></script>
</div>
<!-- bootstrap-select下拉框插件 -->
<div th:fragment="bootstrap-select-css">
<link th:href="@{/ajax/libs/bootstrap-select/bootstrap-select.min.css?v=1.13.18}" rel="stylesheet"/>
</div>
<div th:fragment="bootstrap-select-js">
<script th:src="@{/ajax/libs/bootstrap-select/bootstrap-select.min.js?v=1.13.18}"></script>
</div>
<!-- datetimepicker日期和时间插件 -->
<div th:fragment="datetimepicker-css">
<link th:href="@{/ajax/libs/datapicker/bootstrap-datetimepicker.min.css?v=2.4.4}" rel="stylesheet"/>
</div>
<div th:fragment="datetimepicker-js">
<script th:src="@{/ajax/libs/datapicker/bootstrap-datetimepicker.min.js?v=2.4.4}"></script>
</div>
<!-- ui布局插件 -->
<div th:fragment="layout-latest-css">
<link th:href="@{/ajax/libs/jquery-layout/jquery.layout-latest.css?v=1.4.4}" rel="stylesheet"/>
</div>
<div th:fragment="layout-latest-js">
<script th:src="@{/ajax/libs/jquery-layout/jquery.layout-latest.js?v=1.4.4}"></script>
</div>
<!-- summernote富文本编辑器插件 -->
<div th:fragment="summernote-css">
<link th:href="@{/ajax/libs/summernote/summernote.css?v=0.8.18}" rel="stylesheet"/>
</div>
<div th:fragment="summernote-js">
<script th:src="@{/ajax/libs/summernote/summernote.min.js?v=0.8.18}"></script>
<script th:src="@{/ajax/libs/summernote/summernote-zh-CN.js?v=0.8.18}"></script>
</div>
<!-- cropper图像裁剪插件 -->
<div th:fragment="cropper-css">
<link th:href="@{/ajax/libs/cropper/cropper.min.css?v=1.5.12}" rel="stylesheet"/>
</div>
<div th:fragment="cropper-js">
<script th:src="@{/ajax/libs/cropper/cropper.min.js?v=1.5.12}"></script>
</div>
<!-- jasny功能扩展插件 -->
<div th:fragment="jasny-bootstrap-css">
<link th:href="@{/ajax/libs/jasny/jasny-bootstrap.min.css?v=3.1.3}" rel="stylesheet"/>
</div>
<div th:fragment="jasny-bootstrap-js">
<script th:src="@{/ajax/libs/jasny/jasny-bootstrap.min.js?v=3.1.3}"></script>
</div>
<!-- fileinput文件上传插件 -->
<div th:fragment="bootstrap-fileinput-css">
<link th:href="@{/ajax/libs/bootstrap-fileinput/fileinput.min.css?v=5.2.4}" rel="stylesheet"/>
</div>
<div th:fragment="bootstrap-fileinput-js">
<script th:src="@{/ajax/libs/bootstrap-fileinput/fileinput.min.js?v=5.2.4}"></script>
</div>
<!-- duallistbox双列表框插件 -->
<div th:fragment="bootstrap-duallistbox-css">
<link th:href="@{/ajax/libs/duallistbox/bootstrap-duallistbox.min.css?v=3.0.9}" rel="stylesheet"/>
</div>
<div th:fragment="bootstrap-duallistbox-js">
<script th:src="@{/ajax/libs/duallistbox/bootstrap-duallistbox.min.js?v=3.0.9}"></script>
</div>
<!-- suggest搜索自动补全 -->
<div th:fragment="bootstrap-suggest-js">
<script th:src="@{/ajax/libs/suggest/bootstrap-suggest.min.js?v=0.1.29}"></script>
</div>
<!-- typeahead搜索自动补全 -->
<div th:fragment="bootstrap-typeahead-js">
<script th:src="@{/ajax/libs/typeahead/bootstrap-typeahead.min.js?v=4.0.2}"></script>
</div>
<!-- 多级联动下拉 -->
<div th:fragment="jquery-cxselect-js">
<script th:src="@{/ajax/libs/cxselect/jquery.cxselect.min.js?v=1.4.2}"></script>
</div>
<!-- jsonview格式化和语法高亮JSON格式数据查看插件 -->
<div th:fragment="jsonview-css">
<link th:href="@{/ajax/libs/jsonview/jquery.jsonview.css?v=1.2.0}" rel="stylesheet"/>
</div>
<div th:fragment="jsonview-js">
<script th:src="@{/ajax/libs/jsonview/jquery.jsonview.js?v=1.2.0}"></script>
</div>
<!-- jquery.smartwizard表单向导插件 -->
<div th:fragment="jquery-smartwizard-css">
<link th:href="@{/ajax/libs/smartwizard/smart_wizard_all.min.css?v=5.1.1}" rel="stylesheet"/>
</div>
<div th:fragment="jquery-smartwizard-js">
<script th:src="@{/ajax/libs/smartwizard/jquery.smartWizard.min.js?v=5.1.1}"></script>
</div>
<!-- ECharts百度统计图表插件 -->
<div th:fragment="echarts-js">
<script th:src="@{/ajax/libs/report/echarts/echarts-all.min.js?v=4.2.1}"></script>
</div>
<!-- peity图表组合插件 -->
<div th:fragment="peity-js">
<script th:src="@{/ajax/libs/report/peity/jquery.peity.min.js?v=2.0.3}"></script>
</div>
<!-- sparkline线状图插件 -->
<div th:fragment="sparkline-js">
<script th:src="@{/ajax/libs/report/sparkline/jquery.sparkline.min.js?v=2.1.2}"></script>
</div>
<!-- 表格行拖拽插件 -->
<div th:fragment="bootstrap-table-reorder-rows-js">
<script th:src="@{/ajax/libs/bootstrap-table/extensions/reorder-rows/bootstrap-table-reorder-rows.js?v=1.18.3}"></script>
<script th:src="@{/ajax/libs/bootstrap-table/extensions/reorder-rows/jquery.tablednd.js?v=1.0.3}"></script>
</div>
<!-- 表格列拖拽插件 -->
<div th:fragment="bootstrap-table-reorder-columns-js">
<script th:src="@{/ajax/libs/bootstrap-table/extensions/reorder-columns/jquery.dragtable.js?v=5.3.5}"></script>
<script th:src="@{/ajax/libs/bootstrap-table/extensions/reorder-columns/bootstrap-table-reorder-columns.js?v=1.18.3}"></script>
</div>
<!-- 表格列宽拖动插件 -->
<div th:fragment="bootstrap-table-resizable-js">
<script th:src="@{/ajax/libs/bootstrap-table/extensions/resizable/jquery.resizableColumns.min.js?v=0.1.0}"></script>
<script th:src="@{/ajax/libs/bootstrap-table/extensions/resizable/bootstrap-table-resizable.js?v=1.18.3}"></script>
</div>
<!-- 表格行内编辑插件 -->
<div th:fragment="bootstrap-editable-css">
<link th:href="@{/ajax/libs/bootstrap-table/extensions/editable/bootstrap-editable.css?v=1.5.1}" rel="stylesheet"/>
</div>
<div th:fragment="bootstrap-table-editable-js">
<script th:src="@{/ajax/libs/bootstrap-table/extensions/editable/bootstrap-editable.min.js?v=1.5.1}"></script>
<script th:src="@{/ajax/libs/bootstrap-table/extensions/editable/bootstrap-table-editable.js?v=1.18.3}"></script>
</div>
<!-- 表格导出插件 -->
<div th:fragment="bootstrap-table-export-js">
<script th:src="@{/ajax/libs/bootstrap-table/extensions/export/bootstrap-table-export.js?v=1.18.3}"></script>
<script th:src="@{/ajax/libs/bootstrap-table/extensions/export/tableExport.min.js?v=1.10.24}"></script>
</div>
<!-- 表格冻结列插件 -->
<div th:fragment="bootstrap-table-fixed-columns-js">
<script th:src="@{/ajax/libs/bootstrap-table/extensions/columns/bootstrap-table-fixed-columns.js?v=1.18.3}"></script>
</div>
<!-- 表格自动刷新插件 -->
<div th:fragment="bootstrap-table-auto-refresh-js">
<script th:src="@{/ajax/libs/bootstrap-table/extensions/auto-refresh/bootstrap-table-auto-refresh.js?v=1.18.3}"></script>
</div>
<!-- 表格打印插件 -->
<div th:fragment="bootstrap-table-print-js">
<script th:src="@{/ajax/libs/bootstrap-table/extensions/print/bootstrap-table-print.js?v=1.18.3}"></script>
</div>
<!-- 表格视图分页插件 -->
<div th:fragment="bootstrap-table-custom-view-js">
<script th:src="@{/ajax/libs/bootstrap-table/extensions/custom-view/bootstrap-table-custom-view.js?v=1.18.3}"></script>
</div>
<!-- 二维码插件 -->
<div th:fragment="jquery-qrcode-js">
<script th:src="@{/js/jquery.qrcode.js?v=3.6.0}"></script>
<script th:src="@{/js/qrcode.js?v=3.6.0}"></script>
</div>