liyong
3 天以前 d3e57f662fc00214c9d1b1caa9a4dd542a9d2e1e
采购订单入库批次关联
已修改6个文件
已添加2个文件
295 ■■■■ 文件已修改
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/request/ErpPurchaseRequestRespVO.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/convert/ErpPurchaseOrderInStatusConvert.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/convert/ErpPurchaseRequestStatusConvert.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/ErpPurchaseOrderInStatusEnum.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/ErpPurchaseRequestStatusEnum.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/batch/MesWmBatchMapper.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java
@@ -1,5 +1,6 @@
package cn.iocoder.yudao.framework.excel.core.util;
import cn.idev.excel.ExcelWriter;
import cn.idev.excel.FastExcelFactory;
import cn.idev.excel.converters.longconverter.LongStringConverter;
import cn.iocoder.yudao.framework.common.util.http.HttpUtils;
@@ -33,12 +34,22 @@
    public static <T> void write(HttpServletResponse response, String filename, String sheetName,
                                 Class<T> head, List<T> data) throws IOException {
        // è¾“出 Excel
        FastExcelFactory.write(response.getOutputStream(), head)
        ExcelWriter excelWriter = FastExcelFactory.write(response.getOutputStream(), head)
                .autoCloseStream(false) // ä¸è¦è‡ªåŠ¨å…³é—­ï¼Œäº¤ç»™ Servlet è‡ªå·±å¤„理
                .registerWriteHandler(new ColumnWidthMatchStyleStrategy()) // åŸºäºŽ column é•¿åº¦ï¼Œè‡ªåŠ¨é€‚é…ã€‚æœ€å¤§ 255 å®½åº¦
                .registerWriteHandler(new SelectSheetWriteHandler(head)) // åŸºäºŽå›ºå®š sheet å®žçŽ°ä¸‹æ‹‰æ¡†
                .registerConverter(new LongStringConverter()) // é¿å… Long ç±»åž‹ä¸¢å¤±ç²¾åº¦
                .sheet(sheetName).doWrite(data);
                .build();
        try {
            excelWriter.write(data, FastExcelFactory.writerSheet(sheetName).build());
        } finally {
            // finish() å°† workbook å†™å…¥åˆ° response è¾“出流
            excelWriter.finish();
            // close() è§¦å‘ dispose() æ¸…理临时文件;
            // POI SXSSFWorkbook.dispose() å¯èƒ½è¾“出 WARN "Failed to dispose sheet",
            // è¿™æ˜¯ POI å·²çŸ¥é—®é¢˜ï¼ˆä¸´æ—¶æ–‡ä»¶æ¸…理时 BufferedWriter å·²å…³é—­ï¼‰ï¼Œä¸å½±å“å¯¼å‡ºç»“æžœ
            excelWriter.close();
        }
        // è®¾ç½® header å’Œ contentType。写在最后的原因是,避免报错时,响应 contentType å·²ç»è¢«ä¿®æ”¹äº†
        response.addHeader("Content-Disposition", "attachment;filename=" + HttpUtils.encodeUtf8(filename));
        response.setContentType("application/vnd.ms-excel;charset=UTF-8");
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/request/ErpPurchaseRequestRespVO.java
@@ -1,5 +1,8 @@
package cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request;
import cn.idev.excel.annotation.ExcelIgnore;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import cn.iocoder.yudao.module.system.api.storage.dto.StorageBlobRespDTO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -11,75 +14,95 @@
@Schema(description = "管理后台 - ERP é‡‡è´­ç”³è¯· Response VO")
@Data
@ExcelIgnoreUnannotated
public class ErpPurchaseRequestRespVO {
    @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    @ExcelIgnore
    private Long id;
    @Schema(description = "采购申请单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "CGSQ001")
    @ExcelProperty("采购申请单号")
    private String no;
    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
    @ExcelProperty(value = "状态", converter = cn.iocoder.yudao.module.erp.convert.ErpPurchaseRequestStatusConvert.class)
    private Integer status;
    @Schema(description = "工作流编号", example = "1043")
    private String processInstanceId;
    @Schema(description = "申请人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    @ExcelProperty("申请人编号")
    private Long requestUserId;
    @Schema(description = "申请人姓名", example = "张三")
    @ExcelProperty("申请人姓名")
    private String requestUserName;
    @Schema(description = "申请部门编号", example = "1")
    @ExcelProperty("申请部门编号")
    private Long requestDeptId;
    @Schema(description = "申请部门名称", example = "生产部")
    @ExcelProperty("申请部门名称")
    private String requestDeptName;
    @Schema(description = "申请时间", requiredMode = Schema.RequiredMode.REQUIRED)
    @ExcelProperty("申请时间")
    private LocalDateTime requestTime;
    @Schema(description = "申请理由", example = "生产需要")
    @ExcelProperty("申请理由")
    private String requestReason;
    @Schema(description = "供应商编号", example = "1")
    @ExcelProperty("供应商编号")
    private Long supplierId;
    @Schema(description = "供应商名称", example = "供应商A")
    @ExcelProperty("供应商名称")
    private String supplierName;
    @Schema(description = "定金金额", example = "1000.00")
    @ExcelProperty("定金金额")
    private BigDecimal depositPrice;
    @Schema(description = "合计数量", requiredMode = Schema.RequiredMode.REQUIRED)
    @ExcelProperty("合计数量")
    private BigDecimal totalCount;
    @Schema(description = "合计价格", requiredMode = Schema.RequiredMode.REQUIRED)
    @ExcelProperty("合计价格")
    private BigDecimal totalPrice;
    @Schema(description = "产品名称列表", example = "产品A,产品B")
    @ExcelProperty("产品名称列表")
    private String productNames;
    @Schema(description = "生成的采购订单编号", example = "1")
    @ExcelIgnore
    private Long orderId;
    @Schema(description = "生成的采购订单号", example = "CGDD001")
    @ExcelProperty("采购订单号")
    private String orderNo;
    @Schema(description = "入库状态(0:未入库 1:部分入库 2:全部入库)", example = "0")
    @Schema(description = "入库状态", example = "0")
    @ExcelProperty(value = "入库状态", converter = cn.iocoder.yudao.module.erp.convert.ErpPurchaseOrderInStatusConvert.class)
    private Integer inStatus;
    @Schema(description = "备注", example = "备注")
    @ExcelProperty("备注")
    private String remark;
    @Schema(description = "附件列表")
    @ExcelIgnore
    private List<StorageBlobRespDTO> attachmentList;
    @Schema(description = "创建时间")
    @ExcelProperty("创建时间")
    private LocalDateTime createTime;
    @Schema(description = "申请明细列表")
    @ExcelIgnore
    private java.util.List<Item> items;
    @Schema(description = "申请明细项")
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/convert/ErpPurchaseOrderInStatusConvert.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package cn.iocoder.yudao.module.erp.convert;
import cn.idev.excel.converters.Converter;
import cn.idev.excel.enums.CellDataTypeEnum;
import cn.idev.excel.metadata.GlobalConfiguration;
import cn.idev.excel.metadata.data.ReadCellData;
import cn.idev.excel.metadata.data.WriteCellData;
import cn.idev.excel.metadata.property.ExcelContentProperty;
import cn.iocoder.yudao.module.erp.enums.ErpPurchaseOrderInStatusEnum;
/**
 * ERP é‡‡è´­å…¥åº“状态 Excel è½¬æ¢å™¨
 * <p>
 * å°† Integer å…¥åº“状态码转换为中文名称
 *
 * @author èŠ‹é“æºç 
 */
public class ErpPurchaseOrderInStatusConvert implements Converter<Integer> {
    @Override
    public Class<?> supportJavaTypeKey() {
        return Integer.class;
    }
    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }
    @Override
    public WriteCellData<?> convertToExcelData(Integer value, ExcelContentProperty contentProperty,
                                               GlobalConfiguration globalConfiguration) {
        if (value == null) {
            return new WriteCellData<>("");
        }
        ErpPurchaseOrderInStatusEnum statusEnum = ErpPurchaseOrderInStatusEnum.fromStatus(value);
        return new WriteCellData<>(statusEnum != null ? statusEnum.getName() : String.valueOf(value));
    }
    @Override
    public Integer convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty,
                                     GlobalConfiguration globalConfiguration) {
        String label = cellData.getStringValue();
        ErpPurchaseOrderInStatusEnum statusEnum = ErpPurchaseOrderInStatusEnum.fromName(label);
        return statusEnum != null ? statusEnum.getStatus() : null;
    }
}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/convert/ErpPurchaseRequestStatusConvert.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package cn.iocoder.yudao.module.erp.convert;
import cn.idev.excel.converters.Converter;
import cn.idev.excel.enums.CellDataTypeEnum;
import cn.idev.excel.metadata.GlobalConfiguration;
import cn.idev.excel.metadata.data.ReadCellData;
import cn.idev.excel.metadata.data.WriteCellData;
import cn.idev.excel.metadata.property.ExcelContentProperty;
import cn.iocoder.yudao.module.erp.enums.ErpPurchaseRequestStatusEnum;
/**
 * ERP é‡‡è´­ç”³è¯·çŠ¶æ€ Excel è½¬æ¢å™¨
 * <p>
 * å°† Integer çŠ¶æ€ç è½¬æ¢ä¸ºä¸­æ–‡åç§°ï¼Œç”¨äºŽ Excel å¯¼å‡º
 *
 * @author èŠ‹é“æºç 
 */
public class ErpPurchaseRequestStatusConvert implements Converter<Integer> {
    @Override
    public Class<?> supportJavaTypeKey() {
        return Integer.class;
    }
    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }
    @Override
    public WriteCellData<?> convertToExcelData(Integer value, ExcelContentProperty contentProperty,
                                               GlobalConfiguration globalConfiguration) {
        if (value == null) {
            return new WriteCellData<>("");
        }
        ErpPurchaseRequestStatusEnum statusEnum = ErpPurchaseRequestStatusEnum.fromStatus(value);
        return new WriteCellData<>(statusEnum != null ? statusEnum.getName() : String.valueOf(value));
    }
    @Override
    public Integer convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty,
                                     GlobalConfiguration globalConfiguration) {
        String label = cellData.getStringValue();
        ErpPurchaseRequestStatusEnum statusEnum = ErpPurchaseRequestStatusEnum.fromName(label);
        return statusEnum != null ? statusEnum.getStatus() : null;
    }
}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/ErpPurchaseOrderInStatusEnum.java
@@ -30,4 +30,24 @@
        return ARRAYS;
    }
    /**
     * æ ¹æ®çŠ¶æ€ç èŽ·å–æžšä¸¾
     */
    public static ErpPurchaseOrderInStatusEnum fromStatus(Integer status) {
        return Arrays.stream(values())
                .filter(e -> e.getStatus().equals(status))
                .findFirst()
                .orElse(null);
    }
    /**
     * æ ¹æ®åç§°èŽ·å–æžšä¸¾
     */
    public static ErpPurchaseOrderInStatusEnum fromName(String name) {
        return Arrays.stream(values())
                .filter(e -> e.getName().equals(name))
                .findFirst()
                .orElse(null);
    }
}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/ErpPurchaseRequestStatusEnum.java
@@ -35,4 +35,24 @@
        return ARRAYS;
    }
    /**
     * æ ¹æ®çŠ¶æ€ç èŽ·å–æžšä¸¾
     */
    public static ErpPurchaseRequestStatusEnum fromStatus(Integer status) {
        return Arrays.stream(values())
                .filter(e -> e.getStatus().equals(status))
                .findFirst()
                .orElse(null);
    }
    /**
     * æ ¹æ®åç§°èŽ·å–æžšä¸¾
     */
    public static ErpPurchaseRequestStatusEnum fromName(String name) {
        return Arrays.stream(values())
                .filter(e -> e.getName().equals(name))
                .findFirst()
                .orElse(null);
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/batch/MesWmBatchMapper.java
@@ -72,12 +72,12 @@
                .betweenIfPresent(MesWmBatchDO::getExpireDate, reqVO.getExpireDate())
                .betweenIfPresent(MesWmBatchDO::getReceiptDate, reqVO.getReceiptDate())
                .orderByDesc(MesWmBatchDO::getId);
        if (permittedClientIds != null) {
            if (CollUtil.isEmpty(permittedClientIds)) {
                return PageResult.empty();
            }
            wrapper.in(MesWmBatchDO::getClientId, permittedClientIds);
        }
//        if (permittedClientIds != null) {
//            if (CollUtil.isEmpty(permittedClientIds)) {
//                return PageResult.empty();
//            }
//            wrapper.in(MesWmBatchDO::getClientId, permittedClientIds);
//        }
        return selectPage(reqVO, wrapper);
    }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java
