自动化立体仓库 - WMS系统
zyx
2023-10-15 86b8273226c7aa87e7c346659ed9e76278dcc471
AGV工作档取消和完成
17个文件已修改
5个文件已添加
536 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/AgvOpenController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/InventoryVariance.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/AgvLocDetlMapper.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/InventoryVarianceMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/AgvWrkDetlService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/AgvWrkMastLogService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/AgvWrkMastService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/AllLocDetlService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/InventoryVarianceService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OrderDetlService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java 182 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvWrkDetlServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvWrkMastServiceImp.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AllLocDetlServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/InventoryVarianceServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OrderDetlServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/erp/ErpService.java 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/erp/entity/WlzhVStRd.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/erp/task/ErpScheduler.java 187 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/ViewStayTimeMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/AgvOpenController.java
@@ -118,7 +118,7 @@
            }
            //出库任务 110.空板出库
            if(agvWrkMast.getIoType() == 110){
                agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getLocNo(),"D",agvWrkMast.getBarcode());
                agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getLocNo(),"F",agvWrkMast.getBarcode());
            }
        }
src/main/java/com/zy/asrs/entity/InventoryVariance.java
New file
@@ -0,0 +1,30 @@
package com.zy.asrs.entity;
import com.baomidou.mybatisplus.annotations.TableName;
import lombok.Data;
/**
 * ERP - 立库 库存差异统计表
 */
@Data
@TableName("inventory_variance")
public class InventoryVariance {
    //存货编码
    private String matnr;
    //销售订单号
    private String csocode;
    //销售订单行号
    private String isoseq;
    //ERP存货数量
    private Double iQuantity;
    //立库存货数量
    private Double anfme;
    public InventoryVariance(String matnr, String csocode, String isoseq, Double iQuantity, Double anfme){
        this.matnr = matnr;
        this.csocode = csocode;
        this.isoseq = isoseq;
        this.iQuantity = iQuantity;
        this.anfme = anfme;
    }
}
src/main/java/com/zy/asrs/mapper/AgvLocDetlMapper.java
@@ -24,8 +24,11 @@
            "\t\tROW_NUMBER() over (order by sum(a.anfme) desc) as row\n" +
            "\t\t, a.matnr\n" +
            "\t\t, sum(a.anfme) as anfme\n" +
            "\t\tfrom agv_loc_detl a\n" +
            "\t\twhere 1=1\n" +
//            "\t\tfrom agv_loc_detl a\n" +
//            "\t\twhere 1=1\n" +
//            "\t\t<when #{matnr} != '>" +
//            "\t\tAND matnr = #{matnr}" +
            "\t\t</when>" +
            "\t\tgroup by a.matnr\n" +
            " ) t where t.row between ((#{pageNumber}-1)*#{pageSize}+1) and (#{pageNumber}*#{pageSize})")
    List<AgvLocDetl> getStockStatis(Map<String, Object> map);
