skyouc
6 天以前 162072ac75b009a24cb84569ea7000a782c0fa34
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java
@@ -1,6 +1,7 @@
package com.vincent.rsf.server.manager.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.vincent.rsf.framework.common.R;
@@ -253,78 +254,137 @@
     * @version 1.0
     */
    @Override
    public R createByPo(List<Long> ids) {
        //获取未生成ASN单据
        List<Purchase> purchases = purchaseService.list(new LambdaQueryWrapper<Purchase>().in(Purchase::getId, ids));
        //生成ASN单据
        purchases.forEach(purchase -> {
            if (!Objects.isNull(purchase.getStartTime())) {
                //判断起始时间是否大于当前时间
                if (DateUtils.compareDate(new Date(), purchase.getStartTime())) {
                    return;
                }
    public R createByPo(Map<String, Object> params) {
        Long purchaseId = Long.parseLong(params.get("purchaseId").toString());
        List<PurchaseItem> itemList = JSONArray.parseArray(JSONObject.toJSONString(params.get("items")), PurchaseItem.class);
        if (itemList.isEmpty()) {
            throw new CoolException("PO单明细不能为空!!");
        }
        Purchase purchase = purchaseService.getOne(new LambdaQueryWrapper<Purchase>().eq(Purchase::getId, purchaseId));
        if (Objects.isNull(purchase)) {
            throw new CoolException("PO单据不存在!!");
        }
        AsnOrder order = new AsnOrder();
        //根据编码规则生成ASN单号
        String code = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_ASN_ORDER, purchase);
        order.setCode(code)
                .setArrTime(purchase.getPreArr())
                .setType(purchase.getType())
                .setWkType(purchase.getWkType())
                .setPoId(purchase.getId())
                .setPoCode(purchase.getCode());
        if (!this.save(order)) {
            throw new CoolException("ASN单据保存失败!!");
        }
        List<AsnOrderItem> orderItems = new ArrayList<>();
        for (PurchaseItem item : itemList) {
            AsnOrderItem orderItem = new AsnOrderItem();
            Matnr matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>().eq(Matnr::getCode, item.getMatnrCode()));
            if (Objects.isNull(matnr)) {
                throw new CoolException("数据错误:当前物料不存在!!");
            }
            List<PurchaseItem> items = purchaseItemService.list(new LambdaQueryWrapper<PurchaseItem>().eq(PurchaseItem::getPurchaseId, purchase.getId()));
            if (items.isEmpty()) {
                throw new CoolException("子列表数据为空,请查询PO单是否正确录入!!");
            String trackCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_LABEL_CODE, item);
            if (StringUtils.isBlank(trackCode)) {
                throw new CoolException("单据跟踪码生成失败:请检查「sys_asn_mantr_label」是否配置完成!!");
            }
            AsnOrder order = new AsnOrder();
            //根据编码规则生成ASN单号
            String code = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_ASN_ORDER, purchase);
            order.setAnfme(purchase.getAnfme())
                    .setCode(code)
                    .setArrTime(purchase.getPreArr())
                    .setQty(purchase.getQty())
                    .setPoId(purchase.getId())
                    .setPoCode(purchase.getCode());
            if (!this.save(order)) {
                throw new CoolException("ASN单据保存失败!!");
            orderItem.setAnfme(item.getAnfme())
                    .setAsnId(order.getId())
                    .setSplrName(item.getSplrName())
                    .setAsnCode(code)
                    .setSplrBatch(item.getSplrBatch())
                    .setSplrCode(item.getSplrCode())
                    .setPoDetlId(item.getId())
                    .setPlatItemId(item.getPlatItemId())
                    .setTrackCode(trackCode)
                    .setPoCode(purchase.getCode())
                    .setPurQty(item.getAnfme())
                    .setStockUnit(item.getUnit())
                    .setPurUnit(item.getUnit())
                    .setMatnrCode(matnr.getCode())
                    .setMaktx(matnr.getName())
                    .setMatnrId(matnr.getId());
            orderItems.add(orderItem);
            PurchaseItem purchaseItem = purchaseItemService.getOne(new LambdaQueryWrapper<PurchaseItem>().eq(PurchaseItem::getId, item.getId()));
            if (Objects.isNull(purchaseItem)) {
                throw new CoolException("单据不存在!!");
            }
            List<AsnOrderItem> orderItems = new ArrayList<>();
            items.forEach(item -> {
                AsnOrderItem orderItem = new AsnOrderItem();
                Matnr matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>().eq(Matnr::getCode, item.getMatnrCode()));
                if (Objects.isNull(matnr)) {
                    throw new CoolException("数据错误:当前物料不存在!!");
                }
                String trackCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_LABEL_CODE, item);
                if (StringUtils.isBlank(trackCode)) {
                    throw new CoolException("单据跟踪码生成失败:请检查「sys_asn_mantr_label」是否配置完成!!");
                }
//                String barcode = code + matnr.getCode();
                orderItem.setAnfme(item.getAnfme())
                        .setAsnId(order.getId())
                        .setQty(item.getAnfme())
                        .setSplrName(item.getSplrName())
                        .setAsnCode(code)
                        .setSplrBatch(item.getSplrBatch())
                        .setSplrCode(item.getSplrCode())
                        .setPoDetlId(item.getId())
                        .setPlatItemId(item.getPlatItemId())
                        .setTrackCode(trackCode)
                        .setPoCode(purchase.getCode())
                        .setPurQty(item.getAnfme())
                        .setPurUnit(item.getUnit())
                        .setMatnrCode(matnr.getCode())
                        .setMaktx(matnr.getName())
                        .setMatnrId(matnr.getId());
                orderItems.add(orderItem);
            });
            if (!asnOrderItemService.saveBatch(orderItems)) {
                throw new CoolException(("Asn单据明细保存失败!!"));
            purchaseItem.setQty(purchaseItem.getQty() +  item.getAnfme());
            if (!purchaseItemService.updateById(purchaseItem)) {
                throw new CoolException("PO单明细修改失败!!");
            }
        }
        double sum = orderItems.stream().mapToDouble(AsnOrderItem::getAnfme).sum();
        if (!asnOrderItemService.saveBatch(orderItems)) {
            throw new CoolException(("Asn单据明细保存失败!!"));
        }
        //任务执行完成,修改已完成数量和PO单执行状态
        purchase.setQty(sum + purchase.getQty())
                .setExceStatus(POExceStatus.PO_EXCE_STATUS_EXCE_ING.val);
        if (!purchaseService.saveOrUpdate(purchase)) {
            throw new CoolException("PO单执行完成后,保存失败!!");
        }
        order.setAnfme(sum);
        if (!this.updateById(order)) {
            throw new CoolException("单据更新失败!!");
        }
        return R.ok("操作成功!!");
    }
    /**
     * @author Ryan
     * @date 2025/5/14
     * @description: 移除收货单
     * @version 1.0
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R removeOrders(List<Long> ids) {
        for (Long id : ids) {
            List<AsnOrderItem> list = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>()
                    .eq(AsnOrderItem::getAsnId, id));
            if (list.isEmpty()) {
                continue;
            }
            //任务执行完成,修改已完成数量和PO单执行状态
            purchase.setQty(purchase.getAnfme())
            list.forEach(item -> {
                PurchaseItem purchaseItem = purchaseItemService.getById(item.getPoDetlId());
                if (!Objects.isNull(purchaseItem)) {
                    purchaseItem.setQty(purchaseItem.getQty() - item.getAnfme());
                }
                if (!purchaseItemService.updateById(purchaseItem)) {
                    throw new CoolException("PO单明细更新失败!!");
                }
            });
            double sum = list.stream().mapToDouble(AsnOrderItem::getAnfme).sum();
            Purchase purchase = purchaseService.getOne(new LambdaQueryWrapper<Purchase>()
                    .eq(Purchase::getCode, list.stream().findFirst().get().getPoCode()));
            purchase.setQty(purchase.getQty() - sum)
                    .setExceStatus(POExceStatus.PO_EXCE_STATUS_EXCE_ING.val);
            if (!purchaseService.saveOrUpdate(purchase)) {
                throw new CoolException("PO单执行完成后,保存失败!!");
            if (!purchaseService.updateById(purchase)) {
                throw new CoolException("PO单据更新失败!!");
            }
        });
        }
        if (!asnOrderItemService.remove(new LambdaQueryWrapper<AsnOrderItem>()
                .in(AsnOrderItem::getAsnId, ids))) {
            throw new CoolException("Details Delete Fail");
        }
        return null;
        if (!this.remove(new LambdaQueryWrapper<AsnOrder>()
                .in(AsnOrder::getId, ids)
                .eq(AsnOrder::getExceStatus, AsnExceStatus.ASN_EXCE_STATUS_UN_EXCE.val))) {
            throw new CoolException("任务中单据不可删除!!");
        }
        return R.ok("操作成功!!");
    }
    /**