自动化立体仓库 - WMS系统
野心家
2025-03-31 0823adb64bcb21d38ba022888ea8f2a0dc1a8541
wcs电视机代码移植
26个文件已添加
1517 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/TVController.java 361 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enums/model/BillDto.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enums/model/DetlDto.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enums/model/ErpUpload.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enums/model/KeyValueVo.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enums/model/LocDetlDto.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enums/model/LocDto.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enums/model/LocTypeDto.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enums/model/MatnrDto.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enums/model/MesCombParam.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enums/model/MesPakinParam.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enums/model/MesPakoutParam.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enums/model/MobileLocDetlVo.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enums/model/OutLocDto.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enums/model/PageParam.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enums/model/PowerDto.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enums/model/Shelves.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enums/model/StartupDto.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enums/model/TaskDto.java 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enums/model/UploadBill.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enums/model/UploadBillDetail.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enums/model/WrkDto.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enums/model/enums/HtmlNavIconType.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enums/model/enums/IoWorkType.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enums/model/enums/SysOsType.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enums/model/enums/WorkNoType.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/TVController.java
New file
@@ -0,0 +1,361 @@
package com.zy.asrs.controller;
import com.core.common.Arith;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.asrs.mapper.ReportQueryMapper;
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.*;
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.service.CommonService;
import com.zy.core.CrnThread;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.LedSlave;
import com.zy.core.model.command.LedCommand;
import com.zy.core.model.protocol.CrnProtocol;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.LedThread;
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;
    /**
     * 获取当前时间
     */
    @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", 30)  // 叉牙速度
                        .add("xDistance", Arith.multiplys(1, 0, 1))    // 累计走行距离km
                        .add("yDistance", Arith.multiplys(1, 3, 1))   // 累计升降距离km
                        .add("xDuration", Arith.multiplys(1, 0, 1))    // 累计走行时长h
                        .add("yDuration", Arith.multiplys(1, 1, 1))    // 累计升降时长h
                        .add("isShow", !Cools.isEmpty(200)) // 是否显示内容
                        .add("content", 200) // 显示内容
        );
    }
    /**
     * 入库报表 -- 折线图
     */
    @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) {
        String ledContent = "";
        List<LedCommand> commandList = null;
        for (LedSlave slave : slaveProperties.getLed()) {
            if (slave.getStaArr().contains(ledId)) {
                LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, slave.getId());
                if (null != ledThread) {
                    ledContent = ledThread.getStringBuffer().toString();
                    commandList = ledThread.getCommandList();
                }
            }
        }
        return R.ok().add(commandList);
    }
    /**
     * 异常通知
     */
    @GetMapping("/led/error")
    public R monitorLedError(@RequestParam("ledId") Integer ledId) {
        String errorMsg = "";
        for (LedSlave slave : slaveProperties.getLed()) {
            if (slave.getStaArr().contains(ledId)) {
                LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, slave.getId());
                if (null != ledThread) {
                    errorMsg = ledThread.getErrorMsg().toString();
                }
            }
        }
        return R.ok().add(errorMsg);
    }
    /**
     * 自动补零
     */
    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/common/model/enums/model/BillDto.java
New file
@@ -0,0 +1,15 @@
package com.zy.common.model.enums.model;
import lombok.Data;
/**
 * Created by vincent on 2021/3/23
 */
@Data
public class BillDto {
    private String matnr;
    private Double qty;
}
src/main/java/com/zy/common/model/enums/model/DetlDto.java
New file
@@ -0,0 +1,88 @@
package com.zy.common.model.enums.model;
import com.core.common.Cools;
import com.zy.asrs.entity.OrderDetl;
import lombok.Data;
import java.util.List;
import java.util.Set;
/**
 * Created by vincent on 2022/3/25
 */
