mcp-vue-codegen 1.2.1 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateMasterEntity = generateMasterEntity;
4
+ exports.generateDetailEntity = generateDetailEntity;
5
+ /** BaseEntity 已有的字段,不需要在子类中重复声明 */
6
+ const BASE_ENTITY_FIELDS = new Set([
7
+ 'version', 'createUserId', 'createUser', 'createPosId', 'createPos',
8
+ 'createDptId', 'createDpt', 'createOgnId', 'createOgn',
9
+ 'createPsmFullId', 'createPsmFullName', 'updatePsmFullId', 'updatePsmFullName',
10
+ 'createTime', 'updateTime'
11
+ ]);
12
+ /** 将 schema 的 dataType + 字段特征 映射为 Java 类型 */
13
+ function toJavaType(field) {
14
+ if (field.isPrimaryKey)
15
+ return 'Long';
16
+ if (field.isForeignKey)
17
+ return 'Long';
18
+ if (field.fieldName === 'tenantId')
19
+ return 'Long';
20
+ if (field.fieldName.endsWith('Id') && !field.dictCode)
21
+ return 'Long';
22
+ if (field.dataType === 'date')
23
+ return 'LocalDate';
24
+ if (field.dataType === 'datetime')
25
+ return 'LocalDateTime';
26
+ return 'String';
27
+ }
28
+ /** 获取需要导入的 Java 类型 */
29
+ function getImports(fields) {
30
+ const imports = new Set();
31
+ for (const f of fields) {
32
+ const jt = toJavaType(f);
33
+ if (jt === 'LocalDate')
34
+ imports.add('java.time.LocalDate');
35
+ if (jt === 'LocalDateTime')
36
+ imports.add('java.time.LocalDateTime');
37
+ }
38
+ return Array.from(imports).sort();
39
+ }
40
+ /** 是否有 @DateTimeFormat 注解 */
41
+ function needsDateTimeFormat(field) {
42
+ return field.dataType === 'date' && !!field.dateFormat;
43
+ }
44
+ /** 是否有 @Dict 注解 */
45
+ function needsDict(field) {
46
+ return !!field.dictCode && !!field.needFormatter;
47
+ }
48
+ /** 从 tableName 去掉模块前缀,如 oa_cert_borrow → cert_borrow */
49
+ function stripModulePrefix(tableName, moduleName) {
50
+ const prefix = moduleName + '_';
51
+ return tableName.startsWith(prefix) ? tableName.substring(prefix.length) : tableName;
52
+ }
53
+ /** 过滤掉 BaseEntity 已有的字段 */
54
+ function filterEntityFields(fields) {
55
+ return fields.filter(f => !BASE_ENTITY_FIELDS.has(f.fieldName));
56
+ }
57
+ // ========== Entity ==========
58
+ function generateMasterEntity(schema) {
59
+ const m = schema.module;
60
+ const master = schema.master;
61
+ const entityName = m.entityName;
62
+ const pkg = `com.worsoft.worsoft.${m.moduleName}.entity`;
63
+ const tableName = stripModulePrefix(master.tableName, m.moduleName);
64
+ const fields = filterEntityFields(master.fields);
65
+ const hasDetail = !!schema.detail;
66
+ const javaImports = getImports(fields);
67
+ const needsList = hasDetail;
68
+ const needsDict = fields.some(f => f.dictCode && f.needFormatter);
69
+ const needsDateFormat = fields.some(f => needsDateTimeFormat(f));
70
+ let importBlock = `import com.baomidou.mybatisplus.annotation.IdType;
71
+ import com.baomidou.mybatisplus.annotation.TableId;
72
+ import com.baomidou.mybatisplus.annotation.TableName;
73
+ import com.worsoft.worsoft.common.core.base.BaseEntity;
74
+ import io.swagger.v3.oas.annotations.media.Schema;
75
+ import lombok.Data;
76
+ import lombok.EqualsAndHashCode;\n`;
77
+ if (hasDetail) {
78
+ importBlock += `import com.baomidou.mybatisplus.annotation.TableField;\n`;
79
+ importBlock += `import java.util.List;\n`;
80
+ }
81
+ if (needsDict) {
82
+ importBlock += `import com.worsoft.worsoft.common.core.annotation.Dict;\n`;
83
+ }
84
+ if (needsDateFormat) {
85
+ importBlock += `import org.springframework.format.annotation.DateTimeFormat;\n`;
86
+ }
87
+ for (const imp of javaImports) {
88
+ importBlock += `import ${imp};\n`;
89
+ }
90
+ // 生成字段声明
91
+ const fieldDecls = fields.map(f => {
92
+ const javaType = toJavaType(f);
93
+ let annotations = '';
94
+ if (f.isPrimaryKey) {
95
+ annotations += ` @TableId(type = IdType.ASSIGN_ID)\n`;
96
+ }
97
+ annotations += ` @Schema(description = "${f.label}")`;
98
+ if (f.dictCode && f.needFormatter) {
99
+ annotations += `\n @Dict(value = "${f.dictCode}")`;
100
+ }
101
+ if (needsDateTimeFormat(f)) {
102
+ annotations += `\n @DateTimeFormat(pattern="${f.dateFormat}")`;
103
+ }
104
+ return `\n${annotations}\n private ${javaType} ${f.fieldName};`;
105
+ }).join('\n');
106
+ // 从表关联字段
107
+ const detailField = hasDetail ? `
108
+
109
+ /**
110
+ * ${schema.detail.detailTitle}
111
+ */
112
+ @TableField(exist = false)
113
+ @Schema(description = "${schema.detail.detailTitle}")
114
+ private List<${entityName}DetailEntity> ${schema.detail.detailListName};` : '';
115
+ return `/*
116
+ * Copyright (c) 2018-2025, worsoft All rights reserved.
117
+ */
118
+ package ${pkg};
119
+
120
+ ${importBlock}
121
+ /**
122
+ * ${m.businessName}
123
+ *
124
+ * @author codegen
125
+ */
126
+ @Data
127
+ @TableName("${tableName}")
128
+ @EqualsAndHashCode(callSuper = true)
129
+ @Schema(description = "${m.businessName}")
130
+ public class ${entityName}Entity extends BaseEntity<${entityName}Entity> {
131
+ ${fieldDecls}
132
+ ${detailField}
133
+
134
+ /**
135
+ * 行状态: 0=normal; -1=delete
136
+ */
137
+ @TableField(exist = false)
138
+ @Schema(description = "行状态.取值范围0:正常; -1:删除;")
139
+ private Integer rowStatus = 0;
140
+ }
141
+ `;
142
+ }
143
+ function generateDetailEntity(schema) {
144
+ if (!schema.detail)
145
+ return '';
146
+ const m = schema.module;
147
+ const detail = schema.detail;
148
+ const entityName = m.entityName;
149
+ const pkg = `com.worsoft.worsoft.${m.moduleName}.entity`;
150
+ const tableName = stripModulePrefix(detail.tableName, m.moduleName);
151
+ const fields = filterEntityFields(detail.fields);
152
+ const javaImports = getImports(fields);
153
+ const needsDateFormat = fields.some(f => needsDateTimeFormat(f));
154
+ let importBlock = `import com.baomidou.mybatisplus.annotation.IdType;
155
+ import com.baomidou.mybatisplus.annotation.TableField;
156
+ import com.baomidou.mybatisplus.annotation.TableId;
157
+ import com.baomidou.mybatisplus.annotation.TableName;
158
+ import com.worsoft.worsoft.common.core.base.BaseEntity;
159
+ import io.swagger.v3.oas.annotations.media.Schema;
160
+ import lombok.Data;
161
+ import lombok.EqualsAndHashCode;\n`;
162
+ if (needsDateFormat) {
163
+ importBlock += `import org.springframework.format.annotation.DateTimeFormat;\n`;
164
+ }
165
+ for (const imp of javaImports) {
166
+ importBlock += `import ${imp};\n`;
167
+ }
168
+ const fieldDecls = fields.map(f => {
169
+ const javaType = toJavaType(f);
170
+ let annotations = '';
171
+ if (f.isPrimaryKey) {
172
+ annotations += ` @TableId(type = IdType.ASSIGN_ID)\n`;
173
+ }
174
+ if (f.fieldName === 'tenantId') {
175
+ annotations += ` @Schema(description = "${f.label}", hidden = true)`;
176
+ }
177
+ else {
178
+ annotations += ` @Schema(description = "${f.label}")`;
179
+ }
180
+ if (needsDateTimeFormat(f)) {
181
+ annotations += `\n @DateTimeFormat(pattern="${f.dateFormat}")`;
182
+ }
183
+ return `\n${annotations}\n private ${javaType} ${f.fieldName};`;
184
+ }).join('\n');
185
+ return `/*
186
+ * Copyright (c) 2018-2025, worsoft All rights reserved.
187
+ */
188
+ package ${pkg};
189
+
190
+ ${importBlock}
191
+ /**
192
+ * ${detail.detailTitle}
193
+ *
194
+ * @author codegen
195
+ */
196
+ @Data
197
+ @TableName("${tableName}")
198
+ @EqualsAndHashCode(callSuper = true)
199
+ @Schema(description = "${detail.detailTitle}")
200
+ public class ${entityName}DetailEntity extends BaseEntity<${entityName}DetailEntity> {
201
+
202
+ private static final long serialVersionUID = 1L;
203
+ ${fieldDecls}
204
+
205
+ /**
206
+ * 行状态: 0=normal; -1=delete
207
+ */
208
+ @TableField(exist = false)
209
+ @Schema(description = "行状态.取值范围0:正常; -1:删除;")
210
+ private Integer rowStatus = 0;
211
+ }
212
+ `;
213
+ }
214
+ //# sourceMappingURL=entity.tpl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity.tpl.js","sourceRoot":"","sources":["../../../src/templates/backend/entity.tpl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { TableSchema } from '../../types/schema.js';
2
+ export declare function generateMasterMapper(schema: TableSchema): string;
3
+ export declare function generateDetailMapper(schema: TableSchema): string;
4
+ export declare function generateMasterMapperXml(schema: TableSchema): string;
5
+ export declare function generateDetailMapperXml(schema: TableSchema): string;
6
+ //# sourceMappingURL=mapper.tpl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapper.tpl.d.ts","sourceRoot":"","sources":["../../../src/templates/backend/mapper.tpl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAwBhE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAyBhE;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAWnE;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAYnE"}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateMasterMapper = generateMasterMapper;
4
+ exports.generateDetailMapper = generateDetailMapper;
5
+ exports.generateMasterMapperXml = generateMasterMapperXml;
6
+ exports.generateDetailMapperXml = generateDetailMapperXml;
7
+ function generateMasterMapper(schema) {
8
+ const m = schema.module;
9
+ const pkg = `com.worsoft.worsoft.${m.moduleName}.mapper`;
10
+ const entityPkg = `com.worsoft.worsoft.${m.moduleName}.entity`;
11
+ return `/*
12
+ * Copyright (c) 2018-2025, worsoft All rights reserved.
13
+ */
14
+ package ${pkg};
15
+
16
+ import com.worsoft.worsoft.common.data.datascope.WorsoftBaseMapper;
17
+ import ${entityPkg}.${m.entityName}Entity;
18
+ import org.apache.ibatis.annotations.Mapper;
19
+
20
+ /**
21
+ * ${m.businessName}
22
+ *
23
+ * @author codegen
24
+ */
25
+ @Mapper
26
+ public interface ${m.entityName}Mapper extends WorsoftBaseMapper<${m.entityName}Entity> {
27
+
28
+ }
29
+ `;
30
+ }
31
+ function generateDetailMapper(schema) {
32
+ if (!schema.detail)
33
+ return '';
34
+ const m = schema.module;
35
+ const pkg = `com.worsoft.worsoft.${m.moduleName}.mapper`;
36
+ const entityPkg = `com.worsoft.worsoft.${m.moduleName}.entity`;
37
+ return `/*
38
+ * Copyright (c) 2018-2025, worsoft All rights reserved.
39
+ */
40
+ package ${pkg};
41
+
42
+ import com.worsoft.worsoft.common.data.datascope.WorsoftBaseMapper;
43
+ import ${entityPkg}.${m.entityName}DetailEntity;
44
+ import org.apache.ibatis.annotations.Mapper;
45
+
46
+ /**
47
+ * ${schema.detail.detailTitle}
48
+ *
49
+ * @author codegen
50
+ */
51
+ @Mapper
52
+ public interface ${m.entityName}DetailMapper extends WorsoftBaseMapper<${m.entityName}DetailEntity> {
53
+
54
+ }
55
+ `;
56
+ }
57
+ function generateMasterMapperXml(schema) {
58
+ const m = schema.module;
59
+ const ns = `com.worsoft.worsoft.${m.moduleName}.mapper.${m.entityName}Mapper`;
60
+ return `<?xml version="1.0" encoding="UTF-8"?>
61
+ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
62
+
63
+ <mapper namespace="${ns}">
64
+
65
+ </mapper>
66
+ `;
67
+ }
68
+ function generateDetailMapperXml(schema) {
69
+ if (!schema.detail)
70
+ return '';
71
+ const m = schema.module;
72
+ const ns = `com.worsoft.worsoft.${m.moduleName}.mapper.${m.entityName}DetailMapper`;
73
+ return `<?xml version="1.0" encoding="UTF-8"?>
74
+ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
75
+
76
+ <mapper namespace="${ns}">
77
+
78
+ </mapper>
79
+ `;
80
+ }
81
+ //# sourceMappingURL=mapper.tpl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapper.tpl.js","sourceRoot":"","sources":["../../../src/templates/backend/mapper.tpl.ts"],"names":[],"mappings":";;AAEA,oDAwBC;AAED,oDAyBC;AAED,0DAWC;AAED,0DAYC;AA9ED,SAAgB,oBAAoB,CAAC,MAAmB;IACtD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,MAAM,GAAG,GAAG,uBAAuB,CAAC,CAAC,UAAU,SAAS,CAAC;IACzD,MAAM,SAAS,GAAG,uBAAuB,CAAC,CAAC,UAAU,SAAS,CAAC;IAE/D,OAAO;;;UAGC,GAAG;;;SAGJ,SAAS,IAAI,CAAC,CAAC,UAAU;;;;KAI7B,CAAC,CAAC,YAAY;;;;;mBAKA,CAAC,CAAC,UAAU,oCAAoC,CAAC,CAAC,UAAU;;;CAG9E,CAAC;AACF,CAAC;AAED,SAAgB,oBAAoB,CAAC,MAAmB;IACtD,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,MAAM,GAAG,GAAG,uBAAuB,CAAC,CAAC,UAAU,SAAS,CAAC;IACzD,MAAM,SAAS,GAAG,uBAAuB,CAAC,CAAC,UAAU,SAAS,CAAC;IAE/D,OAAO;;;UAGC,GAAG;;;SAGJ,SAAS,IAAI,CAAC,CAAC,UAAU;;;;KAI7B,MAAM,CAAC,MAAM,CAAC,WAAW;;;;;mBAKX,CAAC,CAAC,UAAU,0CAA0C,CAAC,CAAC,UAAU;;;CAGpF,CAAC;AACF,CAAC;AAED,SAAgB,uBAAuB,CAAC,MAAmB;IACzD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,MAAM,EAAE,GAAG,uBAAuB,CAAC,CAAC,UAAU,WAAW,CAAC,CAAC,UAAU,QAAQ,CAAC;IAE9E,OAAO;;;qBAGY,EAAE;;;CAGtB,CAAC;AACF,CAAC;AAED,SAAgB,uBAAuB,CAAC,MAAmB;IACzD,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,MAAM,EAAE,GAAG,uBAAuB,CAAC,CAAC,UAAU,WAAW,CAAC,CAAC,UAAU,cAAc,CAAC;IAEpF,OAAO;;;qBAGY,EAAE;;;CAGtB,CAAC;AACF,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { TableSchema } from '../../types/schema.js';
2
+ export declare function generateMasterService(schema: TableSchema): string;
3
+ export declare function generateDetailService(schema: TableSchema): string;
4
+ export declare function generateMasterServiceImpl(schema: TableSchema): string;
5
+ export declare function generateDetailServiceImpl(schema: TableSchema): string;
6
+ //# sourceMappingURL=service.tpl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.tpl.d.ts","sourceRoot":"","sources":["../../../src/templates/backend/service.tpl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAsBjE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAuBjE;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAmKrE;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CA4BrE"}
@@ -0,0 +1,246 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateMasterService = generateMasterService;
4
+ exports.generateDetailService = generateDetailService;
5
+ exports.generateMasterServiceImpl = generateMasterServiceImpl;
6
+ exports.generateDetailServiceImpl = generateDetailServiceImpl;
7
+ function generateMasterService(schema) {
8
+ const m = schema.module;
9
+ const pkg = `com.worsoft.worsoft.${m.moduleName}.service`;
10
+ const entityPkg = `com.worsoft.worsoft.${m.moduleName}.entity`;
11
+ return `/*
12
+ * Copyright (c) 2018-2025, worsoft All rights reserved.
13
+ */
14
+ package ${pkg};
15
+
16
+ import com.worsoft.worsoft.common.data.base.BaseService;
17
+ import ${entityPkg}.${m.entityName}Entity;
18
+
19
+ /**
20
+ * ${m.businessName}
21
+ *
22
+ * @author codegen
23
+ */
24
+ public interface ${m.entityName}Service extends BaseService<${m.entityName}Entity> {
25
+
26
+ }
27
+ `;
28
+ }
29
+ function generateDetailService(schema) {
30
+ if (!schema.detail)
31
+ return '';
32
+ const m = schema.module;
33
+ const pkg = `com.worsoft.worsoft.${m.moduleName}.service`;
34
+ const entityPkg = `com.worsoft.worsoft.${m.moduleName}.entity`;
35
+ return `/*
36
+ * Copyright (c) 2018-2025, worsoft All rights reserved.
37
+ */
38
+ package ${pkg};
39
+
40
+ import com.worsoft.worsoft.common.data.base.BaseService;
41
+ import ${entityPkg}.${m.entityName}DetailEntity;
42
+
43
+ /**
44
+ * ${schema.detail.detailTitle}
45
+ *
46
+ * @author codegen
47
+ */
48
+ public interface ${m.entityName}DetailService extends BaseService<${m.entityName}DetailEntity> {
49
+
50
+ }
51
+ `;
52
+ }
53
+ function generateMasterServiceImpl(schema) {
54
+ const m = schema.module;
55
+ const entity = m.entityName;
56
+ const hasDetail = !!schema.detail;
57
+ const hasWorkflow = m.hasWorkflow;
58
+ const pkg = `com.worsoft.worsoft.${m.moduleName}.service.impl`;
59
+ const basePkg = `com.worsoft.worsoft.${m.moduleName}`;
60
+ let imports = `import com.worsoft.worsoft.common.data.base.BaseServiceImpl;
61
+ import ${basePkg}.entity.${entity}Entity;
62
+ import ${basePkg}.mapper.${entity}Mapper;
63
+ import ${basePkg}.service.${entity}Service;
64
+ import org.springframework.stereotype.Service;`;
65
+ if (hasDetail) {
66
+ const detail = schema.detail;
67
+ imports += `
68
+ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
69
+ import ${basePkg}.entity.${entity}DetailEntity;
70
+ import ${basePkg}.mapper.${entity}DetailMapper;
71
+ import org.springframework.beans.factory.annotation.Autowired;
72
+ import org.springframework.transaction.annotation.Transactional;
73
+ import java.io.Serializable;
74
+ import java.util.Collection;
75
+ import java.util.List;`;
76
+ }
77
+ if (hasWorkflow) {
78
+ imports += `
79
+ import cn.hutool.core.util.StrUtil;
80
+ import com.worsoft.worsoft.common.core.constant.enums.BillState;
81
+ import com.worsoft.worsoft.admin.feign.RemoteBillNumberService;
82
+ import java.time.LocalDateTime;`;
83
+ }
84
+ // 生成类体
85
+ let classBody = '';
86
+ if (hasDetail) {
87
+ const detail = schema.detail;
88
+ const detailListName = detail.detailListName;
89
+ const detailFkField = detail.detailFkField;
90
+ classBody += `
91
+ @Autowired
92
+ private ${entity}DetailMapper ${lowerFirst(entity)}DetailMapper;
93
+ `;
94
+ if (hasWorkflow) {
95
+ classBody += `
96
+ @Autowired
97
+ private RemoteBillNumberService remoteBillNumberService;
98
+ `;
99
+ }
100
+ // save
101
+ classBody += `
102
+ /**
103
+ * 新增${m.businessName}(含从表)
104
+ */
105
+ @Transactional(rollbackFor = Exception.class)
106
+ @Override
107
+ public boolean save(${entity}Entity entity) {
108
+ boolean result = super.save(entity);
109
+ this.saveDetails(entity);${hasWorkflow ? `
110
+ if (StrUtil.equals(BillState.FINISHED.getStatus(), entity.getBillStateId())) {
111
+ this.processCompleted(entity.getId());
112
+ }` : ''}
113
+ return result;
114
+ }
115
+
116
+ /**
117
+ * 修改${m.businessName}(含从表)
118
+ */
119
+ @Transactional(rollbackFor = Exception.class)
120
+ @Override
121
+ public boolean updateAllColumnById(${entity}Entity entity) {
122
+ boolean result = super.updateAllColumnById(entity);
123
+ ${lowerFirst(entity)}DetailMapper.delete(new QueryWrapper<${entity}DetailEntity>().eq("${toSnakeCase(detailFkField)}", entity.getId()));
124
+ this.saveDetails(entity);${hasWorkflow ? `
125
+ if (StrUtil.equals(BillState.FINISHED.getStatus(), entity.getBillStateId())) {
126
+ this.processCompleted(entity.getId());
127
+ }` : ''}
128
+ return result;
129
+ }
130
+
131
+ /**
132
+ * 查询${m.businessName}(含从表)
133
+ */
134
+ @Override
135
+ public ${entity}Entity getById(Serializable id) {
136
+ ${entity}Entity result = super.getById(id);
137
+ List<${entity}DetailEntity> details = ${lowerFirst(entity)}DetailMapper.selectList(new QueryWrapper<${entity}DetailEntity>().eq("${toSnakeCase(detailFkField)}", id));
138
+ result.set${upperFirst(detailListName)}(details);
139
+ return result;
140
+ }
141
+
142
+ /**
143
+ * 删除${m.businessName}(级联删除从表)
144
+ */
145
+ @Transactional(rollbackFor = Exception.class)
146
+ @Override
147
+ public boolean removeByIds(Collection idList) {
148
+ ${entity}DetailEntity detail = new ${entity}DetailEntity();
149
+ detail.delete(new QueryWrapper<${entity}DetailEntity>().in("${toSnakeCase(detailFkField)}", idList));
150
+ return super.removeByIds(idList);
151
+ }
152
+
153
+ /**
154
+ * 保存从表明细
155
+ */
156
+ private void saveDetails(${entity}Entity entity) {
157
+ List<${entity}DetailEntity> list = entity.get${upperFirst(detailListName)}();
158
+ if (list != null) {
159
+ for (${entity}DetailEntity detail : list) {
160
+ detail.set${upperFirst(detailFkField)}(entity.getId());
161
+ detail.insert();
162
+ }
163
+ }
164
+ }`;
165
+ }
166
+ else if (hasWorkflow) {
167
+ classBody += `
168
+ @Autowired
169
+ private RemoteBillNumberService remoteBillNumberService;
170
+ `;
171
+ }
172
+ // processCompleted (workflow)
173
+ if (hasWorkflow) {
174
+ classBody += `
175
+
176
+ /**
177
+ * 流程完成回调
178
+ */
179
+ @Override
180
+ @Transactional(rollbackFor = Exception.class)
181
+ public void processCompleted(Long businessId) {
182
+ ${entity}Entity entity = this.getById(businessId);
183
+ super.processCompleted(entity);
184
+ entity.setBillStateId(BillState.FINISHED.getStatus());
185
+ entity.setBillCode(remoteBillNumberService.getBillCode());
186
+ entity.setFinishedTime(LocalDateTime.now());
187
+ baseMapper.updateById(entity);
188
+ }`;
189
+ }
190
+ return `/*
191
+ * Copyright (c) 2018-2025, worsoft All rights reserved.
192
+ */
193
+ package ${pkg};
194
+
195
+ ${imports}
196
+
197
+ /**
198
+ * ${m.businessName} ServiceImpl
199
+ *
200
+ * @author codegen
201
+ */
202
+ @Service
203
+ public class ${entity}ServiceImpl extends BaseServiceImpl<${entity}Mapper, ${entity}Entity> implements ${entity}Service {
204
+ ${classBody}
205
+ }
206
+ `;
207
+ }
208
+ function generateDetailServiceImpl(schema) {
209
+ if (!schema.detail)
210
+ return '';
211
+ const m = schema.module;
212
+ const entity = m.entityName;
213
+ const pkg = `com.worsoft.worsoft.${m.moduleName}.service.impl`;
214
+ const basePkg = `com.worsoft.worsoft.${m.moduleName}`;
215
+ return `/*
216
+ * Copyright (c) 2018-2025, worsoft All rights reserved.
217
+ */
218
+ package ${pkg};
219
+
220
+ import com.worsoft.worsoft.common.data.base.BaseServiceImpl;
221
+ import ${basePkg}.entity.${entity}DetailEntity;
222
+ import ${basePkg}.mapper.${entity}DetailMapper;
223
+ import ${basePkg}.service.${entity}DetailService;
224
+ import org.springframework.stereotype.Service;
225
+
226
+ /**
227
+ * ${schema.detail.detailTitle}
228
+ *
229
+ * @author codegen
230
+ */
231
+ @Service
232
+ public class ${entity}DetailServiceImpl extends BaseServiceImpl<${entity}DetailMapper, ${entity}DetailEntity> implements ${entity}DetailService {
233
+
234
+ }
235
+ `;
236
+ }
237
+ function lowerFirst(s) {
238
+ return s.charAt(0).toLowerCase() + s.slice(1);
239
+ }
240
+ function upperFirst(s) {
241
+ return s.charAt(0).toUpperCase() + s.slice(1);
242
+ }
243
+ function toSnakeCase(s) {
244
+ return s.replace(/([A-Z])/g, '_$1').toLowerCase();
245
+ }
246
+ //# sourceMappingURL=service.tpl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.tpl.js","sourceRoot":"","sources":["../../../src/templates/backend/service.tpl.ts"],"names":[],"mappings":"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"}