自动化立体仓库 - WCS系统
zc
4 天以前 58eaf5e73359f7164525d9c50f6e5bf82b247e32
初步调试
5个文件已添加
1个文件已修改
606 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/TVController.java 419 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/dto/AxisBean.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/dto/LocChartPie.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/dto/MatDto.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/dto/WorkChartAxis.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/ReportQueryMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/TVController.java
New file
@@ -0,0 +1,419 @@
package com.zy.asrs.controller;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Arith;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.asrs.domain.dto.AxisBean;
import com.zy.asrs.domain.dto.WorkChartAxis;
import com.zy.asrs.domain.dto.LocChartPie;
import com.zy.asrs.entity.BasDevp;
import com.zy.asrs.entity.BasShuttle;
import com.zy.asrs.entity.BasShuttleErr;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.mapper.ReportQueryMapper;
import com.zy.asrs.service.BasDevpService;
import com.zy.asrs.service.BasShuttleErrService;
import com.zy.asrs.service.BasShuttleService;
import com.zy.asrs.service.WrkMastService;
import com.zy.common.service.CommonService;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.ShuttleSlave;
import com.zy.core.model.command.LedCommand;
import com.zy.core.model.protocol.ShuttleProtocol;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.ShuttleThread;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * Created by vincent on 2020/11/16
 */
@RestController
@RequestMapping("/monitor")
public class TVController {
    private static final String[] WEEK = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
    @Autowired
    private ReportQueryMapper reportQueryMapper;
    @Autowired
    private BasDevpService basDevpService;
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
    private BasShuttleService shuttleService;
    @Autowired
    private SlaveProperties slaveProperties;
    @Autowired
    private BasShuttleErrService basShuttleErrService;
    /**
     * 获取当前时间
     */
    @GetMapping("/date")
    public R monitorDate() {
        Date now = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(now);
        return R.ok(
                Cools.add("year", calendar.get(Calendar.YEAR))
                        .add("month", CommonService.zerofill(String.valueOf(calendar.get(Calendar.MONTH) + 1), 2))
                        .add("day", CommonService.zerofill(String.valueOf(calendar.get(Calendar.DATE)), 2))
                        .add("hour", CommonService.zerofill(String.valueOf(calendar.get(Calendar.HOUR_OF_DAY)), 2))
                        .add("minute", CommonService.zerofill(String.valueOf(calendar.get(Calendar.MINUTE)), 2))
                        .add("second", CommonService.zerofill(String.valueOf(calendar.get(Calendar.SECOND)), 2))
                        .add("week", WEEK[calendar.get(Calendar.DAY_OF_WEEK) - 1])
        );
    }
    /**
     * 获取其他信息
     */
    @GetMapping("/other")
    public R monitorOther(@RequestParam("crnId") Integer crnId, @RequestParam("ledId") Integer sta) {
        return R.ok(
                Cools.add("xSpeed", Arith.multiplys(1, 0, 1)) // 行走速度
                        .add("ySpeed", Arith.multiplys(1, 60, 1))  // 升降速度
                        .add("zSpeed", Arith.multiplys(1, 30, 1))  // 叉牙速度
                        .add("forkPos", 25)  // 叉牙速度
                        .add("xDistance", Arith.multiplys(1, 0, 1))    // 累计走行距离km
                        .add("yDistance", Arith.multiplys(1, 5, 1))   // 累计升降距离km
                        .add("xDuration", Arith.multiplys(1, 0, 1))    // 累计走行时长h
                        .add("yDuration", Arith.multiplys(1, 2, 1))    // 累计升降时长h
                        .add("isShow", !Cools.isEmpty(1)) // 是否显示内容
                        .add("content", 1) // 显示内容
        );
    }
    /**
     * 入库报表 -- 折线图
     */
    @GetMapping("/pakin/rep")
    public R monitorPakinRep() {
        // 入库
        List<Map<String, Object>> pakinRep = reportQueryMapper.queryPakinRep();
        for (Map<String, Object> map : pakinRep) {
            if (map.get("node") != null) {
                map.put("node", String.valueOf(map.get("node")).substring(5, 10));
            }
        }
        // 出库
        List<Map<String, Object>> pakoutRep = reportQueryMapper.queryPakinRep();
        return R.ok(pakinRep);
    }
    @GetMapping("/line/charts")
    public R locIoLineCharts() {
        Map<String, Object> map = new HashMap<String, Object>();
        List<AxisBean> list = new ArrayList<AxisBean>();
        List<WorkChartAxis> listChart = reportQueryMapper.getChartAxis();
        if (listChart != null) {
            ArrayList<Integer> data1 = new ArrayList<Integer>();
            ArrayList<Integer> data2 = new ArrayList<Integer>();
            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.DATE, -12);
            for (int i = 0; i < 12; i++) {
                boolean flag = true;
                calendar.add(Calendar.DATE, 1);
                String str = sf.format(calendar.getTime());
                for (WorkChartAxis workChart : listChart) {
                    if (str.equals(workChart.getYmd())) {
                        data1.add(workChart.getInqty());
                        data2.add(workChart.getOutqty());
                        flag = false;
                        break;
                    }
                }
                if (flag) {
                    data1.add(0);
                    data2.add(0);
                }
            }
            AxisBean inqty = new AxisBean();
            inqty.setName("入库数量");
            Integer[] array1 = new Integer[data1.size()];
            inqty.setData(data1.toArray(array1));
            list.add(inqty);
            AxisBean outqty = new AxisBean();
            outqty.setName("出库数量");
            Integer[] array2 = new Integer[data2.size()];
            outqty.setData(data2.toArray(array2));
            list.add(outqty);
        }
        map.put("rows", list);
        return R.ok(map);
    }
    /**
     * 库位使用情况统计
     */
    @GetMapping("/loc/rep")
    public R monitorLocRep() {
        List<Map<String, Object>> pie = new ArrayList<>();
        LocChartPie locUseRate = reportQueryMapper.getLocUseRate();
        if (locUseRate != null) {
            Map<String, Object> map = new HashMap<>();
            map.put("name", "在库");
            map.put("value", locUseRate.getFqty());
            pie.add(map);
            Map<String, Object> map1 = new HashMap<>();
            map1.put("name", "空");
            map1.put("value", locUseRate.getOqty());
            pie.add(map1);
            Map<String, Object> map2 = new HashMap<>();
            map2.put("name", "使用");
            map2.put("value", locUseRate.getUqty());
            pie.add(map2);
            Map<String, Object> map3 = new HashMap<>();
            map3.put("name", "禁用");
            map3.put("value", locUseRate.getXqty());
            pie.add(map3);
        }
        // 总库位数
        Integer total = (int) Arith.add(0, locUseRate.getFqty(), locUseRate.getOqty(), locUseRate.getUqty(), locUseRate.getXqty());
        // 使用中
        Integer used = locUseRate.getFqty() + locUseRate.getUqty();
        // 库位使用率
        double usedDivides = Arith.divides(3, used, total);
        double usedPr = Arith.multiplys(1, usedDivides, 100);
        return R.ok(
                Cools.add("pie", pie)
                        .add("stockCunt", locUseRate.getFqty())
                        .add("emptyCount", locUseRate.getOqty())
                        .add("noneCount", locUseRate.getXqty())
                        .add("total", total)
                        .add("used", used)
                        .add("usedPr", usedPr)
        );
    }
    /**
     * 获取其他信息
     */