@Data
public class DetlDto {
    private String orderNo;
    private String matnr;
    private String batch;
    private Double anfme;
    public DetlDto() {
    }
    public DetlDto(String matnr, Double anfme) {
        this.matnr = matnr;
        this.anfme = anfme;
    }
    public DetlDto(String matnr, String batch) {
        this.matnr = matnr;
        this.batch = batch;
    }
    public DetlDto(String matnr, String batch, Double anfme) {
        this.matnr = matnr;
        this.batch = batch;
        this.anfme = anfme;
    }
    public DetlDto(String orderNo, String matnr, String batch, Double anfme) {
        this.orderNo = orderNo;
        this.matnr = matnr;
        this.batch = batch;
        this.anfme = anfme;
    }
    public static boolean hasList(Set<DetlDto> detlDtos, OrderDetl orderDetl) {
        for (DetlDto dto : detlDtos) {
            if (Cools.isEmpty(dto.getBatch()) && Cools.isEmpty(orderDetl.getBatch())) {
                if (dto.getMatnr().equals(orderDetl.getMatnr())) {
                    return true;
                }
            } else {
                if (!Cools.isEmpty(dto.getBatch()) && !Cools.isEmpty(orderDetl.getBatch())) {
                    if (dto.getMatnr().equals(orderDetl.getMatnr()) && dto.getBatch().equals(orderDetl.getBatch())) {
                        return true;
                    }
                }
            }
        }
        return false;
    }
    public static boolean has(List<DetlDto> detlDtos, DetlDto detlDto) {
        for (DetlDto dto : detlDtos) {
            if (dto.getMatnr().equals(detlDto.getMatnr()) && Cools.eq(dto.getBatch(), detlDto.getBatch())) {
                return true;
            }
        }
        return false;
    }
    public static DetlDto find(List<DetlDto> detlDtos, String matnr, String batch) {
        if (Cools.isEmpty(matnr)) {
            return null;
        }
        for (DetlDto detlDto : detlDtos) {
            if (matnr.equals(detlDto.getMatnr()) && Cools.eq(batch, detlDto.getBatch())) {
                return detlDto;
            }
        }
        return null;
    }
}
src/main/java/com/zy/common/model/enums/model/ErpUpload.java
New file
@@ -0,0 +1,19 @@
package com.zy.common.model.enums.model;
import lombok.Data;
import java.util.List;
/**
 * Created by vincent on 2021/6/18
 */
@Data
public class ErpUpload {
    private List<BillDto> dtos;
    private Integer docId;
    private String docNumber;
}
src/main/java/com/zy/common/model/enums/model/KeyValueVo.java
New file
@@ -0,0 +1,16 @@
package com.zy.common.model.enums.model;
import lombok.Data;
/**
 * Created by vincent on 2022/3/23
 */
@Data
public class KeyValueVo {
    private String name;
    private String value;
}
src/main/java/com/zy/common/model/enums/model/LocDetlDto.java
New file
@@ -0,0 +1,37 @@
package com.zy.common.model.enums.model;
import com.zy.asrs.entity.LocDetl;
/**
 * Created by vincent on 2020/6/17
 */
public class LocDetlDto {
    private LocDetl locDetl;
    private Double count;
    public LocDetlDto() {
    }
    public LocDetlDto(LocDetl locDetl, Double count) {
        this.locDetl = locDetl;
        this.count = count;
    }
    public LocDetl getLocDetl() {
        return locDetl;
    }
    public void setLocDetl(LocDetl locDetl) {
        this.locDetl = locDetl;
    }
    public Double getCount() {
        return count;
    }
    public void setCount(Double count) {
        this.count = count;
    }
}
src/main/java/com/zy/common/model/enums/model/LocDto.java
New file
@@ -0,0 +1,72 @@
package com.zy.common.model.enums.model;
import com.core.common.Cools;
import lombok.Data;
import java.util.List;
/**
 * Created by vincent on 2022/3/28
 */
@Data
public class LocDto {
    private String locNo;
    private String matnr;
    private String maktx;
    private String batch;
    private String orderNo;
    private Double anfme;
    private boolean lack = false;
    //目标站点
    private List<Integer> staNos;
    private Integer staNo;
    public LocDto() {
    }
    public LocDto(String locNo, String matnr, String batch, Double anfme) {
        this.locNo = locNo;
        this.matnr = matnr;
        this.batch = batch;
        this.anfme = anfme;
    }
    public LocDto(String locNo, String matnr, String batch, String orderNo, Double anfme) {
        this.locNo = locNo;
        this.matnr = matnr;
        this.batch = batch;
        this.orderNo = orderNo;
        this.anfme = anfme;
    }
    public LocDto(String locNo, String matnr, String maktx, String batch, String orderNo, Double anfme) {
        this.locNo = locNo;
        this.matnr = matnr;
        this.maktx = maktx;
        this.batch = batch;
        this.orderNo = orderNo;
        this.anfme = anfme;
    }
    public String getTitle() {
        return this.matnr + "(" + this.maktx + ")";
    }
    public void setStaNos(List<Integer> staNos) {
        this.staNos = staNos;
        if (!Cools.isEmpty(staNos)) {
            this.staNo = staNos.get(0);
        }
    }
}
src/main/java/com/zy/common/model/enums/model/LocTypeDto.java
New file
@@ -0,0 +1,40 @@
package com.zy.common.model.enums.model;
import com.alibaba.fastjson.JSON;
import com.core.exception.CoolException;
import com.zy.asrs.entity.BasDevp;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
/**
 * Created by vincent on 2020/10/19
 */
@Slf4j
@Data
public class LocTypeDto {
    // 高低类型{0:未知,1:低库位,2:高库位}
    private Short locType1;
    // 宽窄类型{0:未知,1:窄库位,2:宽库位}
    private Short locType2;
    // 轻重类型{0:未知,1:轻库位,2:重库位}
    private Short locType3;
    public LocTypeDto() {
    }
    public LocTypeDto(BasDevp basDevp) {
        if (basDevp.getLocType1() == null || basDevp.getLocType1() == 0) {
            throw new CoolException("plc高低检测异常");
        }
        if (basDevp.getLocType1() == 1) {
            this.locType1 = 1; // 低库位
        } else {
            this.locType1 = 2; // 高库位
        }
        log.info(JSON.toJSONString(this));
    }
}
src/main/java/com/zy/common/model/enums/model/MatnrDto.java
New file
@@ -0,0 +1,15 @@
package com.zy.common.model.enums.model;
import lombok.Data;
/**
 * Created by vincent on 2021/3/31
 */
@Data
public class MatnrDto {
    private String matnr;
    private Double count;
}
src/main/java/com/zy/common/model/enums/model/MesCombParam.java
New file
@@ -0,0 +1,50 @@
package com.zy.common.model.enums.model;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
 * Created by vincent on 2022/4/21
 */
@Data
public class MesCombParam {
    // 托盘条码
    private String zpallet;
    // 帮托时间
    private String pakinTime;
    // 仓库编号 - 写死
    private String lgort;
    // 新增
    private String plantCode;
    private String fromCode;
    private String stationCode;
    private List<Detl> list = new ArrayList<>();
    @Data
    public static class Detl {
        // 物料条码
        private String barcode;
        // 数量
        private Double anfme;
        public Detl() {
        }
        public Detl(String barcode, Double anfme) {
            this.barcode = barcode;
            this.anfme = anfme;
        }
    }
}
src/main/java/com/zy/common/model/enums/model/MesPakinParam.java
New file
@@ -0,0 +1,43 @@
package com.zy.common.model.enums.model;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
 * Created by vincent on 2022/4/21
 */
@Data
public class MesPakinParam {
    // 入库时间
    private String pakinTime;
    // 来源地 - 写死
    private String lgortFrom;
    // 目的地 - 写死
    private String lgortTo;
    private List<Detl> list = new ArrayList<>();
    @Data
    public static class Detl {
        // 物料条码
        private String barcode;
        // 数量
        private Double anfme;
        public Detl() {
        }
        public Detl(String barcode, Double anfme) {
            this.barcode = barcode;
            this.anfme = anfme;
        }
    }
}
src/main/java/com/zy/common/model/enums/model/MesPakoutParam.java
New file
@@ -0,0 +1,71 @@
package com.zy.common.model.enums.model;
import com.alibaba.fastjson.JSON;
import com.core.common.DateUtils;
import lombok.Data;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
 * Created by vincent on 2022/4/21
 */
@Data
public class MesPakoutParam {
    // true: 订单出; false: 手动出
    private boolean tag;
    // 单据编号
    private String orderNo;
    // 出库时间
    private String pakoutTime;
    // 来源地 - 写死
    private String lgortFrom;
    // 目的地 - 写死
    private String lgortTo;
    // 客户号
    private String kunnr;
    private List<Detl> list = new ArrayList<>();
    @Data
    public static class Detl {
        // 物料条码
        private String barcode;
        // 数量
        private Double anfme;
        public Detl() {
        }
        public Detl(String barcode, Double anfme) {
            this.barcode = barcode;
            this.anfme = anfme;
        }
    }
    public static void main(String[] args) {
        MesPakoutParam param = new MesPakoutParam();
        param.setTag(true);
        param.setOrderNo("8135998");
        param.setPakoutTime(DateUtils.convert(new Date()));
        param.setLgortFrom("5006");
        param.setLgortTo("1111");
        Detl detl = new Detl();  param.getList().add(detl);
        detl.setBarcode("1100146-10000-23132132");
        detl.setAnfme(1.0D);
        System.out.println(JSON.toJSONString(param));
    }
}
src/main/java/com/zy/common/model/enums/model/MobileLocDetlVo.java
New file
@@ -0,0 +1,47 @@
package com.zy.common.model.enums.model;
/**
 * Created by vincent on 2020/6/29
 */
public class MobileLocDetlVo {
    private String locNo;
    private String matnr;
    private String maktx;
    private Double count;
    public String getLocNo() {
        return locNo;
    }
    public void setLocNo(String locNo) {
        this.locNo = locNo;
    }
    public String getMatnr() {
        return matnr;
    }
    public void setMatnr(String matnr) {
        this.matnr = matnr;
    }
    public String getMaktx() {
        return maktx;
    }
    public void setMaktx(String maktx) {
        this.maktx = maktx;
    }
    public Double getCount() {
        return count;
    }
    public void setCount(Double count) {
        this.count = count;
    }
}
src/main/java/com/zy/common/model/enums/model/OutLocDto.java
New file
@@ -0,0 +1,65 @@
package com.zy.common.model.enums.model;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.common.SpringUtils;
import com.core.exception.CoolException;
import com.zy.asrs.entity.LocDetl;
import com.zy.asrs.service.LocDetlService;
import lombok.Data;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
 * Created by vincent on 2020/6/17
 */
