自动化立体仓库 - WMS系统
zhangc
2025-01-07 7eb9b6f8c60a244e1a96597319c7b54963ba6612
优化MES库存同步逻辑及AGV告警字段
3个文件已添加
14个文件已修改
565 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/AgvWarnController.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/Agv.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/AgvWarn.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/AgvWarnLog.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/MesLocDetl.java 152 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/AgvWarnCallBackParam.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/AgvBasMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AgvWarnScheduler.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/ReportDataScheduler.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/ReportDataHandler.java 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/AgvBasMapper.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/AgvWarnLogMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/MesLocDetlMapper.xml 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/agvLocDetlStatis/locDetlStatis.js 111 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/agvLocDetlStatis/locDetlStatis.html 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/AgvWarnController.java
@@ -5,6 +5,7 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.annotations.AppAuth;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.zy.asrs.entity.AgvWarn;
import com.zy.asrs.entity.AgvWrkMast;
import com.zy.asrs.entity.param.AgvWarnBody;
@@ -12,11 +13,13 @@
import com.zy.asrs.service.AgvWarnService;
import com.zy.asrs.service.AgvWrkMastService;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.utils.AppAuthUtil;
import com.zy.common.web.BaseController;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@@ -40,6 +43,7 @@
 */
@Slf4j
@RestController
@RequestMapping("/agv")
public class AgvWarnController extends BaseController {
@@ -58,24 +62,31 @@
    @AppAuth(memo = "AGV告警回调")
    public Object taskEventStaus(@RequestBody AgvWarnCallBackParam param, HttpServletRequest request) {
        log.info("AGV告警回调:{}", JSON.toJSONString(param));
        List<AgvWarnBody> data = param.getData();
        AppAuthUtil.auth("", param, request);
        List<AgvWarnBody> agvWarnBodies = param.getData();
        //  List<AgvWarnBody> agvWarnBodies = JSONArray.parseArray(data, AgvWarnBody.class);
        AgvWarn agvWarn = null;
        List<AgvWarn> agvWarns = new ArrayList<>();
        List<AgvWarn> updates = new ArrayList<>();
        for (AgvWarnBody body : data) {
        for (AgvWarnBody body : agvWarnBodies) {
            List<AgvWarn> agvWarnList = agvWarnService.selectList(new EntityWrapper<AgvWarn>().eq("robot_code", body.getRobotCode()).eq("begin_time", body.getBeginTime()).eq("warn_content", body.getWarnContent()));
            if (Cools.isEmpty(agvWarnList)) {
                agvWarn = new AgvWarn();
                agvWarn.setBeginTime(body.getBeginTime());
                agvWarn.setAppeTime(new Date());
                agvWarn.setTimes(0);
                agvWarn.setModiTime(DateUtils.convert(body.getBeginTime(), DateUtils.yyyyMMddHHmmss_F));
                agvWarn.setRobotCode(body.getRobotCode());
                agvWarn.setWarnContent(body.getWarnContent());
                if (body.getTaskCode() != null) {
                    AgvWrkMast agvWrkMast = agvWrkMastService.selectById(body.getTaskCode());
                    if (agvWrkMast != null) {
                        agvWarn.setLocNo(agvWrkMast.getLocNo());
                        agvWarn.setSourceLocNo(agvWrkMast.getSourceLocNo());
                    try {
                        AgvWrkMast agvWrkMast = agvWrkMastService.selectById(Math.abs(Integer.parseInt(body.getTaskCode())));
                        if (agvWrkMast != null) {
                            agvWarn.setLocNo(agvWrkMast.getLocNo());
                            agvWarn.setSourceLocNo(agvWrkMast.getSourceLocNo());
                        }
                    } catch (Exception e) {
                        log.info("任务不存在");
                    }
                }
                agvWarns.add(agvWarn);
@@ -84,10 +95,14 @@
                agvWarn.setWarnContent(agvWarn.getWarnContent().contains(body.getWarnContent()) ? body.getWarnContent() : agvWarn.getWarnContent() + "、" + body.getWarnContent());
                agvWarn.setModiTime(new Date());
                if (body.getTaskCode() != null) {
                    AgvWrkMast agvWrkMast = agvWrkMastService.selectById(body.getTaskCode());
                    if (agvWrkMast != null) {
                        agvWarn.setLocNo(agvWrkMast.getLocNo());
                        agvWarn.setSourceLocNo(agvWrkMast.getSourceLocNo());
                    try {
                        AgvWrkMast agvWrkMast = agvWrkMastService.selectById(body.getTaskCode());
                        if (agvWrkMast != null) {
                            agvWarn.setLocNo(agvWrkMast.getLocNo());
                            agvWarn.setSourceLocNo(agvWrkMast.getSourceLocNo());
                        }
                    } catch (Exception e) {
                        log.info("任务不存在");
                    }
                }
                updates.add(agvWarn);
@@ -100,20 +115,20 @@
            agvWarnService.updateBatchById(updates);
        }
        Map<String, Object> result = new HashMap<>();
        logPost(param, JSONObject.toJSONString(result), true);
        logPost(JSONObject.toJSONString(param), JSONObject.toJSONString(result), true);
        result.put("code", 0);
        result.put("message", "成功");
        result.put("reqCode", param.getReqCode());
        return result;
    }
    private void logPost(AgvWarnCallBackParam param, String response, boolean success) {
    private void logPost(String param, String response, boolean success) {
        apiLogService.save(
                "ESS任务回调",
                "/phyzwms/agv/task/event/status",
                null,
                null,
                JSONObject.toJSONString(param),
                param,
                response,
                success
        );
src/main/java/com/zy/asrs/entity/Agv.java
New file
@@ -0,0 +1,19 @@
package com.zy.asrs.entity;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import lombok.Data;
import java.io.Serializable;
@TableName("agv_bas")
@Data
public class Agv implements Serializable {
    @TableId("agv_no")
    private String agvNo;
    @TableField("region")
    private String region;
}
src/main/java/com/zy/asrs/entity/AgvWarn.java
@@ -47,6 +47,9 @@
    @TableField("modi_time")
    private Date modiTime;
//    @TableField("report_time")
//    private Date reportTime;
    @TableField("memo")
    private String memo;
src/main/java/com/zy/asrs/entity/AgvWarnLog.java
@@ -1,6 +1,7 @@
package com.zy.asrs.entity;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import lombok.Data;
@@ -13,7 +14,14 @@
    private static final long serialVersionUID = 1L;
    @TableField("id")
    @TableId
    private Long id;
    /**
     * 上报次数
     */
    @TableField("times")
    private Integer times;
    @TableField("robot_code")
    private String robotCode;
@@ -21,8 +29,8 @@
    @TableField("begin_time")
    private String beginTime;
    @TableField("warnContent")
    private String warn_content;
    @TableField("warn_content")
    private String warnContent;
    @TableField("task_code")
    private String taskCode;
@@ -30,7 +38,7 @@
    @TableField("loc_no")
    private String locNo;
    @TableField("source_locNo")
    @TableField("source_loc_no")
    private String sourceLocNo;
    @TableField("appe_time")
@@ -38,5 +46,11 @@
    @TableField("modi_time")
    private Date modiTime;
//    @TableField("report_time")
//    private Date reportTime;
    @TableField("memo")
    private String memo;
    
}
src/main/java/com/zy/asrs/entity/MesLocDetl.java
@@ -3,6 +3,7 @@
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.core.common.Cools;
import com.core.common.SpringUtils;
@@ -24,175 +25,180 @@
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value= "库位号")
    @TableId
    private Long id;
    @ApiModelProperty(value = "库位号")
    @TableField("loc_no")
    private String locNo;
    @ApiModelProperty(value= "托盘条码")
    @ApiModelProperty(value = "托盘条码")
    private String zpallet;
    @ApiModelProperty(value= "数量")
    @ApiModelProperty(value = "数量")
    @ExcelProperty("数量")
    private Double anfme;
    @ApiModelProperty(value= "物料号")
    @ApiModelProperty(value = "物料号")
    @ExcelProperty("物料号")
    private String matnr;
    @ApiModelProperty(value= "物料号")
    @ApiModelProperty(value = "物料号")
    @ExcelProperty("物料号")
    private String maktx;
    @ApiModelProperty(value= "序列码")
    @ApiModelProperty(value = "序列码")
    @ExcelProperty("序列码")
    private String batch;
    @ApiModelProperty(value= "单据编号")
    @ApiModelProperty(value = "单据编号")
    @ExcelProperty("单据编号")
    @TableField("order_no")
    private String orderNo;
    @ApiModelProperty(value= "规格")
    @ApiModelProperty(value = "规格")
    private String specs;
    @ApiModelProperty(value= "批次")
    @ApiModelProperty(value = "批次")
    private String model;
    @ApiModelProperty(value= "颜色")
    @ApiModelProperty(value = "颜色")
    private String color;
    @ApiModelProperty(value= "品牌")
    @ApiModelProperty(value = "品牌")
    private String brand;
    @ApiModelProperty(value= "单位")
    @ApiModelProperty(value = "单位")
    private String unit;
    @ApiModelProperty(value= "单价")
    @ApiModelProperty(value = "单价")
    private Double price;
    @ApiModelProperty(value= "sku")
    @ApiModelProperty(value = "sku")
    private String sku;
    @ApiModelProperty(value= "包数")
    @ApiModelProperty(value = "包数")
    private Double units;
    @ApiModelProperty(value= "条码")
    @ApiModelProperty(value = "条码")
    private String barcode;
    @ApiModelProperty(value= "物料状态")
    @ApiModelProperty(value = "物料状态")
    private String origin;
    @ApiModelProperty(value= "厂家")
    @ApiModelProperty(value = "厂家")
    private String manu;
    @ApiModelProperty(value= "单据时间")
    @ApiModelProperty(value = "单据时间")
    @TableField("manu_date")
    private String manuDate;
    @ApiModelProperty(value= "品项数")
    @ApiModelProperty(value = "品项数")
    @TableField("item_num")
    private String itemNum;
    @ApiModelProperty(value= "安全库存量")
    @ApiModelProperty(value = "安全库存量")
    @TableField("safe_qty")
    private Double safeQty;
    @ApiModelProperty(value= "重量")
    @ApiModelProperty(value = "重量")
    private Double weight;
    @ApiModelProperty(value= "长度")
    @ApiModelProperty(value = "长度")
    private Double length;
    @ApiModelProperty(value= "体积")
    @ApiModelProperty(value = "体积")
    private Double volume;
    @ApiModelProperty(value= "三方编码")
    @ApiModelProperty(value = "三方编码")
    @TableField("three_code")
    private String threeCode;
    @ApiModelProperty(value= "供应商")
    @ApiModelProperty(value = "供应商")
    private String supp;
    @ApiModelProperty(value= "供应商编码")
    @ApiModelProperty(value = "供应商编码")
    @TableField("supp_code")
    private String suppCode;
    @ApiModelProperty(value= "是否批次 1: 是  0: 否  ")
    @ApiModelProperty(value = "是否批次 1: 是  0: 否  ")
    @TableField("be_batch")
    private Integer beBatch;
    @ApiModelProperty(value= "保质期")
    @ApiModelProperty(value = "保质期")
    @TableField("dead_time")
    private String deadTime;
    @ApiModelProperty(value= "预警天数")
    @ApiModelProperty(value = "预警天数")
    @TableField("dead_warn")
    private Integer deadWarn;
    @ApiModelProperty(value= "制购 1: 制造  2: 采购  3: 外协  ")
    @ApiModelProperty(value = "制购 1: 制造  2: 采购  3: 外协  ")
    private Integer source;
    @ApiModelProperty(value= "要求检验 1: 是  0: 否  ")
    @ApiModelProperty(value = "要求检验 1: 是  0: 否  ")
    private Integer inspect;
    @ApiModelProperty(value= "危险品 1: 是  0: 否  ")
    @ApiModelProperty(value = "危险品 1: 是  0: 否  ")
    private Integer danger;
    @ApiModelProperty(value= "修改人员")
    @ApiModelProperty(value = "修改人员")
    @TableField("modi_user")
    private Long modiUser;
    @ApiModelProperty(value= "修改时间")
    @ApiModelProperty(value = "修改时间")
    @TableField("modi_time")
    private Date modiTime;
    @ApiModelProperty(value= "创建者")
    @ApiModelProperty(value = "创建者")
    @TableField("appe_user")
    private Long appeUser;
    @ApiModelProperty(value= "添加时间")
    @ApiModelProperty(value = "添加时间")
    @TableField("appe_time")
    private Date appeTime;
    @ApiModelProperty(value= "备注")
    @ApiModelProperty(value = "备注")
    private String memo;
    @TableField("stock_freeze")
    @ApiModelProperty(value= "库存冻结{1:正常,0:冻结}")
    @ApiModelProperty(value = "库存冻结{1:正常,0:冻结}")
    private Integer stockFreeze;
    /**
     * 库存数量
     */
    @ApiModelProperty(value= "可出数量")
    @ApiModelProperty(value = "可出数量")
    @TableField(exist = false)
    private Double stock;
    /**
     * 库存数量
     */
    @ApiModelProperty(value= "可出数量")
    @ApiModelProperty(value = "可出数量")
    @TableField(exist = false)
    private String locSts;
    /**
     * 库存数量
     */
    @ApiModelProperty(value= "可出数量")
    @ApiModelProperty(value = "可出数量")
    @TableField(exist = false)
    private String locSts$;
    /**
     * 工序状态
     */
    @ApiModelProperty(value= "工序状态 1:待加工,2:已加工,3:无需加工")
    @ApiModelProperty(value = "工序状态 1:待加工,2:已加工,3:无需加工")
    @TableField("process_sts")
    private Integer processSts;
    public String getProcessSts$(){
        if (null == this.processSts){ return null; }
        switch (this.processSts){
    public String getProcessSts$() {
        if (null == this.processSts) {
            return null;
        }
        switch (this.processSts) {
            case 0:
                return "其他";
            case 1:
@@ -206,18 +212,20 @@
        }
    }
    public String getLocNo$(){
    public String getLocNo$() {
        LocMastService service = SpringUtils.getBean(LocMastService.class);
        LocMast locMast = service.selectById(this.locNo);
        if (!Cools.isEmpty(locMast)){
        if (!Cools.isEmpty(locMast)) {
            return String.valueOf(locMast.getLocNo());
        }
        return null;
    }
    public String getBeBatch$(){
        if (null == this.beBatch){ return null; }
        switch (this.beBatch){
    public String getBeBatch$() {
        if (null == this.beBatch) {
            return null;
        }
        switch (this.beBatch) {
            case 1:
                return "是";
            case 0:
@@ -227,9 +235,11 @@
        }
    }
    public String getSource$(){
        if (null == this.source){ return null; }
        switch (this.source){
    public String getSource$() {
        if (null == this.source) {
            return null;
        }
        switch (this.source) {
            case 1:
                return "制造";
            case 2:
@@ -241,9 +251,11 @@
        }
    }
    public String getInspect$(){
        if (null == this.inspect){ return null; }
        switch (this.inspect){
    public String getInspect$() {
        if (null == this.inspect) {
            return null;
        }
        switch (this.inspect) {
            case 1:
                return "是";
            case 0:
@@ -253,9 +265,11 @@
        }
    }
    public String getDanger$(){
        if (null == this.danger){ return null; }
        switch (this.danger){
    public String getDanger$() {
        if (null == this.danger) {
            return null;
        }
        switch (this.danger) {
            case 1:
                return "是";
            case 0:
@@ -265,33 +279,33 @@
        }
    }
    public String getModiUser$(){
    public String getModiUser$() {
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.selectById(this.modiUser);
        if (!Cools.isEmpty(user)){
        if (!Cools.isEmpty(user)) {
            return String.valueOf(user.getUsername());
        }
        return null;
    }
    public String getModiTime$(){
        if (Cools.isEmpty(this.modiTime)){
    public String getModiTime$() {
        if (Cools.isEmpty(this.modiTime)) {
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.modiTime);
    }
    public String getAppeUser$(){
    public String getAppeUser$() {
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.selectById(this.appeUser);
        if (!Cools.isEmpty(user)){
        if (!Cools.isEmpty(user)) {
            return String.valueOf(user.getUsername());
        }
        return null;
    }
    public String getAppeTime$(){
        if (Cools.isEmpty(this.appeTime)){
    public String getAppeTime$() {
        if (Cools.isEmpty(this.appeTime)) {
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.appeTime);
@@ -302,7 +316,7 @@
    }
    public String getStockFreeze$() {
        if (Cools.isEmpty(this.stockFreeze)){
        if (Cools.isEmpty(this.stockFreeze)) {
            return "";
        }
        return this.stockFreeze == 1 ? "正常" : "冻结";
src/main/java/com/zy/asrs/entity/param/AgvWarnCallBackParam.java
@@ -17,6 +17,7 @@
    private String tokenCode;
    private List<AgvWarnBody> data;
}
src/main/java/com/zy/asrs/mapper/AgvBasMapper.java
New file
@@ -0,0 +1,20 @@
package com.zy.asrs.mapper;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.zy.asrs.entity.Agv;
import com.zy.asrs.entity.AgvBasDevp;
import org.apache.ibatis.annotations.Delete;
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 AgvBasMapper extends BaseMapper<Agv> {
}
src/main/java/com/zy/asrs/task/AgvWarnScheduler.java
@@ -6,7 +6,9 @@
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.zy.asrs.entity.Agv;
import com.zy.asrs.entity.AgvWarn;
import com.zy.asrs.mapper.AgvBasMapper;
import com.zy.asrs.service.AgvWarnService;
import com.zy.asrs.task.handler.AgvWarnHandler;
import com.zy.common.utils.HttpHandler;
@@ -40,39 +42,53 @@
    @Autowired
    private ConfigService configService;
    @Autowired
    private AgvBasMapper agvBasMapper;
    /**
     * 超过
     * 超过一分钟没更新的,删除
     */
    @Scheduled(fixedDelay = 30000)
    @Scheduled(fixedDelay = 10000)
    private void del() {
        String format = DateUtil.format(DateUtil.offsetMinute(new Date(), -3), "yyyy-MM-dd HH:mm:ss");
        List<AgvWarn> agvWarnList = agvWarnService.selectList(new EntityWrapper<AgvWarn>().ge("modi_time", format));
        String format = DateUtil.format(DateUtil.offsetMinute(new Date(), -1), "yyyy-MM-dd HH:mm:ss");
        List<AgvWarn> agvWarnList = agvWarnService.selectList(new EntityWrapper<AgvWarn>().le("modi_time", format));
        for (AgvWarn agvWarn : agvWarnList) {
            agvWarnHandler.start(agvWarn);
        }
    }
    @Scheduled(fixedDelay = 10000)
    @Scheduled(fixedDelay = 20000)
    private void report() {
        List<Config> config = configService.selectList(new EntityWrapper<Config>().eq("code", "AGV_WARN_REPORT_URL"));
        List<Agv> agvs = agvBasMapper.selectList(new EntityWrapper<Agv>());
        Config first = configService.selectOne(new EntityWrapper<Config>().eq("code", "AGV_WARN_RATE1"));
        Config second = configService.selectOne(new EntityWrapper<Config>().eq("code", "AGV_WARN_RATE2"));
        Config third = configService.selectOne(new EntityWrapper<Config>().eq("code", "AGV_WARN_RATE3"));
        Config url = configService.selectOne(new EntityWrapper<Config>().eq("code", "AGV_WARN_REPORT_URL"));
        List<AgvWarn> agvWarnList = agvWarnService.selectList(new EntityWrapper<AgvWarn>());
        StringBuffer buffer;
        for (AgvWarn agvWarn : agvWarnList) {
            Integer warnTime = getWarnTime(agvWarn.getTimes());
            Integer warnTime = getWarnTime(agvWarn.getTimes(), first.getValue(), second.getValue(), third.getValue());
            DateTime begin = DateUtil.parse(agvWarn.getBeginTime(), "yyyy-MM-dd HH:mm:ss");
            if (DateUtil.offsetMinute(begin, warnTime).after(new Date())) {
            if (DateUtil.offsetMinute(begin, warnTime).before(new Date())) {
                buffer = new StringBuffer();
                buffer.append(agvWarn.getRobotCode() + "号AGV小车报警:");
                buffer.append(agvWarn.getWarnContent());
                buffer.append(processRegion(agvs, agvWarn.getRobotCode()) + "[" + agvWarn.getRobotCode() + "]号AGV小车报警了\n");
                buffer.append("报警类型:" + agvWarn.getWarnContent() + "\n");
                if (!Cools.isEmpty(agvWarn.getSourceLocNo())) {
                    buffer.append("从:[" + agvWarn.getSourceLocNo() + "]到[" + agvWarn.getLocNo() + "]\n");
                }
                buffer.append("开始时间:" + agvWarn.getBeginTime() + "\n");
                int i = agvWarn.getTimes() + 1;
                buffer.append("第[" + i + "]次报警");
                HashMap<String, Object> param = new HashMap<>();
                HashMap<String, Object> data = new HashMap<>();
                data.put("content", buffer.toString());
                param.put("msgtype", "text");
                param.put("text", data);
                log.info("发送报警信息:{}", JSON.toJSONString(param));
                String response = null;
                try {
                    response = new HttpHandler.Builder()
                            .setUri(config.get(0).getValue())
                            .setUri(url.getValue())
                            .setJson(JSON.toJSONString(param))
                            .setHttps(true)
                            .build()
@@ -82,6 +98,8 @@
                }
                JSONObject jsonObject = JSON.parseObject(response);
                if (jsonObject.get("errmsg").equals("ok")) {
                    agvWarn.setTimes(agvWarn.getTimes() + 1);
                    agvWarnService.updateById(agvWarn);
                    //发送成功
                    return;
                } else {
@@ -96,32 +114,29 @@
     * @param times
     * @return
     */
    private Integer getWarnTime(Integer times) {
        try {
            List<Config> config = configService.selectList(new EntityWrapper<Config>().eq("code", "AGV_WARN_RATE1"));
            if (!Cools.isEmpty(config)) {
                String value = config.get(0).getValue();
                if (Cools.isEmpty(value)) {
                    return 5;
                } else {
                    String[] split = value.split(",");
                    if (split.length < times + 1) {
                        Config config2 = configService.selectOne(new EntityWrapper<Config>().eq("code", "AGV_WARN_RATE2"));
                        int t = 0;
                        for (String s : split) {
                            t = t + Integer.parseInt(s);
                        }
                        return t + Integer.parseInt(config2.getValue()) * (times + 1 - split.length);
                    } else {
                        return Integer.parseInt(split[times]);
                    }
                }
            }
            return 5;
        } catch (Exception e) {
            return 5;
    private Integer getWarnTime(Integer times, String first, String second, String thrid) {
        switch (times) {
            case 0:
                return Integer.parseInt(first);
            case 1:
                return Integer.parseInt(second);
            case 2:
                return Integer.parseInt(thrid);
            default:
                return (times - 2) * Integer.parseInt(thrid) + Integer.parseInt(first) + Integer.parseInt(second) + Integer.parseInt(thrid);
        }
    }
    private String processRegion(List<Agv> agvs, String agvNo) {
        if (agvNo == null) {
            return "未知小车";
        }
        for (Agv agv : agvs) {
            if (agv.getAgvNo() != null && agv.getAgvNo().equals(agvNo)) {
                return agv.getRegion();
            }
        }
        return "未知";
    }
}
src/main/java/com/zy/asrs/task/ReportDataScheduler.java
@@ -60,7 +60,7 @@
    private String stock;
    @Scheduled(fixedDelay = 5000)
    @Scheduled(fixedDelay = 30000)
    public void execute() {
        log.info("定时任务开始执行");
        if (!flag) {
@@ -121,12 +121,12 @@
    }
    @Scheduled(fixedDelay = 1000 * 60 * 30)
    public void executeStock() {
        log.info("Stock定时任务开始执行");
        if (!flag) {
            return;
        }
//        if (!flag) {
//            return;
//        }
        Map<String, Object> mesTokenInfo = getMesTokenInfo();
        reportDataHandler.stock(mesTokenInfo);
        log.info("Stock定时任务结束执行");
src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java
@@ -573,7 +573,7 @@
            return SUCCESS;
        } catch (Exception e) {
            //TODO
            log.error("修改AGV入库通知档状态入出状态为Y,{}", e.getMessage());
            //log.error("修改AGV入库通知档状态入出状态为Y,{}", e.getMessage());
        }
        return FAIL;
    }
src/main/java/com/zy/asrs/task/handler/ReportDataHandler.java
@@ -27,6 +27,7 @@
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
 * Created by vincent on 2020/7/7
@@ -114,7 +115,7 @@
                throw new CoolException("mes接口调用失败,返回信息:" + jsonObject);
            }
            success = true;
            return null;
            return response;
        } catch (Exception e) {
            log.error("mes接口调用失败,返回信息:{}", e.getMessage());
@@ -128,7 +129,22 @@
    @Transactional
    public ReturnT<String> stock(Map<String, Object> mesTokenInfo) {
        mesLocDetlService.delete(new EntityWrapper<MesLocDetl>().eq("1", 1));
        List<MesLocDetl> all = mesLocDetlService.selectList(new EntityWrapper<>());
        if (all != null) {
            List<Long> collect = all.stream().map(MesLocDetl::getId).collect(Collectors.toList());
            boolean del = true;
            int d = 1;
            while (del && collect.size() > 0) {
                if (collect.size() > d * 1000) {
                    mesLocDetlService.deleteBatchIds(collect.subList((d - 1) * 1000, d * 1000));
                } else {
                    mesLocDetlService.deleteBatchIds(collect.subList((d - 1) * 1000, collect.size()));
                    del = false;
                }
                d++;
            }
        }
        boolean flag = true;
        Map<String, Object> req = new HashMap<>();
        int i = 1;
@@ -155,16 +171,19 @@
                        mesLocDetl.setBatch(mesStock.getBatchNo());
                        mesLocDetl.setAnfme(mesStock.getOpAmount().getAmount().getAmount());
                        mesLocDetls.add(mesLocDetl);
                        mesLocDetlService.insert(mesLocDetl);
                    }
                } else {
                    flag = false;
                }
            }
            if (!mesLocDetls.isEmpty()) {
                mesLocDetlService.insertBatch(mesLocDetls);
                //mesLocDetlService.insertBatch(mesLocDetls);
            }
            i++;
        }
        return SUCCESS;
    }
}
src/main/resources/application.yml
@@ -1,4 +1,4 @@
spring:
  profiles:
    #dev loc prod
    active: prod
    active: loc
src/main/resources/mapper/AgvBasMapper.xml
New file
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.asrs.mapper.AgvWarnMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.Agv">
        <id column="agv_no" property="agvNo" />
        <result column="region" property="region" />
    </resultMap>
</mapper>
src/main/resources/mapper/AgvWarnLogMapper.xml
@@ -3,5 +3,4 @@
<mapper namespace="com.zy.asrs.mapper.AgvWarnLogMapper">
</mapper>
src/main/resources/mapper/MesLocDetlMapper.xml
@@ -2,6 +2,49 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.asrs.mapper.MesLocDetlMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.AgvLocDetl">
        <result column="loc_no" property="locNo"/>
        <result column="zpallet" property="zpallet"/>
        <result column="anfme" property="anfme"/>
        <result column="matnr" property="matnr"/>
        <result column="maktx" property="maktx"/>
        <result column="batch" property="batch"/>
        <result column="order_no" property="orderNo"/>
        <result column="specs" property="specs"/>
        <result column="model" property="model"/>
        <result column="color" property="color"/>
        <result column="brand" property="brand"/>
        <result column="unit" property="unit"/>
        <result column="price" property="price"/>
        <result column="sku" property="sku"/>
        <result column="units" property="units"/>
        <result column="barcode" property="barcode"/>
        <result column="origin" property="origin"/>
        <result column="manu" property="manu"/>
        <result column="manu_date" property="manuDate"/>
        <result column="item_num" property="itemNum"/>
        <result column="safe_qty" property="safeQty"/>
        <result column="weight" property="weight"/>
        <result column="length" property="length"/>
        <result column="volume" property="volume"/>
        <result column="three_code" property="threeCode"/>
        <result column="supp" property="supp"/>
        <result column="supp_code" property="suppCode"/>
        <result column="be_batch" property="beBatch"/>
        <result column="dead_time" property="deadTime"/>
        <result column="dead_warn" property="deadWarn"/>
        <result column="source" property="source"/>
        <result column="inspect" property="inspect"/>
        <result column="danger" property="danger"/>
        <result column="modi_user" property="modiUser"/>
        <result column="modi_time" property="modiTime"/>
        <result column="appe_user" property="appeUser"/>
        <result column="appe_time" property="appeTime"/>
        <result column="memo" property="memo"/>
        <result column="stock_freeze" property="stockFreeze"/>
    </resultMap>
</mapper>
src/main/webapp/static/js/agvLocDetlStatis/locDetlStatis.js
@@ -1,23 +1,27 @@
var pageCurr;
function getCol() {
    var cols = [
        {field: 'anfme', align: 'center',title: '库存数量', style: 'font-weight: bold'}
        {field: 'anfme', align: 'center', title: 'WMS库存数量', style: 'font-weight: bold'}
        , {field: 'anfme2', align: 'center', title: 'MES库存数量', style: 'font-weight: bold'}
        , {field: 'matnr', align: 'center', title: '编码'}
        , {field: 'maktx', align: 'center', title: '物料名称'}
    ];
    arrRemove(detlCols, "field", "anfme");
    arrRemove(detlCols,"field","suppCode");
    arrRemove(detlCols, "field", "zpallet");
    arrRemove(detlCols, "field", "orderNo");
    arrRemove(detlCols, "field", "threeCode");
    arrRemove(detlCols, "field", "deadTime");
    arrRemove(detlCols, "field", "batch");
    cols.push.apply(cols, detlCols);
    // arrRemove(detlCols, "field", "anfme");
    // arrRemove(detlCols,"field","suppCode");
    // arrRemove(detlCols, "field", "zpallet");
    // arrRemove(detlCols, "field", "orderNo");
    // arrRemove(detlCols, "field", "threeCode");
    // arrRemove(detlCols, "field", "deadTime");
    // arrRemove(detlCols, "field", "batch");
    //cols.push.apply(cols, detlCols);
    // cols.push({field: 'anfme', align: 'center',title: '数量', style: 'font-weight: bold'}
    // )
    return cols;
}
layui.use(['table','laydate', 'form'], function(){
layui.use(['table', 'laydate', 'form'], function () {
    var table = layui.table;
    var $ = layui.jquery;
    var layer = layui.layer;
@@ -28,7 +32,7 @@
    tableIns = table.render({
        elem: '#locDetlStatis',
        headers: {token: localStorage.getItem('token')},
        url: baseUrl+'/agv/locDetl/statis/auth',
        url: baseUrl + '/agv/locDetl/statis/auth',
        page: true,
        limit: 20,
        limits: [20, 30, 50, 100, 200, 500],
@@ -51,17 +55,17 @@
        response: {
            statusCode: 200
        },
        done: function(res, curr, count) {
        done: function (res, curr, count) {
            if (res.code === 403) {
                top.location.href = baseUrl+"/";
                top.location.href = baseUrl + "/";
            }
            pageCurr=curr;
            pageCurr = curr;
            limit();
            form.on('checkbox(tableCheckbox)', function (data) {
                var _index = $(data.elem).attr('table-index')||0;
                if(data.elem.checked){
                var _index = $(data.elem).attr('table-index') || 0;
                if (data.elem.checked) {
                    res.data[_index][data.value] = 'Y';
                }else{
                } else {
                    res.data[_index][data.value] = 'N';
                }
            });
@@ -69,9 +73,9 @@
             * 显示库存总数量
             */
            $.ajax({
                url: baseUrl+"/agv/locDetl/count",
                url: baseUrl + "/agv/locDetl/count",
                headers: {'token': localStorage.getItem('token')},
                contentType:'application/json;charset=UTF-8',
                contentType: 'application/json;charset=UTF-8',
                method: 'POST',
                success: function (res) {
                    $("#countNum").text(res.data + '个');
@@ -84,7 +88,7 @@
    // 监听排序事件
    table.on('sort(locDetlStatis)', function (obj) {
        var searchData = {};
        $.each($('#search-box [name]').serializeArray(), function() {
        $.each($('#search-box [name]').serializeArray(), function () {
            searchData[this.name] = this.value;
        });
        searchData['orderByField'] = obj.field;
@@ -96,9 +100,9 @@
            },
            done: function (res, curr, count) {
                if (res.code === 403) {
                    top.location.href = baseUrl+"/";
                    top.location.href = baseUrl + "/";
                }
                pageCurr=curr;
                pageCurr = curr;
                limit();
            }
        });
@@ -107,11 +111,11 @@
    // 监听头工具栏事件
    table.on('toolbar(locDetlStatis)', function (obj) {
        var checkStatus = table.checkStatus(obj.config.id);
        switch(obj.event) {
        switch (obj.event) {
            case 'exportAll':
                layer.confirm('确定导出Excel吗', {shadeClose: true}, function(){
                    var titles=[];
                    var fields=[];
                layer.confirm('确定导出Excel吗', {shadeClose: true}, function () {
                    var titles = [];
                    var fields = [];
                    obj.config.cols[0].map(function (col) {
                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
                            titles.push(col.title);
@@ -119,7 +123,7 @@
                        }
                    });
                    var exportData = {};
                    $.each($('#search-box [name]').serializeArray(), function() {
                    $.each($('#search-box [name]').serializeArray(), function () {
                        exportData[this.name] = this.value;
                    });
                    var param = {
@@ -128,19 +132,19 @@
                    };
                    var loadIndex = layer.msg('正在导出...', {icon: 16, shade: 0.01, time: false});
                    $.ajax({
                        url: baseUrl+"/agv/locDetl/statis/export",
                        url: baseUrl + "/agv/locDetl/statis/export",
                        headers: {'token': localStorage.getItem('token')},
                        data: JSON.stringify(param),
                        dataType:'json',
                        contentType:'application/json;charset=UTF-8',
                        dataType: 'json',
                        contentType: 'application/json;charset=UTF-8',
                        method: 'POST',
                        success: function (res) {
                            layer.close(loadIndex);
                            layer.closeAll();
                            if (res.code === 200) {
                                table.exportFile(titles,res.data,'xls');
                                table.exportFile(titles, res.data, 'xls');
                            } else if (res.code === 403) {
                                top.location.href = baseUrl+"/";
                                top.location.href = baseUrl + "/";
                            } else {
                                layer.msg(res.msg)
                            }
@@ -149,9 +153,9 @@
                });
                break;
            case 'exportData':
                layer.confirm('确定导出Excel吗', {shadeClose: true}, function(){
                    var titles=[];
                    var fields=[];
                layer.confirm('确定导出Excel吗', {shadeClose: true}, function () {
                    var titles = [];
                    var fields = [];
                    obj.config.cols[0].map(function (col) {
                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
                            titles.push(col.title);
@@ -159,7 +163,7 @@
                        }
                    });
                    var exportData = {};
                    $.each($('#search-box [name]').serializeArray(), function() {
                    $.each($('#search-box [name]').serializeArray(), function () {
                        exportData[this.name] = this.value;
                    });
                    var param = {
@@ -167,18 +171,18 @@
                        'fields': fields
                    };
                    $.ajax({
                        url: baseUrl+"/agv/locDetl/export/auth",
                        url: baseUrl + "/agv/locDetl/export/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: JSON.stringify(param),
                        dataType:'json',
                        contentType:'application/json;charset=UTF-8',
                        dataType: 'json',
                        contentType: 'application/json;charset=UTF-8',
                        method: 'POST',
                        success: function (res) {
                            layer.closeAll();
                            if (res.code === 200) {
                                table.exportFile(titles,res.data,'xls');
                                table.exportFile(titles, res.data, 'xls');
                            } else if (res.code === 403) {
                                top.location.href = baseUrl+"/";
                                top.location.href = baseUrl + "/";
                            } else {
                                layer.msg(res.msg)
                            }
@@ -190,7 +194,7 @@
    });
    // 监听行工具事件
    table.on('tool(locDetlStatis)', function(obj){
    table.on('tool(locDetlStatis)', function (obj) {
        var data = obj.data;
        switch (obj.event) {
            // 详情
@@ -202,11 +206,12 @@
                    area: [top.detailWidth, top.detailHeight],
                    shadeClose: false,
                    content: 'locDetl_detail.html',
                    success: function(layero, index){
                    success: function (layero, index) {
                        setFormVal(layer.getChildFrame('#detail', index), data, true);
                        top.convertDisabled(layer.getChildFrame('#data-detail :input', index), true);
                        layer.getChildFrame('#data-detail-submit-save,#data-detail-submit-edit,#prompt', index).hide();
                        layer.iframeAuto(index);layer.style(index, {top: (($(window).height()-layer.getChildFrame('#data-detail', index).height())/3)+"px"});
                        layer.iframeAuto(index);
                        layer.style(index, {top: (($(window).height() - layer.getChildFrame('#data-detail', index).height()) / 3) + "px"});
                        layero.find('iframe')[0].contentWindow.layui.form.render('select');
                        layero.find('iframe')[0].contentWindow.layui.form.render('checkbox');
                    }
@@ -244,13 +249,13 @@
});
// 关闭动作
$(document).on('click','#data-detail-close', function () {
$(document).on('click', '#data-detail-close', function () {
    parent.layer.closeAll();
});
function tableReload(child) {
    var searchData = {};
    $.each($('#search-box [name]').serializeArray(), function() {
    $.each($('#search-box [name]').serializeArray(), function () {
        searchData[this.name] = this.value;
    });
    (child ? parent.tableIns : tableIns).reload({
@@ -260,14 +265,14 @@
        },
        done: function (res, curr, count) {
            if (res.code === 403) {
                top.location.href = baseUrl+"/";
                top.location.href = baseUrl + "/";
            }
            pageCurr=curr;
            pageCurr = curr;
            if (res.data.length === 0 && count !== 0) {
                tableIns.reload({
                    where: searchData,
                    page: {
                        curr: pageCurr-1
                        curr: pageCurr - 1
                    }
                });
                pageCurr -= 1;
@@ -279,13 +284,13 @@
function detailScreen(index) {
    var detail = layer.getChildFrame('#data-detail', index);
    var height = detail.height()+60;
    if (height > ($(window).height()*0.9)) {
        height = ($(window).height()*0.8);
    var height = detail.height() + 60;
    if (height > ($(window).height() * 0.9)) {
        height = ($(window).height() * 0.8);
    }
    layer.style(index, {
//        top: (($(window).height()-height)/3)+"px",
        height: height+'px'
        height: height + 'px'
    });
}
src/main/webapp/views/agvLocDetlStatis/locDetlStatis.html
@@ -26,14 +26,14 @@
        <button id="reset" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="reset">重置
        </button>
    </div>
    <div class="layui-inline">
        <fieldset class="layui-elem-field">
            <legend>总计数量</legend>
            <div class="layui-field-box" id="countNum">
                请稍等
            </div>
        </fieldset>
    </div>
<!--    <div class="layui-inline">-->
<!--        <fieldset class="layui-elem-field">-->
<!--            <legend>总计数量</legend>-->
<!--            <div class="layui-field-box" id="countNum">-->
<!--                请稍等-->
<!--            </div>-->
<!--        </fieldset>-->
<!--    </div>-->
</div>
<!-- 表格 -->
@@ -52,7 +52,7 @@
<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/agvLocDetlStatis/locDetlStatis.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/agvLocDetlStatis/locDetlStatis.js?v=1" charset="utf-8"></script>
</body>
</html>