9 changed files with 426 additions and 20 deletions
@ -1 +1,3 @@ |
|||||||
{} |
{ |
||||||
|
"cmake.sourceDirectory": "D:/aigc/manta/win_text_editor/linux" |
||||||
|
} |
@ -0,0 +1,290 @@ |
|||||||
|
import 'package:flutter/material.dart'; |
||||||
|
import 'package:win_text_editor/framework/common/constants.dart'; |
||||||
|
import 'package:win_text_editor/framework/services/macro_template_service.dart'; |
||||||
|
import 'package:win_text_editor/modules/call_function/models/call_function.dart'; |
||||||
|
import 'package:win_text_editor/modules/call_function/services/call_function_service.dart'; |
||||||
|
import 'package:win_text_editor/modules/memory_table/models/memory_table.dart'; |
||||||
|
import 'package:win_text_editor/modules/memory_table/services/memory_table_service.dart'; |
||||||
|
import 'package:win_text_editor/modules/outline/models/code_partner.dart'; |
||||||
|
import 'package:win_text_editor/modules/outline/models/outline_node.dart'; |
||||||
|
import 'package:win_text_editor/modules/uft_component/models/uft_component.dart'; |
||||||
|
import 'package:win_text_editor/modules/uft_component/services/uft_component_service.dart'; |
||||||
|
|
||||||
|
class CodeCreateService { |
||||||
|
static List<String> getNodeActions(String type) { |
||||||
|
switch (type) { |
||||||
|
case Constants.atomFunction: |
||||||
|
case Constants.atomService: |
||||||
|
case Constants.business: |
||||||
|
return ['普通调用', '事务调用']; |
||||||
|
case Constants.uftTable: |
||||||
|
return ['获取记录', '遍历记录', '插入记录', '修改记录', '删除记录']; |
||||||
|
case Constants.component: |
||||||
|
return ['获取组件', '遍历组件', '插入组件', '修改组件', '尾部插入组件']; |
||||||
|
case "${Constants.component}_END": |
||||||
|
return ['遍历组件结束']; |
||||||
|
case "${Constants.uftTable}_END": |
||||||
|
return ['遍历记录结束']; |
||||||
|
default: |
||||||
|
return ['']; // 确保返回非空列表 |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
static final MacroTemplateService templateService = MacroTemplateService(); |
||||||
|
|
||||||
|
static void initTemplateService() { |
||||||
|
if (!templateService.inited) { |
||||||
|
templateService.init(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
static Future<String> genCodeString(List<OutlineNode> members, String selectedOperation) async { |
||||||
|
initTemplateService(); |
||||||
|
|
||||||
|
//遍历members,获取每个节点的value |
||||||
|
StringBuffer codeBuffer = StringBuffer("//生成$selectedOperation代码\n\n"); |
||||||
|
|
||||||
|
List<String> inputFields = []; //各个节点入参字段名 |
||||||
|
List<String> outputFields = []; //各个节点出参字段名 |
||||||
|
List<String> macroCodeList = []; //各个节点生成代码 |
||||||
|
List<CodePartner> beforePartner = []; //前序参数伙伴 |
||||||
|
Map<String, List<String>> iterateOutputFields = {}; //遍历出参字段-不能在遍历外部使用 |
||||||
|
Map<String, List<CodePartner>> iteratePartnerMap = {}; //遍历出参伙伴 |
||||||
|
List<String> iterateStack = []; //遍历栈 |
||||||
|
|
||||||
|
//处理关系 |
||||||
|
Future<void> parseRelationShips(List<OutlineNode> nodes, String selectedOperation) async { |
||||||
|
for (int i = 0; i < members.length; i++) { |
||||||
|
final member = members[i]; |
||||||
|
final action = |
||||||
|
member.selectedAction!.isEmpty |
||||||
|
? getNodeActions(member.value)[0] |
||||||
|
: member.selectedAction; |
||||||
|
|
||||||
|
//遍历结束特殊处理 |
||||||
|
if (action!.startsWith("遍历") && action.endsWith("结束")) { |
||||||
|
//将当前遍历块内变量清除 |
||||||
|
final memberName = iterateStack.removeLast(); |
||||||
|
debugPrint('删除遍历块:$memberName'); |
||||||
|
iterateOutputFields.remove(memberName); |
||||||
|
iteratePartnerMap.remove(memberName); |
||||||
|
|
||||||
|
final macroCode = templateService.renderTemplate([action], {}, selectAll: true); |
||||||
|
macroCodeList.add(macroCode); |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
switch (member.value) { |
||||||
|
case Constants.atomFunction: |
||||||
|
case Constants.atomService: |
||||||
|
case Constants.business: |
||||||
|
CallFunction model = await CallFunctionService.parseXmlFile(member.path!); |
||||||
|
model.codePartners.clear(); //清除原有的伙伴 |
||||||
|
|
||||||
|
//将不包含在全局出参中入参加入全局入参中 |
||||||
|
inputFields.addAll( |
||||||
|
model.inputParameters |
||||||
|
.where( |
||||||
|
(field) => |
||||||
|
!outputFields.contains(field.name) && |
||||||
|
!inputFields.contains(field.name) && |
||||||
|
!iterateOutputFields.values.expand((list) => list).contains(field.name), |
||||||
|
) |
||||||
|
.map((field) => field.name), |
||||||
|
); |
||||||
|
|
||||||
|
//全局前序伙伴加入到节点中 |
||||||
|
model.codePartners.addAll(beforePartner.toSet()); |
||||||
|
|
||||||
|
//遍历作用域前序伙伴加入到节点中 |
||||||
|
model.codePartners.addAll( |
||||||
|
iteratePartnerMap.values.expand((partners) => partners).toList(), |
||||||
|
); |
||||||
|
|
||||||
|
//将出参加入作用域出参列表中 |
||||||
|
if (iterateStack.isNotEmpty) { |
||||||
|
//仍在遍历块内,加入最近遍历块中 |
||||||
|
iterateOutputFields |
||||||
|
.putIfAbsent(iterateStack.last, () => []) |
||||||
|
.addAll(model.outputParameters.map((field) => field.name).toSet()); |
||||||
|
|
||||||
|
//出参组件处理:将出参组件加入遍历块的出参列表和伙伴列表中 |
||||||
|
for (UftComponent component in model.outComponentList!) { |
||||||
|
List<String> fieldNames = []; |
||||||
|
for (var field in component.fields) { |
||||||
|
fieldNames.add(field.name); |
||||||
|
} |
||||||
|
iterateOutputFields |
||||||
|
.putIfAbsent(iterateStack.last, () => []) |
||||||
|
.addAll(component.fields.map((field) => field.name).toSet()); |
||||||
|
iteratePartnerMap |
||||||
|
.putIfAbsent(component.name, () => []) |
||||||
|
.add(CodePartner(name: component.name, fields: fieldNames)); |
||||||
|
} |
||||||
|
} else { |
||||||
|
//加入全局出参中 |
||||||
|
outputFields.addAll( |
||||||
|
model.outputParameters |
||||||
|
.where((field) => !outputFields.contains(field.name)) |
||||||
|
.map((field) => field.name), |
||||||
|
); |
||||||
|
|
||||||
|
//出参组件处理 |
||||||
|
for (UftComponent component in model.outComponentList!) { |
||||||
|
List<String> fieldNames = component.fields.map((col) => col.name).toList(); |
||||||
|
outputFields.addAll(fieldNames.toSet()); |
||||||
|
beforePartner.add(CodePartner(name: member.name, fields: fieldNames)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
final macroCode = templateService.renderTemplate( |
||||||
|
[action], |
||||||
|
model.toMap(), |
||||||
|
selectAll: true, |
||||||
|
); |
||||||
|
macroCodeList.add(macroCode); |
||||||
|
|
||||||
|
break; |
||||||
|
case Constants.uftTable: |
||||||
|
TableData tableData = await MemoryTableService.parseStructureFile(member.path!); |
||||||
|
|
||||||
|
final memoryTable = MemoryTable( |
||||||
|
tableName: tableData.tableName, |
||||||
|
columns: tableData.fields, |
||||||
|
indexes: tableData.indexes, |
||||||
|
); |
||||||
|
|
||||||
|
memoryTable.codePartners.clear(); |
||||||
|
|
||||||
|
//全局前序伙伴加入到节点中 |
||||||
|
memoryTable.codePartners.addAll(beforePartner.toSet()); |
||||||
|
|
||||||
|
//遍历作用域前序伙伴加入到节点中 |
||||||
|
memoryTable.codePartners.addAll( |
||||||
|
iteratePartnerMap.values.expand((partners) => partners).toList(), |
||||||
|
); |
||||||
|
|
||||||
|
List<String> fieldNames = memoryTable.columns.map((col) => col.name).toList(); |
||||||
|
|
||||||
|
switch (action) { |
||||||
|
case '获取记录': |
||||||
|
for (var fieldName in memoryTable.keyFields) { |
||||||
|
if (!outputFields.contains(fieldName) && |
||||||
|
!inputFields.contains(fieldName) && |
||||||
|
!iterateOutputFields.values.expand((list) => list).contains(fieldName)) { |
||||||
|
inputFields.add(fieldName); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (iterateStack.isNotEmpty) { |
||||||
|
//仍在遍历块内,加入最近遍历块中 |
||||||
|
iterateOutputFields.putIfAbsent(iterateStack.last, () => []).addAll(fieldNames); |
||||||
|
iteratePartnerMap |
||||||
|
.putIfAbsent(member.name, () => []) |
||||||
|
.add(CodePartner(name: member.name, fields: fieldNames)); |
||||||
|
} else { |
||||||
|
//加入全局出参中 |
||||||
|
outputFields.addAll(fieldNames); |
||||||
|
beforePartner.add(CodePartner(name: member.name, fields: fieldNames)); |
||||||
|
} |
||||||
|
break; |
||||||
|
case '遍历记录': |
||||||
|
List<String> fieldNames = memoryTable.columns.map((col) => col.name).toList(); |
||||||
|
iterateStack.add(memoryTable.tableName); //入栈 |
||||||
|
|
||||||
|
//仍在遍历块内,加入最近遍历块中 |
||||||
|
iterateOutputFields.putIfAbsent(iterateStack.last, () => []).addAll(fieldNames); |
||||||
|
iteratePartnerMap |
||||||
|
.putIfAbsent(member.name, () => []) |
||||||
|
.add(CodePartner(name: member.name, fields: fieldNames)); |
||||||
|
|
||||||
|
break; |
||||||
|
case '插入记录': |
||||||
|
case '修改记录': |
||||||
|
case '删除记录': |
||||||
|
for (var fieldName in memoryTable.keyFields) { |
||||||
|
if (!outputFields.contains(fieldName) && |
||||||
|
!inputFields.contains(fieldName) && |
||||||
|
!iterateOutputFields.values.expand((list) => list).contains(fieldName)) { |
||||||
|
inputFields.add(fieldName); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
final macroCode = templateService.renderTemplate( |
||||||
|
[action!], |
||||||
|
memoryTable.toMap(), |
||||||
|
selectAll: true, |
||||||
|
); |
||||||
|
macroCodeList.add(macroCode); |
||||||
|
break; |
||||||
|
case Constants.component: |
||||||
|
final component = await UftComponentService.getUftComponent(member.path!, member.name); |
||||||
|
component!.codePartners.clear(); |
||||||
|
|
||||||
|
component.codePartners.addAll(beforePartner); |
||||||
|
component.codePartners.addAll( |
||||||
|
iteratePartnerMap.values.expand((partners) => partners).toList(), |
||||||
|
); |
||||||
|
|
||||||
|
switch (action) { |
||||||
|
case "获取组件": |
||||||
|
case "遍历组件": |
||||||
|
List<String> fieldNames = component.fields.map((col) => col.name).toList(); |
||||||
|
|
||||||
|
//将出参加入作用域出参列表中 |
||||||
|
if (iterateStack.isNotEmpty) { |
||||||
|
//仍在遍历块内,加入最近遍历块中 |
||||||
|
iterateOutputFields.putIfAbsent(iterateStack.last, () => []).addAll(fieldNames); |
||||||
|
iteratePartnerMap |
||||||
|
.putIfAbsent(member.name, () => []) |
||||||
|
.add(CodePartner(name: member.name, fields: fieldNames)); |
||||||
|
} else { |
||||||
|
//加入全局出参中 |
||||||
|
outputFields.addAll(fieldNames); |
||||||
|
beforePartner.add(CodePartner(name: member.name, fields: fieldNames)); |
||||||
|
} |
||||||
|
|
||||||
|
iterateStack.add(component.name); //入栈 |
||||||
|
break; |
||||||
|
|
||||||
|
default: |
||||||
|
for (var field in component.fields) { |
||||||
|
if (!outputFields.contains(field.name) && |
||||||
|
!inputFields.contains(field.name) && |
||||||
|
!iterateOutputFields.values.expand((list) => list).contains(field.name)) { |
||||||
|
inputFields.add(field.name); |
||||||
|
} |
||||||
|
} |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
final macroCode = templateService.renderTemplate( |
||||||
|
[action], |
||||||
|
component.toMap(), |
||||||
|
selectAll: true, |
||||||
|
); |
||||||
|
macroCodeList.add(macroCode); |
||||||
|
break; |
||||||
|
default: |
||||||
|
macroCodeList.add('//未知类型: ${member.name}'); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
await parseRelationShips(members, selectedOperation); |
||||||
|
|
||||||
|
codeBuffer.writeln("//可能需要传入的参数"); |
||||||
|
for (var field in inputFields) { |
||||||
|
codeBuffer.writeln('@$field = ,'); |
||||||
|
} |
||||||
|
codeBuffer.writeln(''); |
||||||
|
|
||||||
|
for (final mc in macroCodeList) { |
||||||
|
codeBuffer.write(mc); |
||||||
|
} |
||||||
|
return codeBuffer.toString(); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue