自动化立体仓库 - WMS系统
野心家
2025-03-31 dca01762356c16b03fa4cbbc922910afebf07736
wcs电视机代码移植
8个文件已添加
1个文件已修改
491 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/TVController.java 278 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/dto/AxisBean.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/ReportQueryMapper.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/annotations/RateLimit.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/annotations/bit.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/annotations/expr.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/annotations/flag.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/annotations/little.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/annotations/size.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/TVController.java
New file
@@ -0,0 +1,278 @@
package com.zy.asrs.controller;
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.vo.LocChartPie;
import com.zy.asrs.mapper.ReportQueryMapper;
import com.zy.common.model.annotations.RateLimit;
import com.zy.common.properties.SlaveProperties;
import com.zy.common.service.CommonService;
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 SlaveProperties slaveProperties;
    /**
     * 获取当前时间
     */
    @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) // 显示内容
        );
    }
    /**
     * 入库报表 -- 折线图
     */
    @RateLimit(2)
    @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);
    }
    /**
     * 库位使用情况统计
     */
    @RateLimit(2)
    @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) {
        return R.ok();
    }
    /**
     * 异常通知
     */
    @GetMapping("/led/error")
    public R monitorLedError(@RequestParam("ledId") Integer ledId) {
        return R.ok();
    }
    /**
     * 自动补零
     */
    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/mapper/ReportQueryMapper.java
