package com.qianwen.smartman.modules.develop.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.generator.AutoGenerator; import com.baomidou.mybatisplus.generator.config.DataSourceConfig; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import javax.validation.Valid; import org.apache.commons.lang3.StringUtils; import com.qianwen.smartman.common.cache.RegionCache; import com.qianwen.smartman.common.utils.ZipFileTree; import com.qianwen.core.boot.ctrl.BladeController; import com.qianwen.core.mp.base.BaseEntity; import com.qianwen.core.mp.support.Condition; import com.qianwen.core.mp.support.Query; import com.qianwen.core.tenant.annotation.NonDS; import com.qianwen.core.tool.api.R; import com.qianwen.core.tool.utils.Func; import com.qianwen.core.util.CodeUtil; import org.springblade.generator.action.config.GeneratorConfig; import org.springblade.generator.action.engine.CustomTemplateEngine; import org.springblade.generator.action.engine.WebPageTemplateEngine; import org.springblade.generator.action.model.BladeCodeEntity; import org.springblade.generator.action.model.BladeWebPageEntity; import org.springblade.generator.action.model.TemplateEntity; import org.springblade.generator.entity.TabEntity; import com.qianwen.smartman.modules.develop.entity.Code; import com.qianwen.smartman.modules.develop.service.ICodeService; import com.qianwen.smartman.modules.develop.service.IDatasourceService; import com.qianwen.smartman.modules.develop.vo.CodeTemplateVo; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import springfox.documentation.annotations.ApiIgnore; @RequestMapping({"blade-develop/code"}) @Api(value = "代码生成", tags = {"代码生成"}) @ApiIgnore @RestController @NonDS /* loaded from: blade-api.jar:BOOT-INF/classes/org/springblade/modules/develop/controller/CodeController.class */ public class CodeController extends BladeController { private final ICodeService codeService; private final IDatasourceService datasourceService; @Value("${spring.datasource.dynamic.datasource.master.url}") private String url; @Value("${spring.datasource.dynamic.datasource.master.username}") private String user; @Value("${spring.datasource.dynamic.datasource.master.password}") private String password; public CodeController(ICodeService codeService, IDatasourceService datasourceService) { this.codeService = codeService; this.datasourceService = datasourceService; } @ApiOperationSupport(order = 1) @GetMapping({"/detail"}) @ApiOperation(value = "详情", notes = "传入code") public R detail(Code code) { Code detail = (Code) this.codeService.getOne(Condition.getQueryWrapper(code)); return R.data(detail); } @ApiOperationSupport(order = 2) @ApiImplicitParams({@ApiImplicitParam(name = "codeName", value = "模块名", paramType = "query", dataType = "string"), @ApiImplicitParam(name = "tableName", value = "表名", paramType = "query", dataType = "string"), @ApiImplicitParam(name = "modelName", value = "实体名", paramType = "query", dataType = "string")}) @ApiOperation(value = "分页", notes = "传入code") @GetMapping({"/list"}) public R> list(@RequestParam @ApiIgnore Map code, Query query) { IPage pages = this.codeService.page(Condition.getPage(query), Condition.getQueryWrapper(code, Code.class)); return R.data(pages); } @PostMapping({"/submit"}) @ApiOperationSupport(order = 3) @ApiOperation(value = "新增或修改", notes = "传入code") public R submit(@Valid @RequestBody Code code) { return R.status(this.codeService.submit(code)); } @PostMapping({"/remove"}) @ApiOperationSupport(order = 4) @ApiOperation(value = "删除", notes = "传入ids") public R remove(@RequestParam @ApiParam(value = "主键集合", required = true) String ids) { return R.status(this.codeService.removeByIds(Func.toLongList(ids))); } @PostMapping({"/copy"}) @ApiOperationSupport(order = RegionCache.VILLAGE_LEVEL) @ApiOperation(value = "复制", notes = "传入id") public R copy(@RequestParam @ApiParam(value = "主键", required = true) Long id) { Code code = (Code) this.codeService.getById(id); code.setId(null); code.setCodeName(code.getCodeName() + "-copy"); return R.status(this.codeService.save(code)); } @PostMapping({"/gen-code-new"}) @ApiOperationSupport(order = 6) @ApiOperation(value = "新版本代码生成,生成后端方法", notes = "传入ids") public R genCodeNew(@RequestParam @ApiParam(value = "主键集合", required = true) String ids) throws IOException { Collection codes = this.codeService.listByIds(Func.toLongList(ids)); String millisecond = IdWorker.getMillisecond(); File dir = new File("static/codefile"); if (!dir.exists()) { dir.mkdir(); } String uploadPath = "static/codefile/" + millisecond; String bladeBootPath = uploadPath + "/Bladex-Boot"; codes.forEach(code -> { BladeCodeEntity codeEntity = new BladeCodeEntity("", code.getCodeName(), code.getTableName(), code.getTablePrefix(), code.getServiceName(), code.getPackageName(), bladeBootPath + "/src/main/java", BaseEntity.class); codeEntity.setServiceName(code.getServiceName()); AutoGenerator autoGenerator = new GeneratorConfig(new DataSourceConfig.Builder(this.url, this.user, this.password).build()).build(codeEntity); autoGenerator.execute(new CustomTemplateEngine()); }); new ZipFileTree().zipFile(uploadPath); R res = R.success("代码生成成功"); res.setData(millisecond); return res; } @PostMapping({"/template"}) @ApiOperationSupport(order = RegionCache.VILLAGE_LEVEL) @ApiOperation(value = "前端代码生成,选择相关模板生成,只生成前端代码", notes = "传入模板对象") public R template(@ApiParam(value = "模板生成", required = true) @RequestBody CodeTemplateVo codeTemplate) throws IOException { String millisecond = IdWorker.getMillisecond(); String uploadPath = "static/codefile/" + millisecond; String saberPath = uploadPath + "/Saber"; if (!codeTemplate.isTabPage()) { Code code = (Code) this.codeService.getById(codeTemplate.getTabs().get(0).getId()); createWebPageEntity(codeTemplate, saberPath, code, null); } else { List tabEntities = new ArrayList<>(); codeTemplate.getTabs().forEach(codeVo -> { Code code2 = (Code) this.codeService.getById(codeVo.getId()); createWebPageEntity(codeTemplate, saberPath, code2, codeTemplate.getFileName()); String fileName = CodeUtil.lineToHump(code2.getTableName().replace(code2.getTablePrefix(), "")); tabEntities.add(new TabEntity(fileName)); }); TemplateEntity codeEntity = new TemplateEntity("", codeTemplate.getModulePath(), "src", saberPath); codeEntity.setTabs(tabEntities); if (StringUtils.isNotEmpty(codeTemplate.getFileName())) { codeEntity.setFileName(codeTemplate.getFileName()); } AutoGenerator autoGenerator = new GeneratorConfig(new DataSourceConfig.Builder(this.url, this.user, this.password).build()).build(codeEntity); autoGenerator.execute(new WebPageTemplateEngine()); } new ZipFileTree().zipFile(uploadPath); R res = R.success("代码生成成功"); res.setData(millisecond); return res; } private void createWebPageEntity(CodeTemplateVo codeTemplate, String saberPath, Code code, String tabName) { BladeWebPageEntity codeEntity = new BladeWebPageEntity("", codeTemplate.getModulePath(), code.getTableName(), code.getTablePrefix(), "src", saberPath); codeEntity.setPageTemplate(codeTemplate.pageTemplate()); codeEntity.setTabName(tabName); AutoGenerator autoGenerator = new GeneratorConfig(new DataSourceConfig.Builder(this.url, this.user, this.password).build()).build(codeEntity); autoGenerator.execute(new WebPageTemplateEngine()); } }