自动化立体仓库 - WMS系统
f543f2b2df318ce42111fbe9727a1fb7c7a588d6..ea1db1a84e8d1412b77060a37bc976a93bbb58dd
3 天以前 lsh
#getArmType$
ea1db1 对比 | 目录
3 天以前 lsh
#getArmType$
c28868 对比 | 目录
3 天以前 lsh
#getArmType$
32a0c4 对比 | 目录
3 天以前 lsh
#getArmType$
57f96b 对比 | 目录
10个文件已添加
8个文件已修改
1064 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/OpenController.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/ViewStockUseBeanDigitalTwin.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/DigitalTwinEquipmentParam.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/DigitalTwinRecentDetainMatParam.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/DigitalTwinRecentIdleLocParam.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/DigitalTwinRecentInAndOutBoundParam.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/DigitalTwinRecentOrderParam.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/DigitalTwinWarehouseDetailParam.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/ViewLocDailyLogParam.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/ViewOrderParam.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/VwLocDetlSummaryParam.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/ReportQueryMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OpenService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/OrderMoveHistoryScheduler.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/OrderMoveHistoryHandler.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/TimeCalculatorUtils.java 406 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/ViewWorkInMapper.xml 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OpenController.java
@@ -228,4 +228,94 @@
        return R.ok().add(openService.digitalTwinOverview());
    }
    /**
     * 近期订单  近期订单数量,默认7天
     */
    @RequestMapping("/digitalTwin/recentOrder")
    public R digitalTwinRecentOrder(@RequestHeader(required = false) String appkey,
                                 @RequestBody DigitalTwinRecentOrderParam param,
                                 HttpServletRequest request) {
        auth(appkey, param, request);
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
        return R.ok().add(openService.digitalTwinRecentOrder(param));
    }
    /**
     * 6.3近期剩余库位  近期剩余库位数量,默认7天
     */
    @RequestMapping("/digitalTwin/recentIdleLoc")
    public R digitalTwinRecentIdleLoc(@RequestHeader(required = false) String appkey,
                                    @RequestBody DigitalTwinRecentIdleLocParam param,
                                    HttpServletRequest request) {
        auth(appkey, param, request);
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
        return R.ok().add(openService.digitalTwinRecentIdleLoc(param));
    }
    /**
     * 近期出库入库
     */
    @RequestMapping("/digitalTwin/recentInAndOutBound")
    public R digitalTwinRecentInAndOutBound(@RequestHeader(required = false) String appkey,
                                      @RequestBody DigitalTwinRecentInAndOutBoundParam param,
                                      HttpServletRequest request) {
        auth(appkey, param, request);
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
        return R.ok().add(openService.digitalTwinRecentInAndOutBound(param));
    }
    /**
     * 6.5近期呆滞品
     */
    @RequestMapping("/digitalTwin/recentDetainMat")
    public R digitalTwinRecentDetainMat(@RequestHeader(required = false) String appkey,
                                            @RequestBody DigitalTwinRecentDetainMatParam param,
                                            HttpServletRequest request) {
        auth(appkey, param, request);
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
        return R.ok().add(openService.digitalTwinRecentDetainMat(param));
    }
    /**
     * 6.6设备监控
     */
    @RequestMapping("/digitalTwin/equipment")
    public R digitalTwinEquipment(@RequestHeader(required = false) String appkey,
                                        @RequestBody DigitalTwinEquipmentParam param,
                                        HttpServletRequest request) {
        auth(appkey, param, request);
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
        return R.ok().add(openService.digitalTwinEquipment(param));
    }
    /**
     * 6.7库位及库存信息
     */
    @RequestMapping("/digitalTwin/warehouseDetail")
    public R digitalTwinWarehouseDetail(@RequestHeader(required = false) String appkey,
                                  @RequestBody DigitalTwinWarehouseDetailParam param,
                                  HttpServletRequest request) {
        auth(appkey, param, request);
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
        return R.ok().add(openService.digitalTwinWarehouseDetail(param));
    }
}
src/main/java/com/zy/asrs/entity/ViewStockUseBeanDigitalTwin.java
@@ -9,12 +9,12 @@
 */
@Data
public class ViewStockUseBeanDigitalTwin {
    private Long totalLoc;        //库位总数
    private Long useLoc;        //已用库位
    private Long idleLoc;        //剩余库位
    private Long todayOutbound;        //今日出库
    private Long todayWarehousing;        //今日入库
    private Long remainingStock;        //剩余库存
    private Long totalLoc = 0L;        //库位总数
    private Long useLoc = 0L;        //已用库位
    private Long idleLoc = 0L;        //剩余库位
    private Long todayOutbound = 0L;        //今日出库
    private Long todayWarehousing = 0L;        //今日入库
    private Long remainingStock = 0L;        //剩余库存
    private String nowData;        //剩余库存
}
src/main/java/com/zy/asrs/entity/param/DigitalTwinEquipmentParam.java
New file
@@ -0,0 +1,32 @@
package com.zy.asrs.entity.param;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
 * Created by vincent on 2020/6/13
 */
