#修改
1.库位size字段,修改为长,宽, 高(完成
2.货架批量处理(完成
3.库位初始化功能(完成
4.筛选导出(完成
5.库位可绑定多种类型(中,高,低),可使用类型批量修改库位信息(完成
6.库位信息添加一个使用状态 (出库预约,入库预约,在库,空库,禁用, 空板)(完成
7.物料模板导出添加扩展字段
15个文件已修改
4个文件已添加
591 ■■■■ 已修改文件
pom.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/pom.xml 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/common/utils/ExcelUtil.java 167 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocController.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrController.java 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/LocMastInitParam.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/LocModifyParams.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Loc.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/QlyIsptItem.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/StockItem.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WarehouseAreas.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/MatnrsTemplate.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderItemService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocServiceImpl.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/system/constant/CodeRes.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/system/enums/LocStsType.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/system/enums/LocType.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/resources/application-dev.yml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -8,12 +8,12 @@
    <version>1.0.0</version>
    <name>rsf</name>
    <packaging>pom</packaging>
    <!-- lookup parent from repository -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.3</version>
        <relativePath/> <!-- lookup parent from repository -->
        <relativePath/>
    </parent>
    <modules>
rsf-server/pom.xml
@@ -145,12 +145,11 @@
            <artifactId>easypoi-annotation</artifactId>
            <version>4.2.0</version>
        </dependency>
        <!--        <dependency>-->
<!--            <groupId>com.alibaba</groupId>-->
<!--            <artifactId>easyexcel</artifactId>-->
<!--            <version>2.2.6</version>-->
<!--        </dependency>-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.6</version>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>cn.afterturn</groupId>-->
<!--            <artifactId>easypoi-base</artifactId>-->
rsf-server/src/main/java/com/vincent/rsf/server/common/utils/ExcelUtil.java
@@ -2,28 +2,24 @@
import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.result.ExcelVerifyHandlerResult;
import cn.afterturn.easypoi.handler.inter.IExcelDataHandler;
import com.google.common.collect.Lists;
import com.vincent.rsf.common.domain.BeanValidators;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.vincent.rsf.framework.common.Cools;
import com.vincent.rsf.server.common.handler.AggregationDataHandler;
import com.vincent.rsf.server.common.handler.ExcelDictHandlerImpl;
import com.vincent.rsf.framework.common.SpringUtils;
import com.vincent.rsf.framework.exception.CoolException;
import com.vincent.rsf.server.manager.entity.Matnr;
import com.vincent.rsf.server.manager.entity.excel.MatnrsTemplate;
import com.vincent.rsf.server.manager.entity.excel.annotation.ExcelComment;
import com.vincent.rsf.server.system.entity.Fields;
import com.vincent.rsf.server.system.service.FieldsService;
import io.swagger.annotations.ApiModelProperty;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.formula.functions.T;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import javax.validation.ConstraintViolationException;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
@@ -43,11 +39,12 @@
        try {
            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("export", "UTF-8"));
            workbook.write(response.getOutputStream());
        } catch (IOException ignore) {}
        } catch (IOException ignore) {
        }
    }
    public static <T> Workbook create(List<T> list, Class<T> clz) {
        return  create(list, clz, false);
        return create(list, clz, false);
    }
    public static <T> Workbook create(List<T> list, Class<T> clz, boolean flagTemplate) {
@@ -57,6 +54,12 @@
        Row header = sheet.createRow(0);
        Field[] fields = Cools.getAllFields(clz);
        int headerIdx = 0;
        FieldsService itemService = SpringUtils.getBean(FieldsService.class);
        List<Fields> sysFields = itemService.list(new LambdaQueryWrapper<Fields>()
                .eq(Fields::getStatus, 1)
                .eq(Fields::getFlagEnable, 1));
        for (Field field : fields) {
            if (Modifier.isFinal(field.getModifiers())
                    || Modifier.isStatic(field.getModifiers())
@@ -65,9 +68,7 @@
            }
            String memo = "Undefined";
            if (flagTemplate) {
                if (field.isAnnotationPresent(ExcelComment.class)) {
                    memo = field.getAnnotation(ExcelComment.class).value();
                }
                memo = field.getName();
            } else {
                if (field.isAnnotationPresent(Excel.class)) {
                    memo = field.getAnnotation(Excel.class).name();
@@ -79,39 +80,53 @@
            header.createCell(headerIdx).setCellValue(memo);
            headerIdx++;
        }
        int rowIndex = 1;
        for (T t : list) {
            Row row = sheet.createRow(rowIndex++);
            int cellIndex = 0;
            for (Field field : fields) {
                if (Modifier.isFinal(field.getModifiers())
                        || Modifier.isStatic(field.getModifiers())
                        || Modifier.isTransient(field.getModifiers())) {
                    continue;
                }
                // 此行很重要,特别是字段为private时
                field.setAccessible(true);
                Object value = null;
                try {
                    value = field.get(t);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                if (value != null) {
                    if (value instanceof Date) {
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        row.createCell(cellIndex).setCellValue(sdf.format((Date) value));
        if (clz.equals(MatnrsTemplate.class)) {
            //添加扩展字段别名
            if (!sysFields.isEmpty()) {
                for (Fields field : sysFields) {
                    if (flagTemplate) {
                        header.createCell(headerIdx).setCellValue(field.getFields());
                    } else {
                        row.createCell(cellIndex).setCellValue(value.toString());
                        header.createCell(headerIdx).setCellValue(field.getFieldsAlise());
                    }
                    headerIdx++;
                }
                cellIndex++;
            }
        }
        int rowIndex = 1;
        if (!Objects.isNull(list)) {
            for (T t : list) {
                Row row = sheet.createRow(rowIndex++);
                int cellIndex = 0;
                for (Field field : fields) {
                    if (Modifier.isFinal(field.getModifiers())
                            || Modifier.isStatic(field.getModifiers())
                            || Modifier.isTransient(field.getModifiers())) {
                        continue;
                    }
                    // 此行很重要,特别是字段为private时
                    field.setAccessible(true);
                    Object value = null;
                    try {
                        value = field.get(t);
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                    if (value != null) {
                        if (value instanceof Date) {
                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                            row.createCell(cellIndex).setCellValue(sdf.format((Date) value));
                        } else {
                            row.createCell(cellIndex).setCellValue(value.toString());
                        }
                    }
                    cellIndex++;
                }
            }
        }
        for (int i = 0; i <= fields.length; i++) {
            sheet.autoSizeColumn(i);
        }
@@ -122,6 +137,7 @@
    /**
     * 添加导入excel配置参数
     * 注:默认配置可满足当前需求
     *
     * @return
     */
    public static ImportParams getDefaultImportParams() {
@@ -133,7 +149,68 @@
    }
    /**
     * @author Ryan
     * @description Excel导出Map格式表格
     * @param
     * @return
     * @time 2025/3/18 09:30
     */
    public static void exportForMap(HttpServletResponse response, Class cls, String fileName, List<List<Object>> data) {
        try {
            response.setContentType("application/octet-stream; charset=utf-8");
            response.setCharacterEncoding("utf-8");
            String name = URLEncoder.encode(fileName, "UTF-8");
            response.setHeader("Content-disposition", "attachment;filename=" + name + ".xlsx");
            EasyExcel.write(response.getOutputStream()).head(getHeader(cls)).sheet().doWrite(null);
        } catch (IOException exception) {
            exception.printStackTrace();
        }
    }
    /**
     * @author Ryan
     * @description excel导出map模式
     * @param  Class<T> 模板类型
     * @return  List<List<String>> 表头信息
     * @time 2025/3/18 09:26
     */
    public static List<List<String>> getHeader(Class<T> t) {
        List<List<String>> headList = new ArrayList<List<String>>();
        if (t.getSuperclass().isInstance(MatnrsTemplate.class)) {
            Field[] allFields = Cools.getAllFields(t);
            if (Objects.isNull(allFields) ||  allFields.length < 1) {
                throw new CoolException("模板列不能为空!!");
            }
            for (Field field : allFields) {
                List<String> list = new ArrayList<String>();
                String fieldName = "";
                if (field.isAnnotationPresent(Excel.class)){
                    fieldName = field.getAnnotation(Excel.class).name();
                }
                list.add(field.getName());
                headList.add(list);
            }
            FieldsService itemService = SpringUtils.getBean(FieldsService.class);
            List<Fields> sysFields = itemService.list(new LambdaQueryWrapper<Fields>()
                    .eq(Fields::getStatus, 1)
                    .eq(Fields::getFlagEnable, 1));
            //添加扩展字段别名
            if (!sysFields.isEmpty()) {
                sysFields.forEach(fields1 -> {
                    List<String> list = new ArrayList<String>();
                    list.add(fields1.getFieldsAlise());
                    headList.add(list);
                });
            }
        }
        return headList;
    }
    /**
     * 根据 {@code tClass} 相关成员变量的 {@link ExcelComment#example()} 字段创建模拟数据,暂不支持 复杂类型
     *
     * @param tClass
     * @return
     */
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocController.java
@@ -4,22 +4,31 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.vincent.rsf.framework.common.Cools;
import com.vincent.rsf.framework.common.R;
import com.vincent.rsf.framework.exception.CoolException;
import com.vincent.rsf.server.common.utils.ExcelUtil;
import com.vincent.rsf.server.common.annotation.OperationLog;
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.LocMastInitParam;
import com.vincent.rsf.server.manager.controller.params.LocModifyParams;
import com.vincent.rsf.server.manager.entity.Loc;
import com.vincent.rsf.server.manager.service.LocService;
import com.vincent.rsf.server.system.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.*;
@Api(tags = "库位信息")
@RestController
public class LocController extends BaseController {
@@ -92,18 +101,49 @@
        List<KeyValVo> vos = new ArrayList<>();
        LambdaQueryWrapper<Loc> wrapper = new LambdaQueryWrapper<>();
        if (!Cools.isEmpty(condition)) {
            wrapper.like(Loc::getName, condition);
            wrapper.like(Loc::getCode, condition);
        }
        locService.page(new Page<>(1, 30), wrapper).getRecords().forEach(
                item -> vos.add(new KeyValVo(item.getId(), item.getName()))
                item -> vos.add(new KeyValVo(item.getId(), item.getCode()))
        );
        return R.ok().add(vos);
    }
    @PreAuthorize("hasAuthority('manager:loc:list')")
    @ApiOperation("库位导出")
    @PostMapping("/loc/export")
    public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
        ExcelUtil.build(ExcelUtil.create(locService.list(), Loc.class), response);
        List<Loc> locs = new ArrayList<>();
        if (Objects.isNull(map.get("ids"))) {
            locs = locService.list();
        } else {
            locs = locService.list(new LambdaQueryWrapper<Loc>().in(Loc::getId , map.get("ids")).eq(Loc::getStatus, 1));
        }
        ExcelUtil.build(ExcelUtil.create(locs, Loc.class), response);
    }
    @PreAuthorize("hasAuthority('manager:loc:update')")
    @ApiOperation("库位批量修改")
    @PostMapping("/loc/modify")
    public R batchUpdate(@RequestBody LocModifyParams locs) {
        if (Objects.isNull(locs)) {
            throw new CoolException("参为不能为空!!");
        }
        return locService.modifyLocs(locs);
    }
    @PreAuthorize("hasAuthority('manager:loc:update')")
    @ApiOperation("库位初始化")
    @PostMapping("/loc/init")
    public R initLocInfo(@Valid @RequestBody LocMastInitParam param) {
        if (Objects.isNull(param)) {
            throw new CoolException("初始化信息不能为空!!");
        }
        if (Objects.isNull(param.getAreaId())) {
            throw new CoolException("库区ID不能为空!!");
        }
        return locService.initLocs(param);
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrController.java
@@ -12,6 +12,7 @@
import com.vincent.rsf.server.common.domain.KeyValVo;
import com.vincent.rsf.server.common.domain.PageParam;
import com.vincent.rsf.server.manager.entity.Matnr;
import com.vincent.rsf.server.manager.entity.excel.MatnrsTemplate;
import com.vincent.rsf.server.manager.service.MatnrService;
import com.vincent.rsf.server.system.controller.BaseController;
import io.swagger.annotations.Api;
@@ -24,6 +25,8 @@
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.*;
@RestController
@@ -109,7 +112,6 @@
        return R.ok().add(vos);
    }
    @SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
    @PreAuthorize("hasAuthority('manager:matnr:list')")
    @ApiOperation(value = "获取分类物料明细列表")
    @PostMapping("/matnr/group")
@@ -129,12 +131,27 @@
    }
    @PreAuthorize("hasAuthority('manager:matnr:list')")
    @ApiOperation("导出物料信息")
    @PostMapping("/matnr/export")
    public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
        ExcelUtil.build(ExcelUtil.create(matnrService.list(), Matnr.class), response);
        List<Matnr> matnrs = new ArrayList<>();
        if (!Objects.isNull(map.get("ids"))) {
            matnrs = matnrService.list(new LambdaQueryWrapper<Matnr>().in(Matnr::getId, map.get("ids")).eq(Matnr::getStatus, 1));
        } else {
            matnrs = matnrService.list(new LambdaQueryWrapper<Matnr>().last("limit 1"));
        }
        ExcelUtil.build(ExcelUtil.create(null, MatnrsTemplate.class, true), response);
    }
    @PreAuthorize("hasAuthority('manager:matnr:save')")
    @PreAuthorize("hasAuthority('manager:matnr:list')")
    @ApiOperation("下载物料模板")
    @PostMapping("/matnr/template/download")
    public void download(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
        ExcelUtil.build(ExcelUtil.create(null, MatnrsTemplate.class, true), response);
    }
    @PreAuthorize("hasAuthority('manager:matnr:update')")
    @ApiOperation(value = "excel表格导入物料信息")
    @PostMapping("/matnr/import")
    public R listImport(MultipartFile file) throws Exception {
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/LocMastInitParam.java
New file
@@ -0,0 +1,52 @@
package com.vincent.rsf.server.manager.controller.params;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
/**
 * Created by vincent on 2020/6/13
 */
@Data
@Accessors(chain = true)
public class LocMastInitParam implements Serializable {
    @ApiModelProperty("库区ID")
    private Long areaId;
    @ApiModelProperty("起始排")
    @NotEmpty(message = "起始排不能为空!!")
    private Integer startRow;
    @ApiModelProperty("终止排")
    @NotEmpty(message = "终止排不能为空!!")
    private Integer endRow;
    @ApiModelProperty("起始列")
    @NotEmpty(message = "起始列不能为空!!")
    private Integer startBay;
    @ApiModelProperty("终止列")
    @NotEmpty(message = "终止列不能为空!!")
    private Integer endBay;
    @ApiModelProperty("起始层")
    @NotEmpty(message = "起始层不能为空!!")
    private Integer startLev;
    @ApiModelProperty("终止层")
    @NotEmpty(message = "终止层不能为空!!")
    private Integer endLev;
    @ApiModelProperty("库位类型")
    @NotBlank(message = "库位类型")
    private String type;
    @ApiModelProperty("宽窄类型")
    private String locType;
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/LocModifyParams.java
New file
@@ -0,0 +1,27 @@
package com.vincent.rsf.server.manager.controller.params;
import com.vincent.rsf.server.manager.entity.Loc;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
 * @author Ryan
 * @version 1.0
 * @title LocModifyParams
 * @description
 * @create 2025/3/17 15:35
 */
@Data
@ApiModel(value = "LocModifyParams", description = "批量修改参数")
public class LocModifyParams implements Serializable {
    @ApiModelProperty("主单ID")
    private List<Long> id;
    @ApiModelProperty("库位信息")
    private Loc loc;
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Loc.java
@@ -1,14 +1,13 @@
package com.vincent.rsf.server.manager.entity;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.vincent.rsf.server.manager.service.WarehouseAreasService;
import com.vincent.rsf.server.manager.service.WarehouseService;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import com.vincent.rsf.framework.common.Cools;
@@ -19,6 +18,7 @@
@Data
@TableName("man_loc")
@Accessors(chain = true)
public class Loc implements Serializable {
    private static final long serialVersionUID = 1L;
@@ -53,11 +53,6 @@
    @ApiModelProperty(value= "库位类型")
    private String type;
    /**
     * 名称
     */
    @ApiModelProperty(value= "名称")
    private String name;
    /**
     * 虚拟库位
@@ -87,13 +82,28 @@
     * 长/宽/高
     */
    @ApiModelProperty(value= "长/宽/高")
    private String size;
    @TableField("`length`")
    private Double length;
    /**
     * 宽
     */
    @ApiModelProperty("宽")
    @TableField("`width`")
    private Double width;
    /**
     * 高
     */
    @ApiModelProperty("高")
    private Double height;
    /**
     * 排
     */
    @ApiModelProperty(value= "排")
    private Integer lrow;
    @TableField("`row`")
    private Integer row;
    /**
     * 列
@@ -110,8 +120,13 @@
    /**
     * 通道
     */
    @ApiModelProperty(value= "通道")
    @ApiModelProperty(value= "巷道")
    private Integer channel;
    /**
     * 库位使用状态
     */
    private String useStatus;
    /**
     * 最大零件数
@@ -190,18 +205,19 @@
    public Loc() {}
    public Loc(Long areaId, Long warehouseId, String code,String type,String name,Short flagLogic,String fucAtrrs,String barcode,String unit,String size,Integer lrow,Integer col,Integer lev,Integer channel,Integer maxParts,Integer maxPack,Short flagLabelMange,String locAttrs,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
    public Loc(Long areaId, Long warehouseId, String code,String type,Short flagLogic,String fucAtrrs,String barcode,String unit,Double size, Double width, Double height,Integer lrow,Integer col,Integer lev,Integer channel,Integer maxParts,Integer maxPack,Short flagLabelMange,String locAttrs,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
        this.warehouseId = warehouseId;
        this.areaId = areaId;
        this.code = code;
        this.type = type;
        this.name = name;
        this.width = width;
        this.height = height;
        this.flagLogic = flagLogic;
        this.fucAtrrs = fucAtrrs;
        this.barcode = barcode;
        this.unit = unit;
        this.size = size;
        this.lrow = lrow;
        this.length = size;
        this.row = lrow;
        this.col = col;
        this.lev = lev;
        this.channel = channel;
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/QlyIsptItem.java
@@ -4,14 +4,10 @@
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import com.vincent.rsf.framework.common.Cools;
@@ -19,7 +15,6 @@
import com.vincent.rsf.server.system.service.UserService;
import com.vincent.rsf.server.system.entity.User;
import java.io.Serializable;
import java.util.Date;
@Data
@TableName("man_qly_ispt_item")
@@ -58,7 +53,7 @@
    @ApiModelProperty(value= "标签")
    private String label;
    /**
    /**∂
     * 供应商名称
     */
    @ApiModelProperty(value= "供应商名称")
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/StockItem.java
@@ -13,7 +13,6 @@
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableLogic;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import com.vincent.rsf.framework.common.Cools;
@@ -21,7 +20,6 @@
import com.vincent.rsf.server.system.service.UserService;
import com.vincent.rsf.server.system.entity.User;
import java.io.Serializable;
import java.util.Date;
@Data
@TableName("man_stock_item")
@@ -390,7 +388,7 @@
        LocService service = SpringUtils.getBean(LocService.class);
        Loc loc = service.getById(this.locId);
        if (!Cools.isEmpty(loc)){
            return String.valueOf(loc.getName());
            return String.valueOf(loc.getCode());
        }
        return null;
    }
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WarehouseAreas.java
@@ -38,6 +38,12 @@
    private Long id;
    /**
     * 仓库ID
     */
    @ApiModelProperty("仓库ID")
    private Long wareId;
    /**
     * 编号
     */
    @ApiModelProperty(value= "编号")
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/MatnrsTemplate.java
@@ -1,8 +1,6 @@
package com.vincent.rsf.server.manager.entity.excel;
import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.handler.inter.IExcelDataModel;
import cn.afterturn.easypoi.handler.inter.IExcelModel;
import com.vincent.rsf.server.manager.entity.excel.annotation.ExcelAutoColumnSize;
import com.vincent.rsf.server.manager.entity.excel.annotation.ExcelComment;
import lombok.Data;
@@ -24,7 +22,7 @@
@Accessors(chain = true)
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = false)
public class MatnrsTemplate implements IExcelModel, IExcelDataModel, Serializable {
public class MatnrsTemplate implements Serializable {
    @Excel(name = "物料名称")
    @ExcelComment(example = "华为手机")
@@ -114,28 +112,5 @@
    @ExcelComment(notNull = false, example = "0")
    private String flagCheck;
    private Integer rowNum;
    private String errorMsg;
    @Override
    public Integer getRowNum() {
        return this.rowNum;
    }
    @Override
    public void setRowNum(Integer rowNum) {
        this.rowNum = rowNum;
    }
    @Override
    public String getErrorMsg() {
        return this.errorMsg;
    }
    @Override
    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderItemService.java
@@ -18,7 +18,5 @@
    boolean fieldsSave(Map<String, Object> params);
//    R listByAsnId(Map<String, Object> map);
    IPage<Map<String, Object>> listByAsnId(PageParam<AsnOrderItem, BaseParam> pageParam, QueryWrapper<AsnOrderItem> buildWrapper);
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocService.java
@@ -1,8 +1,16 @@
package com.vincent.rsf.server.manager.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.vincent.rsf.framework.common.R;
import com.vincent.rsf.server.manager.controller.params.LocMastInitParam;
import com.vincent.rsf.server.manager.controller.params.LocModifyParams;
import com.vincent.rsf.server.manager.entity.Loc;
import java.util.List;
public interface LocService extends IService<Loc> {
    R modifyLocs(LocModifyParams locs);
    R initLocs(LocMastInitParam param);
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocServiceImpl.java
@@ -1,12 +1,95 @@
package com.vincent.rsf.server.manager.service.impl;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.vincent.rsf.framework.common.R;
import com.vincent.rsf.framework.exception.CoolException;
import com.vincent.rsf.server.manager.controller.params.LocMastInitParam;
import com.vincent.rsf.server.manager.controller.params.LocModifyParams;
import com.vincent.rsf.server.manager.entity.WarehouseAreas;
import com.vincent.rsf.server.manager.mapper.LocMapper;
import com.vincent.rsf.server.manager.entity.Loc;
import com.vincent.rsf.server.manager.service.LocService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.vincent.rsf.server.manager.service.WarehouseAreasService;
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.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@Service("locService")
public class LocServiceImpl extends ServiceImpl<LocMapper, Loc> implements LocService {
    @Autowired
    private WarehouseAreasService warehouseAreasService;
    @Override
    public R modifyLocs(LocModifyParams locs) {
        if (locs.getId().isEmpty()) {
            throw new CoolException("库位ID不能为空!!");
        }
        Loc loc = locs.getLoc();
        if (Objects.isNull(loc)) {
            throw new CoolException("修改库位信息不能为空!!");
        }
        boolean update = this.update(new LambdaUpdateWrapper<Loc>()
                .in(Loc::getId, locs.getId())
                .eq(Loc::getStatus, 1)
                .set(!Objects.isNull(loc.getUseStatus()), Loc::getUseStatus, loc.getUseStatus())
                .set(!Objects.isNull(loc.getType()), Loc::getType, loc.getType())
                .set(!Objects.isNull(loc.getLength()), Loc::getLength, loc.getLength())
                .set(!Objects.isNull(loc.getWidth()), Loc::getWidth, loc.getWidth())
                .set(!Objects.isNull(loc.getHeight()), Loc::getHeight, loc.getHeight())
                .set(!Objects.isNull(loc.getChannel()), Loc::getChannel, loc.getChannel())
                .set(!Objects.isNull(loc.getFlagLabelMange()), Loc::getFlagLabelMange, loc.getFlagLabelMange())
                .set(!Objects.isNull(loc.getStatus()), Loc::getStatus, loc.getStatus()));
        if (!update) {
            throw new CoolException("库位信息修改失败!!");
        }
        return R.ok("操作成功!!");
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R initLocs(LocMastInitParam param) {
        //清空表
        if (this.baseMapper.delete(new LambdaUpdateWrapper<>()) < 0) {
            throw new CoolException("数据库初始化失败:老数据删除失败!!");
        }
        WarehouseAreas warehouseAreas = warehouseAreasService.getById(param.getAreaId());
        if (Objects.isNull(warehouseAreas)) {
            throw new CoolException("库区不存在!!");
        }
        List<Loc> list = new ArrayList<>();
        for (int r = param.getStartRow(); r <= param.getEndRow(); r++) {
            for (int b = param.getStartBay(); b <= param.getEndBay(); b++) {
                for (int l = param.getStartLev(); l <= param.getEndLev(); l++) {
                    // 获取库位号
                    String locNo = String.format("%02d", r) + String.format("%03d", b) + String.format("%02d", l);
                    Loc loc = new Loc();
                    loc.setCode(locNo)
                            .setUseStatus("O")
                            .setRow(r)
                            .setCol(b)
                            .setLev(l)
                            .setAreaId(param.getAreaId())
                            .setWarehouseId(warehouseAreas.getWareId())
                            .setType(param.getType());
                    list.add(loc);
                }
            }
        }
        if (!this.saveBatch(list)) {
            throw new CoolException("库位初始化失败!!");
        }
        return R.ok("初始化成功!!");
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/system/constant/CodeRes.java
@@ -10,6 +10,7 @@
    String USER_10003 = "10003-密码错误";
    String PICK_600 = "600-拣料任务";
    String NO_COMB_700 = "700-请先组托";
    String SYSTEM_20001 = "20001-许可证已失效";
rsf-server/src/main/java/com/vincent/rsf/server/system/enums/LocStsType.java
New file
@@ -0,0 +1,48 @@
package com.vincent.rsf.server.system.enums;
public enum LocStsType {
    //空板
    LOC_STS_TYPE_D("D", "空板"),
    //在库
    LOC_STS_TYPE_F("F", "在库"),
    //空库
    LOC_STS_TYPE_O("O", "空库"),
    //禁用
    LOC_STS_TYPE_X("X", "禁用"),
    //入库预约
    LOC_STS_TYPE_S("S", "入库预约"),
    //出库预约
    LOC_STS_TYPE_R("R", "出库预约"),
    ;
    private String type;
    private String desc;
    LocStsType(String type, String desc) {
        this.type = type;
        this.desc = desc;
    }
//    public long val() {
//        LocStsService service = SpringUtils.getBean(LocStsService.class);
//        LocSts locSts = service.getOne(new LambdaQueryWrapper<LocSts>().eq(LocSts::getLocSts, this.toString()));
//        if (locSts == null) {
//            throw new CoolException("LocStsType Error!");
//        }
//        return locSts.getId();
//    }
    public static LocStsType get(String el) {
        for (LocStsType value : LocStsType.values()) {
            if (el.equals(value.toString())) {
                return value;
            }
        }
        return null;
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/system/enums/LocType.java
New file
@@ -0,0 +1,25 @@
package com.vincent.rsf.server.system.enums;
/**
 * @author Ryan
 * @version 1.0
 * @title LocType
 * @description
 * @create 2025/3/17 13:29
 */
public enum LocType {
    //高、中、低库位
    LOC_TYPE_HEIGHT("H", "高库位"),
    LOC_TYPE_MIDDLE("M", "中库位"),
    LOC_TYPE_LOW("L", "低库位")
    ;
    LocType(String type, String desc) {
        this.type = type;
        this.desc = desc;
    }
    private String type;
    private String desc;
}
rsf-server/src/main/resources/application-dev.yml
@@ -14,6 +14,8 @@
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
#    url: jdbc:mysql://47.76.147.249:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
#    username: rsf
    password: 34821015
    type: com.alibaba.druid.pool.DruidDataSource
    druid: