//#region
|
import { default as BaseController } from "./baseController";
|
import { In } from "typeorm";
|
import { SysDropDown } from "../entity/sys/core/sysDropDown";
|
import { Post, Get } from "egg-shell-decorators";
|
import { SysMvcTableColumn } from "../entity/sys/core/sysMvcTableColumn";
|
import * as fs from "fs";
|
import * as path from "path";
|
import { isObject } from "util";
|
import { aliOSSUpload } from "../public/aliyunOssHelper";
|
import { SysMvcTableInfo } from "../entity/sys/core/sysMvcTableInfo";
|
import { SysMvcVueData } from "../entity/sys/core/sysMvcVueData";
|
import { SysMenuVue } from "../entity/sys/core/sysMenuVue";
|
import { SysUserLog } from "../entity/sys/core/sysUserLog";
|
//import { In, Not } from "typeorm";
|
import { siemensApi } from "../public/webServiceHelper";
|
//#endregion
|
|
export default class CommonController extends BaseController {
|
//#region loadDropDown 加载下拉框数据
|
/**
|
* 加载下拉框数据
|
*/
|
@Post()
|
public async loadDropDown() {
|
let { ctx } = this;
|
let body = ctx.request.body;
|
let userInfo = await this.userInfo;
|
// 返回下拉框数据集合
|
let dropdownList: Object = {};
|
|
try {
|
// 获得登录信息
|
let ddRep = this.dbRead.getRepository(SysDropDown);
|
let idList: Array<number> = Array.isArray(body.where) ? body.where : body.where.split(",");
|
let dataList = await ddRep.find({
|
dropDown_Id: In(idList)
|
});
|
|
for (let item of dataList) {
|
let sql = item.sql;
|
|
// 获得SQL权限
|
if (sql) {
|
sql = sql.replace(/\{userProduct_Id\}/gi, "" + userInfo.userProduct_Id);
|
// 加载权限
|
let where = (await ctx.service.auth.getDropDownWhere(item.dropDown_Id)) || "1=1";
|
|
sql = sql.replace(/\{AUTHWHERE\}/gi, where);
|
}
|
|
// 获得下拉框数据
|
const ddValueList = await ddRep.query(sql);
|
// 数据转换
|
const newItemList: Array<Object> = [];
|
for (let ddItem of ddValueList) {
|
ddItem = ctx.helper.objectToCase(ddItem);
|
let newItem: Object = {};
|
let keys = Object.keys(ddItem);
|
if (keys.length == 1) {
|
let v = ddItem[keys[0]];
|
if (v instanceof Array) {
|
newItem["value"] = v[0];
|
if (v.length === 2) {
|
newItem["label"] = v[1];
|
} else {
|
newItem["label"] = v[0];
|
}
|
} else {
|
newItem["value"] = v;
|
newItem["label"] = v;
|
}
|
} else if (keys.length === 2) {
|
Object.assign(newItem, ddItem);
|
let v = ddItem[keys[0]];
|
newItem["value"] = v instanceof Array ? v[0] : v;
|
v = ddItem[keys[1]];
|
newItem["label"] = v instanceof Array ? v[0] : v;
|
} else if (keys.length >= 3) {
|
Object.assign(newItem, ddItem);
|
let v = ddItem[keys[0]];
|
newItem["value"] = v instanceof Array ? v[0] : v;
|
v = ddItem[keys[1]];
|
newItem["code"] = v instanceof Array ? v[0] : v;
|
v = ddItem[keys[2]];
|
newItem["label"] = v instanceof Array ? v[0] : v;
|
}
|
newItemList.push(newItem);
|
}
|
|
dropdownList["dropdown" + item.dropDown_Id] = newItemList;
|
}
|
this.info.result = true;
|
this.info.data = dropdownList;
|
} catch (e) {
|
this.info.result = false;
|
this.info.msg = "加载下拉框异常:" + e.message;
|
}
|
this.ctx.body = this.info;
|
}
|
//#endregion
|
|
//#region loadDataList 加载列表数据
|
/**
|
* 加载列表数据
|
*/
|
@Post()
|
public async loadDataList() {
|
let { ctx } = this;
|
let body = ctx.request.body;
|
let tableName = body.tableName || body.tableView;
|
tableName = tableName.replace(/_/g, "");
|
|
// 在service自定义加载列表数据
|
if (body.folder) {
|
let folderNames = body.folder.split("/");
|
let folderName = ctx.helper.caseStyle(folderNames[0]);
|
let serviceNames = tableName.split("_");
|
let serviceName = ctx.helper.caseStyle(serviceNames[serviceNames.length - 1]);
|
let namespace = ctx.service[folderName];
|
if (namespace) {
|
let serviceInstance = namespace[serviceName];
|
if (serviceInstance && serviceInstance.loadDataList) {
|
this.info = await serviceInstance.loadDataList();
|
ctx.body = this.info;
|
return;
|
}
|
}
|
}
|
|
try {
|
let _tableName = ctx.helper.caseStyle(tableName);
|
let skip = (body.pageIndex - 1) * body.pageSize;
|
let entityPath = `../entity/${body.folder}/` + _tableName;
|
let module = await import(entityPath);
|
var m = module[tableName];
|
let masterRep = this.dbRead.getRepository(m);
|
let orderBy = body.orderBy;
|
if (orderBy) {
|
// 自定义字符串模式
|
if (orderBy.customString) orderBy = orderBy.customString;
|
} else {
|
orderBy = {};
|
orderBy[body.idField] = "DESC";
|
}
|
|
let where = await ctx.service.common.getWhere();
|
|
let options = {
|
skip: skip,
|
take: body.pageSize || 50,
|
where: where,
|
order: orderBy
|
};
|
|
let [dataList, total] = await masterRep.findAndCount(options);
|
// 处理扩展字段
|
for (let item of dataList) {
|
if (item["expandFields"]) {
|
let expandFields = JSON.parse(item["expandFields"]);
|
Object.assign(item, expandFields);
|
}
|
if (item["detailExpandFields"]) {
|
let expandFields = JSON.parse(item["detailExpandFields"]);
|
Object.assign(item, expandFields);
|
}
|
}
|
|
// 求和
|
let footer = {};
|
if (body.sumColumnNames) {
|
let sumColumnNames = body.sumColumnNames.split(",");
|
let footerBuilder = await masterRep.createQueryBuilder();
|
let i = 0;
|
for (let f of sumColumnNames) {
|
if (i === 0) {
|
footerBuilder.select(`SUM(${f})`, f);
|
} else {
|
footerBuilder.addSelect(`SUM(${f})`, f);
|
}
|
i++;
|
}
|
footer = await footerBuilder.where(where).getRawOne();
|
}
|
|
//#region 记录登录日志
|
let menu_Id = Number(this.body.menu_Id);
|
if (menu_Id > 0 && this.app.config.openLog) {
|
let menuInfo = await this.dbRead.findOne(SysMenuVue, {
|
select: ["menuName"],
|
where: {
|
menu_Id: this.body.menu_Id
|
}
|
});
|
if (menuInfo) {
|
let log = new SysUserLog();
|
log.userTrueName = (await this.userInfo).userTrueName;
|
log.operateType = menuInfo.menuName;
|
log.action = "查询数据";
|
log.iP = this.ctx.request.ip;
|
await this.setAccountInfo(log);
|
|
await this.dbWrite.save(log);
|
}
|
}
|
//#endregion
|
|
this.info.result = true;
|
this.info.data = {
|
total: total,
|
rows: dataList,
|
footer: [footer]
|
};
|
} catch (error) {
|
this.info.result = false;
|
this.info.msg = error.message;
|
}
|
this.ctx.body = this.info;
|
}
|
//#endregion
|
|
//#region groupDataList 加载分组列表数据
|
/**
|
* 加载分组列表数据
|
*/
|
@Post()
|
public async groupDataList() {
|
let { ctx } = this;
|
let body = ctx.request.body;
|
|
try {
|
let queryInfo = {
|
pagenum: body.pageIndex,
|
pagesize: body.pageSize
|
};
|
let positionName = "";
|
if (body.where.positionName) {
|
positionName = body.where.positionName.value;
|
}
|
if (body.where.extendField04) {
|
positionName = positionName === "" ? "/" + body.where.extendField04.value : positionName + "/" + body.where.extendField04.value;
|
} else {
|
positionName = positionName + "/";
|
}
|
if (body.where.productCode) {
|
positionName = positionName === "" ? "//" + body.where.productCode.value : positionName + "/" + body.where.productCode.value;
|
} else {
|
positionName = positionName + "/";
|
}
|
siemensApi.domainUrl = this.app.config.domainUrl;
|
var params = {
|
queryInfo,
|
positionName,
|
positionTypeValue: 66
|
};
|
var par = JSON.stringify(params);
|
let result: any;
|
|
result = await siemensApi.handfindProductStock({
|
par
|
});
|
var resultInfo = JSON.parse(result);
|
if (resultInfo.status == 200) {
|
var resultInfo = JSON.parse(result);
|
ctx.body = {
|
result: true,
|
msg: "获取成功",
|
data: {
|
total: resultInfo.total,
|
rows: resultInfo.date
|
}
|
};
|
} else {
|
ctx.body = {
|
result: true,
|
msg: "此条件查不到数据",
|
data: {
|
total: 1,
|
rows: []
|
}
|
};
|
}
|
} catch (error) {
|
ctx.body = {
|
result: false,
|
msg: error.message
|
};
|
}
|
}
|
//#endregion
|
|
//#region loadEditData 加载编辑页数据
|
/**
|
* 加载编辑页数据
|
*/
|
@Post()
|
public async loadEditData() {
|
let { ctx } = this;
|
let body = ctx.request.body;
|
let tableName = body.tableName || body.tableView;
|
let entityClassName = tableName.replace(/_/g, "");
|
let entityFielName = ctx.helper.caseStyle(entityClassName);
|
let idField = body.idField;
|
idField = ctx.helper.caseStyle(idField);
|
|
try {
|
// 主表数据处理
|
let entityPath = `../entity/${body.folder}/` + entityFielName;
|
let module = await import(entityPath);
|
let masterEntity = module[entityClassName];
|
let masterRep = this.dbRead.getRepository(masterEntity);
|
let where = body.where;
|
if (!isObject(where)) {
|
where = {};
|
where[body.idField] = body.idValue;
|
}
|
let masterInfo = await masterRep.findOne(where);
|
// 处理扩展字段
|
if (masterInfo && masterInfo["expandFields"]) {
|
let expandFields = JSON.parse(masterInfo["expandFields"]);
|
Object.assign(masterInfo, expandFields);
|
}
|
|
// 明细表数据处理
|
if (body.detailList) {
|
for (const detail of body.detailList) {
|
let detailClassName = detail.tableName.replace(/_/g, "");
|
let detailFielName = ctx.helper.caseStyle(detailClassName);
|
let detaillPath = `../entity/${body.folder}/` + detailFielName;
|
module = await import(detaillPath);
|
let detailEntity = module[detailClassName];
|
|
let detailRep = this.dbRead.getRepository(detailEntity);
|
let skip = ((detail.pageIndex || 1) - 1) * detail.pageSize;
|
let options = {
|
skip: skip,
|
take: 1000,
|
where: where,
|
order: detail.orderBy
|
};
|
let [detailList, detailTotal] = await detailRep.findAndCount(options);
|
// 处理扩展字段
|
for (let item of detailList) {
|
if (item["expandFields"]) {
|
let expandFields = JSON.parse(item["expandFields"]);
|
Object.assign(item, expandFields);
|
}
|
}
|
|
// 明细求和
|
let footer = {};
|
if (detail.sumColumnNames) {
|
const cols = detail.sumColumnNames.split(",");
|
var builder = masterRep.createQueryBuilder();
|
for (var col of cols) {
|
builder.addSelect(`SUM(${col})`, col);
|
}
|
footer = await builder.getRawOne();
|
}
|
|
if (typeof masterInfo === "object" && masterInfo) {
|
masterInfo[detail.tableName] = {
|
total: detailTotal,
|
rows: detailList,
|
footer: [footer]
|
};
|
}
|
}
|
}
|
|
// 加载后事件
|
if (body.folder) {
|
let folderNames = body.folder.split("/");
|
let folderName = ctx.helper.caseStyle(folderNames[0]);
|
let serviceNames = tableName.split("_");
|
let serviceName = ctx.helper.caseStyle(serviceNames[serviceNames.length - 1]);
|
let namespace = ctx.service[folderName];
|
if (namespace) {
|
let serviceInstance = namespace[serviceName];
|
if (serviceInstance && serviceInstance.onLoadSaveAfter) {
|
await serviceInstance.onLoadSaveAfter(masterInfo);
|
}
|
}
|
}
|
|
ctx.body = {
|
result: true,
|
msg: null,
|
data: masterInfo
|
};
|
} catch (error) {
|
console.log("加载编辑页数据错误:" + error.message);
|
ctx.body = {
|
result: false,
|
msg: error.message
|
};
|
}
|
}
|
//#endregion
|
|
//#region saveEditData 编辑页面数据保存
|
/**
|
* 编辑页面数据保存
|
*/
|
@Post()
|
public async saveEditData() {
|
let { ctx } = this;
|
let body = ctx.request.body;
|
let userInfo = await ctx.helper.userInfo();
|
let tableName = body.tableName || body.tableView;
|
let entityClassName = tableName.replace(/_/g, "");
|
let entityFielName = ctx.helper.caseStyle(entityClassName);
|
|
try {
|
// 主表数据处理
|
let entityPath = `../entity/${body.folder}/` + entityFielName;
|
let module = await import(entityPath);
|
let entity = module[entityClassName];
|
|
let dataInfo = JSON.parse(body.data);
|
// 获得自动编码
|
if (body.codeRegular && !dataInfo[body.codeRegular]) {
|
dataInfo[body.codeRegular] = await ctx.service.common.getCodeRegular(body.menu_Id, userInfo.userProduct_Id);
|
}
|
let masterRep = this.dbWrite.getRepository(entity);
|
// 设置账套信息
|
let colInfo = masterRep.metadata.columns.find(item => item.databaseName === "userProduct_Id");
|
if (colInfo) {
|
dataInfo = Object.assign(dataInfo, {
|
userProduct_Id: userInfo.userProduct_Id,
|
userProductCode: userInfo.userProductCode,
|
userProductAlias: userInfo.userProductAlias,
|
platCorpName: userInfo.platCorpName,
|
platUserCode: userInfo.platUserCode,
|
platUser_Id: userInfo.platUser_Id
|
});
|
}
|
// 设置新建信息
|
colInfo = masterRep.metadata.columns.find(item => item.databaseName === "createID");
|
// 当前保存是新建
|
let isAdd = !dataInfo[body.idField];
|
if (colInfo && isAdd) {
|
dataInfo = Object.assign(dataInfo, {
|
createID: userInfo.user_Id,
|
creator: userInfo.userTrueName,
|
createDate: new Date()
|
});
|
}
|
// 设置修改信息
|
colInfo = masterRep.metadata.columns.find(item => item.databaseName === "modifyID");
|
if (colInfo && dataInfo[body.idField]) {
|
dataInfo = Object.assign(dataInfo, {
|
modifyID: userInfo.user_Id,
|
modifier: userInfo.userTrueName,
|
modifyDate: new Date()
|
});
|
}
|
// 保存前事件
|
if (body.folder) {
|
let folderNames = body.folder.split("/");
|
let folderName = ctx.helper.caseStyle(folderNames[0]);
|
let serviceNames = tableName.split("_");
|
let serviceName = ctx.helper.caseStyle(serviceNames[serviceNames.length - 1]);
|
let namespace = ctx.service[folderName];
|
if (namespace) {
|
let serviceInstance = namespace[serviceName];
|
if (serviceInstance && serviceInstance.onAddSaveBefore) {
|
this.info = await serviceInstance.onAddSaveBefore(dataInfo, isAdd);
|
if (this.info.result === false) {
|
ctx.body = this.info;
|
return;
|
}
|
}
|
}
|
}
|
// 将空值置为null
|
Object.keys(dataInfo).forEach(key => {
|
if (dataInfo[key] === "") dataInfo[key] = null;
|
});
|
|
// 保存数据
|
let saveResult = await masterRep.save(dataInfo);
|
|
// 处理明细表
|
let detailTableList = body.detailTableList;
|
if (Array.isArray(detailTableList)) {
|
for (const item of detailTableList) {
|
// 明细表数据处理
|
let detailClassName = item.subTableView.replace(/_/g, "");
|
let entityDetaillName = ctx.helper.caseStyle(detailClassName);
|
entityPath = `../entity/${body.folder}/` + entityDetaillName;
|
let module = await import(entityPath);
|
let detailEntity = module[detailClassName];
|
let detailRep = this.dbWrite.getRepository(detailEntity);
|
|
let detailRows = dataInfo[item.subTableView];
|
for (const detailRow of detailRows) {
|
// 将空值置为null
|
Object.keys(detailRow).forEach(key => {
|
if (detailRow[key] === "") detailRow[key] = null;
|
});
|
// 设置主键值
|
detailRow[body.idField] = dataInfo[body.idField];
|
await this.setAccountInfo(detailRow, item.idField);
|
let _saveResult = await detailRep.save(detailRow);
|
Object.assign(detailRow, _saveResult);
|
}
|
let where = {};
|
where[body.idField] = dataInfo[body.idField];
|
let opts = {
|
where: where,
|
order: item.orderBy
|
};
|
detailRows = await detailRep.find(opts);
|
saveResult[item.subTableView] = {
|
total: detailRows.length,
|
rows: detailRows,
|
footer: []
|
};
|
}
|
}
|
|
// 保存后事件
|
if (body.folder) {
|
let folderNames = body.folder.split("/");
|
let folderName = ctx.helper.caseStyle(folderNames[0]);
|
let serviceNames = tableName.split("_");
|
let serviceName = ctx.helper.caseStyle(serviceNames[serviceNames.length - 1]);
|
let namespace = ctx.service[folderName];
|
if (namespace) {
|
let serviceInstance = namespace[serviceName];
|
if (serviceInstance && serviceInstance.onAddSaveAfter) {
|
await serviceInstance.onAddSaveAfter(dataInfo, isAdd);
|
}
|
}
|
}
|
|
if (saveResult) {
|
this.info.result = true;
|
this.info.msg = "保存成功";
|
this.info.data = saveResult;
|
} else {
|
this.info.result = false;
|
this.info.msg = "保存失败";
|
}
|
} catch (error) {
|
console.log("保存错误:" + error.message);
|
this.info.result = false;
|
this.info.msg = "保存失败:" + error.message;
|
}
|
|
ctx.body = this.info;
|
}
|
//#endregion
|
|
//#region loadTreeNode 加载TREE数据
|
/**
|
* 加载TREE数据
|
*/
|
@Post()
|
public async loadTreeNode() {
|
let { ctx } = this;
|
let body = ctx.request.body;
|
let entityClassName = body.tableName.replace(/_/g, "");
|
let entityFielName = ctx.helper.caseStyle(entityClassName);
|
let where = body.where;
|
let orderBy = body.orderBy;
|
if (!isObject(where)) {
|
this.info.result = false;
|
this.info.msg = "参数不能为空";
|
ctx.body = this.info;
|
return;
|
}
|
|
try {
|
if (where.parentId == -1) {
|
let sql = `
|
WITH CategoryInfo AS
|
(
|
SELECT ${body.keyName} FROM ${body.tableName} where parentId=0
|
UNION ALL
|
SELECT a.${body.keyName} FROM ${body.tableName} AS a INNER JOIN CategoryInfo AS b ON a.${body.parentName}=b.${body.keyName}
|
)
|
SELECT top 50 ${body.keyName}, ${body.nodeName}, 0 as hasChild, 0 as hasFactChild FROM ${body.tableName}
|
WHERE ${body.keyName}
|
not in
|
(
|
SELECT ${body.keyName} FROM CategoryInfo
|
)`;
|
let dataList = await this.dbRead.query(sql);
|
this.info.result = true;
|
this.info.data = dataList;
|
ctx.body = this.info;
|
return;
|
}
|
|
let entityPath = `../entity/${body.folder}/` + entityFielName;
|
|
let module = await import(entityPath);
|
let entity = module[entityClassName];
|
let extendColumns = [body.parentName, body.keyName, body.nodeName];
|
if (body.extendColumns) {
|
extendColumns = extendColumns.concat(body.extendColumns.split(",")).filter(item => item);
|
}
|
let _where = "";
|
let hasChild = "";
|
if (body.fixHasChild) {
|
hasChild = "(1)";
|
} else if (body.parentName) {
|
hasChild = `(case when exists(Select 1 from ${body.tableName} sub Where m.${body.keyName}=sub.${body.parentName}${_where}) then 1 else 0 end)`;
|
}
|
Object.keys(where).forEach(key => {
|
if (_where) _where += " And ";
|
if (where[key] === null) {
|
_where += `m.${key} is null`;
|
} else {
|
_where += `m.${key}=:${key}`;
|
}
|
});
|
|
let dataList = await this.dbRead
|
.createQueryBuilder()
|
.select(extendColumns)
|
.addSelect(hasChild, "hasChild")
|
.addSelect(body.keyName, "value")
|
.addSelect(body.nodeName, "label")
|
.from(entity, "m")
|
.where(_where, where)
|
.orderBy(orderBy)
|
.getRawMany();
|
|
this.info.result = true;
|
this.info.data = dataList;
|
} catch (error) {
|
this.info.result = false;
|
this.info.msg = error.toString();
|
}
|
ctx.body = this.info;
|
}
|
//#endregion
|
|
//#region loadTreeNodeByAuth 加载TREE数据
|
/**
|
* 加载TREE数据
|
*/
|
@Post()
|
public async loadTreeNodeByAuth() {
|
let { ctx } = this;
|
let body = ctx.request.body;
|
let entityClassName = body.tableName.replace(/_/g, "");
|
let entityFielName = ctx.helper.caseStyle(entityClassName);
|
let where = body.where;
|
let orderBy = body.orderBy;
|
if (!isObject(where)) {
|
this.info.result = false;
|
this.info.msg = "参数不能为空";
|
ctx.body = this.info;
|
return;
|
}
|
|
try {
|
let entityPath = `../entity/${body.folder}/` + entityFielName;
|
|
let module = await import(entityPath);
|
let entity = module[entityClassName];
|
let extendColumns = [body.parentName, body.keyName, body.nodeName];
|
if (body.extendColumns) {
|
extendColumns = extendColumns.concat(body.extendColumns.split(",")).filter(item => item);
|
}
|
let _where = "";
|
let hasChild = "";
|
if (body.fixHasChild) {
|
hasChild = "(1)";
|
} else if (body.parentName) {
|
hasChild = `(case when exists(Select 1 from ${body.tableName} sub Where m.${body.keyName}=sub.${body.parentName}${_where}) then 1 else 0 end)`;
|
}
|
Object.keys(where).forEach(key => {
|
if (_where) _where += " And ";
|
if (where[key] === null) {
|
_where += `m.${key} is null`;
|
} else {
|
_where += `m.${key}=:${key}`;
|
}
|
});
|
if (_where) _where += " And ";
|
var storageWhere = await await ctx.service.auth.getStorageAuth("string");
|
_where += storageWhere;
|
let dataList = await this.dbRead
|
.createQueryBuilder()
|
.select(extendColumns)
|
.addSelect(hasChild, "hasChild")
|
.addSelect(body.keyName, "value")
|
.addSelect(body.nodeName, "label")
|
.from(entity, "m")
|
.where(_where, where)
|
.orderBy(orderBy)
|
.getRawMany();
|
|
this.info.result = true;
|
this.info.data = dataList;
|
} catch (error) {
|
this.info.result = false;
|
this.info.msg = error.toString();
|
}
|
ctx.body = this.info;
|
}
|
//#endregion
|
|
//#region loadTreeNodeAll 加载TREE数据
|
/**
|
* 加载TREE数据
|
*/
|
@Post()
|
public async loadTreeNodeAll() {
|
let { ctx } = this;
|
let body = ctx.request.body;
|
|
try {
|
var dataList = await this.ctx.service.common.getTreeDataAll(body, 0);
|
|
ctx.body = {
|
result: true,
|
msg: null,
|
data: dataList
|
};
|
} catch (error) {
|
ctx.body = {
|
result: false,
|
msg: error.toString()
|
};
|
}
|
}
|
//#endregion
|
|
//#region 删除数据 deleteTreeData
|
/**
|
* 删除数据 deleteTreeData
|
*/
|
@Post()
|
public async deleteTreeData() {
|
let { ctx } = this;
|
let body = ctx.request.body;
|
|
try {
|
let sql = `
|
WITH RECURSIVE CategoryInfo AS
|
(
|
SELECT ${body.keyName} FROM ${body.tableName} where ${body.keyName}=${body.keyValue}
|
UNION ALL
|
SELECT a.${body.keyName} FROM ${body.tableName} AS a INNER JOIN CategoryInfo AS b ON a.${body.parentName}=b.${body.keyName}
|
)
|
DELETE FROM ${body.tableName}
|
WHERE ${body.keyName}
|
in
|
(
|
SELECT ${body.keyName} FROM CategoryInfo
|
)`;
|
await this.dbRead.query(sql);
|
this.info.result = true;
|
this.info.msg = "删除成功";
|
} catch (error) {
|
console.log("删除数据错误:" + error.message);
|
this.info.result = false;
|
this.info.msg = error.message;
|
}
|
|
ctx.body = this.info;
|
}
|
//#endregion
|
|
//#region 删除数据 deleteData
|
/**
|
* 删除数据 deleteData
|
*/
|
@Post()
|
public async deleteData() {
|
let { ctx } = this;
|
let body = ctx.request.body;
|
let entityClassName = body.tableName.replace(/_/g, "");
|
let entityFielName = ctx.helper.caseStyle(entityClassName);
|
let tableName = body.tableName || body.tableView;
|
let deletedIDs = [];
|
|
try {
|
// 主表数据处理
|
let entityPath = `../entity/${body.folder}/` + entityFielName;
|
let module = await import(entityPath);
|
let entity = module[entityClassName];
|
if (Array.isArray(body.deletedIDs) && body.deletedIDs.length) {
|
deletedIDs = body.deletedIDs;
|
} else if (typeof body.deletedIDs === "string" && body.deletedIDs) {
|
deletedIDs = body.deletedIDs.split(",");
|
}
|
|
if (!deletedIDs.length) {
|
this.info.result = false;
|
this.info.msg = "没有可删除的数据";
|
ctx.body = this.info;
|
return;
|
}
|
|
// 删除前事件
|
if (body.projectName) {
|
let folderNames = body.projectName.split(".");
|
let folderName = ctx.helper.caseStyle(folderNames[folderNames.length - 1]);
|
let serviceNames = tableName.split("_");
|
let serviceName = ctx.helper.caseStyle(serviceNames[serviceNames.length - 1]);
|
let namespace = ctx.service[folderName];
|
if (namespace) {
|
let serviceInstance = namespace[serviceName];
|
if (serviceInstance && serviceInstance.onDeleteBefore) {
|
this.info = await serviceInstance.onDeleteBefore(deletedIDs);
|
if (this.info.result === false) {
|
ctx.body = this.info;
|
return;
|
}
|
}
|
}
|
}
|
|
// 删除数据
|
let masterRep = this.dbWrite.getRepository(entity);
|
let deleteResult = await masterRep.delete(deletedIDs);
|
|
// 删除后事件
|
if (body.projectName) {
|
let folderNames = body.projectName.split(".");
|
let folderName = ctx.helper.caseStyle(folderNames[folderNames.length - 1]);
|
let serviceNames = tableName.split("_");
|
let serviceName = ctx.helper.caseStyle(serviceNames[serviceNames.length - 1]);
|
let namespace = ctx.service[folderName];
|
if (namespace) {
|
let serviceInstance = namespace[serviceName];
|
if (serviceInstance && serviceInstance.onDeleteAfter) {
|
await serviceInstance.onDeleteAfter(deletedIDs);
|
}
|
}
|
}
|
|
if (deleteResult) {
|
ctx.body = {
|
result: true,
|
msg: "删除成功"
|
};
|
} else {
|
ctx.body = {
|
result: false,
|
msg: "删除成功"
|
};
|
}
|
} catch (error) {
|
console.log("删除数据错误:" + error.message);
|
ctx.body = {
|
result: false,
|
msg: error.toString()
|
};
|
}
|
}
|
//#endregion
|
|
//#region 保存创建vue文件
|
/**
|
* 保存创建vue文件
|
*/
|
@Post()
|
public async createBaseVue() {
|
let { ctx } = this;
|
let body = ctx.request.body;
|
|
try {
|
//主数据
|
if (body.vueData_Id === 0) {
|
let mvcInfo = await this.dbRead.getRepository(SysMvcTableInfo).findOne(body.table_Id);
|
if (mvcInfo) {
|
mvcInfo.vueData = body.vueData;
|
await this.dbWrite.save(mvcInfo);
|
}
|
} else {
|
if (body.vueData_Id > 0) {
|
var tempInfo = await this.dbRead.getRepository(SysMvcVueData).findOne(body.vueData_Id);
|
if (tempInfo != null) {
|
tempInfo.vueDataName = body.vueDataName;
|
tempInfo.vueData = body.vueData;
|
tempInfo.table_Id = body.Table_Id;
|
await this.dbWrite.save(tempInfo);
|
}
|
} else {
|
var vueInfo = new SysMvcVueData();
|
vueInfo.vueDataName = body.vueDataName;
|
vueInfo.vueData = body.vueData;
|
vueInfo.table_Id = body.table_Id;
|
await this.dbWrite.save(vueInfo);
|
}
|
}
|
let resultInfo = {
|
result: true,
|
msg: ""
|
};
|
resultInfo.msg = "保存成功";
|
|
if (body.router && body.type == "json") {
|
let rootPath = path.resolve();
|
let appPath = rootPath + `\\..\\siemens2-site\\`;
|
var baseVuePath = appPath + `static` + body.router.replace(/\//gi, "\\") + ".json";
|
let pathToCreate = baseVuePath.substring(0, baseVuePath.lastIndexOf("\\"));
|
ctx.helper.mkdir(pathToCreate);
|
|
fs.writeFileSync(baseVuePath, body.vueData);
|
resultInfo["msg"] = "数据和JSON文件保存成功";
|
|
var mainPath = appPath + "src\\views" + body.router.replace(/\//gi, "\\") + ".vue";
|
pathToCreate = mainPath.substring(0, mainPath.lastIndexOf("\\"));
|
ctx.helper.mkdir(pathToCreate);
|
|
// 生成biz文件,选择器不生成文件
|
if (!fs.existsSync(mainPath) && body.router.indexOf("/selector") != 0) {
|
let vueData = body.vueData;
|
let jsonVueData = JSON.parse(vueData);
|
let menu_Id = jsonVueData.dataOptions.menu_Id;
|
var menuInfo = await this.dbWrite.getRepository(SysMenuVue).findOne(menu_Id);
|
if (menuInfo != null) {
|
var mainCode = body.mainCode.replace("{name}", menuInfo.vueName);
|
|
fs.writeFileSync(mainPath, mainCode);
|
resultInfo.msg = "文件创建成功";
|
}
|
}
|
}
|
resultInfo.result = true;
|
|
ctx.body = resultInfo;
|
} catch (error) {
|
console.log("创建Vue错误:" + error.message);
|
ctx.body = {
|
result: false,
|
msg: error.toString()
|
};
|
}
|
}
|
//#endregion
|
|
//#region 单据终止
|
/**
|
* 终止
|
*/
|
@Post()
|
public async stop() {
|
let { ctx } = this;
|
let body = ctx.request.body;
|
let folderNames = body.folder.split("/");
|
let folderName = ctx.helper.caseStyle(folderNames[0]);
|
let tableName = body.tableName || body.tableView;
|
let serviceNames = tableName.split("_");
|
let serviceName = ctx.helper.caseStyle(serviceNames[serviceNames.length - 1]);
|
|
try {
|
let namespace = ctx.service[folderName];
|
if (namespace) {
|
let serviceInstance = namespace[serviceName];
|
if (serviceInstance && serviceInstance.stop) {
|
let info = await serviceInstance.stop();
|
ctx.body = info;
|
return;
|
} else {
|
this.info.result = false;
|
this.info.msg = "stop方法未在service中实现";
|
}
|
} else {
|
this.info.result = false;
|
this.info.msg = "stop方法未在service中实现";
|
}
|
} catch (error) {
|
this.info.result = false;
|
this.info.msg = "终止失败:" + error.message;
|
}
|
ctx.body = this.info;
|
}
|
//#endregion
|
|
//#region 单据开启
|
/**
|
* 单据开启
|
*/
|
@Post()
|
public async open() {
|
let { ctx } = this;
|
let body = ctx.request.body;
|
let folderNames = body.folder.split("/");
|
let folderName = ctx.helper.caseStyle(folderNames[0]);
|
let tableName = body.tableName || body.tableView;
|
let serviceNames = tableName.split("_");
|
let serviceName = ctx.helper.caseStyle(serviceNames[serviceNames.length - 1]);
|
|
try {
|
let namespace = ctx.service[folderName];
|
if (namespace) {
|
let serviceInstance = namespace[serviceName];
|
if (serviceInstance && serviceInstance.open) {
|
let info = await serviceInstance.open();
|
ctx.body = info;
|
return;
|
} else {
|
this.info.result = false;
|
this.info.msg = "open方法未在service中实现";
|
}
|
} else {
|
this.info.result = false;
|
this.info.msg = "open方法未在service中实现";
|
}
|
} catch (error) {
|
this.info.result = false;
|
this.info.msg = "开启失败:" + error.message;
|
}
|
ctx.body = this.info;
|
}
|
//#endregion
|
|
//#region 批量审核
|
/**
|
* 批量审核
|
*/
|
@Post()
|
public async batchAuditing() {
|
let { ctx } = this;
|
let body = ctx.request.body;
|
let tableName = body.tableName || body.tableView;
|
let entityClassName = tableName.replace(/_/g, "");
|
let entityFielName = ctx.helper.caseStyle(entityClassName);
|
let userInfo = await ctx.helper.userInfo();
|
|
if (!Array.isArray(body.idValues) || !body.idValues.length || !body.idField) {
|
this.info.result = false;
|
this.info.msg = "没有可审核的单子";
|
return;
|
}
|
let folderNames = body.folder.split("/");
|
let folderName = ctx.helper.caseStyle(folderNames[0]);
|
let serviceNames = tableName.split("_");
|
let serviceName = ctx.helper.caseStyle(serviceNames[serviceNames.length - 1]);
|
|
try {
|
// 默认审核方法
|
let defaultAudit = async () => {
|
// 主表数据处理
|
let entityPath = `../entity/${body.folder}/` + entityFielName;
|
let module = await import(entityPath);
|
let entity = module[entityClassName];
|
|
let idValues: Array<any> = [];
|
if (Array.isArray(body.idValues)) {
|
idValues = body.idValues;
|
} else {
|
idValues = body.idValues.split(",");
|
}
|
let where: Object = {};
|
where[body.idField] = In(idValues);
|
await this.dbWrite.update(entity, where, {
|
auditing: body.auditing,
|
auditor: userInfo.userTrueName,
|
auditDate: new Date(),
|
statusText: body.auditing == 2 ? "审核成功" : "审核失败"
|
});
|
|
this.info.result = true;
|
this.info.msg = "审核成功";
|
return this.info;
|
};
|
let namespace = ctx.service[folderName];
|
if (namespace) {
|
let serviceInstance = namespace[serviceName];
|
if (serviceInstance && serviceInstance.batchAuditing) {
|
let info = await serviceInstance.batchAuditing();
|
ctx.body = info;
|
} else {
|
// 默认审核
|
let info = await defaultAudit();
|
ctx.body = info;
|
}
|
} else {
|
// 默认审核
|
let info = await defaultAudit();
|
ctx.body = info;
|
}
|
} catch (error) {
|
ctx.body = {
|
result: false,
|
msg: "开启失败:" + error.toString()
|
};
|
}
|
}
|
//#endregion
|
|
//#region copy 复制
|
/**
|
* 复制
|
*/
|
@Post()
|
public async copy() {
|
let { ctx } = this;
|
let body = ctx.request.body;
|
let userInfo = await ctx.helper.userInfo();
|
let tableName = body.tableName || body.tableView;
|
let entityClassName = tableName.replace(/_/g, "");
|
let entityFielName = ctx.helper.caseStyle(entityClassName);
|
|
try {
|
// 主表数据处理
|
let entityPath = `../entity/${body.folder}/` + entityFielName;
|
let module = await import(entityPath);
|
let entity = module[entityClassName];
|
let masterRep = this.dbWrite.getRepository(entity);
|
|
if (!isObject(body.where)) {
|
return;
|
}
|
|
let dataList: Array<any> = await masterRep.find(body.where);
|
for (let dataInfo of dataList) {
|
dataInfo[body.idField] = 0;
|
|
// 处理明细表
|
let detailTableList = body.detailTableList;
|
if (detailTableList) {
|
for (const item of detailTableList) {
|
// 明细表数据处理
|
let detailClassName = item.subTableView.replace(/_/g, "");
|
let entityDetaillName = ctx.helper.caseStyle(detailClassName);
|
entityPath = `../entity/${body.folder}/` + entityDetaillName;
|
let module = await import(entityPath);
|
let detailEntity = module[detailClassName];
|
let detailRep = this.dbWrite.getRepository(detailEntity);
|
let details = await detailRep.find(body.where);
|
dataInfo[entityDetaillName] = details;
|
}
|
}
|
|
// 获得自动编码
|
if (body.codeRegular) {
|
dataInfo[body.codeRegular] = await ctx.service.common.getCodeRegular(body.menu_Id);
|
}
|
// 设置账套信息
|
let colInfo = masterRep.metadata.columns.find(item => item.databaseName === "userProduct_Id");
|
if (colInfo) {
|
dataInfo = Object.assign(dataInfo, {
|
userProduct_Id: userInfo.userProduct_Id,
|
userProductCode: userInfo.userProductCode,
|
userProductAlias: userInfo.userProductAlias
|
});
|
// 设置新建id为null;
|
dataInfo[body.idField] = null;
|
}
|
// 设置新建信息
|
colInfo = masterRep.metadata.columns.find(item => item.databaseName === "createID");
|
if (colInfo && !dataInfo[body.idField]) {
|
dataInfo = Object.assign(dataInfo, {
|
createID: userInfo.user_Id,
|
creator: userInfo.userTrueName,
|
createDate: new Date()
|
});
|
}
|
// 设置修改信息
|
colInfo = masterRep.metadata.columns.find(item => item.databaseName === "modifyID");
|
if (colInfo && dataInfo[body.idField]) {
|
dataInfo = Object.assign(dataInfo, {
|
modifyID: userInfo.user_Id,
|
modifier: userInfo.userTrueName,
|
modifyDate: new Date()
|
});
|
}
|
// 复制前事件
|
if (body.folder) {
|
let folderNames = body.folder.split("/");
|
let folderName = ctx.helper.caseStyle(folderNames[0]);
|
let serviceNames = tableName.split("_");
|
let serviceName = ctx.helper.caseStyle(serviceNames[serviceNames.length - 1]);
|
let namespace = ctx.service[folderName];
|
if (namespace) {
|
let serviceInstance = namespace[serviceName];
|
if (serviceInstance && serviceInstance.onCopyBefore) {
|
this.info = await serviceInstance.onCopyBefore(dataInfo);
|
if (this.info.result === false) {
|
ctx.body = this.info;
|
return;
|
}
|
}
|
}
|
}
|
|
// 保存数据
|
await masterRep.insert(dataInfo);
|
|
// 保存明细表
|
if (detailTableList) {
|
for (const item of detailTableList) {
|
// 明细表数据处理
|
let detailClassName = item.subTableView.replace(/_/g, "");
|
let entityDetaillName = ctx.helper.caseStyle(detailClassName);
|
entityPath = `../entity/${body.folder}/` + entityDetaillName;
|
let module = await import(entityPath);
|
let detailEntity = module[detailClassName];
|
let detailRep = this.dbWrite.getRepository(detailEntity);
|
let where = {};
|
where[body.idField] = body.idValue;
|
let details = dataInfo[entityDetaillName];
|
|
// 明细表主键信息,此信息查出的主键信息的字段首字母均为大写与实体库首字母不一致,需要进行首字母转换
|
let detailKeyInfo = await this.dbRead.findOne(SysMvcTableColumn, {
|
tableView: item.subTableView,
|
fieldAttribute: "Key"
|
});
|
let detailKey = detailKeyInfo.columnName;
|
// 将查到的明细主表id首字母小写
|
let detailKeyname = detailKey.charAt(0).toLowerCase() + detailKey.slice(1);
|
for (let detailRow of details) {
|
// 设置主键值
|
detailRow[body.idField] = dataInfo[body.idField];
|
if (detailRow[detailKeyname]) {
|
// 将明细表主键清空
|
detailRow[detailKeyname] = 0;
|
}
|
await detailRep.insert(detailRow);
|
}
|
}
|
}
|
|
// 复制后事件
|
if (body.folder) {
|
let folderNames = body.folder.split("/");
|
let folderName = ctx.helper.caseStyle(folderNames[0]);
|
let serviceNames = tableName.split("_");
|
let serviceName = ctx.helper.caseStyle(serviceNames[serviceNames.length - 1]);
|
let namespace = ctx.service[folderName];
|
if (namespace) {
|
let serviceInstance = namespace[serviceName];
|
if (serviceInstance && serviceInstance.onCopyAfter) {
|
await serviceInstance.onCopyAfter(dataInfo);
|
}
|
}
|
}
|
}
|
|
this.info.result = true;
|
this.info.msg = "复制成功";
|
this.info.data = dataList;
|
} catch (error) {
|
console.log("复制错误:" + error.message);
|
this.info.result = false;
|
this.info.msg = "复制失败:" + error.message;
|
}
|
|
ctx.body = this.info;
|
}
|
//#endregion
|
//#region uploadSingleFile 通用单上传文件
|
/**
|
* uploadSingleFile 通用单上传文件
|
*/
|
@Post()
|
public async uploadSingleFile() {
|
let { ctx } = this;
|
let rootPath = path.resolve();
|
let uploadPath = rootPath + path.sep + "upload";
|
let url: string, fileName: string, writePath: string;
|
url = "/upload/";
|
// 子文件夹
|
let subfolder = this.body.subfolder;
|
if (ctx.header.subfolder) {
|
subfolder = ctx.header.subfolder;
|
}
|
if (subfolder) {
|
uploadPath += path.sep + subfolder;
|
url += subfolder + "/";
|
}
|
|
try {
|
ctx.helper.deldir(uploadPath, 500000);
|
ctx.helper.mkdir(uploadPath);
|
// file not required
|
const stream = await ctx.getFileStream({ requireFile: false });
|
if (stream.filename) {
|
fileName = new Date().getTime() + stream.filename;
|
url += fileName;
|
writePath = uploadPath + `${path.sep}${fileName}`;
|
let writeStrem = fs.createWriteStream(writePath);
|
await stream.pipe(writeStrem);
|
} else {
|
const sendToWormhole = require("stream-wormhole");
|
// must consume the empty stream
|
await sendToWormhole(stream);
|
}
|
|
this.info.result = true;
|
this.info.statusCode = 200;
|
this.info.msg = "上传成功";
|
this.info.data = {
|
fileName: fileName,
|
imageType: "接口上传Stream",
|
localPath: writePath,
|
url: url
|
};
|
} catch (error) {
|
this.info.result = false;
|
this.info.statusCode = 500;
|
this.info.msg = "上传失败:" + error.message;
|
}
|
|
ctx.body = this.info;
|
}
|
//#endregion
|
|
//#region uploadMultiFile 通用多上传文件
|
/**
|
* uploadMultiFile 通用多上传文件
|
*/
|
@Post()
|
public async uploadMultiFile() {
|
let { ctx } = this;
|
let rootPath = path.resolve();
|
let uploadPath = rootPath + path.sep + "upload";
|
ctx.helper.mkdir(uploadPath);
|
|
const parts = ctx.multipart();
|
let part;
|
while ((part = await parts()) != null) {
|
if (part.length) {
|
// 处理其他参数
|
} else {
|
if (!part.filename) {
|
continue;
|
}
|
// otherwise, it's a stream
|
let writePath = uploadPath + `${path.sep}${new Date().getTime() + part.filename}`;
|
let writeStrem = fs.createWriteStream(writePath);
|
await part.pipe(writeStrem);
|
}
|
}
|
}
|
//#endregion
|
//#region uploadAliyun 通用单上传文件到阿里云
|
/**
|
* uploadAliyun 通用单上传文件到阿里云
|
*/
|
@Post()
|
public async uploadAliyun() {
|
let { ctx } = this;
|
let rootPath = path.resolve();
|
let uploadPath = rootPath + path.sep + "upload";
|
let url: string, fileName: string, writePath: string;
|
url = "/upload/";
|
// 子文件夹
|
let subfolder = this.body.subfolder;
|
if (ctx.header.subfolder) {
|
subfolder = ctx.header.subfolder;
|
}
|
if (subfolder) {
|
uploadPath += path.sep + subfolder;
|
url += subfolder + "/";
|
}
|
try {
|
ctx.helper.mkdir(uploadPath);
|
// file not required
|
const stream = await ctx.getFileStream({ requireFile: false });
|
if (stream.filename) {
|
fileName = new Date().getTime() + stream.filename;
|
url += fileName;
|
writePath = uploadPath + `${path.sep}${fileName}`;
|
let writeStrem = fs.createWriteStream(writePath);
|
await stream.pipe(writeStrem);
|
|
// 上传至阿里云
|
let aliPath = "upload/print/" + fileName;
|
let uploadResult = await aliOSSUpload(ctx, writePath, aliPath);
|
if (uploadResult.result) {
|
url = "/" + aliPath;
|
} else {
|
this.info.result = false;
|
this.info.statusCode = 500;
|
this.info.msg = "上传失败:" + uploadResult.msg;
|
ctx.body = this.info;
|
return;
|
}
|
fs.unlinkSync(writePath);
|
} else {
|
const sendToWormhole = require("stream-wormhole");
|
// must consume the empty stream
|
await sendToWormhole(stream);
|
}
|
|
this.info.result = true;
|
this.info.statusCode = 200;
|
this.info.msg = "上传成功";
|
this.info.data = {
|
fileName: fileName,
|
imageType: "接口上传Stream",
|
LocalPath: writePath,
|
url: url
|
};
|
} catch (error) {
|
this.info.result = false;
|
this.info.statusCode = 500;
|
this.info.msg = "上传失败:" + error.message;
|
}
|
|
ctx.body = this.info;
|
}
|
//#endregion
|
|
//#region getUploadMsg 获取上传消息
|
/**
|
* getUploadMsg 获取上传消息
|
*/
|
@Post()
|
public async getUploadMsg() {
|
let { ctx } = this;
|
let body = ctx.body;
|
let redis = ctx.app.redis.clients.get("common"); // 将消息放入redis缓存
|
if (!body.key) {
|
this.info.result = false;
|
this.info.data = ["消息key不存在"];
|
}
|
|
try {
|
let msgList: Array<string> = [];
|
for (let i = 0; i < 10; i++) {
|
let msg = await redis.lpop(body.key);
|
if (msg) msgList.push(msg);
|
}
|
this.info.result = true;
|
this.info.data = msgList;
|
} catch (error) {
|
this.info.result = false;
|
this.info.statusCode = 500;
|
this.info.data = ["获取消息失败:" + error.message];
|
}
|
|
ctx.body = this.info;
|
}
|
//#endregion
|
|
//#region download 下载文件
|
/**
|
* download 获取上传消息
|
*/
|
@Get()
|
public async download() {
|
let { ctx } = this;
|
|
if (!ctx.query.url) {
|
ctx.body = "路径参数不正确";
|
return;
|
}
|
|
let root = path.resolve();
|
let url = ctx.query.url;
|
let fileName = root + url.replace(/\//g, path.sep);
|
if (!fs.existsSync(fileName)) {
|
ctx.body = "文件不存在";
|
ctx.res.end();
|
return;
|
}
|
|
ctx.response.attachment(fileName);
|
// ctx.response.type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
|
let data = fs.readFileSync(fileName);
|
// ctx.set("Content-disposition", "attachment;filename=" + fileName);
|
ctx.body = data;
|
ctx.status = 200;
|
}
|
//#endregion
|
}
|