@@ -97,107 +97,66 @@
        // 2. æ ¹æ®é…ç½®æ ¡éªŒå¿…填参数并清空不需要的参数
        MesWmBatchDO batch = MesWmBatchDO.builder().itemId(reqVO.getItemId()).build();
        if (config != null) {
            // ========== å¿…填校验(flag=true è¡¨ç¤ºè¯¥å­—段为必填) ==========
            // ç”Ÿäº§æ—¥æœŸ
            if (Boolean.TRUE.equals(config.getProduceDateFlag())) {
                if (ObjUtil.isNull(reqVO.getProduceDate())) {
            if (Boolean.TRUE.equals(config.getProduceDateFlag()) && ObjUtil.isNull(reqVO.getProduceDate())) {
                    throw exception(WM_BATCH_PRODUCE_DATE_REQUIRED);
                }
                batch.setProduceDate(reqVO.getProduceDate());
            }
            // å…¥åº“日期
            if (Boolean.TRUE.equals(config.getReceiptDateFlag())) {
                if (ObjUtil.isNull(reqVO.getReceiptDate())) {
            if (Boolean.TRUE.equals(config.getReceiptDateFlag()) && ObjUtil.isNull(reqVO.getReceiptDate())) {
                    throw exception(WM_BATCH_RECEIPT_DATE_REQUIRED);
                }
                batch.setReceiptDate(reqVO.getReceiptDate());
            }
            // æœ‰æ•ˆæœŸ
            if (Boolean.TRUE.equals(config.getExpireDateFlag())) {
                if (ObjUtil.isNull(reqVO.getExpireDate())) {
            if (Boolean.TRUE.equals(config.getExpireDateFlag()) && ObjUtil.isNull(reqVO.getExpireDate())) {
                    throw exception(WM_BATCH_EXPIRE_DATE_REQUIRED);
                }
                batch.setExpireDate(reqVO.getExpireDate());
            }
            // ä¾›åº”商
            if (Boolean.TRUE.equals(config.getVendorFlag())) {
                if (ObjUtil.isNull(reqVO.getVendorId())) {
            if (Boolean.TRUE.equals(config.getVendorFlag()) && ObjUtil.isNull(reqVO.getVendorId())) {
                    throw exception(WM_BATCH_VENDOR_REQUIRED);
                }
                batch.setVendorId(reqVO.getVendorId());
            }
            // å®¢æˆ·
            if (Boolean.TRUE.equals(config.getClientFlag())) {
                if (ObjUtil.isNull(reqVO.getClientId())) {
            if (Boolean.TRUE.equals(config.getClientFlag()) && ObjUtil.isNull(reqVO.getClientId())) {
                    throw exception(WM_BATCH_CLIENT_REQUIRED);
                }
                batch.setClientId(reqVO.getClientId());
            }
            // é‡‡è´­è®¢å•编号
            if (Boolean.TRUE.equals(config.getPurchaseOrderCodeFlag())) {
                if (ObjUtil.isNull(reqVO.getPurchaseOrderCode())) {
            if (Boolean.TRUE.equals(config.getPurchaseOrderCodeFlag()) && ObjUtil.isNull(reqVO.getPurchaseOrderCode())) {
                    throw exception(WM_BATCH_PURCHASE_ORDER_CODE_REQUIRED);
                }
                batch.setPurchaseOrderCode(reqVO.getPurchaseOrderCode());
            }
            // é”€å”®è®¢å•编号
            if (Boolean.TRUE.equals(config.getSalesOrderCodeFlag())) {
                if (ObjUtil.isNull(reqVO.getSalesOrderCode())) {
            if (Boolean.TRUE.equals(config.getSalesOrderCodeFlag()) && ObjUtil.isNull(reqVO.getSalesOrderCode())) {
                    throw exception(WM_BATCH_CUSTOMER_ORDER_CODE_REQUIRED);
                }
                batch.setSalesOrderCode(reqVO.getSalesOrderCode());
            }
            // ç”Ÿäº§å·¥å•
            if (Boolean.TRUE.equals(config.getWorkOrderFlag())) {
                if (ObjUtil.isNull(reqVO.getWorkOrderId())) {
            if (Boolean.TRUE.equals(config.getWorkOrderFlag()) && ObjUtil.isNull(reqVO.getWorkOrderId())) {
                    throw exception(WM_BATCH_WORK_ORDER_REQUIRED);
                }
                batch.setWorkOrderId(reqVO.getWorkOrderId());
            }
            // ç”Ÿäº§ä»»åŠ¡
            if (Boolean.TRUE.equals(config.getTaskFlag())) {
                if (ObjUtil.isNull(reqVO.getTaskId())) {
            if (Boolean.TRUE.equals(config.getTaskFlag()) && ObjUtil.isNull(reqVO.getTaskId())) {
                    throw exception(WM_BATCH_TASK_REQUIRED);
                }
                batch.setTaskId(reqVO.getTaskId());
            }
            // å·¥ä½œç«™
            if (Boolean.TRUE.equals(config.getWorkstationFlag())) {
                if (ObjUtil.isNull(reqVO.getWorkstationId())) {
            if (Boolean.TRUE.equals(config.getWorkstationFlag()) && ObjUtil.isNull(reqVO.getWorkstationId())) {
                    throw exception(WM_BATCH_WORKSTATION_REQUIRED);
                }
                batch.setWorkstationId(reqVO.getWorkstationId());
            }
            // å·¥å…·
            if (Boolean.TRUE.equals(config.getToolFlag())) {
                if (ObjUtil.isNull(reqVO.getToolId())) {
            if (Boolean.TRUE.equals(config.getToolFlag()) && ObjUtil.isNull(reqVO.getToolId())) {
                    throw exception(WM_BATCH_TOOL_REQUIRED);
                }
                batch.setToolId(reqVO.getToolId());
            }
            // æ¨¡å…·
            if (Boolean.TRUE.equals(config.getMoldFlag())) {
                if (ObjUtil.isNull(reqVO.getMoldId())) {
            if (Boolean.TRUE.equals(config.getMoldFlag()) && ObjUtil.isNull(reqVO.getMoldId())) {
                    throw exception(WM_BATCH_MOLD_REQUIRED);
                }
                batch.setMoldId(reqVO.getMoldId());
            }
            // ç”Ÿäº§æ‰¹å·
            if (Boolean.TRUE.equals(config.getLotNumberFlag())) {
                if (ObjUtil.isNull(reqVO.getLotNumber())) {
            if (Boolean.TRUE.equals(config.getLotNumberFlag()) && ObjUtil.isNull(reqVO.getLotNumber())) {
                    throw exception(WM_BATCH_LOT_NUMBER_REQUIRED);
                }
                batch.setLotNumber(reqVO.getLotNumber());
            }
            // è´¨é‡çŠ¶æ€
            if (Boolean.TRUE.equals(config.getQualityStatusFlag())) {
                if (ObjUtil.isNull(reqVO.getQualityStatus())) {
            if (Boolean.TRUE.equals(config.getQualityStatusFlag()) && ObjUtil.isNull(reqVO.getQualityStatus())) {
                    throw exception(WM_BATCH_QUALITY_STATUS_REQUIRED);
                }
                batch.setQualityStatus(reqVO.getQualityStatus());
            }
        }
        // æ— æ‰¹æ¬¡é…ç½®æ—¶ï¼Œä½¿ç”¨ä¼ å…¥çš„参数(宽松模式,适用于自定义入库等场景)
        else {
        // ========== ä¿å­˜å­—段(无论有无配置,只要调用方传了就保存) ==========
            if (reqVO.getProduceDate() != null) {
                batch.setProduceDate(reqVO.getProduceDate());
            }
@@ -213,6 +172,32 @@
            if (reqVO.getClientId() != null) {
                batch.setClientId(reqVO.getClientId());
            }
        if (reqVO.getPurchaseOrderCode() != null) {
            batch.setPurchaseOrderCode(reqVO.getPurchaseOrderCode());
        }
        if (reqVO.getSalesOrderCode() != null) {
            batch.setSalesOrderCode(reqVO.getSalesOrderCode());
        }
        if (reqVO.getWorkOrderId() != null) {
            batch.setWorkOrderId(reqVO.getWorkOrderId());
        }
        if (reqVO.getTaskId() != null) {
            batch.setTaskId(reqVO.getTaskId());
        }
        if (reqVO.getWorkstationId() != null) {
            batch.setWorkstationId(reqVO.getWorkstationId());
        }
        if (reqVO.getToolId() != null) {
            batch.setToolId(reqVO.getToolId());
        }
        if (reqVO.getMoldId() != null) {
            batch.setMoldId(reqVO.getMoldId());
        }
        if (reqVO.getLotNumber() != null) {
            batch.setLotNumber(reqVO.getLotNumber());
        }
        if (reqVO.getQualityStatus() != null) {
            batch.setQualityStatus(reqVO.getQualityStatus());
        }
        // 3.1 æƒ…况一:传入了 batchCode,查询是否存在该批次号