@Data
public class OutLocDto {
    private String locNo;
    private List<LocDetlDto> locDetlDtos = new ArrayList<>();
    public OutLocDto() {
    }
    public OutLocDto(String locNo, LocDetlDto locDetlDto) {
        this.locNo = locNo;
        this.locDetlDtos.add(locDetlDto);
    }
    public boolean isAll(){
        List<LocDetlDto> locDetlDtosCp = new ArrayList<>(this.locDetlDtos);
        // 查询当前库位号所有的库存明细
        LocDetlService locDetlService = SpringUtils.getBean(LocDetlService.class);
        List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", this.locNo));
        if (locDetls == null || locDetls.isEmpty()){
            throw new CoolException("检索库存明细失败,库位号=" + this.locNo);
        }
        int sameNumber = 0;
        for (LocDetl locDetl : locDetls) {
            Iterator<LocDetlDto> iterator = locDetlDtosCp.iterator();
            while (iterator.hasNext()) {
                LocDetlDto next = iterator.next();
                if (!next.getLocDetl().getMatnr().equals(locDetl.getMatnr())) {
                    continue;
                }
                if (!Cools.eq(next.getLocDetl().getBatch(), locDetl.getBatch())) {
                    continue;
                }
                if (next.getCount() > locDetl.getAnfme()) {
                    throw new CoolException("服务器内部错误");
                }
                if (next.getCount().equals(locDetl.getAnfme())) {
                    sameNumber++;
                    iterator.remove();
                    break;
                }
            }
        }
        return sameNumber == locDetls.size();
    }
}
src/main/java/com/zy/common/model/enums/model/PageParam.java
New file
@@ -0,0 +1,33 @@
package com.zy.common.model.enums.model;
import io.swagger.annotations.ApiModelProperty;
/**
 * 分页参数
 * Created by vincent on 2020-04-10
 */
public class PageParam {
    @ApiModelProperty(value="分页索引",required=true)
    private int page = 1;
    @ApiModelProperty(value="单页数量",required=true)
    private int size = 10;
    public Integer getPage() {
        return page;
    }
    public void setPage(Integer page) {
        this.page = page;
    }
    public Integer getSize() {
        return size;
    }
    public void setSize(Integer size) {
        this.size = size;
    }
}
src/main/java/com/zy/common/model/enums/model/PowerDto.java
New file
@@ -0,0 +1,29 @@
package com.zy.common.model.enums.model;
import java.util.List;
/**
 * Created by vincent on 2020-05-12
 */
public class PowerDto {
    private String two;
    private List<String> three;
    public String getTwo() {
        return two;
    }
    public void setTwo(String two) {
        this.two = two;
    }
    public List<String> getThree() {
        return three;
    }
    public void setThree(List<String> three) {
        this.three = three;
    }
}
src/main/java/com/zy/common/model/enums/model/Shelves.java
New file
@@ -0,0 +1,129 @@
package com.zy.common.model.enums.model;
import com.alibaba.fastjson.JSON;
import com.core.common.Arith;
import com.core.exception.CoolException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
 * <strong>立库货架实体类</strong>
 * Created by vincent on 2020/6/11
 */
