@Log(title = "物理删除业务类型定义", businessType = BusinessType.DELETE) @DeleteMapping("/{busiTypeId}") public R<Void> remove(@NotNull(message = "主键不能为空") @PathVariable Long busiTypeId,String busiTypeNew,String subBusiTypeNew) { TKnowledgeBusitypeVo vo = iTKnowledgeBusitypeService.queryById(String.valueOf(busiTypeId)); String busiType = ""; String subBusiType = ""; //一级 if("0".equals(vo.getParentBusiType())){ TKnowledgeBusitypeBo bo = new TKnowledgeBusitypeBo(); bo.setBusiType(vo.getBusiType()); if(UserConstants.NOT_UNIQUE.equals(iTKnowledgeBusitypeService.checkParentBusitypeUnique(bo))){ return R.fail("删除业务类型'" + bo.getBusiTypeName() + "'失败,存在同名业务类型小,不允许删除!"); } busiType = vo.getBusiType(); } //二级 else { busiType = vo.getParentBusiType(); subBusiType = vo.getBusiType(); } ITKnowledgebaseInnerService.updateByBusiType(busiType,subBusiType,busiTypeNew,subBusiTypeNew); ITKnowledgebaseLawService.updateByBusiType(busiType,subBusiType,busiTypeNew,subBusiTypeNew); ITKnowledgebaseCaseService.updateByBusiType(busiType,subBusiType,busiTypeNew,subBusiTypeNew); return toAjax(iTKnowledgeBusitypeService.remove(busiTypeId)); }
时间: 2024-04-19 16:29:44 浏览: 226
这段代码是一个删除操作的方法。根据提供的业务类型ID,首先查询出对应的业务类型信息。然后根据业务类型的级别(一级或二级),分别处理不同的逻辑。
如果是一级业务类型,检查是否存在同名的子业务类型,如果存在则返回删除失败的提示信息。如果不存在同名子业务类型,则将业务类型信息赋值给变量`busiType`。
如果是二级业务类型,将一级业务类型和二级业务类型分别赋值给变量`busiType`和`subBusiType`。
接下来,通过调用`ITKnowledgebaseInnerService`、`ITKnowledgebaseLawService`和`ITKnowledgebaseCaseService`的相应方法,更新这些表中与该业务类型相关的数据。
最后调用`iTKnowledgeBusitypeService.remove(busiTypeId)`方法删除该业务类型,并将结果返回。返回结果以R对象的形式表示,其中`toAjax()`方法将删除结果转换成Ajax响应格式。
相关问题
使用cheerio 将以下代码转换为json<html> <tbody> <!-- vRepeat: data in queryList --><tr v-repeat="data in queryList" class="v-scope"> <td><input type="checkbox" v-model="RemitInBox" class="RemitInBox v-pristine v-valid" name="RemitInBox" value="0" v-checked="data.CheckFlag" v-disabled="data.FndDrc!='01' || data.BusiState!='10'" id="List0_RemitIn" v-click="clickBox($index,data)"></td> <td><span v-show="data.FndDrc!='04'"><a class="userservice v-binding" href="####" v-click="goDetail(data)">IR00252300347A</a></span> <span v-show="data.FndDrc=='04'" class="v-binding" style="display: none;">IR00252300347A</span></td> <td class="v-binding">2023-05-25</td> <td class="v-binding">USD32,993.50</td> <td class="v-binding">1/FLOKSER KIMYA SANAYI VE TICARET 1...</td> <td class="v-binding">31980005000107125</td> <td><span v-show="data.FndDrc=='01'">入账</span> <span v-show="data.FndDrc=='04'" style="display: none;">退汇</span> <span v-show="!(data.FndDrc=='04'||data.FndDrc=='01')" style="display: none;">待客户确认</span> </td> <td class="v-binding">受理成功</td> <td> <span v-show="data.FndDrc=='01' && data.BusiState=='10'"> <a href="#" v-click="remitInPrint(data.BsnSrlNo)" class="userservice"> 打印 </a> </span> </td> </tr> </tbody> </html>
以下是使用Cheerio将代码转换为JSON的示例代码:
```javascript
const cheerio = require('cheerio');
const html = '<html>...</html>'; // 你提供的HTML代码
const $ = cheerio.load(html);
const queryList = [];
$('tr[v-repeat="data in queryList"]').each((i, el) => {
const $tds = $(el).find('td.v-binding');
const data = {
IRNo: $(el).find('a.userservice').text(),
Date: $tds.eq(0).text(),
Amount: $tds.eq(1).text(),
Account: $tds.eq(2).text(),
BusinessType: $tds.eq(3).text(),
BusinessState: $tds.eq(4).text(),
Print: $(el).find('a.userservice').attr('href')
};
queryList.push(data);
});
const result = { queryList };
const json = JSON.stringify(result);
console.log(json);
```
代码说明:
1. 使用Cheerio模块将HTML代码加载到`$`变量中。
2. 遍历所有的`tr`元素,并使用`find`方法查找包含数据的`td`元素。
3. 从每个`td`元素中提取相应的数据,并创建一个包含所有数据的对象。
4. 将每个对象添加到`queryList`数组中。
5. 将`queryList`数组包装在一个对象中,并将其转换为JSON字符串。
@Log(title = "活动名单", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, ActiveEventInformationDto activeEventInformationDto) { ActiveExcel activeExcel = activeEventInformationService.exportList(activeEventInformationDto); List<ActiveEventInformationUserExcel> excelList = activeExcel.getExcelList(); Map<String, List<String>> dynamicHeader = activeExcel.getDynamicHeader(); DynamicsExcelUtil<ActiveEventInformationUserExcel> util = new DynamicsExcelUtil<>(ActiveEventInformationUserExcel.class); util.exportExcel(response, excelList, dynamicHeader, "活动名单", "活动名单"); }和 @Log(title = "用户", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, UserInfoDto userInfoDto) { Long orgId = orgConfigService.getOrgIdByHost().getOrgId(); userInfoDto.setOrgId(orgId); List<UserInfoMailListExcel> excelList = userInfoService.export(userInfoDto); ExcelUtil<UserInfoMailListExcel> util = new ExcelUtil<UserInfoMailListExcel>(UserInfoMailListExcel.class); util.exportExcel(response, excelList, "通讯录");结合这两串代码写一个问卷答复详情导出功能
<think>嗯,用户需要结合已有的两个导出功能的代码,来写一个问卷答复详情的导出功能。首先,我得先理解用户提供的这两段代码的结构和功能。
第一个导出功能是关于活动名单的,使用了@Log注解记录操作日志,业务类型是导出。它通过POST请求处理导出,接收HttpServletResponse和ActiveEventInformationDto作为参数。然后调用service层的exportList方法获取ActiveExcel对象,里面包含数据列表excelList和动态表头dynamicHeader。接着用DynamicsExcelUtil来处理动态表头,导出Excel文件。
第二个导出功能是用户通讯录的导出,同样有@Log注解,业务类型也是导出。这里处理的是UserInfoDto,设置了机构ID,调用service层的export方法获取数据列表,使用ExcelUtil导出,没有动态表头,直接传列表和文件名。
现在用户需要写一个问卷答复详情的导出功能,结合这两段代码。首先需要考虑的是,问卷答复的导出是否需要动态表头?比如,不同问卷可能有不同的题目,表头需要动态生成。如果是的话,就需要参考第一个例子中的动态表头处理方式;如果表头固定,可以用第二个例子的方式。
接下来是代码结构。首先需要创建对应的Controller方法,添加@Log注解,设置正确的业务类型和标题。然后定义POST映射路径,比如"/exportSurveyResponse"。参数应该是HttpServletResponse和对应的DTO,比如SurveyResponseDto。
Service层需要实现导出逻辑,可能返回一个包含数据列表和动态表头的对象,类似ActiveExcel。如果表头是动态的,就需要在service中生成动态表头信息,比如根据问卷的问题动态生成列。然后,在Controller中调用service的导出方法,获取数据,再使用DynamicsExcelUtil或ExcelUtil来导出。
可能还需要创建对应的Excel模型类,比如SurveyResponseExcel,定义导出的字段。如果动态表头的话,可能需要处理更复杂的映射关系,比如使用Map来存储动态列名和对应的数据字段。
另外,要注意路径冲突的问题。之前的两个导出方法都是"/export",但同一个Controller中不能有相同的路径和方法签名的映射。所以在新的功能中,应该使用不同的路径,比如"/exportSurveyResponse"。
然后,检查工具类是否正确使用。第一个例子用了DynamicsExcelUtil来处理动态表头,而第二个用了普通的ExcelUtil。根据是否需要动态表头选择对应的工具类。
最后,测试导出功能是否正常,确保文件正确生成,表头和数据对应正确,避免空指针异常等常见问题。</think>根据您提供的两个导出功能代码,结合问卷答复详情导出需求,以下是分步骤实现方案:
一、代码结构分析
1. 现有代码特点:
- 使用`@Log`注解记录操作日志
- 两种导出模式:
* 动态表头导出(活动名单)
* 固定表头导出(通讯录)
- 使用`HttpServletResponse`直接响应
- 统一POST请求方式
二、问卷答复导出实现方案
1. Controller层实现
```java
@Log(title = "问卷答复", businessType = BusinessType.EXPORT)
@PostMapping("/exportResponse")
public void exportResponse(HttpServletResponse response, SurveyResponseDto responseDto) {
// 调用服务层获取导出数据
SurveyExcel surveyExcel = surveyService.exportResponses(responseDto);
// 动态表头处理(假设问卷问题会动态变化)
List<SurveyResponseExcel> excelList = surveyExcel.getDataList();
Map<String, List<String>> dynamicHeaders = surveyExcel.getHeaders();
// 使用动态导出工具类
DynamicsExcelUtil<SurveyResponseExcel> util = new DynamicsExcelUtil<>(SurveyResponseExcel.class);
util.exportExcel(
response,
excelList,
dynamicHeaders,
"问卷答复详情",
"问卷答复_" + LocalDate.now().toString()
);
}
```
2. Service层核心逻辑
```java
public SurveyExcel exportResponses(SurveyResponseDto dto) {
// 1. 获取基础数据
List<SurveyResponse> responses = surveyResponseMapper.selectByCriteria(dto);
// 2. 构建动态表头(示例结构)
Map<String, List<String>> headers = new LinkedHashMap<>();
headers.put("基础信息", Arrays.asList("用户ID", "提交时间", "提交渠道"));
headers.put("问题列表", generateQuestionHeaders(responses));
// 3. 转换Excel模型
List<SurveyResponseExcel> excelData = responses.stream()
.map(this::convertToExcelModel)
.collect(Collectors.toList());
return new SurveyExcel(excelData, headers);
}
// 动态生成问题表头
private List<String> generateQuestionHeaders(List<SurveyResponse> responses) {
return responses.stream()
.flatMap(r -> r.getQuestions().stream())
.map(Question::getTitle)
.distinct()
.collect(Collectors.toList());
}
```
3. Excel模型类示例
```java
public class SurveyResponseExcel {
// 固定字段
@ExcelProperty("用户ID")
private Long userId;
@ExcelProperty("提交时间")
private LocalDateTime submitTime;
// 动态字段容器
@ExcelIgnore
private Map<String, String> dynamicAnswers;
// 提供动态字段访问器
public String getAnswer(String questionId) {
return dynamicAnswers.get(questionId);
}
}
```
三、关键技术点说明
1. 动态表头处理
- 采用`LinkedHashMap`保持表头顺序
- 分组表头示例结构:
```text
| 基础信息 | 问题列表 |
|----------|-------------------|
| 用户ID | 问题1 | 问题2 | ... |
```
2. 数据转换策略
- 固定字段直接映射
- 动态答案使用`Map`存储
- 通过反射机制匹配动态表头
3. 性能优化建议
```java
// 批量查询优化示例
@Override
public List<SurveyResponse> selectByCriteria(SurveyResponseDto dto) {
// 使用MyBatis的<foreach>标签实现批量查询
return mapper.selectResponsesWithQuestions(dto);
}
```
四、扩展功能建议
1. 大文件处理
```java
// 分页分批处理示例
int pageSize = 1000;
for (int page = 1; ; page++) {
List<SurveyResponse> batch = queryBatch(page, pageSize);
if (batch.isEmpty()) break;
processBatch(batch);
}
```
2. 格式兼容处理
```java
// 处理特殊字符示例
public String sanitizeCellContent(String input) {
return input.replaceAll("[\t\r\n]", " "); // 替换制表符和换行
}
```
五、注意事项
1. 并发导出控制
```java
// 简单的并发限制示例
if(exportCounter.incrementAndGet() > MAX_CONCURRENT_EXPORT){
throw new BusinessException("同时导出操作过多,请稍后再试");
}
try {
// 导出逻辑
} finally {
exportCounter.decrementAndGet();
}
```
2. 安全防护
```java
// 校验导出权限示例
@PreAuthorize("hasPermission('survey:response:export')")
public void exportResponses(...) {
// 方法实现
}
```
3. 结果验证
```java
// 空数据校验示例
if (CollectionUtils.isEmpty(excelList)) {
throw new BusinessException("导出数据为空");
}
```
完整实现应包含以下扩展文件:
1. `SurveyResponseDto.java` 请求参数封装
2. `SurveyExcel.java` 导出数据容器
3. `SurveyResponseExcel.java` Excel映射模型
4. `SurveyResponseMapper.xml` 数据查询Mapper
建议根据具体业务需求调整动态表头的生成策略,如需支持复杂题型(如矩阵题),需扩展动态表头生成算法。
阅读全文
相关推荐
















