skyouc
2025-03-12 4af26c71d9414b8b8f568c0f119f123790cab152
#修改
动态字段key-value值新增,显示优化
1个文件已添加
21个文件已修改
404 ■■■■ 已修改文件
rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/controller/params/ReceiptParams.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/ReceiptDetlsDto.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/service/MobileService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java 145 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/common/utils/FieldsUtils.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderItemController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WarehouseAreasItemController.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Matnr.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WarehouseAreasItem.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/MatnrsTemplate.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/ScheduleJobs.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/MatnrService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WarehouseAreasItemService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/MatnrServiceImpl.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WarehouseAreasItemServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/system/entity/Fields.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/system/entity/FieldsItem.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java
@@ -94,7 +94,6 @@
        if (Objects.isNull(params)) {
            throw new CoolException("参数不能为空!!");
        }
        return mobileService.otherReceipt(params);
    }
@@ -114,4 +113,12 @@
    }
    @PreAuthorize("hasAuthority('manager:asnOrder:list')")
    @GetMapping("/dynamic/fields")
    @ApiOperation("获取动态字段")
    public R getDynamicFields() {
        return R.ok(mobileService.getDynamicFields());
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/api/controller/params/ReceiptParams.java
@@ -7,6 +7,7 @@
import lombok.experimental.Accessors;
import java.util.List;
import java.util.Map;
/**
 * @author Ryan
rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/ReceiptDetlsDto.java
@@ -1,12 +1,17 @@
package com.vincent.rsf.server.api.entity.dto;
import io.swagger.annotations.Api;
import com.alibaba.fastjson.JSONObject;
import com.vincent.rsf.server.api.controller.params.ReceiptParams;
import com.vincent.rsf.server.common.utils.CommonUtil;
import com.vincent.rsf.server.common.utils.FieldsUtils;
import com.vincent.rsf.server.system.utils.SerialRuleUtils;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Map;
/**
 * @author Ryan
@@ -64,4 +69,22 @@
    @ApiModelProperty("供应商编码")
    private String splrCode;
    @ApiModelProperty("扩展字段")
    private Map<String, Object> extendFields;
    public static void main(String[] args) {
        String abc = "";
        String s = CommonUtil.randomUUID16();
       System.out.println("重复字符串:" + s);
//        for (int i = 0; i < 10000; i++) {
//            String s = CommonUtil.randomUUID16();
//            if (abc.equals(s)) {
//                System.out.println("重复字符串:" + abc);
//            }
//            abc = s;
//        }
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/api/service/MobileService.java
@@ -5,6 +5,7 @@
import com.vincent.rsf.server.api.controller.params.ReceiptParams;
import com.vincent.rsf.server.manager.entity.AsnOrder;
import com.vincent.rsf.server.system.controller.param.LoginParam;
import com.vincent.rsf.server.system.entity.Fields;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
@@ -29,4 +30,6 @@
    List<AsnOrder> getAllAsnOrders();
    R getReceiptAreas();
    List<Fields> getDynamicFields();
}
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java
@@ -1,5 +1,6 @@
package com.vincent.rsf.server.api.service.impl;
import com.alibaba.druid.sql.visitor.functions.If;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.vincent.rsf.framework.common.Cools;
import com.vincent.rsf.framework.common.R;
@@ -12,6 +13,7 @@
import com.vincent.rsf.server.common.config.ConfigProperties;
import com.vincent.rsf.server.common.enums.WarehouseAreaType;
import com.vincent.rsf.server.common.security.JwtSubject;
import com.vincent.rsf.server.common.utils.CommonUtil;
import com.vincent.rsf.server.common.utils.JwtUtil;
import com.vincent.rsf.server.manager.entity.*;
import com.vincent.rsf.server.manager.mapper.*;
@@ -20,11 +22,12 @@
import com.vincent.rsf.server.system.constant.CodeRes;
import com.vincent.rsf.server.system.controller.param.LoginParam;
import com.vincent.rsf.server.system.controller.result.LoginResult;
import com.vincent.rsf.server.system.entity.Tenant;
import com.vincent.rsf.server.system.entity.User;
import com.vincent.rsf.server.system.entity.UserLogin;
import com.vincent.rsf.server.system.entity.*;
import com.vincent.rsf.server.system.mapper.FieldsMapper;
import com.vincent.rsf.server.system.mapper.TenantMapper;
import com.vincent.rsf.server.system.mapper.UserMapper;
import com.vincent.rsf.server.system.service.FieldsItemService;
import com.vincent.rsf.server.system.service.FieldsService;
import com.vincent.rsf.server.system.service.UserLoginService;
import com.vincent.rsf.server.system.utils.SerialRuleUtils;
import org.apache.tika.utils.StringUtils;
@@ -73,6 +76,11 @@
    private StockItemMapper stockItemMapper;
    @Resource
    private PurchaseItemMapper purchaseItemMapper;
    @Resource
    private FieldsMapper fieldsMapper;
    @Autowired
    private FieldsItemService fieldsItemService;
    /**
@@ -122,7 +130,7 @@
        if (StringUtils.isEmpty(barcode)) {
            return R.error("标签码不能为空!!");
        }
        AsnOrderItem asnOrderItem = asnOrderItemMapper.selectOne(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getBarcode, barcode));
        List<AsnOrderItem> asnOrderItem = asnOrderItemMapper.selectList(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getBarcode, barcode));
        if (Objects.isNull(asnOrderItem)) {
            throw new CoolException("单据明细不存在!!");
        }
@@ -146,10 +154,14 @@
        if (Objects.isNull(params.getWhAreaId())) {
            throw new CoolException("库区标识不能为空!!");
        }
        WarehouseAreas areasItem = warehouseAreasService.getOne(new LambdaQueryWrapper<WarehouseAreas>().eq(WarehouseAreas::getId, params.getWhAreaId()));
        if (Objects.isNull(areasItem)) {
            throw new CoolException("数据错误:当前库区不存在!!");
        }
        //获取已启用的动态扩展字
        List<Fields> fields = fieldsMapper.selectList(new LambdaQueryWrapper<Fields>().eq(Fields::getFlagEnable, 1).eq(Fields::getStatus, 1));
        List<ReceiptDetlsDto> receipts = params.getReceipts();
        List<WarehouseAreasItem> allOrders =   new ArrayList<>();
        receipts.forEach(dto -> {
@@ -175,7 +187,36 @@
                    .setShipperId(matnr.getShipperId());
                    //TODO 供应商标识未设置,标识由PO单供应商编码转换
            if (!Objects.isNull(fields)) {
                if (!Objects.isNull(dto.getExtendFields())) {
                    //获取16位uuid
                    String uuid16 = CommonUtil.randomUUID16();
                    Map<String, Object> extendFields = dto.getExtendFields();
                    //字段集合申明
                    List<FieldsItem> fieldsItems = new ArrayList<>();
                    extendFields.keySet().forEach(key -> {
                        fields.forEach(obj -> {
                            //判断key值与fields表字段是否相同
                            if (obj.getFields().equals(key)) {
                                FieldsItem fieldsItem = new FieldsItem();
                                fieldsItem.setMatnrId(matnr.getId()).setFieldsId(obj.getId())
                                        .setShiperId(matnr.getShipperId())
                                        .setValue(extendFields.get(key).toString())
                                        .setUuid(uuid16);
                                fieldsItems.add(fieldsItem);
                                //唯一标识入库
                                item.setFieldsIndex(uuid16);
                            }
                        });
                    });
                    if (!fieldsItemService.saveBatch(fieldsItems)) {
                        throw new CoolException("扩展字段保存失败!!");
                    }
                }
            }
            allOrders.add(item);
        });
        if (!warehouseAreasItemService.saveBatch(allOrders)) {
@@ -196,7 +237,7 @@
        if (Objects.isNull(params.getAsnCode())) {
            throw new CoolException("通知单不能为空!!");
        }
        AsnOrderItem asnOrderItem = asnOrderItemMapper.selectOne(new LambdaQueryWrapper<AsnOrderItem>()
        List<AsnOrderItem> asnOrderItem = asnOrderItemMapper.selectList(new LambdaQueryWrapper<AsnOrderItem>()
                .eq(AsnOrderItem::getAsnCode, params.getAsnCode())
                .eq(!Objects.isNull(params.getBarcode()) ,AsnOrderItem::getBarcode, params.getBarcode()));
@@ -232,49 +273,67 @@
    }
    /**
     * 获取ReceiptDetlsDto
     * @author Ryan
     * @description 获取所有启用动态字段
     * @param
     * @return
     * @time 2025/3/12 09:23
     */
    private R getAsnOrderItem(AsnOrderItem asnOrderItem) {
        ReceiptDetlsDto detlsDto = new ReceiptDetlsDto();
    @Override
    public List<Fields> getDynamicFields() {
        return fieldsMapper.selectList(new LambdaQueryWrapper<Fields>().eq(Fields::getFlagEnable, 1).eq(Fields::getStatus, 1));
    }
        detlsDto.setAsnCode(asnOrderItem.getAsnCode())
                .setMatnk(asnOrderItem.getMatnk())
                .setBarcode(asnOrderItem.getBarcode())
                .setPoCode(asnOrderItem.getPoCode())
                .setPurQty(asnOrderItem.getAnfme())
                .setSplrBatch(asnOrderItem.getSplrBatch());
    /**
     * 获取ReceiptDetlsDtos
     */
    private R getAsnOrderItem(List<AsnOrderItem> items) {
        List<ReceiptDetlsDto> detlsDtos = new ArrayList<>();
        items.forEach(asnOrderItem -> {
            ReceiptDetlsDto detlsDto = new ReceiptDetlsDto();
        Matnr matnr = matnrMapper.selectById(asnOrderItem.getMatnrId());
        if (Objects.isNull(matnr)) {
            throw new CoolException("数据错误:当前物料不存在!!");
        }
        //SET 物料最大存放数量
        detlsDto.setMaxQty(matnr.getMaxQty())
                .setMatnrId(matnr.getId())
                .setStockUnit(matnr.getStockUnit());
        QlyInspect inspect = qlyInspectMapper.selectOne(new LambdaQueryWrapper<QlyInspect>()
                .eq(QlyInspect::getAsnItemId, asnOrderItem.getId()).eq(QlyInspect::getPoItemId, asnOrderItem.getPoDetlId()));
        if (!Objects.isNull(inspect)) {
            //set 质检结果
            detlsDto.setInspect(inspect.getStatus$());
        }
        //获取当前库存信息
        StockItem stockItem = stockItemMapper.selectOne(new LambdaQueryWrapper<StockItem>()
                .eq(StockItem::getAsnItemId, asnOrderItem.getId())
                .eq(StockItem::getMatnrId, asnOrderItem.getMatnrId()));
        //SET 当前库存数量
        if (Objects.isNull(stockItem)) {
            detlsDto.setStockQty(0.0);
        } else {
            detlsDto.setStockQty(stockItem.getQty() + stockItem.getWorkQty());
        }
            detlsDto.setAsnCode(asnOrderItem.getAsnCode())
                    .setMatnk(asnOrderItem.getMatnk())
                    .setBarcode(asnOrderItem.getBarcode())
                    .setPoCode(asnOrderItem.getPoCode())
                    .setPurQty(asnOrderItem.getAnfme())
                    .setSplrBatch(asnOrderItem.getSplrBatch());
        //获取采购单明细信息
        PurchaseItem purchaseItem = purchaseItemMapper.selectOne(new LambdaQueryWrapper<PurchaseItem>().eq(PurchaseItem::getId, asnOrderItem.getPoDetlId()));
        //SET 平台行号
        detlsDto.setPlatformId(purchaseItem.getPlatItemId());
            Matnr matnr = matnrMapper.selectById(asnOrderItem.getMatnrId());
            if (Objects.isNull(matnr)) {
                throw new CoolException("数据错误:当前物料不存在!!");
            }
            //SET 物料最大存放数量
            detlsDto.setMaxQty(matnr.getMaxQty())
                    .setMatnrId(matnr.getId())
                    .setStockUnit(matnr.getStockUnit());
            QlyInspect inspect = qlyInspectMapper.selectOne(new LambdaQueryWrapper<QlyInspect>()
                    .eq(QlyInspect::getAsnItemId, asnOrderItem.getId()).eq(QlyInspect::getPoItemId, asnOrderItem.getPoDetlId()));
            if (!Objects.isNull(inspect)) {
                //set 质检结果
                detlsDto.setInspect(inspect.getStatus$());
            }
            //获取当前库存信息
            StockItem stockItem = stockItemMapper.selectOne(new LambdaQueryWrapper<StockItem>()
                    .eq(StockItem::getAsnItemId, asnOrderItem.getId())
                    .eq(StockItem::getMatnrId, asnOrderItem.getMatnrId()));
            //SET 当前库存数量
            if (Objects.isNull(stockItem)) {
                detlsDto.setStockQty(0.0);
            } else {
                detlsDto.setStockQty(stockItem.getQty() + stockItem.getWorkQty());
            }
        return R.ok(detlsDto);
            //获取采购单明细信息
            PurchaseItem purchaseItem = purchaseItemMapper.selectOne(new LambdaQueryWrapper<PurchaseItem>().eq(PurchaseItem::getId, asnOrderItem.getPoDetlId()));
            //SET 平台行号
            detlsDto.setPlatformId(purchaseItem.getPlatItemId());
            detlsDtos.add(detlsDto);
        });
        return R.ok(detlsDtos);
    }
rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java
@@ -22,9 +22,9 @@
//        generator.username="sa";
//        generator.password="Zoneyung@zy56$";
        generator.table="sys_fields_item";
        generator.tableDesc="扩展字段明细表";
        generator.packagePath="com.vincent.rsf.server.system";
        generator.table="man_qly_inspect";
        generator.tableDesc="质检信息";
        generator.packagePath="com.vincent.rsf.server.manager";
        generator.build();
    }
rsf-server/src/main/java/com/vincent/rsf/server/common/utils/FieldsUtils.java
New file
@@ -0,0 +1,58 @@
package com.vincent.rsf.server.common.utils;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.vincent.rsf.framework.common.SpringUtils;
import com.vincent.rsf.server.system.entity.Fields;
import com.vincent.rsf.server.system.entity.FieldsItem;
import com.vincent.rsf.server.system.service.FieldsItemService;
import com.vincent.rsf.server.system.service.FieldsService;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * @author Ryan
 * @version 1.0
 * @title FieldsUtils
 * @description
 * @create 2025/3/12 12:33
 */
public class FieldsUtils {
    /**
     * @author Ryan
     * @description 通过字段唯一标识获取动态字段Map
     * @param
     * @return
     * @time 2025/3/12 12:50
     */
    public static Map<String, String> getFields(String uuid) {
        Map<String, String> fieldsMap = new HashMap<>();
        FieldsService fieldsService = SpringUtils.getBean(FieldsService.class);
        List<Fields> fields = fieldsService.list(new LambdaQueryWrapper<Fields>().eq(Fields::getFlagEnable, 1).eq(Fields::getStatus, 1));
        if (fields.isEmpty()) {
            return null;
        }
        FieldsItemService fieldsItemService = SpringUtils.getBean(FieldsItemService.class);
        List<FieldsItem> fieldsItems = fieldsItemService.list(new LambdaQueryWrapper<FieldsItem>().eq(FieldsItem::getUuid, uuid));
        for (Fields field : fields ) {
            if (fieldsItems.isEmpty()) {
                fieldsMap.put(field.getFields(), null);
                continue;
            }
            fieldsItems.forEach(fieldsItem -> {
                if (fieldsItem.getFieldsId().equals(field.getId())) {
                    fieldsMap.put(field.getFields(), fieldsItem.getValue());
                }
            });
        }
        return  fieldsMap;
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java
@@ -60,9 +60,7 @@
    @ApiOperation("保存")
    public R save(@RequestBody AsnOrder asnOrder) {
        asnOrder.setCreateBy(getLoginUserId());
        asnOrder.setCreateTime(new Date());
        asnOrder.setUpdateBy(getLoginUserId());
        asnOrder.setUpdateTime(new Date());
        if (!asnOrderService.save(asnOrder)) {
            return R.error("Save Fail");
        }
@@ -133,5 +131,11 @@
        }
    }
    @PostMapping("/asnOrder")
    @ApiOperation("ASN导入接口")
    @PreAuthorize("hasAuthority('manager:asnOrder:update')")
    public R importExcel() {
        return R.ok();
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderItemController.java
@@ -56,9 +56,8 @@
    @PostMapping("/asnOrderItem/save")
    public R save(@RequestBody AsnOrderItem asnOrderItem) {
        asnOrderItem.setCreateBy(getLoginUserId());
        asnOrderItem.setCreateTime(new Date());
        asnOrderItem.setUpdateBy(getLoginUserId());
        asnOrderItem.setUpdateTime(new Date());
//        asnOrderItemService.getFieldsExtend
        if (!asnOrderItemService.save(asnOrderItem)) {
            return R.error("Save Fail");
        }
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrController.java
@@ -137,13 +137,11 @@
    @PreAuthorize("hasAuthority('manager:matnr:save')")
    @ApiOperation(value = "excel表格导入物料信息")
    @PostMapping("/matnr/import")
    public R listImport(@RequestParam MultipartFile file) throws Exception {
    public R listImport(MultipartFile file) throws Exception {
        if (Objects.isNull(file)) {
            throw new CoolException("文件不能为空!!");
        }
        matnrService.importExcels(file);
        return R.ok();
       return matnrService.importExcels(file);
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WarehouseAreasItemController.java
@@ -12,6 +12,7 @@
import com.vincent.rsf.server.manager.entity.WarehouseAreasItem;
import com.vincent.rsf.server.manager.service.WarehouseAreasItemService;
import com.vincent.rsf.server.system.controller.BaseController;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
@@ -19,6 +20,7 @@
import javax.servlet.http.HttpServletResponse;
import java.util.*;
@Api(tags = "库区库存明细")
@RestController
public class WarehouseAreasItemController extends BaseController {
@@ -36,10 +38,11 @@
    @PreAuthorize("hasAuthority('manager:warehouseAreasItem:list')")
    @PostMapping("/warehouseAreasItem/list")
    public R list(@RequestBody Map<String, Object> map) {
        return R.ok().add(warehouseAreasItemService.list());
        return R.ok(warehouseAreasItemService.getList());
//        return R.ok().add(warehouseAreasItemService.list());
    }
    @PreAuthorize("hasAuthority('manager:warehouseAreasItem:list')")
    @PreAuthorize("hasAuthority('manager:warehouseAreasItem:list'   )")
    @PostMapping({"/warehouseAreasItem/many/{ids}", "/warehouseAreasItems/many/{ids}"})
    public R many(@PathVariable Long[] ids) {
        return R.ok().add(warehouseAreasItemService.listByIds(Arrays.asList(ids)));
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java
@@ -6,14 +6,10 @@
import lombok.experimental.Accessors;
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;
@@ -21,7 +17,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
@Accessors(chain = true)
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Matnr.java
@@ -9,6 +9,7 @@
import com.vincent.rsf.server.manager.service.CompanysService;
import com.vincent.rsf.server.manager.service.MatnrGroupService;
import com.vincent.rsf.server.manager.service.ShipperService;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
@@ -27,6 +28,7 @@
@Data
@TableName("man_matnr")
@Accessors(chain = true)
@ApiModel(value = "Matnr", description = "物料所有基础属性")
public class Matnr implements Serializable {
@@ -67,6 +69,12 @@
    private Long groupId;
    /**
     * 分组助记码
     */
    @ApiModelProperty(value = "分组助记码")
    private String groupCode;
    /**
     * 规则代码
     */
    @ApiModelProperty(value= "规则代码")
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WarehouseAreasItem.java
@@ -1,6 +1,7 @@
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;
@@ -10,10 +11,7 @@
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;
@@ -23,9 +21,11 @@
import com.vincent.rsf.server.system.entity.User;
import java.io.Serializable;
import java.util.Date;
import java.util.Map;
@Data
@Accessors(chain = true)
@ApiModel(value = "WarehouseAreasItem", description = "库区库存信息")
@TableName("man_warehouse_areas_item")
public class WarehouseAreasItem implements Serializable {
@@ -55,6 +55,9 @@
     */
    @ApiModelProperty(value= "物料标识")
    private Long matnrId;
    @ApiModelProperty(value = "扩展字段唯一标识")
    private String fieldsIndex;
    /**
     * 物料名称
@@ -179,6 +182,10 @@
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    @ApiModelProperty("扩展字段")
    @TableField(exist = false)
    private Map<String, String> extendFields;
    /**
     * 备注
     */
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/MatnrsTemplate.java
@@ -30,9 +30,9 @@
    @ExcelComment(example = "华为手机")
    private String name;
    @Excel(name = "货主编码")
    @ExcelComment(example = "PO12625")
    private String shipperCode;
    @Excel(name = "分类助记码")
    @ExcelComment(example = "256874556")
    private String groupCode;
    @Excel(name = "分类名称")
    @ExcelComment(example = "移动设备")
@@ -79,7 +79,7 @@
    private String purUnit;
    @Excel(name = "ABC类")
    @ExcelComment(notNull = false, example = "A")
    @ExcelComment(notNull = false, example = "0")
    private String stockLevel;
    @Excel(name = "安全库存量")
@@ -107,11 +107,11 @@
    private String barcode;
    @Excel(name = "效期预警阈值")
    @ExcelComment(notNull = false, example = "2025-01-25 14:25:36")
    @ExcelComment(notNull = false, example = "90")
    private String validWarn;
    @Excel(name = "是否免检")
    @ExcelComment(notNull = false, example = "否")
    @ExcelComment(notNull = false, example = "0")
    private String flagCheck;
    private Integer rowNum;
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/ScheduleJobs.java
@@ -92,7 +92,6 @@
                throw new CoolException("ASN单据保存失败!!");
            }
            List<AsnOrderItem> orderItems = new ArrayList<>();
            String uuid16 = CommonUtil.randomUUID16();
            items.forEach(item -> {
                AsnOrderItem orderItem = new AsnOrderItem();
                Matnr matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>().eq(Matnr::getCode, item.getMatnrCode()));
@@ -115,12 +114,6 @@
                        .setPurUnit(item.getUnit())
                        .setMatnk(matnr.getName())
                        .setMatnrId(matnr.getId() + "");
                //判断PO单是否已设置动态字段索引
                if (Objects.isNull(item.getFieldsIndex())) {
                    orderItem.setFieldsIndex(uuid16);
                } else {
                    orderItem.setFieldsIndex(item.getFieldsIndex());
                }
                orderItems.add(orderItem);
            });
            if (!asnOrderItemService.saveBatch(orderItems)) {
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/MatnrService.java
@@ -1,12 +1,11 @@
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.entity.Matnr;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
public interface MatnrService extends IService<Matnr> {
    void importExcels(MultipartFile file) throws Exception;
    R importExcels(MultipartFile file) throws Exception;
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WarehouseAreasItemService.java
@@ -3,6 +3,10 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.vincent.rsf.server.manager.entity.WarehouseAreasItem;
import java.util.List;
import java.util.Map;
public interface WarehouseAreasItemService extends IService<WarehouseAreasItem> {
    List<WarehouseAreasItem> getList();
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/MatnrServiceImpl.java
@@ -2,33 +2,81 @@
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.manager.entity.MatnrGroup;
import com.vincent.rsf.server.manager.entity.excel.MatnrsTemplate;
import com.vincent.rsf.server.manager.mapper.MatnrMapper;
import com.vincent.rsf.server.manager.entity.Matnr;
import com.vincent.rsf.server.manager.service.MatnrGroupService;
import com.vincent.rsf.server.manager.service.MatnrService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@Service("matnrService")
public class MatnrServiceImpl extends ServiceImpl<MatnrMapper, Matnr> implements MatnrService {
    @Autowired
    private MatnrGroupService matnrGroupService;
    /**
     * @return
     * @throws
     * @author Ryan
     * @description 物料数据导入接处理实现
     * @throws
     * @return
     * @time 2025/3/3 13:08
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void importExcels(MultipartFile file) throws Exception {
    public R importExcels(MultipartFile file) throws Exception {
        //读取上传文件内容
        ExcelImportResult<MatnrsTemplate> result = ExcelImportUtil.importExcelMore(file.getInputStream(), MatnrsTemplate.class, ExcelUtil.getDefaultImportParams());
        //TODO 物料写入处理
        if (result.getList().isEmpty()) {
            throw new CoolException("物料导入失败!!");
        }
        List<Matnr> matnrs = new ArrayList<>();
        result.getList().forEach(template -> {
            Matnr matnr = new Matnr();
            matnr.setBarcode(template.getBarcode())
                    .setCode(template.getErpCode())
                    .setDescrible(template.getDescrible())
                    .setColor(template.getColor())
                    .setFlagCheck(Short.parseShort(template.getFlagCheck()))
                    .setWeight(Double.parseDouble(template.getWeight()))
                    .setValidWarn(Integer.parseInt(template.getValidWarn()))
                    .setValid(Integer.parseInt(template.getValid()))
                    .setUnit(template.getUnit())
                    .setStockUnit(template.getPurUnit())
                    .setSpec(template.getSpec())
                    .setStagn(Integer.parseInt(template.getStagn()))
                    .setModel(template.getModel())
                    .setGroupCode(template.getGroupCode())
                    .setPurUnit(template.getPurUnit())
                    .setStockLevel(Short.parseShort(template.getStockLevel()))
                    .setSafeQty(Double.parseDouble(template.getSafeQty()))
                    .setMinQty(Double.parseDouble(template.getMinQty()));
            if (Objects.isNull(template.getGroupCode()) && Objects.isNull(template.getGroupName())) {
                MatnrGroup matnrGroups = matnrGroupService.getOne(new LambdaQueryWrapper<MatnrGroup>()
                        .eq(!Objects.isNull(template.getGroupCode()), MatnrGroup::getCode, template.getGroupCode())
                        .eq(!Objects.isNull(template.getGroupName()),MatnrGroup::getName, template.getName()));
                matnr.setGroupId(matnrGroups.getId());
            }
            matnrs.add(matnr);
        });
        if (!this.saveBatch(matnrs)) {
            throw new CoolException("导入失败!!");
        }
        return R.ok("导入成功!!");
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WarehouseAreasItemServiceImpl.java
@@ -1,12 +1,27 @@
package com.vincent.rsf.server.manager.service.impl;
import com.vincent.rsf.server.common.utils.FieldsUtils;
import com.vincent.rsf.server.manager.mapper.WarehouseAreasItemMapper;
import com.vincent.rsf.server.manager.entity.WarehouseAreasItem;
import com.vincent.rsf.server.manager.service.WarehouseAreasItemService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Objects;
@Service("warehouseAreasItemService")
public class WarehouseAreasItemServiceImpl extends ServiceImpl<WarehouseAreasItemMapper, WarehouseAreasItem> implements WarehouseAreasItemService {
    @Override
    public List<WarehouseAreasItem> getList() {
        List<WarehouseAreasItem> areasItems = this.list();
        for (WarehouseAreasItem areasItem : areasItems) {
            if (Objects.isNull(areasItem.getFieldsIndex())) {
                continue;
            }
            areasItem.setExtendFields(FieldsUtils.getFields(areasItem.getFieldsIndex()));
        }
        return areasItems;
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/system/entity/Fields.java
@@ -21,6 +21,7 @@
@Data
@TableName("sys_fields")
@ApiModel(value = "Fields", description = "动态字段")
public class Fields implements Serializable {
    private static final long serialVersionUID = 1L;
rsf-server/src/main/java/com/vincent/rsf/server/system/entity/FieldsItem.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("sys_fields_item")
public class FieldsItem implements Serializable {