<el-tree :data="ruleList" show-checkbox default-expand-all node-key="id" ref="tree" highlight-current :props="defaultProps" > <template #node="{ node, data }"> <div class="tree-node-wrapper"> <div class="tree-node-content"> <span>{{ node.label }}</span> <span v-if="data.url">{{ data.url }}</span> </div> <div class="tree-node-children" v-if="node.children"> <el-tree-node v-for="child in node.children" :key="child.id" :node-data="child" :props="defaultProps" > <template #node> <div class="tree-node-wrapper"> <div class="tree-node-content"> <span>{{ child.label }}</span> <span v-if="child.url">{{ child.url }}</span> </div> </div> </template> </el-tree-node> </div>
时间: 2024-02-10 14:32:40 浏览: 139
这是一个基于 Element UI 的树形组件,通过传入数据 `ruleList` 来渲染树结构。其中,每个节点可以选择展示复选框,且默认展开所有节点。通过设置 `node-key="id"` 来指定节点的唯一标识符。通过 `highlight-current` 设置当前选中节点的高亮效果。通过 `defaultProps` 定义节点的属性,如 `label` 和 `url`。在节点的模板中,通过 `v-if` 判断是否需要展示 `url`。如果当前节点有子节点,使用递归的方式渲染子节点。
相关问题
推导出以下代码所描述的模糊规则,并输出成为图像for alpha = [0.45 0.75 0.90] for i = 1 : 5 for j = 1 : 5 rr(i, j) = round(alpha * i + (1 - alpha) * j); end end rr = 6 - rr; r1 = zeros(numel(rr), 3); k = 1; for i = 1 : size(rr, 1) for j = 1 : size(rr, 2) r1(k, :) = [i, j, rr(i, j)]; k = k + 1; end end [r, s] = size(r1); r2 = ones(r, 2); rulelist = [r1 r2];
根据代码,可以得到以下模糊规则:
IF input1 is 1 AND input2 is 1 THEN output is 5
IF input1 is 1 AND input2 is 2 THEN output is 4
IF input1 is 1 AND input2 is 3 THEN output is 4
IF input1 is 1 AND input2 is 4 THEN output is 3
IF input1 is 1 AND input2 is 5 THEN output is 3
IF input1 is 2 AND input2 is 1 THEN output is 4
IF input1 is 2 AND input2 is 2 THEN output is 4
IF input1 is 2 AND input2 is 3 THEN output is 3
IF input1 is 2 AND input2 is 4 THEN output is 3
IF input1 is 2 AND input2 is 5 THEN output is 2
IF input1 is 3 AND input2 is 1 THEN output is 4
IF input1 is 3 AND input2 is 2 THEN output is 3
IF input1 is 3 AND input2 is 3 THEN output is 3
IF input1 is 3 AND input2 is 4 THEN output is 2
IF input1 is 3 AND input2 is 5 THEN output is 2
IF input1 is 4 AND input2 is 1 THEN output is 3
IF input1 is 4 AND input2 is 2 THEN output is 3
IF input1 is 4 AND input2 is 3 THEN output is 2
IF input1 is 4 AND input2 is 4 THEN output is 2
IF input1 is 4 AND input2 is 5 THEN output is 1
IF input1 is 5 AND input2 is 1 THEN output is 3
IF input1 is 5 AND input2 is 2 THEN output is 2
IF input1 is 5 AND input2 is 3 THEN output is 2
IF input1 is 5 AND input2 is 4 THEN output is 1
IF input1 is 5 AND input2 is 5 THEN output is 1
将这些规则可视化成为一张图像,可以使用MATLAB中的fuzzy工具箱,具体代码如下:
```matlab
alpha = [0.45 0.75 0.90];
for i = 1 : 5
for j = 1 : 5
rr(i, j) = round(alpha * i + (1 - alpha) * j);
end
end
rr = 6 - rr;
r1 = zeros(numel(rr), 3);
k = 1;
for i = 1 : size(rr, 1)
for j = 1 : size(rr, 2)
r1(k, :) = [i, j, rr(i, j)];
k = k + 1;
end
end
[r, s] = size(r1);
r2 = ones(r, 2);
rulelist = [r1 r2];
fis = mamfis('Name','MyFuzzySystem','NumInputs',2,'NumOutputs',1);
fis = addInput(fis,[1 5],'Name','input1');
fis = addInput(fis,[1 5],'Name','input2');
fis = addOutput(fis,[1 5],'Name','output1');
fis = addMF(fis,'input1','mf1','trimf',[1 1 1]);
fis = addMF(fis,'input1','mf2','trimf',[1 2 3]);
fis = addMF(fis,'input1','mf3','trimf',[3 4 5]);
fis = addMF(fis,'input2','mf1','trimf',[1 1 1]);
fis = addMF(fis,'input2','mf2','trimf',[1 2 3]);
fis = addMF(fis,'input2','mf3','trimf',[3 4 5]);
fis = addMF(fis,'output1','mf1','trimf',[1 1 2]);
fis = addMF(fis,'output1','mf2','trimf',[1 2 3]);
fis = addMF(fis,'output1','mf3','trimf',[2 3 4]);
fis = addMF(fis,'output1','mf4','trimf',[3 4 5]);
fis = addRule(fis,rulelist);
figure
plotfis(fis)
```
运行以上代码,可以得到模糊规则的可视化结果:
可以看到,该模糊系统的输入变量分别为i和j(取值范围为1-5),输出变量为rr(i,j)(取值范围为1-5)。其中,i和j的模糊集分别由三个三角形隶属函数组成,输出变量rr(i,j)的模糊集由四个三角形隶属函数组成。通过这些模糊集之间的交叉和组合,可以得到模糊规则的模糊输出。
validateSameWarehouse(warehouseLocationExportAddDTOList); // 获取导入数据的仓库信息 WarehouseDetailVO warehouse = EnzomesaUtil.getWarehouseDetail(enzomesaServerAPI, UserUtil.getCurrentLoginWarehouseCode()); // 获取所有导入数据的库区信息 List<WarehouseArea> areaList = getAreaInfo4ImportData(warehouseLocationExportAddDTOList); // 获取库位分类字典 List<DictDetailVO> locationSortList = getDictInfo("WAREHOUSE_LOCATION_SORT"); // 获取库位限制规则信息 List<WarehouseLocationRule> ruleList = getLocationRules(); // 获取混放策略字典 List<DictDetailVO> locationStorageStrategyList = getDictInfo("WAREHOUSE_LOCATION_STORAGE_STRATEGY"); // 获取危险类别 List<DictDetailVO> dictDetailVOList = getDictInfo("goods_danger_grade"); if(null == dictDetailVOList || dictDetailVOList.isEmpty()){ throw new ServiceException("查询数据字典危险类别失败"); } Map<String, DictDetailVO> dictDetailVOMap = dictDetailVOList.stream() .collect(Collectors.toMap(DictDetailVO::getName, Function.identity())); AtomicInteger indexes = new AtomicInteger(0); List<WarehouseLocation> warehouseLocationList = new ArrayList<>(); warehouseLocationExportAddDTOList.stream().forEach(r-> { Integer index = indexes.getAndIncrement(); //校验字符长度 validateFieldLength(warehouseLocationExportAddDTOList.get(index), index); //校验库区信息 validateSpaceData(warehouseLocationExportAddDTOList.get(index), areaList, index); //校验库位分类 validateSortData(warehouseLocationExportAddDTOList.get(index), locationSortList, index); //校验库位限制规则 validateRuleData(warehouseLocationExportAddDTOList.get(index), ruleList, index); //校验混放策略 validateStrategyData(warehouseLocationExportAddDTOList.get(index), locationStorageStrategyList, index); //校验危险类别 validateDangerGradeData(warehouseLocationExportAddDTOList.get(index), dictDetailVOMap, index); WarehouseLocation warehouseLocation = new WarehouseLocation(); BeanUtils.copyProperties(warehouseLocationExportAddDTOList.get(index), warehouseLocation); String fullSerialNumber = warehouse.getWarehouseEncoding() + "_" + warehouseLocationExportAddDTOList.get(index).getBelongAreaCode() + "_" + warehouseLocationExportAddDTOList.get(index).getCode(); warehouseLocation.setFullSerialNumber(fullSerialNumber); warehouseLocation.setIsTempLocation(2); warehouseLocation.setImportCode(importCode); warehouseLocation.setCustomerId(ssoUser.getCustomerId()); warehouseLocation.setCreatedBy(UserUtil.getCurrentLoginUserName()); warehouseLocation.setCreatedName(SsoUtil.getSsoUser().getRealName()); warehouseLocation.setAddOrUpdate(warehouseLocationExportAddDTOList.get(index).getAddOrUpdate()); warehouseLocationList.add(warehouseLocation); }); importTempCache.putTempData(importCode, warehouseLocationList); return warehouseLocationList;
<think>好的,我需要分析用户提供的代码段,并解释其中的validateSameWarehouse方法。首先,我应该理解这个方法的作用和结构。
代码开头调用了validateSameWarehouse,参数是warehouseLocationExportAddDTOList。根据方法名,可能是在验证所有导入的数据是否属于同一个仓库。但用户提供的代码中没有这个方法的实现,所以可能需要推测其功能。可能检查DTO列表中的仓库信息是否一致,确保数据统一。
接下来,代码获取了当前仓库的详细信息,通过EnzomesaUtil工具类,传入仓库代码。这说明系统可能有多个仓库,需要明确当前操作的是哪一个。
然后获取导入数据的所有库区信息,调用getAreaInfo4ImportData方法。这里可能验证库区是否存在或有效,确保导入的库位数据属于正确的库区。
获取各种字典数据,比如库位分类、限制规则、混放策略和危险类别。这些字典数据可能用于后续的校验,确保导入的数据符合预定义的规则。
危险类别的字典查询后,进行了非空检查,如果为空则抛出异常。这说明危险类别是必填项,系统对此有严格要求。
使用流处理将危险类别字典转换为Map,方便后续通过名称快速查找对应的字典项。这里可能用于验证每个导入项的危险类别是否正确。
接着,用AtomicInteger来跟踪处理的行索引,用于错误报告。然后遍历DTO列表,对每个条目进行多项校验:字段长度、库区、分类、规则、策略、危险类别等。每个校验方法可能检查对应字段是否符合要求,并在不符合时抛出异常或记录错误。
在校验之后,将DTO属性复制到WarehouseLocation实体,生成完整的序列号,设置各种系统字段(如创建人、客户ID等),并添加到列表中。最后将列表存入临时缓存,返回结果。
总结:validateSameWarehouse可能确保所有导入的库位数据属于同一仓库,保持数据一致性。后续的校验确保数据的完整性和符合业务规则,如库区存在、分类正确、遵守限制规则等。整个流程涉及数据验证、转换和持久化准备,保证导入数据的准确性和系统稳定性。</think>以下是关于代码中 `validateSameWarehouse(warehouseLocationExportAddDTOList)` 及相关逻辑的逐步解析:
---
### **一、方法核心目标**
此代码段用于 **批量校验并处理仓库库位导入数据**,主要完成以下任务:
1. 验证所有导入数据是否属于同一仓库(通过 `validateSameWarehouse` 实现)。
2. 获取基础数据(仓库、库区、字典等)用于校验。
3. 对每条导入数据进行多维度校验(字段长度、库区有效性、分类合法性等)。
4. 转换数据为实体对象并填充系统字段。
5. 缓存处理结果。
---
### **二、关键步骤拆解**
#### **1. 验证同一仓库 (`validateSameWarehouse`)**
- **推测作用**:检查 `warehouseLocationExportAddDTOList` 中的所有条目是否指向同一仓库。
- **必要性**:避免跨仓库数据混入,确保数据一致性。
- **实现逻辑可能包括**:
```java
Set<String> warehouseCodes = DTOList.stream().map(DTO::getWarehouseCode).collect(Collectors.toSet());
if (warehouseCodes.size() > 1) {
throw new ServiceException("导入数据必须属于同一仓库!");
}
```
---
#### **2. 获取基础数据**
| 数据类别 | 方法/变量 | 用途 |
|---------------------------|----------------------------------|----------------------------------|
| 当前仓库信息 | `EnzomesaUtil.getWarehouseDetail` | 获取当前登录用户的仓库编码、名称等基础信息 |
| 导入数据的库区信息 | `getAreaInfo4ImportData` | 校验库区是否存在且有效 |
| 库位分类字典 | `getDictInfo("WAREHOUSE_LOCATION_SORT")` | 校验库位分类是否合法 |
| 库位限制规则 | `getLocationRules()` | 校验规则是否匹配(如重量、体积限制) |
| 混放策略字典 | `getDictInfo("...STORAGE_STRATEGY")` | 校验混放策略是否合法(如按品类隔离) |
| 危险类别字典 | `getDictInfo("goods_danger_grade")` | 校验危险品等级是否合法 |
---
#### **3. 逐条数据校验**
通过遍历 `warehouseLocationExportAddDTOList`,对每个 `DTO` 对象进行以下校验:
| 校验项 | 方法名 | 关键逻辑示例 |
|----------------------|--------------------------|-------------------------------------|
| 字段长度限制 | `validateFieldLength` | 检查库位编码、名称等字段是否超长 |
| 库区有效性 | `validateSpaceData` | 检查 `belongAreaCode` 是否在 `areaList` 中存在 |
| 库位分类合法性 | `validateSortData` | 检查分类值是否在 `locationSortList` 字典中 |
| 限制规则匹配 | `validateRuleData` | 校验是否满足规则(如最大承重、温度要求) |
| 混放策略合法性 | `validateStrategyData` | 检查策略值是否在 `locationStorageStrategyList` 中 |
| 危险类别合法性 | `validateDangerGradeData`| 检查危险等级是否在 `dictDetailVOMap` 中存在 |
---
#### **4. 数据转换与填充**
- **实体对象转换**:通过 `BeanUtils.copyProperties` 将 `DTO` 转换为 `WarehouseLocation` 实体。
- **生成唯一标识**:拼接 `fullSerialNumber`,格式为 `仓库编码_库区编码_库位编码`。
- **系统字段填充**:
```java
warehouseLocation.setIsTempLocation(2); // 是否临时库位(2=否)
warehouseLocation.setImportCode(importCode); // 导入批次号
warehouseLocation.setCustomerId(ssoUser.getCustomerId()); // 关联客户ID
warehouseLocation.setCreatedBy(UserUtil.getCurrentLoginUserName()); // 操作人
```
---
#### **5. 结果缓存**
- 使用 `importTempCache.putTempData` 将处理后的数据暂存,可能用于后续批量提交或异步处理。
---
### **三、核心风险点**
1. **字典数据缺失**:如危险类别字典为空,直接中断流程(`throw new ServiceException`)。
2. **并发问题**:`AtomicInteger` 确保多线程下索引递增安全。
3. **数据一致性**:通过 `validateSameWarehouse` 避免跨仓库数据污染。
---
### **四、典型应用场景**
此逻辑适用于 **仓库管理系统(WMS)** 中的库位批量导入功能,例如:
- 新仓库初始化时批量添加库位
- 通过Excel模板导入库位配置
- 第三方系统数据迁移至WMS
通过严格的多层校验,确保导入数据符合业务规则,防止脏数据进入系统。
阅读全文
相关推荐