@Data
public class DigitalTwinEquipmentParam {
    private int areaId = 0;         //库区ID,不传默认全部
    private List<DataCode> dataCodeList = new ArrayList<>();
    @Data
    public static class DataCode {
        private String equipmentId = "1";         //设备ID
        private String equipmentName = "号堆垛机";       //设备名称
        private int equipmentType = 1;         //设备类型:1 堆垛机;2 CTU;3 AGV;
        private String belongAreaId = "1";        //归属库区ID
        private String belongAreaName = "1";      //归属库区名称
        private int verticalSpeed = 10;         //垂直速度,单位:M/min
        private int horizontalSpeed = 10;       //水平速度,单位:M/min
        private int voltage = 320;               //电压,单位:v
        private int status = 1;                //设备状态:1 正常;2 待机;3 故障;
        private int operateMethod = 1;         //操作方式:1 自动;2 半自动;3 手动;
    }
}
src/main/java/com/zy/asrs/entity/param/DigitalTwinRecentDetainMatParam.java
New file
@@ -0,0 +1,45 @@
package com.zy.asrs.entity.param;
import lombok.Data;
import java.util.List;
/**
 * Created by vincent on 2020/6/13
 */
@Data
public class DigitalTwinRecentDetainMatParam {
    private int areaId = 0;         //库区ID,不传默认全部
    private int overDayNum = 30;    //呆滞品认定天数,如超过10传值:10。默认30。
    private int pageIndex = 1;      //分页页码,从1开始。需要分页时使用。
    private int pageSize = 9999;    //分页页码大小。
    private List<DataCode> dataCodeList;
    @Data
    public static class DataCode {
        private int belongAreaId;        //归属库区ID
        private String belongAreaName;      //归属库区名称
        private String matId;               //物料ID
        private String matName;             //物料名称
        private String lokId;               //所属库位ID
        private String lokName;             //所属库位名称
        private int detainTime;            //呆滞时间,计算单位:分钟
        private String inBoundTime;         //入库时间,格式:2025-10-11T11:15:16,预留
        public DataCode() {
        }
        public DataCode(VwLocDetlSummaryParam vwLocDetlSummaryParam) {
            this.belongAreaId = vwLocDetlSummaryParam.getAreaId();
            this.matId = vwLocDetlSummaryParam.getMatId();
            this.matName = vwLocDetlSummaryParam.getMaktx();
            this.lokId = vwLocDetlSummaryParam.getLocNo();
            this.lokName = vwLocDetlSummaryParam.getLocNo();
            this.detainTime = vwLocDetlSummaryParam.getDetainTime();
            this.inBoundTime = vwLocDetlSummaryParam.getInBoundTime();
        }
    }
}
src/main/java/com/zy/asrs/entity/param/DigitalTwinRecentIdleLocParam.java
New file
@@ -0,0 +1,35 @@
package com.zy.asrs.entity.param;
import lombok.Data;
import java.util.List;
/**
 * Created by vincent on 2020/6/13
 */
@Data
public class DigitalTwinRecentIdleLocParam {
    private int areaId;
    // 开始日期,格式:20251022。不传默认7天。
    private String startDate;
    // 结束日期,格式:20251022。配合startDate使用。
    private String endDate;
    private String memo;
    private List<DataCode> dataCodeList;
    @Data
    public static class DataCode {
        private int areaId;
        // 库存日期,格式:2025-10-22
        private String locDate;
        // 数字    剩余库位数量
        private Long idleNum;
    }
}
src/main/java/com/zy/asrs/entity/param/DigitalTwinRecentInAndOutBoundParam.java
New file
@@ -0,0 +1,35 @@
package com.zy.asrs.entity.param;
import lombok.Data;
import java.util.List;
/**
 * Created by vincent on 2020/6/13
 */
@Data
public class DigitalTwinRecentInAndOutBoundParam {
    private int areaId;
    // 开始日期,格式:20251022。不传默认7天。
    private String startDate;
    // 结束日期,格式:20251022。配合startDate使用。
    private String endDate;
    private String memo;
    private List<DataCode> dataCodeList;
    @Data
    public static class DataCode {
        // 库存日期,格式:2025-10-22
        private String boundDate;
        //        入库数量
        private Long inBoundNum;
        // 数字    出库数量
        private Long outBoundNum;
    }
}
src/main/java/com/zy/asrs/entity/param/DigitalTwinRecentOrderParam.java
New file
@@ -0,0 +1,33 @@
package com.zy.asrs.entity.param;
import lombok.Data;
import java.util.List;
/**
 * Created by vincent on 2020/6/13
 */
@Data
public class DigitalTwinRecentOrderParam {
    // 开始日期,格式:20251022。不传默认7天。
    private String startDate;
    // 结束日期,格式:20251022。配合startDate使用。
    private String endDate;
    private String memo;
    private List<DataCode> dataCodeList;
    @Data
    public static class DataCode {
        // 物料编号
        private String orderDate;
        // 物料数量
        private Long orderNum;
    }
}
src/main/java/com/zy/asrs/entity/param/DigitalTwinWarehouseDetailParam.java
New file
@@ -0,0 +1,46 @@
package com.zy.asrs.entity.param;
import com.zy.asrs.entity.LocDetl;
import com.zy.asrs.entity.LocMast;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
 * Created by vincent on 2020/6/13
 */
@Data
public class DigitalTwinWarehouseDetailParam {
    private int areaId = 0;         //库区ID,不传默认全部
    private List<DataCode> dataCodeList = new ArrayList<DataCode>();
    @Data
    public static class DataCode {
        private String locNo;//设备ID
        private String locSts;//设备名称
        private int areaId;//设备类型
        private String areaName;//设备类型
        private int row1;//设备类型
        private int bay1;//设备类型
        private int lev1;//设备类型
        private List<LocMast> locMast;//设备类型
        private List<LocDetl> locDetl;//设备类型
        public DataCode(LocMast locMast,List<LocDetl> locDetl) {
            ArrayList<LocMast> locMasts = new ArrayList<>();
            locMasts.add(locMast);
            this.locNo = locMast.getLocNo();
            this.locSts = locMast.getLocSts();
            this.areaId = locMast.getCrnNo();
            this.areaName = "";
            this.row1 = locMast.getRow1();
            this.bay1 = locMast.getBay1();
            this.lev1 = locMast.getLev1();
            this.locMast = locMasts;
            this.locDetl = locDetl;
        }
    }
}
src/main/java/com/zy/asrs/entity/param/ViewLocDailyLogParam.java
New file
@@ -0,0 +1,44 @@
package com.zy.asrs.entity.param;
/**
 * Created by vincent on 2020/6/13
 */
