##
mrzhssss
2022-09-06 20004f666ec4568ba161a112cb6d955dedc1014a
src/main/java/zy/cloud/wms/common/service/MainService.java
@@ -9,6 +9,7 @@
import org.springframework.transaction.annotation.Transactional;
import zy.cloud.wms.common.model.MatnrDto;
import zy.cloud.wms.common.model.OrderStoDto;
import zy.cloud.wms.common.model.ReceiveStoDto;
import zy.cloud.wms.common.utils.VersionUtils;
import zy.cloud.wms.manager.entity.*;
import zy.cloud.wms.manager.service.*;
@@ -32,6 +33,10 @@
    private SnowflakeIdWorker snowflakeIdWorker;
    @Autowired
    private OrderService orderService;
    @Autowired
    private ReceiveService receiveService;
    @Autowired
    private ReceiveDetlService receiveDetlService;
    @Transactional
    public List<StoPreTab> stockOutPreview(OrderStoDto orderStoDto, Long hostId) {
@@ -47,6 +52,80 @@
            Mat mat = matService.selectByMatnr(hostId, matnrDto.getMatnr());
            if (null == mat) {
                throw new CoolException(matnrDto.getMatnr() + "物料尚未更新。" + orderStoDto.getOrderNo() +"单据因此中断!");
            }
            Double sumAnfme = Optional.ofNullable(locDetlService.selectCountByMatnr(mat.getMatnr(), hostId)).orElse(0.0D);
            double lack = 0.0D;
            // 缺货
            if (sumAnfme < matnrDto.getCount()) {
                lack = matnrDto.getCount() - sumAnfme;
                // 视图对象
                StoPreTab tab = new StoPreTab();
                tab.setTitle(mat.getMaktx() + "(" + mat.getMatnr() + ")");
                tab.setMatnr(mat.getMatnr());
                tab.setMaktx(mat.getMaktx());
                tab.setAnfme(matnrDto.getCount());
                tab.setLocNo("缺货");
                tab.setTotal(lack);
                tab.setReduce(lack);
                tab.setRemQty(0.0D);
                tab.setPrior(false);
                tab.setPrior$("×");
                tab.setType(0);
                res.add(tab);
            }
            // 查询存有当前物料的货位
            List<LocDetl> locDetls = locDetlService.findOfSort(hostId, mat.getMatnr());
            double issued = Optional.of(matnrDto.getCount() - lack).orElse(0.0D) ;
            double anfme = issued;
            for (LocDetl locDetl : locDetls) {
                if (issued > 0) {
                    // 视图对象
                    StoPreTab tab = new StoPreTab();
                    tab.setTitle(mat.getMaktx() + "(" + mat.getMatnr() + ")");
                    tab.setMatnr(mat.getMatnr());
                    tab.setMaktx(mat.getMaktx());
                    tab.setAnfme(matnrDto.getCount());
                    tab.setLocNo(locDetl.getLocNo());
                    tab.setNodeId(locDetl.getNodeId());
                    tab.setTotal(locDetl.getAnfme());
                    tab.setReduce(issued>=locDetl.getAnfme()?locDetl.getAnfme():issued);
                    tab.setRemQty(tab.getTotal() - tab.getReduce());
                    tab.setPrior(locDetlService.isPrior(locDetl.getNodeId(), mat.getMatnr()));
                    tab.setPrior$(tab.getPrior()?"✔":"×");
                    tab.setType(1);
                    res.add(tab);
                    // 剩余待出数量递减
                    issued = issued - locDetl.getAnfme();
                }
            }
        }
        res.sort(new Comparator<StoPreTab>() {
            @Override
            public int compare(StoPreTab o1, StoPreTab o2) {
//                return o1.getMatnr().length() - o2.getMatnr().length();
                return (int) (o1.getAnfme() - o2.getAnfme());
            }
        });
        return res;
    }
    @Transactional
    public List<StoPreTab> receiveStockOutPreview(ReceiveStoDto receiveStoDto, Long hostId) {
        if (Cools.isEmpty(receiveStoDto) || Cools.isEmpty(receiveStoDto.getDtos())) {
            throw new CoolException("数据异常,请联系管理员");
        }
        List<StoPreTab> res = new ArrayList<>();
        // 检查库存是否足够
//        locDetlService.checkLocDetlCount(orderStoDto.getDtos());
        for (MatnrDto matnrDto : receiveStoDto.getDtos()) {
            // 判断物料是否存在
            Mat mat = matService.selectByMatnr(hostId, matnrDto.getMatnr());
            if (null == mat) {
                throw new CoolException(matnrDto.getMatnr() + "物料尚未更新。" + receiveStoDto.getOrderNo() +"单据因此中断!");
            }
            Double sumAnfme = Optional.ofNullable(locDetlService.selectCountByMatnr(mat.getMatnr(), hostId)).orElse(0.0D);
@@ -171,5 +250,83 @@
            }
        }
    }
    @Transactional
    public void receiveStockOutProcess(ReceiveStoDto receiveStoDto, Long hostId) {
        if (Cools.isEmpty(receiveStoDto) || Cools.isEmpty(receiveStoDto.getDtos())) {
            return;
        }
        Receive receive = receiveService.selectByOrderNo(receiveStoDto.getOrderNo(), hostId);
//        Order order = orderService.selectByOrderNo(orderStoDto.getOrderNo(), hostId);
        if (receive == null) {
            throw new CoolException(receiveStoDto.getOrderNo() + "单据不存在");
        }
        Date now = new Date();
        // 检查库存是否足够
        locDetlService.checkLocDetlCount(receiveStoDto.getDtos(), hostId);
        for (MatnrDto matnrDto : receiveStoDto.getDtos()) {
            // 判断物料是否存在
            Mat mat = matService.selectByMatnr(hostId, matnrDto.getMatnr());
            if (null == mat) {
                throw new CoolException(matnrDto.getMatnr() + "物料尚未更新。" + matnrDto.getCount() +"单据因此中断!");
            }
            // 查询存有当前物料的货位
            List<LocDetl> locDetls = locDetlService.findOfSort(hostId, mat.getMatnr());
            double issued = Optional.ofNullable(matnrDto.getCount()).orElse(0.0D) ;
            for (LocDetl locDetl : locDetls) {
                if (issued > 0) {
                    // 保存出库通知单
                    Pakout pakout = new Pakout();
                    pakout.setHostId(hostId);
                    pakout.setWrkSts(1L);
                    pakout.setAnfme(issued>=locDetl.getAnfme()?locDetl.getAnfme():issued);
                    pakout.setZpallet(locDetl.getZpallet());
                    pakout.setLocNo(locDetl.getLocNo());
                    pakout.setNodeId(locDetl.getNodeId());
                    pakout.setWrkNo(String.valueOf(snowflakeIdWorker.nextId()));
                    VersionUtils.setPakout(pakout, mat);
                    pakout.setDocId(receive.getDocType()); // 单据类型
                    pakout.setDocNum(receive.getOrderNo());    // 单据编号
                    pakout.setCreateTime(now);
                    pakout.setUpdateTime(now);
                    pakout.setStatus(1);
                    if (!pakoutService.insert(pakout)) {
                        throw new CoolException("保存出库通知单失败");
                    }
                    if (issued>=locDetl.getAnfme()) {
//                        // 删除库存明细
//                        if (!locDetlService.removeStock(locDetl.getNodeId(), mat.getMatnr())) {
//                            throw new CoolException("删除库存明细失败");
//                        }
                    } else {
//                        // 修改库存明细数量
//                        if (!locDetlService.reduceStock(locDetl.getNodeId(), mat.getMatnr(), issued)) {
//                            throw new CoolException("修改库存明细数量失败");
//                        }
                    }
                    // 剩余待出数量递减
                    issued = issued - locDetl.getAnfme();
                }
            }
            // 修改单据状态
            if (!orderService.updateSettle(receiveStoDto.getOrderNo(), 2L, hostId)) {
                throw new CoolException("修改单据状态失败");
            }
        }
    }
    public static void main(String[] args) {
        for (int i = 2; i < 51; i++) {
            System.out.println("EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'节点"+i+"名称' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'man_item_detl', @level2type=N'COLUMN',@level2name=N'node"+i+"_name'\n" +
                    "GO");
            System.out.println("EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'节点"+i+"截止日期' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'man_item_detl', @level2type=N'COLUMN',@level2name=N'node"+i+"_deadline'\n" +
                    "GO");
            System.out.println("EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'节点"+i+"完工日期' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'man_item_detl', @level2type=N'COLUMN',@level2name=N'node"+i+"_real_deadline'\n" +
                    "GO");
            System.out.println("EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'节点"+i+"超出日期' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'man_item_detl', @level2type=N'COLUMN',@level2name=N'node"+i+"_extra_day'\n" +
                    "GO");
        }
    }
}