src/main/java/com/zy/asrs/mapper/InventoryVarianceMapper.java
New file
@@ -0,0 +1,11 @@
package com.zy.asrs.mapper;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.zy.asrs.entity.InventoryVariance;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface InventoryVarianceMapper extends BaseMapper<InventoryVariance> {
}
src/main/java/com/zy/asrs/service/AgvWrkDetlService.java
@@ -24,4 +24,6 @@
    boolean updateOrderNo(String orderNo, Integer wrkNo, String matnr, String batch);
    boolean deleteByWrkNo(int wrkNo);
}
src/main/java/com/zy/asrs/service/AgvWrkMastLogService.java
@@ -6,6 +6,6 @@
public interface AgvWrkMastLogService extends IService<AgvWrkMastLog> {
    boolean save(AgvWrkMast workNo);
    boolean save(AgvWrkMast agvWrkMast);
}
src/main/java/com/zy/asrs/service/AgvWrkMastService.java
@@ -17,4 +17,6 @@
    public int containerMoveOut(List<AgvWrkMast> agvWrkMastList) throws IOException;
    public boolean insertByIncrease(AgvWrkMast agvWrkMast);
    public boolean deleteByWrkNo(int wrkNo);
}
src/main/java/com/zy/asrs/service/AllLocDetlService.java
@@ -3,6 +3,9 @@
import com.baomidou.mybatisplus.service.IService;
import com.zy.asrs.entity.AllLocDetl;
import java.util.List;
public interface AllLocDetlService extends IService<AllLocDetl> {
    public List<AllLocDetl> getByMatnrAndCsocodeAndIsoseq(String matnr, String csocode, String isoseq);
}
src/main/java/com/zy/asrs/service/InventoryVarianceService.java
New file
@@ -0,0 +1,7 @@
package com.zy.asrs.service;
import com.baomidou.mybatisplus.service.IService;
import com.zy.asrs.entity.InventoryVariance;
public interface InventoryVarianceService extends IService<InventoryVariance> {
}
src/main/java/com/zy/asrs/service/OrderDetlService.java
@@ -34,4 +34,6 @@
    OrderDetl selectContainBatch(String batch);
    public OrderDetl selectByOrderNoAndMatnr(String orderNo, String matnr, String csocode, String isoseq);
}
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java
@@ -3,7 +3,6 @@
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.EmptyPlateOutParam;
@@ -25,7 +24,6 @@
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
/**
 * Created by vincent on 2020/6/11
@@ -447,26 +445,22 @@
        if (Cools.isEmpty(wrkMast)){
            throw new CoolException(workNo+"工作档不存在");
        }
        if (wrkMast.getWrkSts() == 9 || wrkMast.getWrkSts() == 29) {
            throw new CoolException("当前工作档已完成");
        if(wrkMast.getWrkSts() > 202){
            //修改AGV工作档的工作状态为205.工作完成
            agvWrkMastService.updateWrkStsByWrkNo(wrkMast.getWrkNo(),205);
            //出库任务 101.出库 || 103.拣料出库 || 107.盘点出库
            if(wrkMast.getIoType() == 101 || wrkMast.getIoType() == 103 || wrkMast.getIoType() == 107){
                //修改出库站点状态
                agvBasDevpService.updateLocStsAndBarcodeByDevNo(wrkMast.getLocNo(),"F",wrkMast.getBarcode());
            }
            //出库任务 110.空板出库
            if(wrkMast.getIoType() == 110){
                agvBasDevpService.updateLocStsAndBarcodeByDevNo(wrkMast.getLocNo(),"F",wrkMast.getBarcode());
            }
        }
        // 入库 + 库位转移
        if (wrkMast.getWrkSts() < 9 || (wrkMast.getWrkSts() > 10 && wrkMast.getIoType()==11)) {
            wrkMast.setWrkSts(9L);
            // 出库
        } else if (wrkMast.getWrkSts() > 20) {
            wrkMast.setWrkSts(29L);
        }
        Date now = new Date();
        wrkMast.setCrnStrTime(DateUtils.calculate(now, 1L, TimeUnit.SECONDS, true));
        wrkMast.setCrnEndTime(now);
        wrkMast.setModiTime(now);
        wrkMast.setModiUser(userId);
        // 完成操作人员记录
        wrkMast.setManuType("手动完成");
        if (!agvWrkMastService.updateById(wrkMast)) {
            throw new CoolException("修改工作档失败");
        }
    }
    @Transactional
@@ -475,125 +469,51 @@
        if (Cools.isEmpty(wrkMast)){
            throw new CoolException(workNo+"工作档不存在");
        }
        if (wrkMast.getWrkSts() == 200) {
            //小车移库任务,直接删除工作档
            agvWrkMastService.deleteById(wrkMast);
            return;
        //拣料入库 盘点入库不可取消
        if(wrkMast.getIoType() == 53 || wrkMast.getIoType() == 57){
            throw new CoolException("当前任务不可取消");
        }
        String locNo = ""; // 待修改目标库位
        String locSts = ""; // 待修改目标库位状态
        // 入库取消(修改目标库位)
        if (wrkMast.getWrkSts() < 9) {
            locNo = wrkMast.getLocNo();
            locSts = "O";
        //AGV机器人未取货前取消
        if(wrkMast.getWrkSts() < 203){
            //入库取消
            if(wrkMast.getIoType() == 1 || wrkMast.getIoType() == 10){
                //源站点
                String devNo = wrkMast.getSourceLocNo();
                //目标库位
                String locNo = wrkMast.getLocNo();
                agvLocMastService.updateLocStsByLocNo(locNo,"O");
                agvBasDevpService.updateLocStsAndBarcodeByDevNo(devNo,"F",wrkMast.getBarcode());
            // 库位转移
            if (wrkMast.getIoType() == 11) {
                // 库位转移:源库位
                AgvLocMast locMast = agvLocMastService.selectById(wrkMast.getSourceLocNo());
                if (Cools.isEmpty(locMast)) {
                    throw new CoolException("取消库位转移失败,源库位不存在:"+ wrkMast.getSourceLocNo());
                }
                locMast.setLocSts("F");
                locMast.setModiTime(new Date());
                locMast.setModiUser(userId);
                agvLocMastService.updateById(locMast);
                //出库取消
            }else {
                //源库位
                String locNo = wrkMast.getSourceLocNo();
                //目标站点
                String devNo = wrkMast.getLocNo();
                agvLocMastService.updateLocStsByLocNo(locNo,"F");
                agvBasDevpService.updateLocStsAndBarcodeByDevNo(devNo,"O","");
            }
            // 出库取消(修改源库位)
        } else if (wrkMast.getWrkSts() > 20) {
            locNo = wrkMast.getSourceLocNo();
            // 出库 ===>> F.在库
            if (wrkMast.getIoType() > 100 && wrkMast.getIoType() != 110) {
                locSts = "F";
                // 空板出库 ===>> D.空桶/空栈板
            } else if (wrkMast.getIoType() == 110) {
                locSts = "D";
                // 库位转移 ===>> D.空桶/空栈板
            } else if (wrkMast.getIoType() == 11) {
                locSts = wrkMast.getFullPlt().equalsIgnoreCase("N")?"D":"F";
                // 库位转移:目标库位
                AgvLocMast locMast = agvLocMastService.selectById(wrkMast.getLocNo());
                if (Cools.isEmpty(locMast)) {
                    throw new CoolException("取消库位转移失败,目标库位不存在:"+ wrkMast.getSourceLocNo());
                }
                locMast.setLocSts("O");
                locMast.setModiTime(new Date());
                locMast.setModiUser(userId);
                agvLocMastService.updateById(locMast);
            }
        } else {
            throw new CoolException("当前工作状态无法取消");
        }
        // 订单关联
        List<AgvWrkDetl> wrkDetls = agvWrkDetlService.selectByWrkNo(wrkMast.getWrkNo());
        for (AgvWrkDetl wrkDetl : wrkDetls) {
            if (!Cools.isEmpty(wrkDetl.getOrderNo())) {
                if (!BaseController.isJSON(wrkDetl.getOrderNo())) {
                    if (!orderDetlService.decrease(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getAnfme())) {
                        throw new CoolException("订单数据回滚失败");
                    }
                } else {
                    // 订单合并出库
                    //实际取消的出库数量
                    Double wrkDetlAnfme = wrkDetl.getAnfme();
                    //订单实际出库数量
                    Double orderAnfme;
                    List<OrderDto> orderDtoList = JSON.parseArray(wrkDetl.getOrderNo(), OrderDto.class);
                    for (OrderDto orderDto : orderDtoList) {
                        if(wrkDetlAnfme > orderDto.getAnfme()){
                            orderAnfme = orderDto.getAnfme();
                            wrkDetlAnfme -= orderAnfme;
                        }else {
                            orderAnfme = wrkDetlAnfme;
                        }
                        if (!orderDetlService.decrease(orderDto.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), orderAnfme)) {
                            throw new CoolException("订单数据回滚失败");
                        }
                    }
                }
            }
        }
        // 取消操作人员记录
        wrkMast.setManuType("手动取消");
        wrkMast.setModiUser(userId);
        wrkMast.setModiTime(new Date());
        if (!agvWrkMastService.updateById(wrkMast)) {
            throw new CoolException("取消工作档失败");
        }
        // 保存工作主档历史档
        if (!agvWrkMastLogService.save(wrkMast)) {
            throw new CoolException("保存工作历史档失败, workNo = " + wrkMast.getWrkNo());
        }
        // 删除工作主档
        boolean wrkMastRes = agvWrkMastService.deleteById(wrkMast);
        if (wrkMast.getIoType() != 10 && wrkMast.getIoType() != 110) {
            // 保存工作明细档历史档
            if (!agvWrkDetlLogService.save(wrkMast.getWrkNo())) {
//                throw new CoolException("保存工作明细历史档失败, workNo = " + wrkMast.getWrkNo());
            }
            // 删除工作档明细
            boolean wrkDetlRes = agvWrkDetlService.delete(new EntityWrapper<AgvWrkDetl>().eq("wrk_no", workNo));
        }
        // 修改库位状态
        AgvLocMast locMast = agvLocMastService.selectById(locNo);
        if (Cools.isEmpty(locMast)) {
            throw new CoolException("取消工作档失败,库位不存在:"+ locNo);
        //订单回滚
        AgvWrkDetl agvWrkDetl = agvWrkDetlService.selectByWrkNo(wrkMast.getWrkNo()).get(0);
        if(!Cools.isEmpty(agvWrkDetl.getOrderNo())){
            OrderDetl orderDetl = orderDetlService.selectByOrderNoAndMatnr(agvWrkDetl.getOrderNo(),agvWrkDetl.getMatnr(),agvWrkDetl.getThreeCode(),agvWrkDetl.getDeadTime());
            orderDetl.setQty(orderDetl.getQty() - agvWrkDetl.getAnfme());
            orderDetlService.updateById(orderDetl);
        }
        locMast.setLocSts(locSts);
        locMast.setModiTime(new Date());
        locMast.setModiUser(userId);
        boolean locMastRes = agvLocMastService.updateById(locMast);
        if (!wrkMastRes || !locMastRes) {
            throw new CoolException("保存数据失败");
        //保存工作档以及明细
        agvWrkMastLogService.save(wrkMast);
        agvWrkDetlLogService.save(wrkMast.getWrkNo());
        //删除工作档以及明细
        if(agvWrkMastService.deleteByWrkNo(wrkMast.getWrkNo()) && agvWrkDetlService.deleteByWrkNo(wrkMast.getWrkNo())){
            throw new CoolException("删除失败,请联系管理员");
        }
    }
    /*
src/main/java/com/zy/asrs/service/impl/AgvWrkDetlServiceImpl.java
@@ -1,5 +1,6 @@
package com.zy.asrs.service.impl;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.zy.asrs.entity.AgvWrkDetl;
import com.zy.asrs.entity.WrkDetl;
@@ -51,6 +52,7 @@
    */
    @Override
    public List<AgvWrkDetl> selectByWrkNo(Integer wrkNo) {
        return this.baseMapper.selectByWrkNo(wrkNo);
    }