//    @GetMapping("/led")
//    public R monitorLed(@RequestParam("ledId") Integer ledId) {
//        BasDevp basDevp = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no", ledId));
//        if (Cools.isEmpty(basDevp)) {
//            return R.ok();
//        }
//        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", basDevp.getWrkNo()));
//        if (Cools.isEmpty(wrkMast)) {
//            return R.ok();
//        }
//        List<LedCommand> commands = new ArrayList<>();
//
//        // 组装命令
//        LedCommand ledCommand = new LedCommand();
//        ledCommand.setWorkNo(wrkMast.getWrkNo());
//        ledCommand.setIoType(wrkMast.getIoType());
//        // 出库模式
//        switch (wrkMast.getIoType()) {
//            case 1:
//                ledCommand.setTitle("全板入库");
//                break;
//            case 10:
//                ledCommand.setTitle("空板入库");
//                break;
//            case 101:
//                ledCommand.setTitle("全板出库");
//                break;
//            case 103:
//                ledCommand.setTitle("拣料出库");
//                break;
//            case 104:
//                ledCommand.setTitle("并板出库");
//                break;
//            case 107:
//                ledCommand.setTitle("盘点出库");
//                break;
//            case 110:
//                ledCommand.setTitle("空板出库");
//                ledCommand.setEmptyMk(true);
//                break;
//            case 53:
//                ledCommand.setTitle("拣料入库");
//                break;
//            case 57:
//                ledCommand.setTitle("盘点入库");
//                break;
//            case 54:
//                ledCommand.setTitle("并板入库");
//                break;
//            default:
//                break;
//        }
//        ledCommand.setSourceLocNo(wrkMast.getSourceLocNo());
//        ledCommand.setLocNo(wrkMast.getLocNo());
//        ledCommand.setStaNo(wrkMast.getStaNo());
////                ledCommand.setSourceStaNo(wrkMast.getSourceStaNo());
//        if (wrkMast.getIoType() != 110 && wrkMast.getIoType() != 10) {
//            List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(wrkMast.getWrkNo());
//            try {
//                if (wrkMast.getIoType() > 100) {
//                    for (WrkDetl wrkDetl : wrkDetls) {
//                        LocDetl locDetl = locDetlService.selectMatnrSpecs(wrkDetl.getMatnr(), wrkDetl.getSpecs(), wrkMast.getSourceLocNo());
//                        wrkDetl.setWeight(locDetl.getAnfme());
//                    }
//                } else {
//                    for (WrkDetl wrkDetl : wrkDetls) {
//                        wrkDetl.setWeight(wrkDetl.getAnfme());
//                    }
//                }
//            } catch (Exception e) {
////                log.error("工作档案明细输入电视机失败1:异常信息==》"+e);
//            }
//            wrkDetls.forEach(wrkDetl -> ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getAnfme(), wrkDetl.getWeight(), wrkDetl.getSpecs(), wrkDetl.getModel())));
//        }
//        commands.add(ledCommand);
//        return R.ok().add(commands);
//    }
    /**
     * 异常通知
     */
    @GetMapping("/led/error")
    public R monitorLedError(@RequestParam("ledId") Integer ledId) {
        BasDevp basDevp = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no", ledId));
        if (Cools.isEmpty(basDevp)) {
            return R.ok();
        }
        if (Cools.isEmpty(basDevp.getArea())) {
            return R.ok();
        }
        if (basDevp.getLoading().equals("N")) {
            basDevp.setArea("");
            basDevpService.updateById(basDevp);
            return R.ok();
        }
        String errorMsg = basDevp.getArea();
        return R.ok().add(errorMsg);
    }
    /**
     * 设备异常通知
     */
    @GetMapping("/device/error")
    public R monitorDeviceError() {
        ArrayList<HashMap<String, Object>> list = new ArrayList<>();
        List<BasShuttle> basCrnpLiset = shuttleService.selectList(new EntityWrapper<BasShuttle>());
        for (ShuttleSlave shuttleSlave : slaveProperties.getShuttle()) {
            // 获取四向穿梭车信息
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleSlave.getId());
            if (shuttleThread == null) {
                continue;
            }
            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
            if (shuttleProtocol == null) {
                continue;
            }
            HashMap<String, Object> map = new HashMap<>();
            int i = Integer.parseInt(shuttleProtocol.getErrorCode());
            if (i > 0) {
                BasShuttleErr basShuttleErr = basShuttleErrService.queryByCode(i);
                String errName = basShuttleErr == null ? "未知异常" : basShuttleErr.getErrName();
                //故障中
                map.put("deviceNo", shuttleProtocol.getShuttleNo());//设备号-小车号
                map.put("errorMsg", errName);//异常信息
                map.put("device", "四向车");//异常信息
                list.add(map);
            }
        }
        return R.ok().add(list);
    }
    /**
     * 自动补零
     */
    private List<Map<String, Object>> fill(List<Map<String, Object>> list, int start, int end) {
        for (int i = start; i <= end; i++) {
            boolean exist = false;
            for (Map seq : list) {
                if (Integer.parseInt(String.valueOf(seq.get("node"))) == i) {
                    exist = true;
                }
            }
            if (!exist) {
                HashMap<String, Object> map = new HashMap<>();
                map.put("node", i);
                map.put("val", 0);
                list.add(map);
            }
        }
        list.sort(Comparator.comparingInt(o -> (int) o.get("node")));
        return list;
    }
    /**
     * x轴单位转换
     *
     * @param dot y轴数值保留小数位
     */
    private List<Map<String, Object>> convert(List<Map<String, Object>> list, StatsType statsType, int dot) {
        for (Map<String, Object> map : list) {
            Object val = map.get("val");
            map.put("val", Arith.multiplys(dot, 1, (Number) val));
            Object node = map.get("node");
            switch (statsType) {
                case MONTH:
                    map.put("node", node + "号");
                    break;
                case YEAR:
                    map.put("node", node + "月");
                    break;
                default:
                    break;
            }
        }
        return list;
    }
    enum StatsType {
        YEAR(1, 1, 12),
        MONTH(2, 1, 30),
        ;
        int id;
        int start;
        int end;
        StatsType(int id, int start, int end) {
            this.id = id;
            this.start = start;
            this.end = end;
        }
        static StatsType get(int id) {
            StatsType[] values = StatsType.values();
            for (StatsType statsType : values) {
                if (statsType.id == id) {
                    return statsType;
                }
            }
            throw new RuntimeException("找不到StatsType类型");
        }
    }
}
src/main/java/com/zy/asrs/domain/dto/AxisBean.java
New file
@@ -0,0 +1,24 @@
package com.zy.asrs.domain.dto;
/**
 * 曲线图表json键
 * @author admin
 *
 */
