import { AMModelManager } from "./modelmanager"; import { AmUtil } from "./util"; import {AMProp} from "./types"; import * as fsMdl from 'fs'; import * as pathMdl from 'path'; export class AMDataTypeGenerator{ /** * 基础存储路径 */ private baseSavePath:string; /** * dataconfig对象 * { * cond:{entity,id,showName,fields} * status:[{entity,id,showName}] * datas:[{entity,id,showName,status,fields}] * } */ private dataConfig:any; /** * 构造器 * @param savePath 元数据存储路径 */ constructor(savePath:string){ this.baseSavePath = savePath; //目录不存在则创建目录 if(!fsMdl.existsSync(savePath)){ fsMdl.mkdirSync(savePath,{recursive:true}); } } /** * 创建元数据 */ public genData(){ //数据实体名数组 let dataEntities:string[] = []; // 数据模型数组 let dataModels:any[] = []; //条件模型类 let condCls; //条件对象 let condObj; let statusArr = []; let dataTypeArr = []; for(let [name,cls] of AMModelManager.modelMap){ if(cls.isCond){ //条件模型 let id = AMModelManager.getIdProp(name); condObj = {entity:cls.ref,id:id.name,showName:cls.showName,fields:this.getCondFields(cls)}; condCls = cls; }else if(cls.isData) { dataEntities.push(cls.ref); dataModels.push(cls); this.getTypeCfg(cls,statusArr,dataTypeArr); this.genDataGrid(cls); } } //保存dataconfig this.genDataConfig(condObj,statusArr,dataTypeArr); this.genStateConfig(statusArr,dataTypeArr); this.genImport(condCls); this.genDetail(); // this.genOrgMode(condCls); this.genCondGrid(); } /** * 产生条件字段 * @param cls cond class * @returns */ private getCondFields(cls){ let fields = ['*']; for(let prop of cls.props){ if(prop.ref){ let f = prop.ref.substring(3); f = f.substring(0,1).toLowerCase() + f.substring(1); fields.push(f + '.*'); } } //添加 数据import fields.push("amDataImport.amUser.*"); return fields; } /** * 生成状态、数据配置 * @param cls data类 * @param statusArr 状态数组 * @param typeArr 数据类型数组 * @returns {cls:条件实体model类,prop:属性名} */ private getTypeCfg(cls,statusArr,typeArr):any{ let arr:{en:string,zh:string,type:string,width:number}[] = []; let statusName; for(let prop of cls.props){ //不生成id属性 if(prop.isId){ continue; } if(prop.ref){ //状态 const cls1 = AMModelManager.getModel(prop.ref); if(cls1.isCond){ continue; } const id = AMModelManager.getIdProp(cls1.name); cls1.isStatus = true; statusName = cls1.ref; if(!statusArr.find(item=>item.entity === cls1.ref)){ statusArr.push({entity:cls1.ref,id:id.name,showName:cls1.showName,fields:this.getStatusFields(cls1)}); //生成state grid this.genStatusGrid(cls1); } }else if(AmUtil.getTsType(prop.type) === 'number'){ arr.push({en:prop.name,zh:prop.showName,type:prop.type,width:prop.width}); } } //数据类型id const id = AMModelManager.getIdProp(cls.name); //添加到数据类型数组 typeArr.push({entity:cls.ref,id:id.name,showName:cls.showName,status:statusName,fields:arr}); } /** * 获取状态非引用字段 * @param cls 状态类 * @returns */ private getStatusFields(cls){ let arr:{en:string,zh:string,type:string,width:number}[] = []; for(let prop of cls.props){ if(prop.ref || prop.isId){ continue; } arr.push({en:prop.name,zh:prop.showName,type:prop.type,width:prop.width}); } return arr; } /** * 创建数据config对象 * @param cond 条件 * @param status 状态数组 * @param type 数据类型数组 */ private genDataConfig(cond,status,type){ //写dataconfig文件 const prettier = require('prettier'); this.dataConfig = { cond:cond, status:status, datas:type } //美化 let str = prettier.format('export const __AmDataConfig = ' + JSON.stringify(this.dataConfig),{tabWidth: 4, parser: "typescript",trailingComma:'none'}); //写文件 fsMdl.writeFileSync(pathMdl.resolve(this.baseSavePath,'__amdataconfig.js'), str); fsMdl.writeFileSync(pathMdl.resolve(this.baseSavePath,'__amdataconfig.ts'), str); } /** * 创建导入配置 * @returns */ private genImport(condCls):any{ //曲线轴坐标数据 if(!condCls){ return; } //放到其它参数中的条件字段串 let otherFields:string[] = []; //条件非外键字段 let condFields:string[] = []; //grid模块属组 let gridArr:{title:string,cls:string}[] = []; // 表格外键条件属组 let gridConds = {}; for(let prop of condCls.props){ if(!prop.editable){ continue; } if(!prop.ref){ otherFields.push(this.genInputStr(prop)); condFields.push(prop.name); }else{ //外键 const cls1 = AMModelManager.getModel(prop.ref); if(cls1){ gridArr.push({ title: cls1.showName, cls:cls1.ref }); gridConds[`M${prop.ref.substring(3)}Grid`] = { title:prop.showName, field:`${prop.name}.${AMModelManager.getIdProp(prop.ref).name}`, notNull:prop.validator&&prop.validator.includes('require') } } } } //外键字段,需要传给baseimport gridConds['MAmImportTemplateGrid'] = { title:'导入模版', field:'amImportTemplate.importTemplateId', notNull:true } //添加导入模版 gridArr.push({title:'导入模版',cls:'AmImportTemplate'}); //import 串 let importStr = ''; //表格相关模版串 let gridTmpStr = ''; let moduleArr:string[] = []; for(let g of gridArr){ importStr += `import{M${g.cls}Grid} from '../../${g.cls.toLowerCase()}/${g.cls.toLowerCase()}grid.js';`; gridTmpStr += `
${g.title}
` moduleArr.push('M' + g.cls + 'Grid'); } let template = `
${gridTmpStr}
其它信息
${otherFields.join('\r\n')}