@@ -88,4 +90,9 @@
        return baseMapper.updateOrderNo(orderNo, wrkNo, matnr, batch) > 0;
    }
    @Override
    public boolean deleteByWrkNo(int wrkNo) {
        return this.delete(new EntityWrapper<AgvWrkDetl>().eq("wrk_no",wrkNo));
    }
}
src/main/java/com/zy/asrs/service/impl/AgvWrkMastServiceImp.java
@@ -2,6 +2,7 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.core.exception.CoolException;
import com.zy.asrs.entity.AgvWrkMast;
@@ -115,6 +116,11 @@
        return index > 0;
    }
    @Override
    public boolean deleteByWrkNo(int wrkNo) {
        return this.delete(new EntityWrapper<AgvWrkMast>().eq("wrk_no", wrkNo));
    }
    private void getContainerMoveParam(List<AgvWrkMast> agvWrkMastList,List<Map<String,String>> positionCodeMapList){
        //往容器入场参数中放入源站点位置
        for(AgvWrkMast agvWrkMast : agvWrkMastList){
src/main/java/com/zy/asrs/service/impl/AllLocDetlServiceImpl.java
@@ -1,11 +1,18 @@
package com.zy.asrs.service.impl;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.zy.asrs.entity.AllLocDetl;
import com.zy.asrs.mapper.AllLocDetlMapper;
import com.zy.asrs.service.AllLocDetlService;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class AllLocDetlServiceImpl extends ServiceImpl<AllLocDetlMapper, AllLocDetl> implements AllLocDetlService {
    @Override
    public List<AllLocDetl> getByMatnrAndCsocodeAndIsoseq(String matnr, String csocode, String isoseq) {
        return this.selectList(new EntityWrapper<AllLocDetl>().eq("matnr",matnr).eq("three_code",csocode).eq("dead_time",isoseq));
    }
}
src/main/java/com/zy/asrs/service/impl/InventoryVarianceServiceImpl.java
New file
@@ -0,0 +1,11 @@
package com.zy.asrs.service.impl;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.zy.asrs.entity.InventoryVariance;
import com.zy.asrs.mapper.InventoryVarianceMapper;
import com.zy.asrs.service.InventoryVarianceService;
import org.springframework.stereotype.Service;
@Service
public class InventoryVarianceServiceImpl extends ServiceImpl<InventoryVarianceMapper, InventoryVariance> implements InventoryVarianceService {
}
src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
@@ -9,6 +9,7 @@
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.result.StockVo;
import com.zy.asrs.mapper.LocDetlMapper;
import com.zy.asrs.service.BasDevpService;
import com.zy.asrs.service.LocDetlService;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.service.StaDescService;
@@ -28,6 +29,8 @@
    private StaDescService staDescService;
    @Autowired
    private LocMastService locMastService;
    @Autowired
    private BasDevpService basDevpService;
    @Override
    public Page<LocDetl> getStockOut(Page<LocDetl> page) {
@@ -123,9 +126,10 @@
                int ioType = anfme > issued ? 103 : 101;
                anfme = anfme > issued ? issued : anfme;
                LocDto locDto = new LocDto(locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getMaktx(), locDetl.getBatch(), orderNo, anfme);
                List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locDetl.getLocNo(), ioType);
                //List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locDetl.getLocNo(), ioType);
                List<Integer> outSite = basDevpService.getAvailableOutSite(101);
                locDto.setStaNos(staNos);
                locDto.setStaNos(outSite);
                locDto.setCsocode(csocode);
                locDto.setIsoseq(isoseq);
                locDto.setContainerCode(locDetl.getSuppCode());
src/main/java/com/zy/asrs/service/impl/OrderDetlServiceImpl.java
@@ -1,12 +1,14 @@
package com.zy.asrs.service.impl;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.core.common.Cools;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.mapper.OrderDetlMapper;
import com.zy.asrs.service.OrderDetlService;
import com.zy.asrs.utils.Utils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -104,5 +106,14 @@
//        return null;
    }
    @Override
    public OrderDetl selectByOrderNoAndMatnr(String orderNo, String matnr, String csocode, String isoseq) {
        Wrapper<OrderDetl> wrapper = new EntityWrapper<OrderDetl>().eq("order_no", orderNo).eq("matnr", matnr);
        Utils.wapperSetCondition(wrapper,"csocode",csocode);
        Utils.wapperSetCondition(wrapper,"isoseq",isoseq);
        return this.selectOne(wrapper);
    }
}
src/main/java/com/zy/common/service/erp/ErpService.java
Binary files differ
src/main/java/com/zy/common/service/erp/entity/WlzhVStRd.java
New file
@@ -0,0 +1,38 @@
package com.zy.common.service.erp.entity;
import com.baomidou.mybatisplus.annotations.TableName;
import lombok.Data;
/*
ERP中库存比对视图
 */