public class Shelves {
    // 货架排数量
    public final int size;
    // 货架组数量
    public final int group;
    // 偏移量[default:0]
    public final int offset;
    // 货架实例节点集合
    public List<List<Integer>> nodes;
    public Shelves(int size, int group) {
        this(size, group, 0);
    }
    /**
     * @param size 货架单排总数
     * @param group 货架组数量
     * @param offset 序列号偏移量
     */
    public Shelves(int size, int group, int offset) {
        this.size = size;
        this.group = group;
        this.offset = offset;
        init();
    }
    /**
     * 初始化方法【私有】
     */
    private void init(){
        if (group == 0 || size%group != 0) {
            throw new RuntimeException("shelves init fail!");
        }
        nodes = new ArrayList<>();
        for (int g = 1; g <= this.group; g++){
            int unit = size/group;
            List<Integer> node = new ArrayList<>();
            for (int i = (g-1)*unit+1+offset ; i <= g*unit+offset; i++){
                node.add(i);
            }
            nodes.add(node);
        }
    }
    /**
     * 开始计算 =======>>>
     *
     *          货架命中规则如下:
     *              安装位置:   [1]  [2]  |  [3]  [4]  --------  [5] [6]  |  [7] [8]
     *                  命中顺序:      1 -> 5 -> 4 -> 8 -> 2 -> 6 -> 3 -> 7 -> 1 ...
     *
     *          1.该规则适不限制货架数量,总数与组别在构造器中设置
     *          2.如有序列号起始问题,用偏移量规避即可
     *
     * @param curSeq 当前货架号
     * @return 规则命中货架号
     */
    public int start(int curSeq){
        Iterator<List<Integer>> iterator = nodes.iterator();
        while (iterator.hasNext()){
            List<Integer> node = iterator.next();
            if (node.contains(curSeq)) {
                int idx = node.indexOf(curSeq);
                // 是否为末尾货架
                if (iterator.hasNext()) {
                    return iterator.next().get(idx);
                } else {
                    List<Integer> first = nodes.get(0);
                    int val = first.get(idx);
                    int res = size / group + 1 + offset - val;
                    // 反向命中货架时不再是对立下标(相对于巷道)
                    if (res < val) {
                        // 轮询所有货架后重新开始定位
                        if (val - res - offset == 1) {
                            return first.get(0);
                        }
                        res = res + 1;
                    }
                    return res + offset;
                }
            }
        }
        return -1;
    }
    public Integer get(Integer curRow) {
        for (List<Integer> node : nodes){
            if (node.contains(curRow)) {
                return nodes.indexOf(node) + 1;
            }
        }
        throw new CoolException("货排检索系统报错, node:" + JSON.toJSONString(nodes) + ", curRow:" + curRow);
    }
    public static void main(String[] args) throws InterruptedException {
        double remainder = Arith.divides(1,16 - 1, 16);
        System.out.println(remainder);
        System.out.println((int) remainder);
//        Shelves shelves = new Shelves(8,2);
//        System.out.println(shelves.nodes.toString());
//        int start = 1;
//        while (true) {
//            System.out.println(start);
//            start = shelves.start(start);
//            Thread.sleep(500L);
//        }
    }
}
src/main/java/com/zy/common/model/enums/model/StartupDto.java
New file
@@ -0,0 +1,21 @@
package com.zy.common.model.enums.model;
import lombok.Data;
/**
 * Created by vincent on 2020/6/11
 */
@Data
public class StartupDto {
    private Integer sourceStaNo;
    private Integer staNo;
    private Integer crnNo;
    private String locNo;
    private Integer workNo;
}
src/main/java/com/zy/common/model/enums/model/TaskDto.java
New file
@@ -0,0 +1,124 @@
package com.zy.common.model.enums.model;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.common.SpringUtils;
import com.core.exception.CoolException;
import com.zy.asrs.entity.LocDetl;
import com.zy.asrs.service.LocDetlService;
import lombok.Data;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
 * Created by vincent on 2022/3/28
 */