public class AxisBean {
    private String name;
    private Integer[] data;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer[] getData() {
        return data;
    }
    public void setData(Integer[] data) {
        this.data = data;
    }
}
src/main/java/com/zy/asrs/domain/dto/LocChartPie.java
New file
@@ -0,0 +1,37 @@
package com.zy.asrs.domain.dto;
/**
 * 库位占用百分比
 * @author admin
 * @date 2018年12月12日
 */
public class LocChartPie {
    private int fqty;
    private int oqty;
    private int uqty;
    private int xqty;
    public int getFqty() {
        return fqty;
    }
    public void setFqty(int fqty) {
        this.fqty = fqty;
    }
    public int getOqty() {
        return oqty;
    }
    public void setOqty(int oqty) {
        this.oqty = oqty;
    }
    public int getUqty() {
        return uqty;
    }
    public void setUqty(int uqty) {
        this.uqty = uqty;
    }
    public int getXqty() {
        return xqty;
    }
    public void setXqty(int xqty) {
        this.xqty = xqty;
    }
}
src/main/java/com/zy/asrs/domain/dto/MatDto.java
New file
@@ -0,0 +1,80 @@
package com.zy.asrs.domain.dto;
import lombok.Data;
/**
 * Created by vincent on 2020/8/6
 */