public class ViewLocDailyLogParam {
    private String ymd;
    private int area;
    private Long qty;
    private String sts;
    public String getYmd() {
        return ymd;
    }
    public void setYmd(String ymd) {
        this.ymd = ymd;
    }
    public int getArea() {
        return area;
    }
    public void setArea(int area) {
        this.area = area;
    }
    public Long getQty() {
        return qty;
    }
    public void setQty(Long qty) {
        this.qty = qty;
    }
    public String getSts() {
        return sts;
    }
    public void setSts(String sts) {
        this.sts = sts;
    }
}
src/main/java/com/zy/asrs/entity/param/ViewOrderParam.java
New file
@@ -0,0 +1,20 @@
package com.zy.asrs.entity.param;
/**
 * Created by vincent on 2020/6/13
 */
public class ViewOrderParam {
    // 物料编号
    private String ymd;
    // 物料数量
    private Long qty;
    public String getYmd() {
        return ymd;
    }
    public void setYmd(String ymd) {
        this.ymd = ymd;
    }
    public Long getQty() { return qty;}
    public void setQty(Long qty) { this.qty = qty;}
}
src/main/java/com/zy/asrs/entity/param/VwLocDetlSummaryParam.java
New file
@@ -0,0 +1,22 @@
package com.zy.asrs.entity.param;
import lombok.Data;
/**
 * Created by vincent on 2020/6/13
 */