@@ -1,83 +1,53 @@
package com.zy.asrs.mapper;
import com.zy.asrs.entity.*;
import com.zy.asrs.domain.dto.WorkChartAxis;
import com.zy.asrs.domain.vo.LocChartPie;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
@Mapper
@Repository
public interface ReportQueryMapper {
    //分页查询库位使用率
    List<ViewStockUseBean> queryViewStockUseList(ViewStockUseBean viewStockUse);
    int getViewStockUseCount(ViewStockUseBean viewStockUse);
    List<ViewStockUseBean> getViewStockUseAll(ViewStockUseBean viewStockUse);
    //分页查询库存滞留时间
    public List<ViewStayTimeBean> queryViewStayTimeList(ViewStayTimeBean viewStayTime);
    public int getViewStayTimeCount(ViewStayTimeBean viewStayTime);
    //不分页查询所有信息,用于excel导出
    public List<ViewStayTimeBean> getViewStayTimeAll(ViewStayTimeBean viewStayTime);
//    // 库位Map
    @Select("select distinct row1 from asr_loc_mast order by row1 asc")
    List<Integer> getViewLocRowTotal();
    @Select("select distinct lev1 from asr_loc_mast where row1=#{row1} order by lev1 desc")
    public List<String> getViewLocLevCount(@Param("row1") int row1);
//
    @Select("select loc_no as locNo, bay1,loc_sts as locSts from asr_loc_mast where row1=#{row1} and lev1=#{lev1} order by bay1")
    public List<ViewLocMapDto> getViewLocBays(@Param("row1") int row1, @Param("lev1") int lev1);
    // 库位Map
    @Select("select distinct bay1 from asr_loc_mast where row1=#{row1} order by bay1")
    public List<String> getViewLocBayCount(@Param("row1") int row1);
    @Select("select lev1,loc_sts as locSts from asr_loc_mast where row1=#{row1} and bay1=#{bay1} order by bay1")
    public List<ViewLocMapDto> getViewLocLevs(@Param("row1") int row1, @Param("bay1") int bay1);
    //分页查询站点入出库次数统计
    public List<ViewInOutBean> queryViewInOutList(ViewInOutBean viewInOut);
    public int getViewInOutCount(ViewInOutBean viewInOut);
    //不分页查询所有信息,用于excel导出
    public List<ViewInOutBean> getViewInOutAll(ViewInOutBean viewInOut);
    @Select("select \n" +
            "Min(wm.io_time) as node,\n" +
            "isnull(count(1), 0) as val\n" +
            "from asr_wrk_mast_log wm\n" +
            "where wm.wrk_sts = 5 \n" +
            "and (wm.io_type = 1 OR wm.io_type = 54)\n" +
            "and datediff(d, wm.io_time, getdate())<=7 \n" +
            "group by datediff(day,wm.io_time,getdate())\n" +
            "order by Min(wm.io_time) asc\n")
    List<Map<String, Object>> queryPakinRep();
    //分页查询日入库记录
    public List<ViewWorkInBean> queryViewWorkInList(ViewWorkInBean viewWorkIn);
    public int getViewWorkInCount(ViewWorkInBean viewWorkIn);
    //不分页查询所有信息,用于excel导出
    public List<ViewWorkInBean> getViewWorkInAll(ViewWorkInBean viewWorkIn);
    @Select("select\n" +
            "Min(wm.io_time) as node,\n" +
            "isnull(count(1), 0) as val\n" +
            "from asr_wrk_mast_log wm\n" +
            "where 1=1\n" +
            "and ((wm.wrk_sts = 15 AND wm.io_type = 101) OR (wm.wrk_sts = 14 AND wm.io_type = 103))\n" +
            "and datediff(d, wm.io_time, getdate())<=7\n" +
            "group by datediff(day,wm.io_time,getdate())\n" +
            "order by Min(wm.io_time) asc")
    List<Map<String, Object>> queryPakOutRep();
    //分页查询日出库记录
    public List<ViewWorkInBean> queryViewWorkOutList(ViewWorkInBean viewWorkOut);
    public int getViewWorkOutCount(ViewWorkInBean viewWorkOut);
    //不分页查询所有信息,用于excel导出
    public List<ViewWorkInBean> getViewWorkOutAll(ViewWorkInBean viewWorkOut);
    //曲线图
    @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();
    @Select("select * from asr_loc_use_view")
    LocChartPie getLocUseRate();
    // ------图表
    //饼状图
    @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();
    @Select("select count(1) as totalWrk from asr_wrk_mast_log where crn_no = #{crnNo}")
    Integer getTotalWrkByCrnId(Integer crnNo);
    List<ViewWorkCountInView> selectWorkCountIn(@Param("curr") Integer curr, @Param("limit") Integer limit, @Param("matnr")String matnr, @Param("start") String startTime, @Param("end") String endTime);
    @Select("select count(1) as totalLoc from asr_loc_mast")
    Integer getTotalLocByCrnId();
    Integer selectWorkCountInTotal(String matnr, @Param("start") String startTime, @Param("end") String endTime);
    List<ViewWorkCountInView> selectWorkCountOut(@Param("curr") Integer pageNumber, @Param("limit") Integer pageSize, String matnr, @Param("start") String startTime, @Param("end") String endTime);
    Integer selectWorkCountOutTotal(String matnr, @Param("start") String startTime, @Param("end") String endTime);
    Integer selectWorkCountInSum(String matnr, @Param("start") String startTime, @Param("end") String endTime);
    Integer selectWorkCountOutSum(String matnr, @Param("start") String startTime, @Param("end") String endTime);
}
src/main/java/com/zy/common/model/annotations/RateLimit.java
New file
@@ -0,0 +1,15 @@
package com.zy.common.model.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//接口频率限制
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RateLimit {
    int value();//接口频率
}
src/main/java/com/zy/common/model/annotations/bit.java
New file
@@ -0,0 +1,16 @@
package com.zy.common.model.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * 标识注解类
 * @author vincent
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.TYPE,ElementType.METHOD})
public @interface bit {
    int value();
}
src/main/java/com/zy/common/model/annotations/expr.java
New file
@@ -0,0 +1,16 @@
package com.zy.common.model.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * 标识注解类
 * @author vincent
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.TYPE,ElementType.METHOD})
public @interface expr {
    String value();
}
src/main/java/com/zy/common/model/annotations/flag.java
New file
@@ -0,0 +1,16 @@
package com.zy.common.model.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * 标识注解类
 * @author vincent
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.TYPE,ElementType.METHOD})
public @interface flag {
    String value();
}
src/main/java/com/zy/common/model/annotations/little.java
New file
@@ -0,0 +1,14 @@
package com.zy.common.model.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * 小端模式注解类
 * @author vincent
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.TYPE,ElementType.METHOD})
public @interface little {}
src/main/java/com/zy/common/model/annotations/size.java
New file
@@ -0,0 +1,16 @@
package com.zy.common.model.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * 标识注解类
 * @author vincent
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.TYPE,ElementType.METHOD})
public @interface size {
    int value();
}