@Data
public class MatDto {
    // 物料编号
    private String matnr;
    // 物料名称
    private String maknx;
    private String batch;
    private String specs;
    // 客户信息
    private String manu;
    // 备注
    private String memo;
    // 物料数量
    private Double count;
    private Double total;
    private String orderNo;
    private String customer;
    public MatDto() {
    }
    public MatDto(String matnr, String maknx, String batch, String specs, String manu, String memo, Double count, Double total) {
        this.matnr = matnr;
        this.maknx = maknx;
        this.batch = batch;
        this.specs = specs;
        this.manu = manu;
        this.memo = memo;
        this.count = count;
        this.total = total;
    }
    public MatDto(String matnr, String maknx, String batch, String specs, String manu, String memo, Double count, Double total, String orderNo, String customer) {
        this.matnr = matnr;
        this.maknx = maknx;
        this.batch = batch;
        this.specs = specs;
        this.manu = manu;
        this.memo = memo;
        this.count = count;
        this.total = total;
        this.orderNo = orderNo;
        this.customer = customer;
    }
    public MatDto(String matNo, String maknx, Double count) {
        this.matnr = matNo;
        this.maknx = maknx;
        this.count = count;
    }
    public MatDto(String matNo, String maknx, Double count, String specs) {
        this.specs = specs;
        this.matnr = matNo;
        this.maknx = maknx;
        this.count = count;
    }
    public MatDto(String matNo, String maknx, Double count, Double total, String specs) {
        this.specs = specs;
        this.matnr = matNo;
        this.maknx = maknx;
        this.count = count;
        this.total = total;
    }
}
src/main/java/com/zy/asrs/domain/dto/WorkChartAxis.java
New file
@@ -0,0 +1,31 @@
package com.zy.asrs.domain.dto;
/**
 * 入出库统计曲线图
 * @author admin
 * @date 2018年12月12日
 */
public class WorkChartAxis {
    private String ymd;
    private int inqty;
    private int outqty;
    public String getYmd() {
        return ymd;
    }
    public void setYmd(String ymd) {
        this.ymd = ymd;
    }
    public int getInqty() {
        return inqty;
    }
    public void setInqty(int inqty) {
        this.inqty = inqty;
    }
    public int getOutqty() {
        return outqty;
    }
    public void setOutqty(int outqty) {
        this.outqty = outqty;
    }
}
src/main/java/com/zy/asrs/mapper/ReportQueryMapper.java
@@ -1,5 +1,7 @@
package com.zy.asrs.mapper;
import com.zy.asrs.domain.dto.LocChartPie;
import com.zy.asrs.domain.dto.WorkChartAxis;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
@@ -10,6 +12,7 @@
@Mapper
@Repository
public interface ReportQueryMapper {
    @Select("select \n" +
            "Min(wm.io_time) as node,\n" +
            "isnull(count(1), 0) as val\n" +
@@ -20,4 +23,16 @@
            "group by datediff(day,wm.io_time,getdate())\n" +
            "order by Min(wm.io_time) asc\n")
    List<Map<String, Object>> queryPakinRep();
    //饼状图
    @Select("select * from asr_loc_use_view")
    public LocChartPie getLocUseRate();
    //曲线图
    @Select("select ymd,SUM(sto_qty) inqty,SUM(ret_qty) outqty from asr_sta_inout_view "
            + "where ymd>CONVERT(char(10), DATEADD(DAY,-12,GETDATE()), 120) group by ymd order by ymd")
    public List<WorkChartAxis> getChartAxis();
}