@Data
public class VwLocDetlSummaryParam {
    private String locNo;
    private int areaId;
    private String matId;
    private String inBoundTime;
    private int detainTime;//库龄(天数)
    // 物料编号
    private String maktx;
    private String batch;
    private String zpallet;
    // 物料数量
    private Double anfme;
}
src/main/java/com/zy/asrs/mapper/ReportQueryMapper.java
@@ -1,6 +1,9 @@
package com.zy.asrs.mapper;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.ViewLocDailyLogParam;
import com.zy.asrs.entity.param.ViewOrderParam;
import com.zy.asrs.entity.param.VwLocDetlSummaryParam;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
@@ -80,4 +83,10 @@
    Integer selectWorkCountInSum(String matnr, @Param("start") String startTime, @Param("end") String endTime);
    Integer selectWorkCountOutSum(String matnr, @Param("start") String startTime, @Param("end") String endTime);
    List<ViewOrderParam> getAsrOrderView(@Param("ymdS") String startTime, @Param("ymdD") String endTime);
    List<ViewLocDailyLogParam> getAsrLocDailyLogO(@Param("areaId")int areaId, @Param("ymdS") String startTime, @Param("ymdD") String endTime);
    List<ViewLocDailyLogParam> getAsrLocDailyLog2(@Param("areaId")int areaId, @Param("ymdS") String startTime, @Param("ymdD") String endTime);
    List<VwLocDetlSummaryParam> getVwLocDetlSummaryParam(@Param("areaId")int areaId,@Param("overDayNum")int overDayNum, @Param("curr") Integer curr, @Param("limit") Integer limit);
    void insertAsrLocDailyLog();
}
src/main/java/com/zy/asrs/service/OpenService.java
@@ -49,4 +49,10 @@
     * 库存统计
     */
    ViewStockUseBeanDigitalTwin digitalTwinOverview();
    DigitalTwinRecentOrderParam digitalTwinRecentOrder(DigitalTwinRecentOrderParam digitalTwinRecentOrderParam);
    DigitalTwinRecentIdleLocParam digitalTwinRecentIdleLoc(DigitalTwinRecentIdleLocParam digitalTwinRecentIdleLocParam);
    DigitalTwinRecentInAndOutBoundParam digitalTwinRecentInAndOutBound(DigitalTwinRecentInAndOutBoundParam digitalTwinRecentIdleLocParam);
    DigitalTwinRecentDetainMatParam digitalTwinRecentDetainMat(DigitalTwinRecentDetainMatParam digitalTwinRecentIdleLocParam);
    DigitalTwinEquipmentParam digitalTwinEquipment(DigitalTwinEquipmentParam digitalTwinRecentIdleLocParam);
    DigitalTwinWarehouseDetailParam digitalTwinWarehouseDetail(DigitalTwinWarehouseDetailParam digitalTwinRecentIdleLocParam);
}
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.common.R;
import com.core.common.SnowflakeIdWorker;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
@@ -14,6 +15,7 @@
import com.zy.asrs.service.*;
import com.zy.asrs.utils.MatUtils;
import com.zy.asrs.utils.OrderInAndOutUtil;
import com.zy.asrs.utils.TimeCalculatorUtils;
import com.zy.common.model.DetlDto;
import com.zy.common.utils.NodeUtils;
import lombok.extern.slf4j.Slf4j;
@@ -609,7 +611,7 @@
        viewStockUseBeanDigitalTwin.setIdleLoc(Integer.toUnsignedLong(selectCountLocMastO));
        List<ViewInOutBean> list = reportQueryMapper.getViewInOutAll(new ViewInOutBean());
        Date date = new Date();
        String format = new SimpleDateFormat("yyyy-MM-dd").format(date);
        String format = new SimpleDateFormat(DateUtils.yyyyMMdd_F).format(date);
        viewStockUseBeanDigitalTwin.setNowData(format);
        for (ViewInOutBean view : list) {
            if (view.getYmd().equals(format)) {
@@ -621,4 +623,135 @@
        return viewStockUseBeanDigitalTwin;
    }
    @Override
    @Transactional
    public DigitalTwinRecentOrderParam digitalTwinRecentOrder(DigitalTwinRecentOrderParam param) {
        Date date = new Date();
        if (Cools.isEmpty(param.getStartDate()) || !TimeCalculatorUtils.isValidDateFormat(param.getStartDate(), DateUtils.yyyyMMdd) || TimeCalculatorUtils.isFutureDate(param.getStartDate(), DateUtils.yyyyMMdd)) {
            param.setMemo("开始日期异常 :"+param.getStartDate());
            String timeFrontSevenYesterday = new SimpleDateFormat(DateUtils.yyyyMMdd).format(TimeCalculatorUtils.timeFrontSevenYesterday6(date));//七天前
            param.setStartDate(timeFrontSevenYesterday);
            String format = new SimpleDateFormat(DateUtils.yyyyMMdd).format(date);//当天
            param.setEndDate(format);
            param.setMemo(param.getMemo()+";初始化日期为 :"+param.getStartDate()+"===>" + param.getEndDate());
        } else if (Cools.isEmpty(param.getEndDate()) || !TimeCalculatorUtils.isValidDateFormat(param.getEndDate(), DateUtils.yyyyMMdd)) {
            param.setMemo("结束日期异常 :"+param.getEndDate());
            String format = new SimpleDateFormat(DateUtils.yyyyMMdd).format(date);//当天
            param.setEndDate(format);
            param.setMemo(param.getMemo()+";初始化日期为 :"+param.getStartDate()+"===>" + param.getEndDate());
        }
        List<ViewOrderParam> asrOrderView = reportQueryMapper.getAsrOrderView(param.getStartDate(), param.getEndDate());
        List<DigitalTwinRecentOrderParam.DataCode> dataCodes = new ArrayList<>();
        for (ViewOrderParam view : asrOrderView) {
            DigitalTwinRecentOrderParam.DataCode dataCode = new DigitalTwinRecentOrderParam.DataCode();
            dataCode.setOrderDate(view.getYmd());
            dataCode.setOrderNum(view.getQty());
            dataCodes.add(dataCode);
        }
        param.setDataCodeList(dataCodes);
        return param;
    }
    @Override
    @Transactional
    public DigitalTwinRecentIdleLocParam digitalTwinRecentIdleLoc(DigitalTwinRecentIdleLocParam param) {
        Date date = new Date();
        if (Cools.isEmpty(param.getStartDate()) || !TimeCalculatorUtils.isValidDateFormat(param.getStartDate(), DateUtils.yyyyMMdd) || TimeCalculatorUtils.isFutureDate(param.getStartDate(), DateUtils.yyyyMMdd)) {
            param.setMemo("开始日期异常 :"+param.getStartDate());
            String timeFrontSevenYesterday = new SimpleDateFormat(DateUtils.yyyyMMdd).format(TimeCalculatorUtils.timeFrontSevenYesterday6(date));//七天前
            param.setStartDate(timeFrontSevenYesterday);
            String format = new SimpleDateFormat(DateUtils.yyyyMMdd).format(date);//当天
            param.setEndDate(format);
            param.setMemo(param.getMemo()+";初始化日期为 :"+param.getStartDate()+"===>" + param.getEndDate());
        } else if (Cools.isEmpty(param.getEndDate()) || !TimeCalculatorUtils.isValidDateFormat(param.getEndDate(), DateUtils.yyyyMMdd)) {
            param.setMemo("结束日期异常 :"+param.getEndDate());
            String format = new SimpleDateFormat(DateUtils.yyyyMMdd).format(date);//当天
            param.setEndDate(format);
            param.setMemo(param.getMemo()+";初始化日期为 :"+param.getStartDate()+"===>" + param.getEndDate());
        }
//        List<ViewLocDailyLogParam> asrLocDailyLogO = reportQueryMapper.getAsrLocDailyLogO(param.getAreaId(), param.getStartDate(), param.getEndDate());
        List<ViewLocDailyLogParam> asrLocDailyLogO = reportQueryMapper.getAsrLocDailyLog2(param.getAreaId(), param.getStartDate(), param.getEndDate());
        List<DigitalTwinRecentIdleLocParam.DataCode> dataCodes = new ArrayList<>();
        for (ViewLocDailyLogParam view : asrLocDailyLogO) {
            DigitalTwinRecentIdleLocParam.DataCode dataCode = new DigitalTwinRecentIdleLocParam.DataCode();
            dataCode.setLocDate(view.getYmd());
            dataCode.setIdleNum(view.getQty());
            dataCode.setAreaId(view.getArea());
            dataCodes.add(dataCode);
        }
        param.setDataCodeList(dataCodes);
        return param;
    }
    @Override
    @Transactional
    public DigitalTwinRecentInAndOutBoundParam digitalTwinRecentInAndOutBound(DigitalTwinRecentInAndOutBoundParam param) {
        Date date = new Date();
        if (Cools.isEmpty(param.getStartDate()) || !TimeCalculatorUtils.isValidDateFormat(param.getStartDate(), DateUtils.yyyyMMdd) || TimeCalculatorUtils.isFutureDate(param.getStartDate(), DateUtils.yyyyMMdd)) {
            param.setMemo("开始日期异常 :"+param.getStartDate());
            String timeFrontSevenYesterday = new SimpleDateFormat(DateUtils.yyyyMMdd).format(TimeCalculatorUtils.timeFrontSevenYesterday6(date));//七天前
            param.setStartDate(timeFrontSevenYesterday);
            String format = new SimpleDateFormat(DateUtils.yyyyMMdd).format(date);//当天
            param.setEndDate(format);
            param.setMemo(param.getMemo()+";初始化日期为 :"+param.getStartDate()+"===>" + param.getEndDate());
        } else if (Cools.isEmpty(param.getEndDate()) || !TimeCalculatorUtils.isValidDateFormat(param.getEndDate(), DateUtils.yyyyMMdd)) {
            param.setMemo("结束日期异常 :"+param.getEndDate());
            String format = new SimpleDateFormat(DateUtils.yyyyMMdd).format(date);//当天
            param.setEndDate(format);
            param.setMemo(param.getMemo()+";初始化日期为 :"+param.getStartDate()+"===>" + param.getEndDate());
        }
        ViewInOutBean viewInOutBean = new ViewInOutBean();
        viewInOutBean.setBegin_date(param.getStartDate());
        viewInOutBean.setEnd_date(param.getEndDate());
        List<ViewInOutBean> list = reportQueryMapper.getViewInOutAll(viewInOutBean);
        List<DigitalTwinRecentInAndOutBoundParam.DataCode> dataCodes = new ArrayList<>();
        for (ViewInOutBean view : list) {
            DigitalTwinRecentInAndOutBoundParam.DataCode dataCode = new DigitalTwinRecentInAndOutBoundParam.DataCode();
            dataCode.setBoundDate(view.getYmd());
            dataCode.setOutBoundNum(view.getRet_qty());
            dataCode.setInBoundNum(view.getSto_qty());
            dataCodes.add(dataCode);
        }
        param.setDataCodeList(dataCodes);
        return param;
    }
    @Override
    @Transactional
    public DigitalTwinRecentDetainMatParam digitalTwinRecentDetainMat(DigitalTwinRecentDetainMatParam param) {
        List<VwLocDetlSummaryParam> vwLocDetlSummaryParam = reportQueryMapper.getVwLocDetlSummaryParam(param.getAreaId(), param.getOverDayNum(), param.getPageIndex(), param.getPageSize());
        List<DigitalTwinRecentDetainMatParam.DataCode> dataCodes = new ArrayList<>();
        for (VwLocDetlSummaryParam view : vwLocDetlSummaryParam) {
            DigitalTwinRecentDetainMatParam.DataCode dataCode = new DigitalTwinRecentDetainMatParam.DataCode(view);
            dataCodes.add(dataCode);
        }
        param.setDataCodeList(dataCodes);
        return param;
    }
    @Override
    @Transactional
    public DigitalTwinEquipmentParam digitalTwinEquipment(DigitalTwinEquipmentParam param) {
        DigitalTwinEquipmentParam.DataCode dataCode = new DigitalTwinEquipmentParam.DataCode();
        dataCode.setEquipmentId(""+param.getAreaId());
        dataCode.setEquipmentName(param.getAreaId()+dataCode.getEquipmentName());
        dataCode.setBelongAreaId(""+param.getAreaId());
        dataCode.setBelongAreaName(""+param.getAreaId());
        param.getDataCodeList().add(dataCode);
        return param;
    }
    @Override
    @Transactional
    public DigitalTwinWarehouseDetailParam digitalTwinWarehouseDetail(DigitalTwinWarehouseDetailParam param) {
        List<LocMast> locMastList = locMastService.selectList(new EntityWrapper<>());
        for (LocMast locMast : locMastList) {
            List<LocDetl> locDetlList = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", locMast.getLocNo()));
            DigitalTwinWarehouseDetailParam.DataCode dataCode = new DigitalTwinWarehouseDetailParam.DataCode(locMast,locDetlList);
            param.getDataCodeList().add(dataCode);
        }
        return param;
    }
}
src/main/java/com/zy/asrs/task/OrderMoveHistoryScheduler.java
@@ -26,4 +26,9 @@
    public void executeOrder(){
        orderMoveHistoryHandler.startOrder();
    }
    @Scheduled(cron = "59 59 23 * * ?")
    public void executeAsrLocDailyLog(){
        orderMoveHistoryHandler.startAsrLocDailyLog();
    }
}
src/main/java/com/zy/asrs/task/handler/OrderMoveHistoryHandler.java
@@ -3,7 +3,9 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.zy.asrs.entity.*;
import com.zy.asrs.mapper.ReportQueryMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.service.impl.LocMastServiceImpl;
import com.zy.asrs.service.impl.OrderDetlPakinServiceImpl;
import com.zy.asrs.service.impl.OrderPakinServiceImpl;
import com.zy.asrs.task.AbstractHandler;
@@ -31,6 +33,8 @@
    private OrderDetlPakinServiceImpl orderDetlPakinService;
    @Autowired
    private OrderDetlPakoutService orderDetlPakoutService;
    @Autowired
    private ReportQueryMapper reportQueryMapper;
    public ReturnT<String> start(){
//        List<Order> settleEqual6 = orderService.selectList(new EntityWrapper<Order>()
@@ -114,4 +118,9 @@
        }
    }
    public ReturnT<String> startAsrLocDailyLog(){
        reportQueryMapper.insertAsrLocDailyLog();
        return SUCCESS;
    }
}
src/main/java/com/zy/asrs/utils/TimeCalculatorUtils.java
New file
@@ -0,0 +1,406 @@
package com.zy.asrs.utils;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.time.temporal.WeekFields;
import java.util.*;
public class TimeCalculatorUtils {
    //获取七天前的日期(日期天数减七)
    public static Date timeFrontSevenYesterday(Date date){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DAY_OF_MONTH, -7);
        return calendar.getTime();
    }
    //获取七天前的日期(日期天数减七,包含当天)
    public static Date timeFrontSevenYesterday6(Date date){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DAY_OF_MONTH, -6);
        return calendar.getTime();
    }
    //获取七天后的日期(日期天数加七)
    public static Date timeAfterSevenYesterday(Date date){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DAY_OF_MONTH, 7);
        return calendar.getTime();
    }
    //获取相差n天的日期(日期天数加N)
    public static Date timeYesterdayN(Date date,int day){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DAY_OF_MONTH, day);
        return calendar.getTime();
    }
    //获取年月日
    public static String timeYestMonthDay(Date date){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH) + 1;  // 月份从0开始,需要加1
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        return year+"年"+month+"月"+day+"日";
    }
    //获取年
    public static int timeYest(Date date){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.YEAR);
    }
    //获取月
    public static int timeMonth(Date date){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.MONTH) + 1;
    }
    //获取日
    public static int timeDay(Date date){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.DAY_OF_MONTH);
    }
    //获取年差异
    public static int DifferenceYest(Date startDay,Date endDay){
        int startYest = timeYest(startDay);
        int endYest = timeYest(endDay);
        return endYest-startYest;
    }
    //获取月差异
    public static int DifferenceMonth(Date startDay,Date endDay){
        int startMonth = timeMonth(startDay);
        int endMonth = timeMonth(endDay);
        return endMonth-startMonth;
    }
    //获取天差异
    public static int DifferenceDayInt(Date startDay,Date endDay){
        return DifferenceDayLong(startDay,endDay).intValue();
    }
    //获取天差异
    public static Long DifferenceDayLong(Date startDay,Date endDay){
        LocalDate a = LocalDate.of(timeYest(startDay), timeMonth(startDay), timeDay(startDay));
        LocalDate b = LocalDate.of(timeYest(endDay), timeMonth(endDay), timeDay(endDay));
        return ChronoUnit.DAYS.between(a, b)+1;
    }
    //获取天差异
    public static Double DifferenceDayMorningAfternoon(Date startDay,Date endDay,int startTime,int endTime){
        double between = DifferenceDayLong(startDay, endDay).doubleValue();
        if (startTime==2){
            between = between-0.5;
        }
        if (endTime == 1){
            between = between-0.5;
        }
        return between;
    }
    //获取毫秒差异
    public static Long differenceInMilliseconds(Date startDay, Date endDay) {
        if (startDay == null || endDay == null) {
            throw new IllegalArgumentException("Dates cannot be null");
        }
        // 获取毫秒差异
        return endDay.getTime() - startDay.getTime();
    }
    //获秒差异
    public static long differenceInSeconds(Date startDay, Date endDay) {
        if (startDay == null || endDay == null) {
            throw new IllegalArgumentException("Dates cannot be null");
        }
        // 获取毫秒差异,并转换为秒
        long millisecondsDifference = endDay.getTime() - startDay.getTime();
        return millisecondsDifference / 1000;
    }
    public static boolean CompareData(Date startDay,Date endDay){
        // 将日期字符串解析为LocalDate对象
        LocalDate a = LocalDate.of(timeYest(startDay), timeMonth(startDay), timeDay(startDay));
        LocalDate b = LocalDate.of(timeYest(endDay), timeMonth(endDay), timeDay(endDay));
        // 比较日期
        if (a.isAfter(b)) {
            return false;
        } else if (a.isBefore(b)) {
            return true;
        } else {
            return true;
        }
    }
    //java.time.LocalDate 转换为 java.util.Date;
    public static Date DateLocalDate(LocalDate localDate) {
        return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
    }
    //获取现在日期是当月第几周
    public static int WeeklyNowMonthDay(Date date) {
//        int day = timeDay(date);
//        if (day<7){
//            if (WeeklyNowMonth(WeeklyMonday(date))>2){
//                return 1;
//            }
//        }
        return WeeklyNowMonth(WeeklyMonday(date));
    }
    public static int WeeklyNowMonth(Date date) {
//        LocalDate currentDate = LocalDate.now();
        LocalDate currentDate = LocalDate.of(timeYest(date), timeMonth(date), timeDay(date));
        WeekFields weekFields = WeekFields.of(Locale.getDefault());
        int weekOfMonth = currentDate.get(weekFields.weekOfMonth());
        return weekOfMonth;
    }
    //限制两个日期是周一和周末  工作日  周一到周六
    public static void WeeklySix(Date date) {
//        LocalDate startDate = LocalDate.of(2022, 9, 5); // 假设开始日期是2022年9月5日,周一
        LocalDate startDate = LocalDate.of(timeYest(date), timeMonth(date), timeDay(date));
        System.out.println("当前日期 " + startDate + " 周");
        LocalDate endDate = startDate.plus(6, ChronoUnit.DAYS); // 结束日期是开始日期加上6天
        System.out.println("当前日期加上6天是 " + endDate + " 周");
        // 如果开始日期不是周一,则将它调整到下一个周一
        if (startDate.getDayOfWeek() != DayOfWeek.MONDAY) {
            startDate = startDate.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
        }
        // 如果结束日期不是周末(即周六或周日),则将它调整到下一个周末
        if (endDate.getDayOfWeek() != DayOfWeek.SATURDAY && endDate.getDayOfWeek() != DayOfWeek.SUNDAY) {
            endDate = endDate.with(TemporalAdjusters.next(DayOfWeek.SATURDAY));
        }
        // 确保两个日期之间相隔七天
        while (startDate.plus(7, ChronoUnit.DAYS).isBefore(endDate)) {
            startDate = startDate.plus(7, ChronoUnit.DAYS);
        }
        System.out.println("开始日期:" + startDate);
        System.out.println("结束日期:" + endDate);
    }
    //限制两个日期是周一和周末  周一到周日
    public static List<Date> WeeklySeven(Date date) {
//        LocalDate startDate = LocalDate.of(2022, 9, 5); // 假设开始日期是2022年9月5日,周一
        LocalDate startDate = LocalDate.of(timeYest(date), timeMonth(date), timeDay(date));
//        System.out.println("当前日期 " + startDate + " 周");
        LocalDate endDate = startDate.plus(6, ChronoUnit.DAYS); // 结束日期是开始日期加上6天
//        System.out.println("当前日期加上6天是 " + endDate + " 周");
        // 如果开始日期不是周一,则将它调整到下一个周一
        if (startDate.getDayOfWeek() != DayOfWeek.MONDAY) {
            startDate = startDate.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
        }
        // 如果结束日期不是周日,则将它调整到下一个周日
        if (endDate.getDayOfWeek() != DayOfWeek.SUNDAY) {
            endDate = endDate.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
        }
        // 确保两个日期之间相隔七天
        while (startDate.plus(7, ChronoUnit.DAYS).isBefore(endDate)) {
            startDate = startDate.plus(7, ChronoUnit.DAYS);
        }
        List<Date> dateList = new ArrayList<>();
        dateList.add(DateLocalDate(startDate));
        dateList.add(DateLocalDate(endDate));
        return dateList;
//        System.out.println("开始日期:" + startDate);
//        System.out.println("结束日期:" + endDate);
    }
    //判断是不是周一
    public static boolean WeeklyOneSign(Date date) {
        LocalDate localDate = LocalDate.of(timeYest(date), timeMonth(date), timeDay(date));
        // 判断是不是周一
        if (localDate.getDayOfWeek() != DayOfWeek.MONDAY) {
            return false;
        }
        return true;
    }
    //获取本周周一
    public static Date WeeklyMonday (Date date) {
        LocalDate localDate = LocalDate.of(timeYest(date), timeMonth(date), timeDay(date));
        // 下周周一
        localDate = localDate.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
        // 将LocalDate转换为Date
        Date monday = DateLocalDate(localDate);
        // 则将它调整到本周周一
        return timeFrontSevenYesterday(monday);
    }
    //获取当前日期所在的周一及周日时间
    public static List<Date> WeeklyMondayAndSundayNow(Date date) {
        Date nowMonday = WeeklyMonday(date);
        return WeeklySeven(nowMonday);
    }
    //获取当前日期上一周周一及周日时间
    public static List<Date> WeeklyMondayAndSundayFront(Date date) {
        Date nowMonday = WeeklyMonday(date);
        Date frontSevenYesterday = timeFrontSevenYesterday(nowMonday);
        return WeeklySeven(frontSevenYesterday);
    }
    //获取当前日期下一周周一及周日时间
    public static List<Date> WeeklyMondayAndSundayAfter(Date date) {
        Date nowMonday = WeeklyMonday(date);
        Date afterSevenYesterday = timeAfterSevenYesterday(nowMonday);
        return WeeklySeven(afterSevenYesterday);
    }
    //获取周一到周末
    public static List<Date> WeeklyDays(Date date){
        Date nowMonday = WeeklyMonday(date);
        List<Date> dateList = new ArrayList<>();
        dateList.add(nowMonday);
        for (int i = 1; i<7 ; i++){
            dateList.add(timeYesterdayN(nowMonday,i));
        }
        return dateList;
    }
    //获取周一到周末
    public static List<Date> WeeklyListDays(List<Date> dates){
        Date date = dates.get(0);
        Date nowMonday = WeeklyMonday(date);
        List<Date> dateList = new ArrayList<>();
        dateList.add(nowMonday);
        for (int i = 1; i<7 ; i++){
            dateList.add(timeYesterdayN(nowMonday,i));
        }
        return dateList;
    }
    public static void main(String[] args) {
        Date now = new Date();
        int weeklyNowMonth = WeeklyNowMonthDay(now);
        System.out.println("当前日期是第 " + weeklyNowMonth + " 周");
        LocalDate startDate1 = LocalDate.of(2024, 2, 29);
        int weeklyNowMonth1 = WeeklyNowMonthDay(DateLocalDate(startDate1));
        System.out.println("当前日期是第 " + weeklyNowMonth1 + " 周");
        LocalDate startDate2 = LocalDate.of(2024, 3, 5);
        int weeklyNowMonth2 = WeeklyNowMonthDay(DateLocalDate(startDate2));
        System.out.println("当前日期是第 " + weeklyNowMonth2 + " 周");
        LocalDate startDate3 = LocalDate.of(2024, 3, 10);
        int weeklyNowMonth3 = WeeklyNowMonthDay(DateLocalDate(startDate3));
        System.out.println("当前日期是第 " + weeklyNowMonth3 + " 周");
        LocalDate startDate4 = LocalDate.of(2024, 3, 31);
        int weeklyNowMonth4 = WeeklyNowMonthDay(DateLocalDate(startDate4));
        System.out.println("当前日期是第 " + weeklyNowMonth4 + " 周");
        LocalDate startDate5 = LocalDate.of(2024, 4, 1);
        int weeklyNowMonth5 = WeeklyNowMonthDay(DateLocalDate(startDate5));
        System.out.println("当前日期是第 " + weeklyNowMonth5 + " 周");
        LocalDate startDate6 = LocalDate.of(2024, 4, 7);
        int weeklyNowMonth6 = WeeklyNowMonthDay(DateLocalDate(startDate6));
        System.out.println("当前日期是第 " + weeklyNowMonth6 + " 周");
    }