@Data
public class TaskDto {
    private String locNo;
    private Integer staNo;
    private List<LocDto> locDtos;
    {
        locDtos = new ArrayList<>();
    }
    public TaskDto(String locNo, Integer staNo) {
        this.locNo = locNo;
        this.staNo = staNo;
    }
    public TaskDto(String locNo, Integer staNo, LocDto locDto) {
        this.locNo = locNo;
        this.staNo = staNo;
        this.locDtos.add(locDto);
    }
    public TaskDto(String locNo, Integer staNo, List<LocDto> locDtos) {
        this.locNo = locNo;
        this.staNo = staNo;
        this.locDtos = locDtos;
    }
    public static boolean has(List<TaskDto> list, TaskDto dto) {
        if (Cools.isEmpty(list)) {
            return false;
        }
        for (TaskDto taskDto : list) {
            if (dto.getLocNo().equals(taskDto.getLocNo()) && taskDto.getStaNo().equals(dto.getStaNo())) {
                return true;
            }
        }
        return false;
    }
    public static TaskDto find(List<TaskDto> list, TaskDto dto) {
        if (Cools.isEmpty(list)) {
            return null;
        }
        for (TaskDto taskDto : list) {
            if (dto.getLocNo().equals(taskDto.getLocNo()) && taskDto.getStaNo().equals(dto.getStaNo())) {
                return taskDto;
            }
        }
        return null;
    }
    public boolean isAll(){
        // 汇总不考虑序列码
        List<DetlDto> detlDtos = new ArrayList<>();
        for (LocDto locDto : this.getLocDtos()) {
            DetlDto dto = new DetlDto(locDto.getMatnr(), locDto.getBatch(), locDto.getAnfme());
            if (DetlDto.has(detlDtos, dto)) {
                DetlDto detlDto = DetlDto.find(detlDtos, locDto.getMatnr(), dto.getBatch());
                assert detlDto != null;
                detlDto.setAnfme(detlDto.getAnfme() + locDto.getAnfme());
            } else {
                detlDtos.add(new DetlDto(locDto.getMatnr(), locDto.getBatch(), locDto.getAnfme()));
            }
        }
        // 查询当前库位号所有的库存明细
        LocDetlService locDetlService = SpringUtils.getBean(LocDetlService.class);
        List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", this.locNo));
        if (locDetls == null || locDetls.isEmpty()){
            throw new CoolException("检索库存明细失败,库位号=" + this.locNo);
        }
        int sameNumber = 0;
        for (LocDetl locDetl : locDetls) {
            Iterator<DetlDto> iterator = detlDtos.iterator();
            while (iterator.hasNext()) {
                DetlDto dto = iterator.next();
                if (!dto.getMatnr().equals(locDetl.getMatnr())) {
                    continue;
                }
                if (Cools.isEmpty(dto.getBatch()) && !Cools.isEmpty(locDetl.getBatch())) {
                    continue;
                }
                if (!Cools.isEmpty(dto.getBatch()) && Cools.isEmpty(locDetl.getBatch())) {
                    continue;
                }
                if (!Cools.isEmpty(dto.getBatch()) && !Cools.isEmpty(locDetl.getBatch())) {
                    if (!dto.getBatch().equals(locDetl.getBatch())) {
                        continue;
                    }
                }
                if (dto.getAnfme() > locDetl.getAnfme()) {
                    throw new CoolException("服务器内部错误");
                }
                if (dto.getAnfme().equals(locDetl.getAnfme())) {
                    sameNumber++;
                    iterator.remove();
                    break;
                }
            }
        }
        return sameNumber == locDetls.size();
    }
}
src/main/java/com/zy/common/model/enums/model/UploadBill.java
New file
@@ -0,0 +1,32 @@
package com.zy.common.model.enums.model;
import lombok.Data;
import java.util.List;
/**
 * Created by vincent on 2021/3/23
 */
@Data
public class UploadBill {
    private String number;
    private Integer vchType;
    private String billDate;
    private String bTypeID;
    private String kTypeID;
    private String summary;
    // 自增
    private Double Vchcode;
    private Integer difAtype;
    private List<UploadBillDetail> detail;
}
src/main/java/com/zy/common/model/enums/model/UploadBillDetail.java
New file
@@ -0,0 +1,24 @@
package com.zy.common.model.enums.model;
import lombok.Data;
/**
 * Created by vincent on 2021/3/23
 */
@Data
public class UploadBillDetail {
    private String userCode;
    private Double qty;
    private Integer Price;
    private String comment;
    private String unit;
    // 商品明细行号
    private Double RowNo;
}
src/main/java/com/zy/common/model/enums/model/WrkDto.java
New file
@@ -0,0 +1,26 @@
package com.zy.common.model.enums.model;
import com.zy.asrs.entity.WrkDetl;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
 * Created by vincent on 2022/5/13
 */
