verou
2025-03-28 71d2544683d6bab0ed8d4b19b6189ccd60afde7b
Merge branch 'devlop' of http://47.97.1.152:5880/r/wms-master into devlop
9个文件已修改
2个文件已添加
234 ■■■■■ 已修改文件
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderItemController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaitPakinController.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/PakinItem.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/WaitPakinParam.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WaitPakin.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WaitPakinItem.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WaitPakinService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaitPakinServiceImpl.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/resources/mapper/manager/PurchaseMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderItemController.java
@@ -77,7 +77,6 @@
    }
    @PreAuthorize("hasAuthority('manager:asnOrderItem:update')")
    @OperationLog("Update ASN单据")
    @PostMapping("/asnOrderItem/update")
@@ -135,7 +134,12 @@
        return asnOrderItemService.generateBarcode(orders);
    }
    @PreAuthorize("hasAuthority('manager:asnOrderItem:list')")
    @ApiOperation("获取订单物料明细")
    @GetMapping("/asnOrderItem/trackCode/{code}")
    public R getItemByTrackCode(@PathVariable String code) {
        return R.ok(asnOrderItemService.getOne(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getTrackCode, code)));
    }
    /**
     * ASN单据明细导入
     * @param file
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaitPakinController.java
@@ -9,9 +9,13 @@
import com.vincent.rsf.server.common.domain.BaseParam;
import com.vincent.rsf.server.common.domain.KeyValVo;
import com.vincent.rsf.server.common.domain.PageParam;
import com.vincent.rsf.server.manager.controller.params.WaitPakinParam;
import com.vincent.rsf.server.manager.entity.WaitPakin;
import com.vincent.rsf.server.manager.service.WaitPakinService;
import com.vincent.rsf.server.system.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
@@ -19,6 +23,7 @@
import javax.servlet.http.HttpServletResponse;
import java.util.*;
@Api(tags = "组拖通知档")
@RestController
public class WaitPakinController extends BaseController {
@@ -107,4 +112,22 @@
        ExcelUtil.build(ExcelUtil.create(waitPakinService.list(), WaitPakin.class), response);
    }
    @PreAuthorize("hasAuthority('manager:waitPakin:update')")
    @ApiOperation("组盘")
    @PostMapping("/waitPakin/merge")
    public R pikinOrder(@RequestBody WaitPakinParam waitPakin) {
        if (Objects.isNull(waitPakin)) {
            return R.error("参数不能为空!!");
        }
        if (StringUtils.isBlank(waitPakin.getBarcode())) {
            return R.error("托盘码不能为空!!");
        }
        if (Objects.isNull(waitPakin.getItems()) || waitPakin.getItems().isEmpty()) {
            return R.error("跟踪码不能为空!!");
        }
        return R.ok(waitPakinService.mergeItems(waitPakin));
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/PakinItem.java
New file
@@ -0,0 +1,19 @@
package com.vincent.rsf.server.manager.controller.params;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@Accessors(chain = true)
@ApiModel(value = "PakinItem", description = "组拖明细参数")
public class PakinItem implements Serializable {
    private String trackCode;
    private Long matnrId;
    private Double qty;
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/WaitPakinParam.java
New file
@@ -0,0 +1,23 @@
package com.vincent.rsf.server.manager.controller.params;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.List;
@Data
@Accessors(chain = true)
@ApiModel(value = "WaitPakinParam", description = "组拖参数")
public class WaitPakinParam implements Serializable {
    @ApiModelProperty("拖盘码")
    private String barcode;
    @ApiModelProperty("跟踪码")
    private List<PakinItem> items;
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java
@@ -56,6 +56,9 @@
    @ApiModelProperty("字段索引")
    private String fieldsIndex;
    @ApiModelProperty("执行数量")
    private Double workQty;
    /**
     * ASN单号
     */
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WaitPakin.java
@@ -3,6 +3,8 @@
import com.baomidou.mybatisplus.annotation.TableLogic;
import java.text.SimpleDateFormat;
import java.util.Date;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
@@ -22,6 +24,7 @@
import java.util.Date;
@Data
@Accessors(chain = true)
@TableName("man_wait_pakin")
public class WaitPakin implements Serializable {
@@ -39,18 +42,6 @@
     */
    @ApiModelProperty(value= "编码")
    private String code;
    /**
     * 订单ID
     */
    @ApiModelProperty(value= "订单ID")
    private Long ansId;
    /**
     * 订单编码
     */
    @ApiModelProperty(value= "订单编码")
    private String asnCode;
    /**
     * 容器码
@@ -123,10 +114,8 @@
    public WaitPakin() {}
    public WaitPakin(String code,Long ansId,String asnCode,String barcode,Double anfme,Short ioStatus,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
    public WaitPakin(String code,String barcode,Double anfme,Short ioStatus,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
        this.code = code;
        this.ansId = ansId;
        this.asnCode = asnCode;
        this.barcode = barcode;
        this.anfme = anfme;
        this.ioStatus = ioStatus;
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WaitPakinItem.java
@@ -3,6 +3,8 @@
import com.baomidou.mybatisplus.annotation.TableLogic;
import java.text.SimpleDateFormat;
import java.util.Date;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
@@ -22,6 +24,7 @@
import java.util.Date;
@Data
@Accessors(chain = true)
@TableName("man_wait_pakin_item")
public class WaitPakinItem implements Serializable {
@@ -41,6 +44,30 @@
    private Long pakinId;
    /**
     * 订单ID
     */
    @ApiModelProperty(value= "订单ID")
    private Long ansId;
    /**
     * 订单编码
     */
    @ApiModelProperty(value= "订单编码")
    private String asnCode;
    /**
     * 订单明细ID
     */
    @ApiModelProperty("订单明细ID")
    private Long asnItemId;
    /**
     * 跟踪码
     */
    @ApiModelProperty("物料跟踪码")
    private String trackCode;
    /**
     * 物料名称
     */
    @ApiModelProperty(value= "物料名称")
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WaitPakinService.java
@@ -1,8 +1,10 @@
package com.vincent.rsf.server.manager.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.vincent.rsf.server.manager.controller.params.WaitPakinParam;
import com.vincent.rsf.server.manager.entity.WaitPakin;
public interface WaitPakinService extends IService<WaitPakin> {
    WaitPakin mergeItems(WaitPakinParam waitPakin);
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaitPakinServiceImpl.java
@@ -1,12 +1,115 @@
package com.vincent.rsf.server.manager.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.vincent.rsf.framework.exception.CoolException;
import com.vincent.rsf.server.manager.controller.params.PakinItem;
import com.vincent.rsf.server.manager.controller.params.WaitPakinParam;
import com.vincent.rsf.server.manager.entity.AsnOrder;
import com.vincent.rsf.server.manager.entity.AsnOrderItem;
import com.vincent.rsf.server.manager.entity.WaitPakinItem;
import com.vincent.rsf.server.manager.mapper.WaitPakinMapper;
import com.vincent.rsf.server.manager.entity.WaitPakin;
import com.vincent.rsf.server.manager.service.AsnOrderItemService;
import com.vincent.rsf.server.manager.service.AsnOrderService;
import com.vincent.rsf.server.manager.service.WaitPakinItemService;
import com.vincent.rsf.server.manager.service.WaitPakinService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.vincent.rsf.server.system.constant.SerialRuleCode;
import com.vincent.rsf.server.system.utils.SerialRuleUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
@Service("waitPakinService")
public class WaitPakinServiceImpl extends ServiceImpl<WaitPakinMapper, WaitPakin> implements WaitPakinService {
    @Autowired
    private AsnOrderItemService asnOrderItemService;
    @Autowired
    private AsnOrderService asnOrderService;
    @Autowired
    private WaitPakinItemService waitPakinItemService;
    /**
     * 单据组拖
     * @param waitPakin
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public WaitPakin mergeItems(WaitPakinParam waitPakin) {
        if (waitPakin.getItems().isEmpty()) {
            throw new CoolException("参数错误:物料跟踪码为空!");
        }
        if (StringUtils.isBlank(waitPakin.getBarcode())) {
            throw new CoolException("参数错误:托盘码为空!!");
        }
        double sum = waitPakin.getItems().stream().mapToDouble(PakinItem::getQty).sum();
        WaitPakin pakin = new WaitPakin();
        String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_WAIT_PAKIN_CODE, null);
        if (StringUtils.isBlank(ruleCode)) {
            throw new CoolException("编码规则错误: 编码规则「SYS_WAIT_PAKIN_CODE」规则是不存在");
        }
        pakin.setCode(ruleCode)
                .setAnfme(sum)
                .setBarcode(waitPakin.getBarcode());
        if (!this.save(pakin)) {
            throw new CoolException("主单保存失败!!");
        }
        /**物料跟踪码*/
        List<String> tracks = waitPakin.getItems().stream().map(PakinItem::getTrackCode).collect(Collectors.toList());
        List<AsnOrderItem> asnOrderItems = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>()
                .in(AsnOrderItem::getTrackCode, tracks));
        if (Objects.isNull(asnOrderItems) || asnOrderItems.isEmpty()) {
            throw new CoolException("单据不存在!!");
        }
        List<WaitPakinItem> items = new ArrayList<>();
        for (AsnOrderItem item : asnOrderItems) {
            WaitPakinItem pakinItem = new WaitPakinItem();
            pakinItem.setAnfme(item.getAnfme())
                    .setPakinId(pakin.getId())
                    .setAnsId(item.getAsnId())
                    .setAsnCode(item.getAsnCode())
                    .setBatch(item.getSplrBatch())
                    .setFieldsIndex(item.getFieldsIndex())
                    .setUnit(item.getStockUnit())
                    .setMatnrId(StringUtils.isNotBlank(item.getMatnrId()) ? Long.parseLong(item.getMatnrId()) : null)
                    .setMaktx(item.getMaktx())
                    .setMatnrCode(item.getMatnrCode());
            for (PakinItem waitPakinItem : waitPakin.getItems()) {
                if (waitPakinItem.getTrackCode().equals(item.getTrackCode())) {
                    Double v = item.getWorkQty() + waitPakinItem.getQty();
                    pakinItem.setWorkQty(v)
                            .setAnfme(waitPakinItem.getQty())
                            .setTrackCode(waitPakinItem.getTrackCode());
                    /**更新单据执行中库存*/
                    if (v.compareTo(item.getQty()) > 0) {throw new CoolException("执行中数量大于收货数量!!");}
                    if (!asnOrderItemService.update(new LambdaUpdateWrapper<AsnOrderItem>()
                            .eq(AsnOrderItem::getTrackCode, waitPakinItem.getTrackCode()).set(AsnOrderItem::getWorkQty, v))) {
                        throw new CoolException("执行中库存更新失败!!");
                    }
                }
            }
            items.add(pakinItem);
        }
        if (!waitPakinItemService.saveBatch(items)) {
            throw new CoolException("组拖明细保存失败!!");
        }
        return pakin;
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java
@@ -39,4 +39,9 @@
     */
    public final static String SYS_MATNR_CODE = "sys_matnr_code";
    /**
     * 组拖编码生成规则
     */
    public final static String SYS_WAIT_PAKIN_CODE = "sys_wait_pakin_code";
}
rsf-server/src/main/resources/mapper/manager/PurchaseMapper.xml
@@ -6,7 +6,7 @@
        SELECT
            id,
            purchase_id,
            erp_item_id,
            plat_item_id,
            matnr_code,
            matnr_name,
            unit,