//    public static void main(String[] args) {
//        Date now = new Date();
//        //本周
//        List<Date> dateList = WeeklyMondayAndSundayNow(now);
//        for (Date date : dateList){
//            System.out.println("------------------------------");
//            System.out.println(date);
//        }
//        //上周
//        List<Date> dateList1 = WeeklyMondayAndSundayFront(now);
//        for (Date date : dateList1){
//            System.out.println("------------------------------");
//            System.out.println(date);
//        }
//        //下周
//        List<Date> dateList2 = WeeklyMondayAndSundayAfter(now);
//        for (Date date : dateList2){
//            System.out.println("------------------------------");
//            System.out.println(date);
//        }
//        //周
//        List<Date> dateList3 = WeeklyDays(now);
//        for (Date date : dateList3){
//            System.out.println("------------------------------");
//            System.out.println(date);
//        }
//    }
    /**
     * 校验字符串是否是指定格式的合法日期
     * @param dateString 待校验的日期字符串,如 "20260104"
     * @param dateFormat 预期的日期格式,如 "yyyyMMdd"
     * @return true 表示格式合法且是有效日期,false 表示格式错误或日期无效
     */
    public static boolean isValidDateFormat(String dateString, String dateFormat) {
        if (dateString == null || dateFormat == null || dateString.length() != dateFormat.length()) {
            return false;
        }
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(dateFormat);
        try {
            LocalDate parsedDate = LocalDate.parse(dateString, formatter);
            return true; // 解析成功说明格式正确且日期有效
        } catch (DateTimeParseException e) {
            return false; // 解析失败说明格式错误或日期无效
        }
    }
    /**
     * 校验字符串是否表示未来时间(首先会校验格式是否正确)
     * @param dateString 待校验的日期字符串,如 "20260104"
     * @param dateFormat 预期的日期格式,如 "yyyyMMdd"
     * @return true 表示是未来时间,false 表示不是未来时间或格式无效
     */
    public static boolean isFutureDate(String dateString, String dateFormat) {
        if (!isValidDateFormat(dateString, dateFormat)) {
            return false; // 格式无效直接返回false
        }
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(dateFormat);
        LocalDate inputDate = LocalDate.parse(dateString, formatter);
        LocalDate today = LocalDate.now();
        return inputDate.isAfter(today); // 与当前日期比较
    }
}
src/main/resources/mapper/ViewWorkInMapper.xml
@@ -50,6 +50,19 @@
        </if>