@Data
@TableName("wlzh_v_st_rd")
public class WlzhVStRd {
    //核算主体
    private String account;
    //仓库
    private String cWhName;
    //存货编码
    private String cInvCode;
    //规格型号
    private String cInvStd;
    //计量单位
    private String cComUnitName;
    //通用型号
    private String cinvdefine4;
    //现存量
    private Double iQuantity;
    //销售订单号
    private String csocode;
    //销售订单行号
    private String isoseq;
}
src/main/java/com/zy/common/service/erp/task/ErpScheduler.java
@@ -2,33 +2,35 @@
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.common.SnowflakeIdWorker;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.service.*;
import com.zy.asrs.entity.AllLocDetl;
import com.zy.asrs.entity.InventoryVariance;
import com.zy.asrs.entity.Mat;
import com.zy.asrs.entity.Tag;
import com.zy.asrs.service.AllLocDetlService;
import com.zy.asrs.service.InventoryVarianceService;
import com.zy.asrs.service.MatService;
import com.zy.asrs.service.TagService;
import com.zy.asrs.task.AbstractHandler;
import com.zy.common.service.erp.ErpService;
import com.zy.common.service.erp.dto.VoucherDto;
import com.zy.common.service.erp.entity.Goods;
import com.zy.common.service.erp.entity.Voucher;
import com.zy.common.service.erp.entity.VoucherDetail;
import com.zy.common.service.erp.entity.WlzhVStRd;
import lombok.Synchronized;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * erp任务控制器
 * Created by vincent on 2020/11/27
 */
