import { IsNull, Not } from "typeorm";
|
import { default as BaseController } from "../baseController";
|
import * as fs from "fs";
|
import * as path from "path";
|
import { getManager } from "typeorm";
|
import { SysMvcTableInfo } from "../../entity/sys/core/sysMvcTableInfo";
|
import { SysMvcTableColumn } from "../../entity/sys/core/sysMvcTableColumn";
|
import { Post, Prefix } from "egg-shell-decorators";
|
import { SysMvcUserData } from "../../entity/sys/core/sysMvcUserData";
|
|
@Prefix("sysmvc")
|
export default class SysMvcController extends BaseController {
|
//#region createModel
|
/**
|
* 创建model文件
|
*/
|
@Post()
|
public async createModel() {
|
let { ctx } = this;
|
let body = ctx.request.body;
|
let changeDataType = (dataType, nullable?: number) => {
|
let tsDatatype: string;
|
dataType = ctx.helper.caseStyle(dataType);
|
switch (dataType) {
|
case "byte":
|
case "tinyint":
|
case "int":
|
case "int32":
|
case "int64":
|
case "bigint":
|
case "decimal":
|
case "money":
|
tsDatatype = "number";
|
break;
|
case "date":
|
case "datetime":
|
case "dateTime":
|
tsDatatype = "Date";
|
break;
|
default:
|
tsDatatype = "string";
|
break;
|
}
|
tsDatatype = ": " + tsDatatype;
|
if (nullable === 1) {
|
tsDatatype = "?" + tsDatatype;
|
}
|
|
return tsDatatype;
|
};
|
|
try {
|
//主数据
|
let tableInfo = await getManager().getRepository(SysMvcTableInfo).findOne(body.table_Id);
|
|
if (!tableInfo) {
|
this.info.result = false;
|
this.info.msg = "模块不存在";
|
ctx.body = this.info;
|
return;
|
}
|
|
let where = "";
|
// StatData
|
if (tableInfo.dataTableType === 5) {
|
where = "table_Id = " + body.table_Id + " AND (isManagerDataSet>=1) And columnName<>'分割行'";
|
} else {
|
where = "table_Id = " + body.table_Id + " AND (isManagerDataSet>=1) And columnName<>'分割行'";
|
}
|
let colList = await getManager()
|
.getRepository(SysMvcTableColumn)
|
.find({
|
select: ["columnName", "columnComment", "dataType", "groupBy", "isManagerDataSet", "fieldAttribute", "nullable", "isEditDataSet", "isSum"],
|
where: where,
|
order: { orderNo: "DESC", columnID: "ASC" }
|
});
|
|
let relation = "";
|
let typeormList = "";
|
let importList = "";
|
let html = "";
|
|
// 获得主表信息
|
let whereStr = "detailName + ',' like '%' + :detailName + ',%'";
|
if (tableInfo.tableView.indexOf(",") >= 0) {
|
whereStr = "detailName=:detailName";
|
}
|
let _where = { detailName: tableInfo.tableView };
|
let masterTableInfo = await this.dbRead.createQueryBuilder(SysMvcTableInfo, "t").where(whereStr, _where).getOne();
|
|
for (let cInfo of colList) {
|
if (cInfo.isEditDataSet == 3) continue; //3为分割行
|
let dataType = changeDataType(cInfo.dataType, cInfo.nullable);
|
|
let colProp = "@Column()";
|
if (["decimal", "money"].indexOf(this.ctx.helper.caseStyle(cInfo.dataType)) >= 0) {
|
colProp = `@Column({
|
type: "decimal",
|
precision: 14,
|
scale: 4
|
})`;
|
}
|
let keyIDs = [];
|
if (tableInfo.keyIDs) {
|
keyIDs = tableInfo.keyIDs.split(",");
|
}
|
let fieldAttribute = cInfo.fieldAttribute;
|
if (fieldAttribute) {
|
fieldAttribute = fieldAttribute.toLocaleLowerCase();
|
}
|
if (fieldAttribute == "key" || keyIDs.indexOf(cInfo.columnName) >= 0) {
|
colProp = "@PrimaryGeneratedColumn()";
|
} else if (cInfo.columnName == "CreateDate") {
|
colProp = "@CreateDateColumn()";
|
typeormList += ",\r\n CreateDateColumn";
|
} else if (cInfo.columnName == "ModifyDate") {
|
colProp = "@UpdateDateColumn()";
|
typeormList += ",\r\n UpdateDateColumn";
|
}
|
// 子表信息,外键类型
|
if (tableInfo && tableInfo.detailName && cInfo.fieldAttribute == "Key") {
|
let tableView = tableInfo.tableView.replace(/_/gi, "");
|
let _DetailName = tableInfo.detailName.replace(/_/gi, "");
|
let DetailNames = _DetailName.split(",");
|
let keyName = ctx.helper.caseStyle(tableView);
|
switch (tableInfo.domainModelType) {
|
case 2: // 一对多主
|
let index = 0;
|
let _relation = "";
|
for (let DetailName of DetailNames) {
|
let detailName = ctx.helper.caseStyle(DetailName);
|
_relation += `
|
/**
|
* ${DetailName}明细表数据
|
*/
|
@OneToMany(
|
() => ${DetailName},
|
t => t.${keyName}
|
)
|
${detailName}: ${DetailName}[];\r\n\r\n`;
|
if (index > 0) {
|
importList += "\r\n";
|
}
|
importList += "import { " + DetailName + ' } from "./' + detailName + '";';
|
index++;
|
}
|
relation = _relation;
|
if (index > 0) typeormList += ",\r\n OneToMany";
|
break;
|
}
|
}
|
|
// 主表信息
|
if (masterTableInfo != null) {
|
if (masterTableInfo.keyIDs == cInfo.columnName) {
|
let tableView = masterTableInfo.tableView.replace(/_/gi, "");
|
let masterName = ctx.helper.caseStyle(tableView);
|
let _currentTableView = ctx.helper.caseStyle(tableInfo.tableView.replace(/_/gi, ""));
|
let keyName = ctx.helper.caseStyle(masterTableInfo.keyIDs);
|
switch (tableInfo.domainModelType) {
|
case 4: // 一对多从
|
relation = ` /**
|
* ${masterTableInfo.cnName}主表数据
|
*/
|
@ManyToOne(
|
() => ${tableView},
|
t => t.${_currentTableView}
|
)
|
@JoinColumn({
|
name: "${keyName}",
|
referencedColumnName: "${keyName}"
|
})
|
${masterName}: ${tableView};\r\n\r\n`;
|
typeormList += ",\r\n ManyToOne";
|
typeormList += ",\r\n JoinColumn";
|
importList = "import { " + tableView + ' } from "./' + masterName + '";';
|
break;
|
}
|
}
|
}
|
html += " /**\r\n";
|
html += " * " + cInfo.columnComment + "\r\n";
|
html += " */\r\n";
|
html += " " + colProp + "\r\n";
|
//分组特性
|
let columnName = ctx.helper.caseStyle(cInfo.columnName);
|
html += " " + columnName + dataType + ";\r\n\r\n";
|
}
|
html = html.replace(/\s+$/, ""); // 移出结尾空白字符
|
// 主外键关系
|
html += relation;
|
|
let tableView = tableInfo.tableView.replace(/_/gi, "");
|
|
html = `import {
|
Entity,
|
PrimaryGeneratedColumn,
|
Column${typeormList}
|
} from "typeorm";
|
${importList}
|
|
@Entity("${tableInfo.tableName}")
|
export class ${tableView} {
|
${html}
|
}
|
`;
|
|
let _tableView = ctx.helper.caseStyle(tableView);
|
let rootPath = path.resolve();
|
let appPath = rootPath + `\\app\\entity\\`;
|
let folderName = tableInfo.folderName.toLowerCase();
|
let namespace = tableInfo.namespace.toLowerCase();
|
let savePath = tableInfo.domainModelSavePath
|
.replace(/\{namespace\}/gi, namespace)
|
.replace(/\{folder\}/gi, folderName)
|
.replace(/\{folderName\}/gi, folderName)
|
.replace(/\{tableView\}/gi, tableInfo.tableView)
|
.replace(/DomainModels\//gi, "")
|
.replace(/SelectorModel\.cs/gi, ".ts")
|
.replace(/Model\.cs/gi, ".ts")
|
.replace(/..\/Rattan.Interface\./gi, appPath)
|
.replace(/..\/Rattan.ERP\./gi, appPath)
|
.replace(/..\/Rattan\./gi, appPath)
|
.replace(tableInfo.tableView, tableView)
|
// .replace("_", "")
|
.replace(/\//gi, "\\");
|
|
let regS = new RegExp(tableView, "gi");
|
savePath = savePath.toLowerCase().replace(regS, _tableView);
|
|
let pathToCreate = savePath.substring(0, savePath.lastIndexOf("\\"));
|
ctx.helper.mkdir(pathToCreate);
|
|
fs.writeFileSync(savePath, html);
|
this.info.msg = "model文件保存成功";
|
this.info.result = true;
|
} catch (error) {
|
console.log("生成model错误:" + error.message);
|
this.info.msg = "生成model错误:" + error.mesage;
|
this.info.result = false;
|
}
|
ctx.body = this.info;
|
}
|
//#endregion
|
|
//#region createMenuTree
|
/**
|
* 生成菜单树
|
*/
|
@Post()
|
public async createMenuTree() {
|
const { ctx } = this;
|
|
let loadInfo = {
|
folder: "sys/core",
|
tableName: "Sys_Menu",
|
tableView: "Sys_MenuVue",
|
keyName: "menu_Id",
|
nodeName: "menuName",
|
parentName: "parentId",
|
orderBy: { vueOrderNo: "DESC", menu_Id: "ASC" },
|
where: { parentId: 0, vueEnable: 1, vueUrl: Not(IsNull()) },
|
extendColumns: "vueUrl,vueFilePath,vueName,vueAuth,vueIcon"
|
};
|
|
try {
|
let list = await this.ctx.service.common.getTreeDataAll(loadInfo, 0);
|
let routers = await this.createMenuNode(list);
|
|
routers = `/* eslint-disable */
|
export const asyncRouterMap = [${routers},
|
{
|
path: '*',
|
redirect: '/404',
|
hidden: true
|
}]`;
|
|
let rootPath = path.resolve();
|
let appPath = rootPath + `\\..\\siemens2-site`;
|
let baseVuePath = appPath + "\\src\\router\\modules\\router.js";
|
let pathToCreate = baseVuePath.substring(0, baseVuePath.lastIndexOf("\\"));
|
ctx.helper.mkdir(pathToCreate);
|
fs.writeFileSync(baseVuePath, routers);
|
|
this.info.result = true;
|
this.info.msg = "生成成功!";
|
|
ctx.body = this.info;
|
} catch (ex) {
|
let msg = "异常错误信息:" + ex.message;
|
this.info.result = false;
|
this.info.msg = msg;
|
}
|
|
return this.info;
|
}
|
//#endregion
|
|
//#region createMenuNode
|
private async createMenuNode(list: Array<Object>) {
|
let routers = "";
|
for (let item of list) {
|
let node = "";
|
let children = item["children"];
|
if (children && children.length > 0) {
|
node = `{
|
path: '${item["vueUrl"]}',
|
component: () => import('${item["vueFilePath"]}'),
|
redirect: '/',
|
name: '${item["vueName"]}',
|
alwaysShow: true,
|
meta: {
|
title: '${item["vueName"]}',
|
icon: '${item["vueIcon"] || ""}',
|
menu_Id: ${item["menu_Id"]},
|
menuName: '${item["menuName"]}'
|
},
|
children:[{children}]
|
}`;
|
let childNode = await this.createMenuNode(children);
|
node = node.replace("{children}", childNode);
|
} else {
|
node = `{
|
path: '${item["vueUrl"]}',
|
component: () => import('${item["vueFilePath"]}'),
|
name: '${item["vueName"]}',
|
meta: {
|
title: '${item["vueName"]}',
|
icon: '${item["vueIcon"] || ""}',
|
menu_Id: ${item["menu_Id"]},
|
menuName: '${item["menuName"]}'
|
}
|
}`;
|
}
|
if (routers) routers += ",";
|
routers += node;
|
}
|
|
return routers;
|
}
|
|
//#endregion
|
|
//#region 提取字段
|
@Post()
|
public async createField() {
|
try {
|
this.ctx.service.sys.sysMvc.params = Object.assign({}, this.body);
|
this.info = await this.ctx.service.sys.sysMvc.generateTableColumns();
|
} catch (error) {
|
this.info.result = false;
|
this.info.msg = error.message;
|
}
|
|
this.ctx.body = this.info;
|
}
|
//#endregion
|
|
//#region 保存账套用户自定义
|
@Post()
|
public async saveUserJson() {
|
try {
|
let userInfo = await this.userInfo;
|
let table_Id = this.body.table_Id;
|
let userJson = JSON.stringify(this.body.userJson);
|
let userData = await this.dbRead.findOne(SysMvcUserData, {
|
userProduct_Id: userInfo.userProduct_Id,
|
table_Id: table_Id
|
});
|
if (!userData) {
|
userData = new SysMvcUserData();
|
}
|
await this.setAccountInfo(userData);
|
userData.table_Id = this.body.table_Id;
|
userData.tableView = this.body.tableView;
|
userData.userJson = userJson;
|
await this.dbWrite.save(userData);
|
|
this.info.result = true;
|
this.info.msg = "保存成功";
|
} catch (error) {
|
this.info.result = false;
|
this.info.msg = error.message;
|
}
|
|
this.ctx.body = this.info;
|
}
|
//#endregion
|
|
//#region 获取账套用户自定义
|
@Post()
|
public async getUserJson() {
|
try {
|
let userInfo = await this.userInfo;
|
let table_Id = this.body.table_Id;
|
let tableInfo = await this.dbRead.findOne(SysMvcUserData, {
|
userProduct_Id: userInfo.userProduct_Id,
|
table_Id: table_Id
|
});
|
if (!tableInfo) {
|
this.info.result = false;
|
this.ctx.body = this.info;
|
return;
|
}
|
let userJson = tableInfo.userJson;
|
if (userJson) {
|
this.info.result = true;
|
this.info.data = JSON.parse(userJson);
|
} else {
|
this.info.result = false;
|
}
|
} catch (error) {
|
this.info.result = false;
|
this.info.msg = error.message;
|
}
|
|
this.ctx.body = this.info;
|
}
|
//#endregion
|
}
|