src/main/java/com/zy/asrs/controller/MobileController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/controller/ReviewController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/entity/ReviewDetl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/task/OrderSyncScheduler.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/task/handler/OrderMoveHistoryHandler.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/webapp/static/js/review/review.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/webapp/views/review/review.html | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/zy/asrs/controller/MobileController.java
@@ -652,7 +652,7 @@ @GetMapping("/getReviewList/{orderNo}") public synchronized R getReviewList(@PathVariable("orderNo") String orderNo) { List<Review> reviewList = reviewService.selectList(new EntityWrapper<Review>().like("order_no", orderNo)); List<Review> reviewList = reviewService.selectList(new EntityWrapper<Review>().like("order_no", orderNo).in("settle", 1, 2)); List<String> collect = reviewList.stream().map(Review::getOrderNo).collect(Collectors.toList()); return R.ok(collect); src/main/java/com/zy/asrs/controller/ReviewController.java
@@ -1,6 +1,7 @@ package com.zy.asrs.controller; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.core.annotations.ManagerAuth; @@ -29,9 +30,10 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Date; import java.util.Map; import java.net.URLEncoder; import java.util.*; @RestController public class ReviewController extends BaseController { @@ -48,6 +50,34 @@ @Resource private ReviewDetlMapper reviewDetlMapper; @Resource private HttpServletResponse response; @RequestMapping("/exportReview") public synchronized void exportReview(String ids) throws IOException { if (Cools.isEmpty(ids)) { return; } String[] idsArr = ids.split(","); Set set = new HashSet<Long>(); for (String id : idsArr) { if (!Cools.isEmpty(id)) { set.add(Long.parseLong(id)); } } List<ReviewDetl> reviewDetls = reviewDetlService.selectList(new EntityWrapper<ReviewDetl>().in("order_id", set)); response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); String fileName = URLEncoder.encode("单据复核明细表", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); EasyExcel.write(response.getOutputStream(), ReviewDetl.class) .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) .sheet("表1") .doWrite(reviewDetls); } @PostMapping("/importReview") @ManagerAuth(memo = "单据导入") @@ -66,7 +96,7 @@ public void importOrder(MultipartFile multipartFile) throws IOException { // 考核数据的判重使用order_id,check_type的组合唯一索引解决 EasyExcel.read(multipartFile.getInputStream(), ImportReviewDto.class, new ImportReviewListener(transactionManager,reviewService, reviewDetlService, snowflakeIdWorker, getUserId())).sheet().doReadSync(); new ImportReviewListener(transactionManager, reviewService, reviewDetlService, snowflakeIdWorker, getUserId())).sheet().doReadSync(); } @@ -122,7 +152,7 @@ @RequestMapping(value = "/review/delete/auth") @ManagerAuth(memo = "手动删除订单") @Transactional public R delete(@RequestParam Long orderId){ public R delete(@RequestParam Long orderId) { Review review = reviewService.selectById(orderId); reviewDetlService.delete(new EntityWrapper<ReviewDetl>().eq("order_id", orderId)); reviewService.deleteById(orderId); src/main/java/com/zy/asrs/entity/ReviewDetl.java
@@ -1,5 +1,7 @@ package com.zy.asrs.entity; import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; import com.baomidou.mybatisplus.annotations.TableField; import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.annotations.TableName; @@ -30,12 +32,14 @@ */ @ApiModelProperty(value = "ID") @TableId(value = "id", type = IdType.AUTO) @ExcelIgnore private Long id; /** * 订单内码 */ @ApiModelProperty(value = "订单内码") @ExcelIgnore @TableField("order_id") private Long orderId; @@ -44,6 +48,7 @@ */ @ApiModelProperty(value = "单据编号") @TableField("order_no") @ExcelProperty("单据编号") private String orderNo; @@ -51,6 +56,7 @@ * 数量 */ @ApiModelProperty(value = "数量") @ExcelProperty("净重") private Double anfme; /** @@ -61,6 +67,7 @@ */ @ApiModelProperty(value = "作业数量") @TableField("work_qty") @ExcelIgnore private Double workQty; /** @@ -70,96 +77,112 @@ * 出库 : qty 👆 */ @ApiModelProperty(value = "完成数量") @ExcelIgnore private Double qty; /** * 商品编码 */ @ApiModelProperty(value = "商品编码") @ExcelProperty("物料编码") private String matnr; /** * 商品名称 */ @ApiModelProperty(value = "商品名称") @ExcelProperty("物料名称") private String maktx; /** * 批号 */ @ApiModelProperty(value = "批号") @ExcelProperty("批次号") private String batch; /** * 规格 */ @ApiModelProperty(value = "规格") @ExcelProperty("规格型号") private String specs; /** * 型号 */ @ApiModelProperty(value = "型号") @ExcelProperty("卷号") private String model; /** * 颜色 */ @ApiModelProperty(value = "颜色") @ExcelIgnore private String color; /** * 品牌 */ @ApiModelProperty(value = "品牌") @ExcelIgnore private String brand; /** * 单位 */ @ApiModelProperty(value = "单位") @ExcelIgnore private String unit; /** * 单价 */ @ApiModelProperty(value = "单价") @ExcelIgnore private Double price; /** * sku */ @ApiModelProperty(value = "sku") @ExcelIgnore private String sku; /** * 单位量 */ @ApiModelProperty(value = "单位量") @ExcelIgnore private Double units; /** * 条码 */ @ApiModelProperty(value = "条码") @ExcelIgnore private String barcode; /** * 产地 */ @ApiModelProperty(value = "产地") @ExcelIgnore private String origin; /** * 厂家 、、江铜:暂存库位号 */ @ApiModelProperty(value = "厂家") @ExcelIgnore private String manu; /** * 生产日期 */ @ApiModelProperty(value = "生产日期") @ExcelIgnore @TableField("manu_date") private String manuDate; @@ -167,6 +190,7 @@ * 品项数 */ @ApiModelProperty(value = "品项数") @ExcelIgnore @TableField("item_num") private String itemNum; @@ -174,6 +198,7 @@ * 安全库存量 */ @ApiModelProperty(value = "安全库存量") @ExcelIgnore @TableField("safe_qty") private Double safeQty; @@ -181,18 +206,21 @@ * 重量 */ @ApiModelProperty(value = "重量") @ExcelIgnore private Double weight; /** * 长度 */ @ApiModelProperty(value = "长度") @ExcelIgnore private Double length; /** * 体积 */ @ApiModelProperty(value = "体积") @ExcelIgnore private Double volume; /** @@ -200,18 +228,21 @@ */ @ApiModelProperty(value = "三方编码") @TableField("three_code") @ExcelProperty("复核人") private String threeCode; /** * 供应商 */ @ApiModelProperty(value = "供应商") @ExcelIgnore private String supp; /** * 供应商编码 */ @ApiModelProperty(value = "供应商编码") @ExcelIgnore @TableField("supp_code") private String suppCode; @@ -220,6 +251,7 @@ */ @ApiModelProperty(value = "是否批次 1: 是 0: 否 ") @TableField("be_batch") @ExcelIgnore private Integer beBatch; /** @@ -227,12 +259,14 @@ */ @ApiModelProperty(value = "保质期") @TableField("dead_time") @ExcelProperty("出库日期") private String deadTime; /** * 预警天数 */ @ApiModelProperty(value = "预警天数") @ExcelIgnore @TableField("dead_warn") private Integer deadWarn; @@ -240,30 +274,39 @@ * 制购 1: 制造 2: 采购 3: 外协 、、江铜:是否确认 1: 确认 2: 未确认 */ @ApiModelProperty(value = "制购 1: 制造 2: 采购 3: 外协 ") @ExcelIgnore private Integer source; /** * 要求检验 1: 是 0: 否 */ @ApiModelProperty(value = "要求检验 1: 是 0: 否 ") @ExcelIgnore private Integer inspect; @ExcelProperty("是否复核") @TableField(exist = false) private String inspect$; /** * 危险品 1: 是 0: 否 */ @ApiModelProperty(value = "危险品 1: 是 0: 否 ") @ExcelIgnore private Integer danger; /** * 状态 1: 正常 0: 禁用 */ @ApiModelProperty(value = "状态 1: 正常 0: 禁用 ") @ExcelIgnore private Integer status; /** * 添加人员 */ @ApiModelProperty(value = "添加人员") @ExcelIgnore @TableField("create_by") private Long createBy; @@ -271,6 +314,7 @@ * 添加时间 */ @ApiModelProperty(value = "添加时间") @ExcelIgnore @TableField("create_time") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; @@ -279,6 +323,7 @@ * 修改人员 */ @ApiModelProperty(value = "修改人员") @ExcelIgnore @TableField("update_by") private Long updateBy; @@ -288,15 +333,18 @@ @ApiModelProperty(value = "修改时间") @TableField("update_time") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ExcelProperty("复核时间") private Date updateTime; /** * 备注 */ @ApiModelProperty(value = "备注") @ExcelProperty("复核备注") private String memo; @ApiModelProperty(value = "退库标记") @ExcelIgnore @TableField("tk_type") private Integer tkType; @@ -304,6 +352,7 @@ * 卷信息ID */ @ApiModelProperty(value = "卷信息ID") @ExcelIgnore @TableField("roll_up") private Long rollUp; src/main/java/com/zy/asrs/task/OrderSyncScheduler.java
@@ -1,8 +1,14 @@ package com.zy.asrs.task; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.zy.asrs.entity.Order; import com.zy.asrs.entity.Review; import com.zy.asrs.entity.ReviewDetl; import com.zy.asrs.service.ApiLogService; import com.zy.asrs.service.OrderService; import com.zy.asrs.service.ReviewDetlService; import com.zy.asrs.service.ReviewService; import com.zy.asrs.task.core.ReturnT; import com.zy.asrs.task.handler.OrderSyncHandler; import com.zy.system.entity.Config; @@ -28,12 +34,16 @@ @Autowired private OrderService orderService; @Autowired private ReviewService reviewService; @Autowired private ReviewDetlService reviewDetlService; @Autowired private ApiLogService apiLogService; @Resource private ConfigMapper configMapper; @Scheduled(cron = "0 0 1 * * ? ") public void clearApiLog(){ public void clearApiLog() { try { apiLogService.clearWeekBefore(); } catch (Exception e) { @@ -64,4 +74,28 @@ } @Scheduled(cron = "0/30 * * * * ? ") public void complete() { List<Review> orders = reviewService.selectList(new EntityWrapper<Review>().eq("settle", 2)); for (Review order : orders) { try { boolean flag = true; List<ReviewDetl> reviewDetls = reviewDetlService.selectList(new EntityWrapper<ReviewDetl>().eq("order_no", order.getOrderNo())); for (ReviewDetl reviewDetl : reviewDetls) { if (Cools.isEmpty(reviewDetl.getInspect()) || reviewDetl.getInspect() == 0) { flag = false; break; } } if (flag) { order.setSettle(4L); reviewService.updateById(order); } log.info("单据[orderNo={}]处理完成", order.getOrderNo()); } catch (Exception e) { log.error("单据[orderNo={}]处理失败,异常信息:" + e, order.getOrderNo()); } } } } src/main/java/com/zy/asrs/task/handler/OrderMoveHistoryHandler.java
@@ -46,7 +46,7 @@ public ReturnT<String> start2() { List<Review> settleEqual6 = reviewService.selectList(new EntityWrapper<Review>() .in("settle", 4,6)); .eq("settle", 6)); for (Review order : settleEqual6) { List<ReviewDetl> orderDetls = reviewDetlService.selectList(new EntityWrapper<ReviewDetl>() .eq("order_no", order.getOrderNo())); src/main/webapp/static/js/review/review.js
@@ -4,7 +4,7 @@ base: baseUrl + "/static/layui/lay/modules/" }).extend({ notice: 'notice/notice', }).use(['layer', 'form', 'table','upload','element', 'util', 'admin', 'xmSelect', 'laydate', 'tableMerge', 'notice'], function () { }).use(['layer', 'form', 'table', 'upload', 'element', 'util', 'admin', 'xmSelect', 'laydate', 'tableMerge', 'notice'], function () { var $ = layui.jquery; var layer = layui.layer; var form = layui.form; @@ -20,21 +20,21 @@ var element = layui.element; // 渲染表格 var insTb = table.render({ elem: '#order', url: baseUrl+'/review/head/page/auth', url: baseUrl + '/review/head/page/auth', headers: {token: localStorage.getItem('token')}, page: true, cellMinWidth: 100, toolbar: '#toolbar', cols: [[ {type: 'numbers'}, {type: 'checkbox', fixed: 'left'}, {field: 'orderNo', title: '单据编号'}, {field: 'cstmrName', align: 'center',title: '客户名称'}, {field: 'cstmrName', align: 'center', title: '客户名称'}, {align: 'center', title: '明细', toolbar: '#tbLook', minWidth: 250, width: 250}, {field: 'createTime$', title: '创建时间', minWidth: 200, width: 200}, {field: 'settle$', align: 'center', title: '状态', templet: '#settleTpl', minWidth: 160, width: 160}, {field: 'settle$', align: 'center', title: '状态', templet: '#settleTpl', minWidth: 160, width: 160}, //{field: 'memo', align: 'center',title: '备注'}, {align: 'center', title: '操作', toolbar: '#operate', width: 240} ]], @@ -56,11 +56,31 @@ done: function (res, curr, count) { limit(); if (res.code === 403) { top.location.href = baseUrl+"/"; top.location.href = baseUrl + "/"; } insTbCount = count; } }); // table.on('toolbar(order)', function (obj) { console.info("121211") var checkStatus = table.checkStatus(obj.config.id); console.info(obj) console.info(checkStatus) layer.confirm('确定导出Excel吗', {shadeClose: true}, function () { var ids = ''; for (const o in checkStatus.data) { console.info(o) //ids.push(checkStatus.data[o].id) ids =ids + checkStatus.data[o].id + "," } location.href = baseUrl + "/exportReview?ids=" + ids; layer.closeAll(); }); }); // 搜索 form.on('submit(tbSearch)', function (data) { @@ -70,37 +90,37 @@ //多文件列表 var uploadListIns = upload.render({ elem: '#data-btn-file2' ,elemList: $('#data-btn-file3') //列表元素对象 ,url: baseUrl+'/review/insert/labelUp/file/auth' ,accept: 'file' ,multiple: true ,number: 10 ,auto: false ,bindAction: '#testListAction' ,choose: function(obj){ , elemList: $('#data-btn-file3') //列表元素对象 , url: baseUrl + '/review/insert/labelUp/file/auth' , accept: 'file' , multiple: true , number: 10 , auto: false , bindAction: '#testListAction' , choose: function (obj) { // 赋值 this.data.orderId=$('.layui-layer-title').text() this.data.orderId = $('.layui-layer-title').text() var that = this; var files = this.files = obj.pushFile(); //将每次选择的文件追加到文件队列 //读取本地文件 obj.preview(function(index, file, result){ var tr = $(['<tr id="upload-'+ index +'">' ,'<td>'+ file.name +'</td>' ,'<td>'+ (file.size/1014).toFixed(1) +'kb</td>' ,'<td><div class="layui-progress" lay-filter="progress-demo-'+ index +'"><div class="layui-progress-bar" lay-percent=""></div></div></td>' ,'<td>' ,'<button class="layui-btn layui-btn-xs demo-reload layui-hide">重传</button>' obj.preview(function (index, file, result) { var tr = $(['<tr id="upload-' + index + '">' , '<td>' + file.name + '</td>' , '<td>' + (file.size / 1014).toFixed(1) + 'kb</td>' , '<td><div class="layui-progress" lay-filter="progress-demo-' + index + '"><div class="layui-progress-bar" lay-percent=""></div></div></td>' , '<td>' , '<button class="layui-btn layui-btn-xs demo-reload layui-hide">重传</button>' // ,'<button class="layui-btn layui-btn-xs layui-btn-danger demo-delete">删除</button>' ,'</td>' ,'</tr>'].join('')); , '</td>' , '</tr>'].join('')); //单个重传 tr.find('.demo-reload').on('click', function(){ tr.find('.demo-reload').on('click', function () { obj.upload(index, file); }); //删除 tr.find('.demo-delete').on('click', function(){ tr.find('.demo-delete').on('click', function () { delete files[index]; //删除对应的文件 tr.remove(); uploadListIns.config.elem.next()[0].value = ''; //清空 input file 值,以免删除后出现同名文件不可选 @@ -110,28 +130,28 @@ element.render('progress'); //渲染新加的进度条组件 }); } ,done: function(res, index, upload){ //成功的回调 , done: function (res, index, upload) { //成功的回调 var that = this; //if(res.code == 0){ //上传成功 var tr = that.elemList.find('tr#upload-'+ index) ,tds = tr.children(); var tr = that.elemList.find('tr#upload-' + index) , tds = tr.children(); tds.eq(3).html(''); //清空操作 delete this.files[index]; //删除文件队列已经上传成功的文件 return; //} this.error(index, upload); } ,allDone: function(obj){ //多文件上传完毕后的状态回调 , allDone: function (obj) { //多文件上传完毕后的状态回调 console.log(obj) } ,error: function(index, upload){ //错误回调 , error: function (index, upload) { //错误回调 var that = this; var tr = that.elemList.find('tr#upload-'+ index) ,tds = tr.children(); var tr = that.elemList.find('tr#upload-' + index) , tds = tr.children(); tds.eq(3).find('.demo-reload').removeClass('layui-hide'); //显示重传 } ,progress: function(n, elem, e, index){ //注意:index 参数为 layui 2.6.6 新增 element.progress('progress-demo-'+ index, n + '%'); //执行进度条。n 即为返回的进度百分比 , progress: function (n, elem, e, index) { //注意:index 参数为 layui 2.6.6 新增 element.progress('progress-demo-' + index, n + '%'); //执行进度条。n 即为返回的进度百分比 } }); @@ -157,24 +177,24 @@ layer.open({ area: '1020px', type: 1, title: '上传文件-'+data.id, title: '上传文件-' + data.id, content: $('#myModal') }); // 获取路径下的文件列表,使用 jQuery 的 ajax 方法 $.ajax({ url: baseUrl+'/review/view/labelUp/file/auth', data:{ orderId:data.id url: baseUrl + '/review/view/labelUp/file/auth', data: { orderId: data.id }, success: function(response) { if (response.code==200){ success: function (response) { if (response.code == 200) { var targetTable = document.getElementById("data-btn-file3"); targetTable.innerHTML = ''; // 将获取到的文件列表添加到文件队列中进行显示 response.data.forEach(function(file,index) { response.data.forEach(function (file, index) { // 创建tr元素 var tr = document.createElement("tr"); tr.id = "upload-"+index; tr.id = "upload-" + index; tr.innerHTML = '<td>' + file.name + '</td>' + '<td>' + (file.size / 1024).toFixed(1) + 'kb</td>' + '<td><div class="layui-progress" lay-filter="progress-demo-' + index + '"><div class="layui-progress-bar" lay-percent=""></div></div></td>' @@ -186,11 +206,11 @@ // 将tr元素添加到目标table中 targetTable.appendChild(tr); }); }else { } else { console.log('Failed to get file list error.'); } }, error: function() { error: function () { console.log('Failed to get file list.'); } }); @@ -217,14 +237,13 @@ table.render({ elem: '#lookSSXMTable', headers: {token: localStorage.getItem('token')}, url: baseUrl+'/reviewDetl/list/auth', url: baseUrl + '/reviewDetl/list/auth', where: { order_id: data.id }, page: true, cellMinWidth: 100, cols: [[ {type: 'numbers'}, {field: 'matnr', title: '物质编码'}, {field: 'maktx', title: '产品名称'}, {field: 'specs', title: '规格型号'}, @@ -285,18 +304,18 @@ } let nList = admin.util.deepClone(xxDataList); for (let xi = 0; xi < nList.length; xi++) { if (nList[xi].anfme <= 0){ if (nList[xi].anfme <= 0) { layer.msg('明细修改数量不合法', {icon: 2}); return false; } if (nList[xi].anfme < nList[xi].workQty){ if (nList[xi].anfme < nList[xi].workQty) { layer.msg('数量不能小于已作业数量', {icon: 2}); return false; } } layer.load(2); $.ajax({ url: baseUrl+"/review/form/" + (isExpAdd?"add":"modify") + "/auth", url: baseUrl + "/review/form/" + (isExpAdd ? "add" : "modify") + "/auth", headers: {'token': localStorage.getItem('token')}, data: JSON.stringify({ orderId: Number(data.field.id), @@ -304,17 +323,17 @@ orderNo: data.field.orderNo, orderDetlList: nList }), contentType:'application/json;charset=UTF-8', contentType: 'application/json;charset=UTF-8', method: 'POST', success: function (res) { layer.closeAll('loading'); if (res.code === 200){ if (res.code === 200) { layer.close(dIndex); $(".layui-laypage-btn")[0].click(); layer.msg(res.msg, {icon: 1}); } else if (res.code === 403){ top.location.href = baseUrl+"/"; }else { } else if (res.code === 403) { top.location.href = baseUrl + "/"; } else { layer.msg(res.msg, {icon: 2}); } } @@ -336,11 +355,25 @@ {field: 'maktx', title: '商品名称', width: 200}, {field: 'batch', title: '箱号', edit: true}, {field: 'specs', title: '接头'}, {field: 'anfme', title: '数量(修改)', style: 'color: blue;font-weight: bold', edit: true, minWidth: 110, width: 110}, {field: 'workQty', title: '作业数量', minWidth: 100, width: 100}, { field: 'anfme', title: '数量(修改)', style: 'color: blue;font-weight: bold', edit: true, minWidth: 110, width: 110 }, {field: 'workQty', title: '作业数量', minWidth: 100, width: 100}, // {field: 'unit', title: '单位', width: 80}, {field: 'memo', title: '备注' , edit: true}, {align: 'center', title: '操作', toolbar: '#formSSXMTableBar', minWidth: 80, width: 80, fixed: 'right'} {field: 'memo', title: '备注', edit: true}, { align: 'center', title: '操作', toolbar: '#formSSXMTableBar', minWidth: 80, width: 80, fixed: 'right' } ]], done: function (res) { $(layero).find('.layui-table-view').css('margin', '0'); @@ -349,17 +382,17 @@ }; if (!isExpAdd) { $.ajax({ url: baseUrl+"/review/detl/all/auth?orderId=" + expTpe.id, url: baseUrl + "/review/detl/all/auth?orderId=" + expTpe.id, headers: {'token': localStorage.getItem('token')}, method: 'GET', async: false, success: function (res) { if (res.code === 200){ if (res.code === 200) { xxDataList = res.data; tbOptions.data = xxDataList; } else if (res.code === 403){ top.location.href = baseUrl+"/"; }else { } else if (res.code === 403) { top.location.href = baseUrl + "/"; } else { layer.msg(res.msg, {icon: 2}) } } @@ -373,7 +406,7 @@ if (layEvent === 'edit') { showEditModel2(data); } else if (layEvent === 'del') { if(data.workQty > 0){ if (data.workQty > 0) { layer.msg("已存在作业数量,不能删除", {icon: 2}); return; } @@ -396,7 +429,7 @@ table.on('edit(formSSXMTable)', function (obj) { let index = obj.tr.attr("data-index"); let data = xxDataList[index]; if (obj.field === 'anfme'){ if (obj.field === 'anfme') { let vle = Number(obj.value); if (isNaN(vle)) { layer.msg("请输入数字", {icon: 2}); @@ -408,7 +441,7 @@ // insTbSSXM.reload({data: xxDataList}); return false; } if(obj.value < data.workQty){ if (obj.value < data.workQty) { layer.msg("输入数量不能小于作业中数量", {icon: 2}); // data[obj.field] = 0; // insTbSSXM.reload({data: xxDataList}); @@ -438,21 +471,21 @@ // 表单提交事件 form.on('submit(matEditSubmit)', function (data) { let selectList = matXmSelect.getValue(); for (let i = 0; i<selectList.length; i++) { for (let i = 0; i < selectList.length; i++) { let item = selectList[i]; // 查询物料详情 $.ajax({ url: baseUrl+"/mat/covert/"+item.value+"/auth", url: baseUrl + "/mat/covert/" + item.value + "/auth", headers: {'token': localStorage.getItem('token')}, method: 'GET', async: false, success: function (res) { if (res.code === 200){ if (res.code === 200) { xxDataList.push(res.data); insTbSSXM.reload({data: xxDataList, page: {curr: 1}}); } else if (res.code === 403){ top.location.href = baseUrl+"/"; }else { } else if (res.code === 403) { top.location.href = baseUrl + "/"; } else { layer.msg(res.msg, {icon: 2}) } } @@ -468,19 +501,19 @@ width: '340px', }, autoRow: true, toolbar: { show: true }, toolbar: {show: true}, filterable: true, remoteSearch: true, remoteMethod: function(val, cb, show){ remoteMethod: function (val, cb, show) { $.ajax({ url: baseUrl+"/mat/all/get/kv", url: baseUrl + "/mat/all/get/kv", headers: {'token': localStorage.getItem('token')}, data: { condition: val }, method: 'POST', success: function (res) { if (res.code === 200){ if (res.code === 200) { cb(res.data) } else { cb([]); @@ -510,7 +543,7 @@ layer.close(i); layer.load(2); $.ajax({ url: baseUrl+"/review/delete/auth", url: baseUrl + "/review/delete/auth", headers: {'token': localStorage.getItem('token')}, data: { orderId: orderId @@ -518,16 +551,16 @@ method: 'POST', success: function (res) { layer.closeAll('loading'); if (res.code === 200){ if (res.code === 200) { if (insTbCount === 0) { insTb.reload({page: {curr: 1}}); } else { $(".layui-laypage-btn")[0].click(); } layer.msg(res.msg, {icon: 1}); } else if (res.code === 403){ top.location.href = baseUrl+"/"; }else { } else if (res.code === 403) { top.location.href = baseUrl + "/"; } else { layer.msg(res.msg, {icon: 2}); } } @@ -546,7 +579,7 @@ console.log(orderId); console.log(settle); $.ajax({ url: baseUrl+"/review/update/auth", url: baseUrl + "/review/update/auth", headers: {'token': localStorage.getItem('token')}, data: { id: orderId, @@ -556,16 +589,16 @@ method: 'POST', success: function (res) { layer.closeAll('loading'); if (res.code === 200){ if (res.code === 200) { if (insTbCount === 0) { insTb.reload({page: {curr: 1}}); } else { $(".layui-laypage-btn")[0].click(); } layer.msg(res.msg, {icon: 1}); } else if (res.code === 403){ top.location.href = baseUrl+"/"; }else { } else if (res.code === 403) { top.location.href = baseUrl + "/"; } else { layer.msg(res.msg, {icon: 2}); } } @@ -577,7 +610,7 @@ function showWrkTrace(orderId) { let loadIndex = layer.msg('请求中...', {icon: 16, shade: 0.01, time: false}); $.ajax({ url: baseUrl+"/review/wrk/trace/auth", url: baseUrl + "/review/wrk/trace/auth", headers: {'token': localStorage.getItem('token')}, data: { orderId: orderId @@ -585,7 +618,7 @@ method: 'POST', success: function (res) { layer.close(loadIndex); if (res.code === 200){ if (res.code === 200) { laytpl(wrkTraceDialog.innerHTML).render(res.data, function (html) { admin.open({ type: 1, @@ -606,19 +639,27 @@ }, color: ['#10B4E8', '#E0E0E0', '#FF0000'], tooltip: {trigger: 'item'}, series: [{name: '箱子数量', type: 'pie', radius: ['75%', '80%'], label: {normal: {show: false}}}] series: [{ name: '箱子数量', type: 'pie', radius: ['75%', '80%'], label: {normal: {show: false}} }] }; traceCharts.setOption(traceOptions); // 赋值 traceCharts.setOption({ title: { subtext: res.data.totalQty+"/"+res.data.wrkQty+"/"+res.data.endQty subtext: res.data.totalQty + "/" + res.data.wrkQty + "/" + res.data.endQty }, series: [ { data: [ {name: '已作业', value: res.data.wrkQty}, {name: '未作业', value: res.data.totalQty-res.data.wrkQty-res.data.lackQty}, { name: '未作业', value: res.data.totalQty - res.data.wrkQty - res.data.lackQty }, {name: '库存不足', value: res.data.lackQty}, ] } @@ -627,9 +668,9 @@ } }); }); } else if (res.code === 403){ top.location.href = baseUrl+"/"; }else { } else if (res.code === 403) { top.location.href = baseUrl + "/"; } else { layer.msg(res.msg, {icon: 2}); } } @@ -638,8 +679,8 @@ layDate.render({ elem: '.layui-laydate-range' ,type: 'datetime' ,range: true , type: 'datetime' , range: true }); function pakoutPreview(ids) { @@ -653,20 +694,20 @@ success: function (res) { layer.close(loadIndex); var tableCache; if (res.code === 200){ if (res.code === 200) { layer.open({ type: 1 ,title: false ,closeBtn: false ,offset: '50px' ,area: ['1500px', '700px'] ,shade: 0.5 ,shadeClose: false ,btn: ['生成退库单', '稍后处理'] ,btnAlign: 'c' ,moveType: 1 //拖拽模式,0或者1 ,content: $('#pakoutPreviewBox').html() ,success: function(layero, index){ , title: false , closeBtn: false , offset: '50px' , area: ['1500px', '700px'] , shade: 0.5 , shadeClose: false , btn: ['生成退库单', '稍后处理'] , btnAlign: 'c' , moveType: 1 //拖拽模式,0或者1 , content: $('#pakoutPreviewBox').html() , success: function (layero, index) { stoPreTabIdx = table.render({ elem: '#stoPreTab', data: res.data, @@ -687,8 +728,20 @@ // {field: 'brand', title: '木箱类型', align: 'center'}, {field: 'brand$', title: '木箱类型', align: 'center'}, {field: 'zpallet', title: '托盘码', align: 'center'}, {field: 'anfme', title: '数量', align: 'center', width: 90, style: 'font-weight: bold'}, {field: 'count', title: '数量', align: 'center', width: 90, style: 'font-weight: bold'}, { field: 'anfme', title: '数量', align: 'center', width: 90, style: 'font-weight: bold' }, { field: 'count', title: '数量', align: 'center', width: 90, style: 'font-weight: bold' }, {field: 'locNo', title: '货位', align: 'center', width: 100, templet: '#locNoTpl'}, {field: 'tkType$', title: 'TK标记', align: 'center', width: 100}, // {field: 'staNos', align: 'center', title: '出库站', merge: ['locNo'], templet: '#tbBasicTbStaNos'}, @@ -702,9 +755,9 @@ }); // 修改出库站 form.on('select(tbBasicTbStaNos)', function (obj) { let index = obj.othis.parents('tr').attr("data-index"); let index = obj.othis.parents('tr').attr("data-index"); let data = tableCache[index]; for (let i = 0; i<tableCache.length; i++) { for (let i = 0; i < tableCache.length; i++) { if (tableCache[i].locNo === data.locNo) { tableCache[i]['staNo'] = Number(obj.elem.value); } @@ -721,18 +774,18 @@ } modifySta(stoPreTabData); }); // 批量修改出库站 - 站点选择 function modifySta(stoPreTabData) { // 出库站取交集 let staBatchSelectVal = []; for(let i = 0; i<stoPreTabData.length; i++) { for (let i = 0; i < stoPreTabData.length; i++) { let staNos = stoPreTabData[i].staNos; if (staNos !== null) { if (staBatchSelectVal.length === 0) { staBatchSelectVal = staNos; } else { staBatchSelectVal = staBatchSelectVal.filter(val => { staBatchSelectVal = staBatchSelectVal.filter(val => { return new Set(staNos).has(val) } ) @@ -758,8 +811,8 @@ let loadIdx = layer.load(2); let batchSta = Number(obj.field.batchSta); let arr = []; for (let j = 0; j<stoPreTabData.length; j++) { for (let i = 0; i<tableCache.length; i++) { for (let j = 0; j < stoPreTabData.length; j++) { for (let i = 0; i < tableCache.length; i++) { if (tableCache[i].orderNo === stoPreTabData[j].orderNo && tableCache[i].matnr === stoPreTabData[j].matnr && tableCache[i].locNo === stoPreTabData[j].locNo) { @@ -776,7 +829,8 @@ arr.forEach(item => { $('div[lay-id=stoPreTab] tr[data-index="' + item + '"] .layui-select-title').find("input").css("color", "blue"); }); layer.close(loadIdx); layer.close(ddIndex); layer.close(loadIdx); layer.close(ddIndex); return false; }); // 弹窗不出现滚动条 @@ -787,20 +841,20 @@ } } ,yes: function(index, layero){ , yes: function (index, layero) { //按钮【退库】的回调 pakout(tableCache2, index); tableCache2 = [] } ,btn2: function(index, layero){ , btn2: function (index, layero) { //按钮【稍后处理】的回调 layer.close(index) tableCache2 = [] //return false 开启该代码可禁止点击该按钮关闭 } }); } else if (res.code === 403){ top.location.href = baseUrl+"/"; } else if (res.code === 403) { top.location.href = baseUrl + "/"; } else { layer.msg(res.msg, {icon: 2}) } @@ -808,7 +862,7 @@ }) // 复选框事件 table.on('checkbox(stoPreTab)', function(obj){ table.on('checkbox(stoPreTab)', function (obj) { tableCache2.push(obj.data) }); } src/main/webapp/views/review/review.html
@@ -26,15 +26,19 @@ .layui-timeline:first-child .layui-timeline-item { margin-top: 30px; } .btn-add { display: none; } .btn-edit { display: none; } .btn-complete { display: none; } .btn-delete { display: none; } @@ -61,7 +65,8 @@ </div> <div class="layui-inline" style="width: 300px"> <div class="layui-input-inline"> <input class="layui-input layui-laydate-range" name="create_time" type="text" placeholder="起始时间 - 终止时间" autocomplete="off" style="width: 300px"> <input class="layui-input layui-laydate-range" name="create_time" type="text" placeholder="起始时间 - 终止时间" autocomplete="off" style="width: 300px"> </div> </div> <div class="layui-inline"> @@ -85,10 +90,9 @@ <button class="layui-btn icon-btn" lay-filter="tbSearch" lay-submit> <i class="layui-icon"></i>搜索 </button> <!-- <button id="orderAddBtn" class="layui-btn icon-btn btn-add"><i class="layui-icon"></i>添加--> <!-- </button>--> <input type="file" id="fileInput" accept=".xlsx, .xls"> <button onclick="exportExc()">导入订单</button> <input class="layui-btn icon-btn" type="file" id="fileInput" accept=".xlsx, .xls"> <button class="layui-btn icon-btn" onclick="exportExc()">导入订单</button> </div> </div> </div> @@ -97,12 +101,17 @@ </div> <div class="layui-card"> <div class="layui-card-body"> <!-- 入库通知单:由ERP提供单据编号、类型、单据时间及物料明细,生成入库作业单,为维护系统高可用,用户可自行添加入库通知单数据,完成独立的入库作业。--> <!-- <span class="text-danger">手动添加时,请检查单据编号是否在ERP系统中已存在,避免发生数据错误问题。</span>--> <!-- 入库通知单:由ERP提供单据编号、类型、单据时间及物料明细,生成入库作业单,为维护系统高可用,用户可自行添加入库通知单数据,完成独立的入库作业。--> <!-- <span class="text-danger">手动添加时,请检查单据编号是否在ERP系统中已存在,避免发生数据错误问题。</span>--> <span class="text-danger">出库时,请检查单据编号是否在系统中已存在,避免发生数据错误问题。</span> </div> </div> </div> <script type="text/html" id="toolbar"> <div class="layui-btn-container"> <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData">导出</button> </div> </script> <script> function exportExc() { var fileInput = document.getElementById('fileInput'); @@ -114,7 +123,7 @@ var formData = new FormData(); formData.append('file', file); fetch(baseUrl+'/importReview', { fetch(baseUrl + '/importReview', { method: 'POST', headers: {'token': localStorage.getItem('token')}, body: formData @@ -128,10 +137,11 @@ }); } </script> <div id="myModal" style="display: none"> <div id="myModal" style="display: none"> <div style="padding: 10px"> <div class="layui-upload"> <button type="button" class="layui-btn layui-btn-normal" id="data-btn-file2">选择文件</button><input id="data-btn-upload" class="layui-upload-file" type="file" accept="" name="file" multiple=""> <button type="button" class="layui-btn layui-btn-normal" id="data-btn-file2">选择文件</button> <input id="data-btn-upload" class="layui-upload-file" type="file" accept="" name="file" multiple=""> <div class="layui-upload-list" style="max-width: 1000px;height:400px;overflow: scroll"> <table class="layui-table"> <colgroup> @@ -141,11 +151,13 @@ <col width="150"> </colgroup> <thead> <tr><th>文件名</th> <tr> <th>文件名</th> <th>大小</th> <th>上传进度</th> <th>操作</th> </tr></thead> </tr> </thead> <tbody id="data-btn-file3"></tbody> </table> </div> @@ -156,10 +168,10 @@ <!-- 表格操作列 --> <script type="text/html" id="operate"> {{# if (d.settle == 0 || d.settle == 1) { }} <!-- <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">修改</a>--> <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">删除</a> <!-- <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">修改</a>--> <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">删除</a> <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-edit" lay-event="complete">完结</a> <!-- <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-complete" lay-event="labelUp">上传标签</a>--> <!-- <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-complete" lay-event="labelUp">上传标签</a>--> {{# } }} {{# if (d.settle == 2) { }} <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">删除</a> @@ -167,7 +179,7 @@ <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-edit" lay-event="complete">完结</a> {{# } }} {{# if (d.settle == 4 && d.tkType=='1') { }} <!-- <a class="layui-btn layui-btn-danger layui-btn-xs btn-delete" lay-event="refundLoc">退库</a>--> <!-- <a class="layui-btn layui-btn-danger layui-btn-xs btn-delete" lay-event="refundLoc">退库</a>--> {{# } }} </script> <!-- 表格操作列 --> @@ -183,7 +195,8 @@ {{# if(d.settle > 1 && d.settle !== 3){ }} {{# } }} <i class="layui-icon layui-icon-about wrk-trace" lay-tips="查看任务追溯" lay-direction="2" lay-offset="-10px,0px" lay-event="wrkTrace"></i> <i class="layui-icon layui-icon-about wrk-trace" lay-tips="查看任务追溯" lay-direction="2" lay-offset="-10px,0px" lay-event="wrkTrace"></i> </script> <!--<script type="text/html" id="settleTpl">--> @@ -191,17 +204,17 @@ <!--</script>--> <script type="text/html" id="settleTpl"> <span name="settle" {{# if( d.settle === 1){ }} {{# if( d.settle=== 1){ }} class="layui-badge layui-badge-red" {{# }else if(d.settle === 2){ }} {{# }else if(d.settle=== 2){ }} class="layui-badge layui-badge-green" {{# }else if(d.settle === 3){ }} {{# }else if(d.settle=== 3){ }} class="layui-badge layui-badge-gray" {{# }else if(d.settle === 4){ }} {{# }else if(d.settle=== 4){ }} class="layui-badge layui-badge-blue" {{# }else if(d.settle === 5){ }} {{# }else if(d.settle=== 5){ }} class="layui-badge layui-badge-gray" {{# }else if(d.settle === 6){ }} {{# }else if(d.settle=== 6){ }} class="layui-badge layui-badge-gray" {{# } }} >{{d.settle$}}</span> @@ -214,10 +227,14 @@ <label class="layui-form-label">单据类型:</label> <div class="layui-input-block cool-auto-complete"> <input class="layui-input" name="docType" placeholder="请输入单据类型" style="display: none"> <input id="docType$" name="docType$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请输入单据类型" onfocus=this.blur() lay-verType="tips" lay-verify="required"> <input id="docType$" name="docType$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请输入单据类型" onfocus=this.blur() lay-verType="tips" lay-verify="required"> <div class="cool-auto-complete-window"> <input class="cool-auto-complete-window-input" data-key="docTypeQueryBydocType" onkeyup="autoLoad(this.getAttribute('data-key'))"> <select class="cool-auto-complete-window-select" data-key="docTypeQueryBydocTypeSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple"> <input class="cool-auto-complete-window-input" data-key="docTypeQueryBydocType" onkeyup="autoLoad(this.getAttribute('data-key'))"> <select class="cool-auto-complete-window-select" data-key="docTypeQueryBydocTypeSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple"> </select> </div> </div> @@ -225,8 +242,9 @@ <div class="layui-form-item"> <label class="layui-form-label">单据编号:</label> <div class="layui-input-block"> <input id="orderNo" name="orderNo" placeholder="输入单据编号" type="text" class="layui-input" maxlength="20" lay-verType="tips" /> <!-- lay-verify="required"--> <input id="orderNo" name="orderNo" placeholder="输入单据编号" type="text" class="layui-input" maxlength="20" lay-verType="tips"/> <!-- lay-verify="required"--> </div> </div> <div class="layui-form-item" style="position: relative;"> @@ -271,20 +289,22 @@ <script id="wrkTraceDialog" type="text/html" style="position: relative"> <div style="position: absolute; top: 0; left: 0;"> <div class="layui-card" style="overflow: hidden;"> <div class="layui-card-header" style="text-align: center;width: 80%;font-weight: inherit;font-size: 18px">{{ d.orderNo }}</div> <div class="layui-card-header" style="text-align: center;width: 80%;font-weight: inherit;font-size: 18px">{{ d.orderNo }} </div> <div class="layui-card-body"> <div id="wrkTraceCharts" style="height: 300px;width: 400px;transform: translateX(-10%);"></div> </div> </div> </div> <div class="layui-row" > <div class="layui-row"> <div class="layui-col-md5"> <h1 style="opacity: 0;">Hello World</h1> </div> <div class="layui-col-md7" style=""> {{# if(d.list.length > 0){ }} <div class="layui-col-md7" style=""> {{# if(d.list.length > 0){ }} <ul class="layui-timeline" style="height: 400px; overflow: scroll;"> {{# layui.each(d.list, function(index, item){ }} {{# layui.each(d.list, function(index, item){ }} <li class="layui-timeline-item"> <i class="layui-icon layui-timeline-axis"></i> <div class="layui-timeline-content layui-text"> @@ -292,30 +312,30 @@ <h3 class="inline-block"> {{ item.wrkNo }} {{# if(item.wrkMast.ioType < 100){ }} {{# if(item.wrkMast.ioType < 100){ }} <span class="layui-badge layui-bg-blue" style="line-height: 20px;"> {{ item.wrkMast.ioType$ }} </span> {{# } }} {{# } }} {{# if(item.wrkMast.ioType > 100){ }} {{# if(item.wrkMast.ioType > 100){ }} <span class="layui-badge layui-bg-orange" style="line-height: 20px;"> {{ item.wrkMast.ioType$ }} </span> {{# } }} {{# } }} {{# if(item.wrkMast.wrkSts < 14){ }} {{# if(item.wrkMast.wrkSts < 14){ }} <span class="layui-badge layui-bg-red" style="line-height: 20px;"> {{ item.wrkMast.wrkSts$ }} </span> {{# } }} {{# } }} {{# if(item.wrkMast.wrkSts >= 14){ }} {{# if(item.wrkMast.wrkSts >= 14){ }} <span class="layui-badge layui-bg-green" style="line-height: 20px;"> {{ item.wrkMast.wrkSts$ }} </span> {{# } }} {{# } }} </h3>  {{ item.wrkMast.ioTime$ }} @@ -328,12 +348,12 @@ <td>规格</td> <!-- <td>规格</td>--> <td>箱号</td> <!-- <td>箱子类型</td>--> <!-- <td>箱子类型</td>--> <td>是否确认</td> </tr> </thead> <tbody> {{# layui.each(item.wrkDetls, function(idx, wrkDetl){ }} {{# layui.each(item.wrkDetls, function(idx, wrkDetl){ }} <tr> <td><span class="layui-badge layui-bg-cyan">{{ idx+1 }}</span></td> <td>{{ wrkDetl.matnr }}</td> @@ -341,20 +361,20 @@ <td style="font-weight: bold">{{ wrkDetl.batch }}</td> <td style="font-weight: bold">{{ wrkDetl.source$ }}</td> </tr> {{# }); }} {{# }); }} </tbody> </table> <hr class="layui-border-cyan" style="width: 90%; opacity: .6;"> </div> </li> {{# }); }} {{# }); }} </ul> {{# } else { }} {{# } else { }} <div style="height: 350px;display: flex;justify-content: center;align-items: center;"> <h2 style="font-weight: bold;letter-spacing: 2px">暂无任务</h2> </div> {{# } }} {{# } }} </div> </div> @@ -366,7 +386,8 @@ <form class="layui-form" style="padding: 25px 50px 30px 50px;text-align: center"> <select id="batchSelectStaBox" name="batchSta" lay-vertype="tips" lay-verify="required" required=""> </select> <button style="margin-top: 30px" class="layui-btn" lay-filter="staBatchSelectConfirm" lay-submit="">确定</button> <button style="margin-top: 30px" class="layui-btn" lay-filter="staBatchSelectConfirm" lay-submit="">确定 </button> </form> </script> @@ -382,8 +403,6 @@ </body> </html>