</sql>
<sql id="viewAsrOrderView">
    <if test="ymdS!=null and ymdS!='' ">
        <![CDATA[
        and ymd >= #{ymdS}
        ]]>
    </if>
    <if test="ymdD!=null and ymdD!='' ">
        <![CDATA[
        and ymd <= #{ymdD}
        ]]>
    </if>
</sql>
<sql id="viewWorkOutConditionSql">
        <if test="loc_no!=null and loc_no!='' ">
            and loc_no like '%' + #{loc_no} + '%'
@@ -157,4 +170,71 @@
    Order by a.io_time desc
</select>
<!-- 不分页查询所有信息 -->
<select id="getAsrOrderView" parameterType="com.zy.asrs.entity.param.ViewOrderParam" resultType="com.zy.asrs.entity.param.ViewOrderParam">
    select *
    from asr_order_view
    where 1=1
    <include refid="viewAsrOrderView"></include>
    Order by ymd desc
</select>
<!-- 不分页查询所有信息 -->
<select id="getAsrLocDailyLogO" parameterType="com.zy.asrs.entity.param.ViewLocDailyLogParam" resultType="com.zy.asrs.entity.param.ViewLocDailyLogParam">
    select *
    from asr_loc_daily_log_view
    where 1=1
    <choose>
        <when test="areaId != null and areaId != 0">
            and sts = 'O'
            and area = #{areaId}
        </when>
        <otherwise>
            and sts = 'BFQ'
            and (area IS NULL OR area = 0)
        </otherwise>
    </choose>
    <include refid="viewAsrOrderView"></include>
    Order by ymd desc
