| | |
| | | } |
| | | DocType docType = docTypeService.selectById(order.getDocType()); |
| | | if (docType.getPakin() == null || docType.getPakin() != 1) { |
| | | return R.ok(); |
| | | continue; |
| | | } |
| | | if (order.getSettle() > 2) { |
| | | return R.ok(); |
| | | continue; |
| | | } |
| | | List<OrderDetl> orderDetls = orderService.selectWorkingDetls(order.getId()); |
| | | if (!Cools.isEmpty(orderDetls)) { |
| | |
| | | import com.core.exception.CoolException; |
| | | import com.zy.asrs.entity.*; |
| | | import com.zy.asrs.entity.param.OrderDomainParam; |
| | | |
| | | import com.zy.asrs.entity.result.WrkTraceVo; |
| | | import com.zy.asrs.service.*; |
| | | import com.zy.common.model.DetlDto; |
| | | import com.zy.common.web.BaseController; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.web.bind.annotation.*; |
| | |
| | | private WrkDetlService wrkDetlService; |
| | | @Autowired |
| | | private WaitPakinService waitPakinService; |
| | | @Autowired |
| | | private LocDetlService locDetlService; |
| | | @Autowired |
| | | private WrkMastService wrkMastService; |
| | | @Autowired |
| | | private WrkMastLogService wrkMastLogService; |
| | | |
| | | @RequestMapping(value = "/order/nav/list/auth") |
| | | @ManagerAuth |
| | |
| | | return R.ok("订单修改成功"); |
| | | } |
| | | |
| | | @PostMapping(value = "/order/wrk/trace/auth") |
| | | @ManagerAuth |
| | | public R orderWrkTrace(@RequestParam("orderId") Long orderId) { |
| | | Order order = orderService.selectById(orderId); |
| | | if (null == order) { |
| | | return R.error("单据不存在"); |
| | | } |
| | | // 数量统计 |
| | | List<OrderDetl> orderDetls = orderDetlService.selectByOrderId(orderId); |
| | | double totalQty = 0; |
| | | double wrkQty = 0; |
| | | double lackQty = 0; |
| | | for (OrderDetl orderDetl : orderDetls) { |
| | | totalQty = totalQty + orderDetl.getAnfme(); |
| | | wrkQty = wrkQty + orderDetl.getQty(); |
| | | double issued = Optional.of(orderDetl.getAnfme() - orderDetl.getQty()).orElse(0.0D); |
| | | if (issued > 0.0) { |
| | | List<LocDetl> locDetls = locDetlService.queryStock(orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getOrigin(), null); |
| | | for (LocDetl locDetl : locDetls) { |
| | | if (issued > 0) { |
| | | issued = issued - locDetl.getAnfme(); |
| | | } else { |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | if (issued > 0.0) { |
| | | lackQty = lackQty + issued; |
| | | } |
| | | } |
| | | // 任务追溯 |
| | | List<WrkTraceVo> wrkTraceVos = new ArrayList<>(); |
| | | List<WrkDetl> wrkDetls = wrkDetlService.selectAndLogByOrderNoGroupByMatnrOfSum(order.getOrderNo()); |
| | | for (WrkDetl wrkDetl : wrkDetls) { |
| | | WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", wrkDetl.getWrkNo()).eq("io_time", wrkDetl.getIoTime())); |
| | | if (wrkMast == null) { |
| | | WrkMastLog wrkMastLog = wrkMastLogService.selectOne(new EntityWrapper<WrkMastLog>().eq("wrk_no", wrkDetl.getWrkNo()).eq("io_time", wrkDetl.getIoTime())); |
| | | if (wrkMastLog != null) { |
| | | wrkMast = new WrkMast(); |
| | | BeanUtils.copyProperties(wrkMastLog, wrkMast); |
| | | } else { |
| | | continue; |
| | | } |
| | | } |
| | | boolean exist = false; |
| | | for (WrkTraceVo vo : wrkTraceVos) { |
| | | if (vo.getWrkNo().equals(wrkMast.getWrkNo()) && vo.getIoTimeStr().equals(DateUtils.convert(wrkMast.getIoTime()))) { |
| | | vo.getWrkDetls().add(wrkDetl); |
| | | exist = true; |
| | | } |
| | | } |
| | | if (!exist) { |
| | | WrkTraceVo vo = new WrkTraceVo(wrkMast.getWrkNo(), DateUtils.convert(wrkMast.getIoTime()), wrkMast, wrkDetl); |
| | | wrkTraceVos.add(vo); |
| | | } |
| | | } |
| | | if (!Cools.isEmpty(wrkTraceVos) && wrkTraceVos.size() > 1) { |
| | | wrkTraceVos.sort((o1, o2) -> (int) (o2.getWrkMast().getIoTime().getTime() - o1.getWrkMast().getIoTime().getTime())); |
| | | } |
| | | return R.ok().add(Cools |
| | | .add("list", wrkTraceVos) |
| | | .add("orderNo", order.getOrderNo()) |
| | | .add("totalQty", totalQty) |
| | | .add("wrkQty", wrkQty) |
| | | .add("lackQty", lackQty) |
| | | ); |
| | | } |
| | | |
| | | |
| | | // ------------------------------------------------------------------------------------------------ |
| | | |
New file |
| | |
| | | package com.zy.asrs.entity.result; |
| | | |
| | | import com.zy.asrs.entity.WrkDetl; |
| | | import com.zy.asrs.entity.WrkMast; |
| | | import com.zy.common.model.DetlDto; |
| | | import lombok.Data; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * Created by vincent on 2022/7/22 |
| | | */ |
| | | @Data |
| | | public class WrkTraceVo { |
| | | |
| | | private Integer wrkNo; |
| | | |
| | | private String ioTimeStr; |
| | | |
| | | private WrkMast wrkMast; |
| | | |
| | | private List<WrkDetl> wrkDetls = new ArrayList<>(); |
| | | |
| | | private List<DetlDto> detlDtos = new ArrayList<>(); |
| | | |
| | | public WrkTraceVo(Integer wrkNo, String ioTimeStr, WrkMast wrkMast, WrkDetl wrkDetl) { |
| | | this.wrkNo = wrkNo; |
| | | this.ioTimeStr = ioTimeStr; |
| | | this.wrkMast = wrkMast; |
| | | this.wrkDetls.add(wrkDetl); |
| | | } |
| | | } |
| | |
| | | int updateInspect( @Param("wrkNo")Integer wrkNo, @Param("matnr")String matnr, @Param("batch")String batch); |
| | | |
| | | List<WrkDetl> selectPakoutQuery(@Param("staNo")Integer staNo, @Param("matnr")String matnr); |
| | | |
| | | List<WrkDetl> selectAndLogByOrderNoGroupByMatnrOfSum(String orderNo); |
| | | } |
| | |
| | | |
| | | List<WrkDetl> selectPakoutQuery(Integer staNo, String matnr); |
| | | |
| | | List<WrkDetl> selectAndLogByOrderNoGroupByMatnrOfSum(String orderNo); |
| | | |
| | | } |
| | |
| | | public List<WrkDetl> selectPakoutQuery(Integer staNo, String matnr) { |
| | | return this.baseMapper.selectPakoutQuery(staNo, matnr); |
| | | } |
| | | |
| | | @Override |
| | | public List<WrkDetl> selectAndLogByOrderNoGroupByMatnrOfSum(String orderNo) { |
| | | return this.baseMapper.selectAndLogByOrderNoGroupByMatnrOfSum(orderNo); |
| | | } |
| | | } |
| | |
| | | and awd.matnr + '-' + awd.batch = #{matnr} |
| | | </select> |
| | | |
| | | <select id="selectAndLogByOrderNoGroupByMatnrOfSum" resultMap="BaseResultMap"> |
| | | select awd.wrk_no, awd.io_time, awd.matnr, sum(awd.anfme) as anfme |
| | | from asr_wrk_detl awd |
| | | left join asr_wrk_mast awm on awd.wrk_no = awm.wrk_no and awd.io_time = awm.io_time |
| | | where order_no = #{orderNo} |
| | | group by awd.wrk_no, awd.io_time, awd.matnr |
| | | union |
| | | select distinct awdl.wrk_no, awdl.io_time, awdl.matnr, sum(awdl.anfme) as anfme |
| | | from asr_wrk_detl_log awdl |
| | | left join asr_wrk_mast_log awml on awdl.wrk_no = awml.wrk_no and awdl.io_time = awml.io_time |
| | | where awdl.order_no = #{orderNo} |
| | | and (awml.manu_type is null or awml.manu_type != '手动取消') |
| | | group by awdl.wrk_no, awdl.io_time, awdl.matnr |
| | | </select> |
| | | |
| | | </mapper> |
| | |
| | | var admin = layui.admin; |
| | | var xmSelect = layui.xmSelect; |
| | | var layDate = layui.laydate; |
| | | var laytpl = layui.laytpl; |
| | | |
| | | // 渲染搜索模板 |
| | | $.ajax({ |
| | |
| | | cellMinWidth: 100, |
| | | cols: [[ |
| | | {type: 'numbers'}, |
| | | {field: 'orderNo', title: '单据编号'}, |
| | | {field: 'orderNo', title: '单据编号', templet: '#orderNoTpl'}, |
| | | {field: 'docType$', align: 'center', title: '类型', minWidth: 160, width: 160}, |
| | | {align: 'center', title: '明细', toolbar: '#tbLook', minWidth: 160, width: 160}, |
| | | {field: 'createTime$', title: '创建时间', minWidth: 200, width: 200}, |
| | |
| | | var layEvent = obj.event; |
| | | if (layEvent === 'edit') { |
| | | showEditModel(data); |
| | | } else if (layEvent === 'wrkTrace') { |
| | | showWrkTrace(data.id); |
| | | } else if (layEvent === 'del') { |
| | | doDel(data.id); |
| | | } else if (layEvent === 'complete') { |
| | |
| | | }); |
| | | } |
| | | |
| | | // 任务追溯 |
| | | function showWrkTrace(orderId) { |
| | | let loadIndex = layer.msg('请求中...', {icon: 16, shade: 0.01, time: false}); |
| | | $.ajax({ |
| | | url: baseUrl+"/order/wrk/trace/auth", |
| | | headers: {'token': localStorage.getItem('token')}, |
| | | data: { |
| | | orderId: orderId |
| | | }, |
| | | method: 'POST', |
| | | success: function (res) { |
| | | layer.close(loadIndex); |
| | | if (res.code === 200){ |
| | | laytpl(wrkTraceDialog.innerHTML).render(res.data, function (html) { |
| | | admin.open({ |
| | | type: 1, |
| | | title: '任务追溯', |
| | | area: ['800px', '450px'], |
| | | shadeClose: true, |
| | | content: html, |
| | | success: function (layero, dIndex) { |
| | | $(layero).children('.layui-layer-content').css('overflow', 'visible'); |
| | | /** 统计图表 */ |
| | | var traceCharts = echarts.init(document.getElementById('wrkTraceCharts')); |
| | | var traceOptions = { |
| | | title: { |
| | | text: '作业/总量', x: 'center', y: '38%', |
| | | textStyle: {fontSize: 18, color: '#262626', fontWeight: 'normal'}, |
| | | subtextStyle: {fontSize: 36, color: '#10B4E8'}, |
| | | itemGap: 20 |
| | | }, |
| | | color: ['#10B4E8', '#E0E0E0', '#FF0000'], |
| | | tooltip: {trigger: 'item'}, |
| | | series: [{name: '数量', type: 'pie', radius: ['75%', '80%'], label: {normal: {show: false}}}] |
| | | }; |
| | | traceCharts.setOption(traceOptions); |
| | | // 赋值 |
| | | traceCharts.setOption({ |
| | | title: { |
| | | subtext: res.data.wrkQty+"/"+res.data.totalQty |
| | | }, |
| | | series: [ |
| | | { |
| | | data: [ |
| | | {name: '已作业', value: res.data.wrkQty}, |
| | | {name: '未作业', value: res.data.totalQty-res.data.wrkQty-res.data.lackQty}, |
| | | {name: '库存不足', value: res.data.lackQty}, |
| | | ] |
| | | } |
| | | ] |
| | | }); |
| | | } |
| | | }); |
| | | }); |
| | | } else if (res.code === 403){ |
| | | top.location.href = baseUrl+"/"; |
| | | }else { |
| | | layer.msg(res.msg, {icon: 2}); |
| | | } |
| | | } |
| | | }) |
| | | } |
| | | |
| | | layDate.render({ |
| | | elem: '.layui-laydate-range' |
| | | ,type: 'datetime' |
| | |
| | | <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> |
| | | <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all"> |
| | | <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all"> |
| | | <link rel="stylesheet" href="../../static/css/cool.css" media="all"> |
| | | <link rel="stylesheet" href="../../static/css/cool.css" media="all"> |
| | | <!-- <link rel="stylesheet" href="../../static/css/common.css" media="all">--> |
| | | <!--[if lt IE 9]> |
| | | <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> |
| | | <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> |
| | | <![endif]--> |
| | | <style> |
| | | .wrk-trace { |
| | | color: green; |
| | | cursor: pointer; |
| | | margin-left: 6px; |
| | | font-size: 18px; |
| | | } |
| | | |
| | | .layui-timeline:first-child .layui-timeline-item { |
| | | margin-top: 30px; |
| | | } |
| | | .btn-add { |
| | | display: none; |
| | | } |
| | |
| | | </a> |
| | | </span> |
| | | </script> |
| | | <script type="text/html" id="orderNoTpl"> |
| | | {{d.orderNo}} |
| | | {{# 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> |
| | | </script> |
| | | |
| | | <!--<script type="text/html" id="settleTpl">--> |
| | | <!-- <span name="settle" class="layui-badge layui-badge-gray">{{d.settle$}}</span>--> |
| | | <!--</script>--> |
| | |
| | | </div> |
| | | </form> |
| | | </script> |
| | | <!-- 订单任务追溯 --> |
| | | <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-body"> |
| | | <div id="wrkTraceCharts" style="height: 300px;width: 400px;transform: translateX(-10%);"></div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <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){ }} |
| | | <ul class="layui-timeline" style="height: 400px; overflow: scroll;"> |
| | | {{# 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"> |
| | | <div class="layui-timeline-title"> |
| | | <h3 class="inline-block"> |
| | | {{ item.wrkNo }} |
| | | |
| | | {{# 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){ }} |
| | | <span class="layui-badge layui-bg-orange" style="line-height: 20px;"> |
| | | {{ item.wrkMast.ioType$ }} |
| | | </span> |
| | | {{# } }} |
| | | |
| | | |
| | | {{# 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){ }} |
| | | <span class="layui-badge layui-bg-green" style="line-height: 20px;"> |
| | | {{ item.wrkMast.wrkSts$ }} |
| | | </span> |
| | | {{# } }} |
| | | |
| | | </h3>  |
| | | {{ item.wrkMast.ioTime$ }} |
| | | </div> |
| | | |
| | | <table class="layui-table" lay-skin="nob" style="width: 80%"> |
| | | <thead> |
| | | <tr style="background: none"> |
| | | <td>No.</td> |
| | | <td>商品编号</td> |
| | | <td>数量</td> |
| | | </tr> |
| | | </thead> |
| | | <tbody> |
| | | {{# layui.each(item.wrkDetls, function(idx, wrkDetl){ }} |
| | | <tr> |
| | | <td><span class="layui-badge layui-bg-cyan">{{ idx+1 }}</span></td> |
| | | <td>{{ wrkDetl.matnr }}</td> |
| | | <td style="font-weight: bold">{{ wrkDetl.anfme }}</td> |
| | | </tr> |
| | | {{# }); }} |
| | | </tbody> |
| | | </table> |
| | | |
| | | <hr class="layui-border-cyan" style="width: 90%; opacity: .6;"> |
| | | </div> |
| | | </li> |
| | | {{# }); }} |
| | | </ul> |
| | | {{# } 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> |
| | | |
| | | |
| | | </script> |
| | | <script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script> |
| | | <script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script> |
| | | <script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script> |
| | | <script type="text/javascript" src="../../static/js/echarts/echarts.min.js" charset="utf-8"></script> |
| | | <script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script> |
| | | <script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script> |
| | | <script type="text/javascript" src="../../static/js/order/order.js" charset="utf-8"></script> |