Browse Source

基本完成,开始公测

master
hejl 3 weeks ago
parent
commit
265925af99
  1. 4
      win_text_editor/.vscode/settings.json
  2. 97
      win_text_editor/assets/config/uft_macro_list.yaml
  3. 2
      win_text_editor/lib/modules/call_function/models/call_function.dart
  4. 5
      win_text_editor/lib/modules/call_function/services/call_function_service.dart
  5. 35
      win_text_editor/lib/modules/code_creater/controllers/code_creater_controller.dart
  6. 290
      win_text_editor/lib/modules/code_creater/services/code_create_service.dart
  7. 4
      win_text_editor/lib/modules/code_creater/widgets/code_creater_view.dart
  8. 2
      win_text_editor/lib/modules/code_creater/widgets/node_table.dart
  9. 3
      win_text_editor/lib/modules/uft_component/services/uft_component_service.dart

4
win_text_editor/.vscode/settings.json vendored

@ -1 +1,3 @@
{} {
"cmake.sourceDirectory": "D:/aigc/manta/win_text_editor/linux"
}

97
win_text_editor/assets/config/uft_macro_list.yaml

@ -19,6 +19,15 @@ templates:
} }
获取记录_ALL:
body: |
[获取记录][{{tableName}}({{keyName}})][
{{#keyFields}}
{{name}} = @{{name}}{{^isLast}}, {{/isLast}}
{{/keyFields}}
][]
获取记录数: 获取记录数:
body: "[获取记录数][{{tableName}}][@count]" body: "[获取记录数][{{tableName}}][@count]"
@ -36,7 +45,7 @@ templates:
[获取记录][{{tableName}}({{keyName}})][ [获取记录][{{tableName}}({{keyName}})][
{{#keyFields}} {{#keyFields}}
{{name}} = @{{name}} {{^isLast}}, {{/isLast}} {{name}} = @{{#partnerName}}{{partnerName}}.{{/partnerName}}{{name}} {{^isLast}}, {{/isLast}}
{{/keyFields}} {{/keyFields}}
] ]
@ -48,7 +57,7 @@ templates:
<F>[修改索引字段][{{tableName}}][ <F>[修改索引字段][{{tableName}}][
{{#keyFields}} {{#keyFields}}
{{name}} = @{{name}}{{^isLast}}, {{/isLast}} {{name}} = @{{#partnerName}}{{partnerName}}.{{/partnerName}}{{name}}{{^isLast}}, {{/isLast}}
{{/keyFields}} {{/keyFields}}
] ]
} }
@ -105,6 +114,23 @@ templates:
} }
[遍历记录结束] [遍历记录结束]
遍历记录_ALL:
body: |
[遍历记录开始][{{tableName}}({{selectIndexOrKey.name}})][
{{#selectIndexOrKey.fields}}
{{name}} = @{{name}}{{^isLast}}, {{/isLast}}
{{/selectIndexOrKey.fields}}
][
{{#selectedFields}}
{{name}} = @{{name}}{{^isLast}}, {{/isLast}}
{{/selectedFields}}
]
遍历记录结束_ALL:
body: |
[遍历记录结束]
插入组件: 插入组件:
body: | body: |
[插入组件][{{name}}][0][ [插入组件][{{name}}][0][
@ -136,6 +162,17 @@ templates:
{{/selectedFields}} {{/selectedFields}}
] ]
获取组件_ALL:
body: |
{{#hasIndex}}[组件排序][{{name}}(index.name)]{{/hasIndex}}
[获取组件][{{name}}{{#hasIndex}}({{index.name}}){{/hasIndex}}][{{^hasIndex}}[@num][{{/hasIndex}}
{{#hasIndex}}
{{#index.fields}}
{{name}} = @{{name}}{{^isLast}}, {{/isLast}}
{{/index.fields}}
][
{{/hasIndex}}]
遍历组件: 遍历组件:
body: | body: |
{{#hasIndex}}[组件排序][{{name}}({{index.name}})]{{/hasIndex}} {{#hasIndex}}[组件排序][{{name}}({{index.name}})]{{/hasIndex}}
@ -153,7 +190,7 @@ templates:
{ {
} }
"[遍历组件结束]" [遍历组件结束]
组件大小: 组件大小:
body: "[组件大小][{{name}}][@num]" body: "[组件大小][{{name}}][@num]"
@ -166,7 +203,7 @@ templates:
{{/fields}} {{/fields}}
] ]
遍历组件所有: 遍历组件_ALL:
body: | body: |
{{#hasIndex}}[组件排序][{{name}}({{index.name}})]{{/hasIndex}} {{#hasIndex}}[组件排序][{{name}}({{index.name}})]{{/hasIndex}}
[遍历组件开始][{{name}}{{#hasIndex}}({{index.name}}){{/hasIndex}}][ [遍历组件开始][{{name}}{{#hasIndex}}({{index.name}}){{/hasIndex}}][
@ -175,19 +212,16 @@ templates:
{{name}} = @{{name}} {{^isLast}}, {{/isLast}} {{name}} = @{{name}} {{^isLast}}, {{/isLast}}
{{/index.fields}} {{/index.fields}}
{{/hasIndex}} {{/hasIndex}}
][
{{#fields}}
{{name}} = @{{name}}{{^isLast}}, {{/isLast}}
{{/fields}}
] ]
{
}
"[遍历组件结束]"
普通调用: 遍历组件结束_ALL:
body: | body: |
<Z>[{{chineseName}}][ [遍历组件结束]
普通调用_ALL:
body: |
[{{chineseName}}][
{{#input}} {{#input}}
{{name}} = @{{#partnerName}}{{partnerName}}.{{/partnerName}}{{name}}{{^isLast}},{{/isLast}} {{name}} = @{{#partnerName}}{{partnerName}}.{{/partnerName}}{{name}}{{^isLast}},{{/isLast}}
{{/input}} {{/input}}
@ -196,6 +230,19 @@ templates:
{{name}} = @{{name}}{{^isLast}},{{/isLast}} {{name}} = @{{name}}{{^isLast}},{{/isLast}}
{{/output}} {{/output}}
] ]
普通调用:
body: |
<Z>[{{chineseName}}][
{{#selectedInput}}
{{name}} = @{{#partnerName}}{{partnerName}}.{{/partnerName}}{{name}}{{^isLast}},{{/isLast}}
{{/selectedInput}}
][
{{#selectedOutput}}
{{name}} = @{{name}}{{^isLast}},{{/isLast}}
{{/selectedOutput}}
]
[处理失败] [处理失败]
{ {
[错误信息获取] [错误信息获取]
@ -209,6 +256,30 @@ templates:
} }
事务调用: 事务调用:
body: |
[事务处理开始]
<Z>[{{chineseName}}][
{{#selectedInput}}
{{name}} = @{{#partnerName}}{{partnerName}}.{{/partnerName}}{{name}}{{^isLast}},{{/isLast}}
{{/selectedInput}}
][
{{#selectedOutput}}
{{name}} = @{{name}}{{^isLast}},{{/isLast}}
{{/selectedOutput}}
]
[处理失败]
{
[错误信息获取]
//TODO:处理异常
[事务回滚]
[继续执行]
}
else
{
[事务处理结束]
}
事务调用_ALL:
body: | body: |
[事务处理开始] [事务处理开始]
<Z>[{{chineseName}}][ <Z>[{{chineseName}}][

2
win_text_editor/lib/modules/call_function/models/call_function.dart

@ -10,6 +10,7 @@ class CallFunction {
final List<Field> inputParameters; final List<Field> inputParameters;
final List<Field> outputParameters; final List<Field> outputParameters;
List<UftComponent>? componentList; List<UftComponent>? componentList;
List<UftComponent>? outComponentList;
String? factorParam; String? factorParam;
final List<CodePartner> codePartners = []; final List<CodePartner> codePartners = [];
@ -20,6 +21,7 @@ class CallFunction {
required this.inputParameters, required this.inputParameters,
required this.outputParameters, required this.outputParameters,
this.componentList, this.componentList,
this.outComponentList,
this.factorParam, this.factorParam,
}); });

5
win_text_editor/lib/modules/call_function/services/call_function_service.dart

@ -50,6 +50,8 @@ class CallFunctionService {
List<UftComponent> componentList = []; List<UftComponent> componentList = [];
List<UftComponent> outComponentList = [];
// 5. Process inputParameters (fields) // 5. Process inputParameters (fields)
final inputParameters = document.findAllElements( final inputParameters = document.findAllElements(
extendFileName == "uftfactorservice" ? 'internalParams' : 'inputParameters', extendFileName == "uftfactorservice" ? 'internalParams' : 'inputParameters',
@ -65,7 +67,7 @@ class CallFunctionService {
// 6. Process outputParameters // 6. Process outputParameters
final outputParameters = document.findAllElements('outputParameters'); final outputParameters = document.findAllElements('outputParameters');
final outputFields = await parserFields(filePath, outputParameters, componentList); final outputFields = await parserFields(filePath, outputParameters, outComponentList);
return CallFunction( return CallFunction(
functionType: extendFileName, functionType: extendFileName,
@ -74,6 +76,7 @@ class CallFunctionService {
inputParameters: inputFields, inputParameters: inputFields,
outputParameters: outputFields, outputParameters: outputFields,
componentList: componentList, componentList: componentList,
outComponentList: outComponentList,
factorParam: factorParam, factorParam: factorParam,
); );
} on xml.XmlParserException catch (e) { } on xml.XmlParserException catch (e) {

35
win_text_editor/lib/modules/code_creater/controllers/code_creater_controller.dart

@ -43,7 +43,16 @@ class CodeCreaterController extends BaseContentController {
return; return;
} }
if (members.contains(node)) {
Logger().error('不支持重复节点: ${node.title}');
return;
}
//
node.selectedAction = CodeCreateService.getNodeActions(node.name)[0];
members.add(node); members.add(node);
notifyListeners(); notifyListeners();
} }
@ -52,7 +61,31 @@ class CodeCreaterController extends BaseContentController {
} }
void handleActionTypeChange(int index, String newAction) { void handleActionTypeChange(int index, String newAction) {
members[index].selectedAction = newAction; final memberName = members[index].name;
if (newAction == "遍历记录") {
members.add(
OutlineNode(
name: '${members[index].name}_END',
title: members[index].title,
value: '${members[index].value}_END',
selectedAction: "遍历记录结束",
),
);
} else if (newAction == "遍历组件") {
members.add(
OutlineNode(
name: '${members[index].name}_END',
title: members[index].title,
value: '${members[index].value}_END',
selectedAction: "遍历组件结束",
),
);
} else {
members.removeWhere((member) => member.name == '${memberName}_END');
}
// members[index].selectedAction = newAction;
notifyListeners(); notifyListeners();
} }
} }

290
win_text_editor/lib/modules/code_creater/services/code_create_service.dart

@ -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();
}
}

4
win_text_editor/lib/modules/code_creater/widgets/code_creater_view.dart

@ -135,6 +135,10 @@ class _CodeCreaterViewState extends State<CodeCreaterView> {
void _deleteMember(int index) { void _deleteMember(int index) {
setState(() { setState(() {
final memberName = _controller.members[index].name;
//
_controller.members.removeWhere((member) => member.name == '${memberName}_END');
_controller.members.removeAt(index); _controller.members.removeAt(index);
_updateDisplay(); _updateDisplay();
}); });

2
win_text_editor/lib/modules/code_creater/widgets/node_table.dart

@ -202,7 +202,7 @@ class NodeTableState extends State<NodeTable> {
MyPlutoColumn( MyPlutoColumn(
title: '成员', title: '成员',
field: 'content', field: 'content',
width: 300, width: 200,
enableRowChecked: false, // enableRowChecked: false, //
), ),
MyPlutoDropdownColumn( MyPlutoDropdownColumn(

3
win_text_editor/lib/modules/uft_component/services/uft_component_service.dart

@ -17,7 +17,8 @@ class UftComponentService {
static Future<UftComponent?> getUftComponent(String filePath, String componentName) async { static Future<UftComponent?> getUftComponent(String filePath, String componentName) async {
if (_components.isNotEmpty) { if (_components.isNotEmpty) {
return _components.firstWhereOrNull((c) => c.name == componentName); final com = _components.firstWhereOrNull((c) => c.name == componentName);
if (com != null) return com;
} }
return parseComponentFile( return parseComponentFile(
filePath, filePath,

Loading…
Cancel
Save