@Slf4j
//@Component
@Component
public class ErpScheduler extends AbstractHandler<Exception> {
    @Autowired
@@ -38,15 +40,11 @@
    @Autowired
    private MatService matService;
    @Autowired
    private OrderService orderService;
    private AllLocDetlService allLocDetlService;
    @Autowired
    private DocTypeService docTypeService;
    @Autowired
    private OrderDetlService orderDetlService;
    @Autowired
    private SnowflakeIdWorker snowflakeIdWorker;
    private InventoryVarianceService inventoryVarianceService;
    @Scheduled(cron = "0/5 * * * * ? ")
    //@Scheduled(cron = "0/5 * * * * ? ")
    @Synchronized
    @Transactional
    public synchronized void syncMat() {
@@ -85,126 +83,53 @@
        }
    }
    @Scheduled(cron = "0/5 * * * * ? ")
    //@Scheduled(cron = "0/5 * * * * ? ")
    @Synchronized
    @Transactional
    public synchronized void syncOrder() {
        List<VoucherDto> list = erpService.selectOrder(0);
        for (VoucherDto dto : list) {
            Voucher voucher = dto.getVoucher();
            Order order = orderService.selectByNo(voucher.getVoucherID());
            if (Cools.isEmpty(order)) {
    public void syncLocDetl(){
                String regEx = "[^0-9]";
                Pattern compile = Pattern.compile(regEx);
                Matcher matcher = compile.matcher(voucher.getMT());
                String docTypeVal = matcher.replaceAll("").trim();
        List<InventoryVariance> inventoryVariances = new ArrayList<>();
                DocType docType = docTypeService.selectOrAdd(docTypeVal, null);
                Date now = new Date();
                // 单据主档
                order = new Order(
                        String.valueOf(snowflakeIdWorker.nextId()),    // 编号[非空]
                        voucher.getVoucherID(),    // 订单编号
                        DateUtils.convert(now),    // 单据日期
                        docType.getDocId(),    // 单据类型
                        null,    // 项目编号
                        null,    //
                        null,    // 调拨项目编号
                        voucher.getBatch(),    // 初始票据号
                        voucher.getMaterialNO(),    // 票据号
                        null,    // 客户编号
                        voucher.getCustomer(),    // 客户
                        voucher.getCenterID(),    // 联系方式
                        voucher.getPlant(),    // 操作人员
                        voucher.getTotalNum(),    // 合计金额  ********************
                        null,    // 优惠率
                        null,    // 优惠金额
                        null,    // 销售或采购费用合计
                        null,    // 实付金额
                        null,    // 付款类型
                        voucher.getLoc(),    // 业务员
                        voucher.getTotalCount(),    // 结算天数  ********************
                        null,    // 邮费支付类型
                        voucher.getExpectedWeight(),    // 邮费
                        null,    // 付款时间
                        null,    // 发货时间
                        null,    // 物流名称
                        null,    // 物流单号
                        1L,    // 订单状态
                        1,    // 状态
                        9527L,    // 添加人员
                        now,    // 添加时间
                        9527L,    // 修改人员
                        now,    // 修改时间
                        null    // 备注
                );
                if (!orderService.insert(order)) {
                    throw new CoolException(order.getOrderNo() + "生成单据主档失败,请联系管理员");
                }
                Mat mat = matService.selectByMatnr(voucher.getMaterialNO());
                if (mat == null) {
                    throw new CoolException(voucher.getMaterialNO() + "物料号不存在");
                }
                // 繳庫單
                if (docType.getPakin() == 1) {
                    for (VoucherDetail detail : dto.getDetails()) {
                        OrderDetl orderDetl = new OrderDetl();
                        orderDetl.sync(mat);
                        orderDetl.setBatch(detail.getBarcode());
                        orderDetl.setAnfme(mat.getWeight());
                        orderDetl.setOrderId(order.getId());
                        orderDetl.setOrderNo(order.getOrderNo());
                        orderDetl.setCreateBy(9527L);
                        orderDetl.setCreateTime(now);
                        orderDetl.setUpdateBy(9527L);
                        orderDetl.setUpdateTime(now);
                        orderDetl.setStatus(1);
                        orderDetl.setQty(0.0D);
                        if (!orderDetlService.insert(orderDetl)) {
                            throw new CoolException(order.getOrderNo() + "生成单据明细失败,请联系管理员");
                        }
                    }
                } else {
                    OrderDetl orderDetl = new OrderDetl();
                    orderDetl.sync(mat);
                    StringBuilder sb = new StringBuilder();
                    if (!Cools.isEmpty(dto.getDetails())) {
                        for (VoucherDetail detail : dto.getDetails()) {
                            sb.append(detail.getBarcode()).append(",");
                        }
                        orderDetl.setBatch(sb.toString());
                    }
                    orderDetl.setAnfme(voucher.getExpectedWeight());
                    orderDetl.setOrderId(order.getId());
                    orderDetl.setOrderNo(order.getOrderNo());
                    orderDetl.setCreateBy(9527L);
                    orderDetl.setCreateTime(now);
                    orderDetl.setUpdateBy(9527L);
                    orderDetl.setUpdateTime(now);
                    orderDetl.setStatus(1);
                    orderDetl.setQty(0.0D);
                    if (!orderDetlService.insert(orderDetl)) {
                        throw new CoolException(order.getOrderNo() + "生成单据明细失败,请联系管理员");
                    }
                }
                // erp 同步
                int state = 1;
                if (!erpService.updateStateForVoucher(voucher.getVoucherID(), state)) {
                    throw new CoolException(voucher.getVoucherID() + "订单修改State为"+state+"失败");
                } else {
                    erpService.updateTimeForVoucherDetail(voucher.getVoucherID());
                }
            } else {
                log.warn("{}订单已存在", voucher.getVoucherID());
        int pageSize = 500;
        int pageNumber = 0;
        while (true){
            List<WlzhVStRd> wlzhVStRds = erpService.selectPage(pageSize, pageNumber);
            if(wlzhVStRds.size() < pageSize){
                break;
            }
            //ERP库存与立库库存比对
            compileStock(wlzhVStRds,inventoryVariances);
            pageNumber ++;
        }
        inventoryVarianceService.insertBatch(inventoryVariances);
    }
    private void compileStock(List<WlzhVStRd> wlzhVStRds, List<InventoryVariance> inventoryVariances){
        wlzhVStRds.forEach(wlzhVStRd -> {
            String matnr = wlzhVStRd.getCInvCode();
            String csocode = wlzhVStRd.getCsocode();
            String isoseq = wlzhVStRd.getIsoseq();
            Double iQuantity = wlzhVStRd.getIQuantity();
            Double anfme = 0.0;
            List<AllLocDetl> allLocDetlList = allLocDetlService.getByMatnrAndCsocodeAndIsoseq(matnr, csocode, isoseq);
            for(AllLocDetl allLocDetl : allLocDetlList){
                anfme += allLocDetl.getAnfme();
            }
            int compare = Double.compare(iQuantity, anfme);
            if(compare != 0){
                InventoryVariance inventoryVarianceParam = new InventoryVariance(matnr,csocode,isoseq,iQuantity,anfme);
                inventoryVariances.add(inventoryVarianceParam);
            }
        });
    }
}
src/main/resources/application.yml
@@ -10,9 +10,9 @@
    enabled: false
  datasource:
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    url: jdbc:sqlserver://localhost:1433;databasename=tzskasrs
    #url: jdbc:sqlserver://localhost:1433;databasename=tzskasrs
    #url: jdbc:sqlserver://192.168.4.15:1433;databasename=tzskasrs
    #url: jdbc:sqlserver://10.10.10.40:1433;databasename=tzskasrs
    url: jdbc:sqlserver://10.10.10.40:1433;databasename=tzskasrs
    username: sa
    password: sa@123
  mvc:
@@ -68,9 +68,9 @@
erp:
  db:
    driver_class_name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    ur: jdbc:sqlserver://10.20.46.23:1433;databasename=POY_ASRS
    username: poy-asrs
    password: Poy@2022
    ur: jdbc:sqlserver://192.168.1.55:1433;databasename=ufdata_998_2022
    username: WMS
    password: Wlzh44338
agv:
#  url: localhost:8080
src/main/resources/mapper/ViewStayTimeMapper.xml
@@ -178,5 +178,4 @@
                ) t
        ) a
</select>
</mapper>