@Data
public class WrkDto {
    private Integer wrkNo;
    private List<WrkDetl> wrkDetls = new ArrayList<>();
    public WrkDto() {
    }
    public WrkDto(Integer wrkNo, WrkDetl wrkDetl) {
        this.wrkNo = wrkNo;
        this.wrkDetls .add(wrkDetl);
    }
}
src/main/java/com/zy/common/model/enums/model/enums/HtmlNavIconType.java
New file
@@ -0,0 +1,51 @@
package com.zy.common.model.enums.model.enums;
public enum HtmlNavIconType {
    INDEX("index", "layui-icon-home"),
    SYSTEM("system", "layui-icon-component"),
    SET("set", "layui-icon-set"),
    MERCHANT("merchant", "layui-icon-user"),
    DEVELOP("develop", "layui-icon-util"),
    STOCK("stock", "layui-icon-templeate-1"),
    LOG_REPORT("logReport", "layui-icon-read"),
    IO_WORK("ioWork", "layui-icon-flag"),
    WORK_FLOW("workFlow", "layui-icon-form"),
    BASE("base", "layui-icon-file"),
    ORDER("erp", "layui-icon-senior"),
    SENSOR("sensor", "layui-icon-engine"),
    ;
    private String code;
    private String icon;
    HtmlNavIconType(String code, String icon){
        this.code = code;
        this.icon = icon;
    }
    public static String get(String code) {
        for (HtmlNavIconType type : HtmlNavIconType.values()){
            if (type.code.equals(code)){
                return type.icon;
            }
        }
        return "layui-icon-file-b";
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getIcon() {
        return icon;
    }
    public void setIcon(String icon) {
        this.icon = icon;
    }
}
src/main/java/com/zy/common/model/enums/model/enums/IoWorkType.java
New file
@@ -0,0 +1,12 @@
package com.zy.common.model.enums.model.enums;
public enum IoWorkType {
    ALL_IN,
    PICK_IN,
    ALL_OUT,
    PICK_OUT,
    CHECK_OUT,
    ;
}
src/main/java/com/zy/common/model/enums/model/enums/SysOsType.java
New file
@@ -0,0 +1,49 @@
package com.zy.common.model.enums.model.enums;
public enum SysOsType {
    Any("any", null),
    Linux("Linux", null),
    Mac_OS("Mac OS", null),
    Mac_OS_X("Mac OS X", null),
    Windows("Windows", "D:\\licensed.txt"),
    OS2("OS/2", null),
    Solaris("Solaris", null),
    SunOS("SunOS", null),
    MPEiX("MPE/iX", null),
    HP_UX("HP-UX", null),
    AIX("AIX", null),
    OS390("OS/390", null),
    FreeBSD("FreeBSD", null),
    Irix("Irix", null),
    Digital_Unix("Digital Unix", null),
    NetWare_411("NetWare", null),
    OSF1("OSF1", null),
    OpenVMS("OpenVMS", null),
    Others("Others", null);
    private String description;
    private String activationCodePath;
    SysOsType(String desc, String activationCodePath) {
        this.description = desc;
        this.activationCodePath = activationCodePath;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public String getActivationCodePath() {
        return activationCodePath;
    }
    public void setActivationCodePath(String activationCodePath) {
        this.activationCodePath = activationCodePath;
    }
}
src/main/java/com/zy/common/model/enums/model/enums/WorkNoType.java
New file
@@ -0,0 +1,48 @@
package com.zy.common.model.enums.model.enums;
import com.core.exception.CoolException;
/**
 * 工作号排序规则
 */
public enum WorkNoType {
    PAKIN(0),
    PICK(1),
    PAKOUT(2),
    OTHER(3),
    ;
    public Integer type;
    WorkNoType(Integer type) {
        this.type = type;
    }
    public static Integer getWorkNoType(Integer ioType) {
        switch (ioType) {
            case 1:
                return PAKIN.type;
            case 10:
                return PAKIN.type;
            case 11:
                return PICK.type;
            case 53:
            case 54:
            case 57:
                return PICK.type;
            case 101:
                return PAKOUT.type;
            case 103:
            case 104:
            case 107:
                return PICK.type;
            case 110:
                return PAKOUT.type;
            default:
                break;
        }
        throw new CoolException(ioType + "的任务类型无法生成工作号");
    }
}