</select>
<!-- 不分页查询所有信息 -->
<select id="getAsrLocDailyLog2" parameterType="com.zy.asrs.entity.param.ViewLocDailyLogParam" resultType="com.zy.asrs.entity.param.ViewLocDailyLogParam">
    select *
    from asr_loc_daily_log_view
    where 1=1
    and sts = 'O'
    <if test="areaId != null and areaId != 0">
        and area = #{areaId}
    </if>
    <include refid="viewAsrOrderView"></include>
    Order by ymd desc
</select>
<insert id="insertAsrLocDailyLog">
    INSERT INTO asr_loc_daily_log (loc_count, area_id)
    SELECT COUNT(*), crn_no
    FROM asr_loc_mast
    WHERE loc_sts = 'O'
    GROUP BY crn_no;
</insert>
<select id="getVwLocDetlSummaryParam" resultType="com.zy.asrs.entity.param.VwLocDetlSummaryParam">
    SELECT *
    FROM (
        select
        ROW_NUMBER() OVER(Order by a.areaId desc) as row
        , *
        FROM(
            SELECT * FROM vw_loc_detl_summary
            WHERE 1=1
              and detainTime >= #{overDayNum}
            <if test="areaId != null and areaId != 0">
                and area = #{areaId}
            </if>
        ) a
    ) b
    WHERE 1=1 and b.row between ((#{curr}-1)*#{limit}+1) and (#{curr}*#{limit})
</select>
</mapper>