【更新】代码生成增强,生成到插件与模块可配置,新增及编辑加入事务注解

pull/86/head
小诺 2023-02-23 00:55:02 +08:00 committed by 俞宝山
parent 08e70171bc
commit e11abd1f9a
14 changed files with 352 additions and 2162 deletions

View File

@ -413,6 +413,7 @@ body,
.index-message-list, .index-message-list,
.ant-picker-time-panel-column, .ant-picker-time-panel-column,
.timeline-div, .timeline-div,
.gen-preview-content,
.adminui-main{ .adminui-main{
&::-webkit-scrollbar { &::-webkit-scrollbar {

View File

@ -27,11 +27,14 @@
</a-col> </a-col>
<a-col :span="8"> <a-col :span="8">
<a-form-item label="表前缀移除:" name="tablePrefix"> <a-form-item label="表前缀移除:" name="tablePrefix">
<a-radio-group v-model:value="formData.tablePrefix" :options="tablePrefixOptions" @change="tablePrefixChange"> </a-radio-group> <a-radio-group
v-model:value="formData.tablePrefix"
:options="tablePrefixOptions"
@change="tablePrefixChange"
>
</a-radio-group>
</a-form-item> </a-form-item>
</a-col> </a-col>
</a-row>
<a-row :gutter="16">
<a-col :span="8"> <a-col :span="8">
<a-form-item label="生成方式:" name="generateType"> <a-form-item label="生成方式:" name="generateType">
<a-radio-group v-model:value="formData.generateType" :options="generateTypeOptions"> </a-radio-group> <a-radio-group v-model:value="formData.generateType" :options="generateTypeOptions"> </a-radio-group>
@ -69,15 +72,51 @@
></a-tree-select> ></a-tree-select>
</a-form-item> </a-form-item>
</a-col> </a-col>
</a-row> <a-col :span="8">
<a-row :gutter="16"> <a-form-item name="pluginName">
<template #label>
<a-tooltip>
<template #title>
不想吧代码生成到本框架指定插件名称下可以新建一个plugin模块并这里改为新的名字
</template>
<question-circle-outlined />
</a-tooltip>
&nbsp 插件名
</template>
<a-input v-model:value="formData.pluginName" placeholder="请输入插件名" allow-clear />
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="包名:" name="packageName">
<a-input v-model:value="formData.packageName" placeholder="请输入包名" allow-clear />
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item name="moduleName">
<template #label>
<a-tooltip>
<template #title> 代码模块名就是包名后面的代码包例如vip.xiaonuo.**代表此模块名 </template>
<question-circle-outlined />
</a-tooltip>
&nbsp 模块名
</template>
<a-input v-model:value="formData.moduleName" placeholder="请输入模块名" allow-clear />
</a-form-item>
</a-col>
<a-col :span="8"> <a-col :span="8">
<a-form-item label="功能名:" name="functionName"> <a-form-item label="功能名:" name="functionName">
<a-input v-model:value="formData.functionName" placeholder="请输入功能名" allow-clear /> <a-input v-model:value="formData.functionName" placeholder="请输入功能名" allow-clear />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :span="8"> <a-col :span="8">
<a-form-item label="业务名:" name="busName"> <a-form-item name="busName">
<template #label>
<a-tooltip>
<template #title> 业务名是代码生成后存放controllerservice等代码的文件夹名称 </template>
<question-circle-outlined />
</a-tooltip>
&nbsp 业务名
</template>
<a-input v-model:value="formData.busName" placeholder="请输入业务名" allow-clear /> <a-input v-model:value="formData.busName" placeholder="请输入业务名" allow-clear />
</a-form-item> </a-form-item>
</a-col> </a-col>
@ -86,15 +125,32 @@
<a-input v-model:value="formData.className" placeholder="请输入类名" allow-clear /> <a-input v-model:value="formData.className" placeholder="请输入类名" allow-clear />
</a-form-item> </a-form-item>
</a-col> </a-col>
</a-row>
<a-row :gutter="16">
<a-col :span="8"> <a-col :span="8">
<a-form-item label="表单布局:" name="formLayout"> <a-form-item label="作者:" name="authorName">
<a-input v-model:value="formData.authorName" placeholder="请输入作者名" allow-clear />
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item name="formLayout">
<template #label>
<a-tooltip>
<template #title> 垂直选项生成出来的前端表单代码为名称跟输入框是上下两行反之水平则是一行 </template>
<question-circle-outlined />
</a-tooltip>
&nbsp 表单布局
</template>
<a-radio-group v-model:value="formData.formLayout" :options="formLayoutOptions" /> <a-radio-group v-model:value="formData.formLayout" :options="formLayoutOptions" />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :span="8"> <a-col :span="8">
<a-form-item label="使用栅格:" name="gridWhether"> <a-form-item name="gridWhether">
<template #label>
<a-tooltip>
<template #title> 如果使用了栅格配置即生成出来的前端代码表单是一排两列并非一排一列 </template>
<question-circle-outlined />
</a-tooltip>
&nbsp 使用栅格
</template>
<a-radio-group v-model:value="formData.gridWhether" :options="gridWhetherOptions" /> <a-radio-group v-model:value="formData.gridWhether" :options="gridWhetherOptions" />
</a-form-item> </a-form-item>
</a-col> </a-col>
@ -104,18 +160,6 @@
</a-form-item> </a-form-item>
</a-col> </a-col>
</a-row> </a-row>
<a-row :gutter="16">
<a-col :span="8">
<a-form-item label="作者:" name="authorName">
<a-input v-model:value="formData.authorName" placeholder="请输入作者名" allow-clear />
</a-form-item>
</a-col>
<a-col :span="8" v-if="formData.generateType === 'ZIP'">
<a-form-item label="包名:" name="packageName">
<a-input v-model:value="formData.packageName" placeholder="请输入包名" allow-clear />
</a-form-item>
</a-col>
</a-row>
</a-form> </a-form>
</a-card> </a-card>
</template> </template>
@ -171,7 +215,7 @@
{ {
label: '不使用', label: '不使用',
value: 'N' value: 'N'
}, }
]) ])
// //
const onOpen = (record) => { const onOpen = (record) => {
@ -197,21 +241,26 @@
id: record.id id: record.id
} }
submitLoading.value = true submitLoading.value = true
genBasicApi.basicDetail(params).then((data) => { genBasicApi
.basicDetail(params)
.then((data) => {
formData.value = data formData.value = data
// //
selectTableColumnsData(data.dbTable, true) selectTableColumnsData(data.dbTable, true)
// //
moduleChange(data.module, true) moduleChange(data.module, true)
}).finally(() => { })
.finally(() => {
submitLoading.value = false submitLoading.value = false
}) })
} else { } else {
formData.value = { formData.value = {
pluginName: 'snowy-plugin-biz',
packageName: 'vip.xiaonuo',
moduleName: 'biz',
sortCode: 99, sortCode: 99,
tablePrefix: 'Y', tablePrefix: 'Y',
generateType: 'ZIP', generateType: 'ZIP',
packageName: 'vip.xiaonuo',
formLayout: 'vertical', formLayout: 'vertical',
gridWhether: 'N' gridWhether: 'N'
} }
@ -220,6 +269,8 @@
} }
// //
const formRules = { const formRules = {
pluginName: [required('请输入插件名')],
moduleName: [required('请输入模块名')],
tablePrefix: [required('请选择是否移除表前缀')], tablePrefix: [required('请选择是否移除表前缀')],
dbTable: [required('请选择主表')], dbTable: [required('请选择主表')],
dbTableKey: [required('请选择主表主键')], dbTableKey: [required('请选择主表主键')],
@ -345,12 +396,16 @@
.validate() .validate()
.then(() => { .then(() => {
submitLoading.value = true submitLoading.value = true
genBasicApi.submitForm(formData.value, !formData.value.id).then((data) => { genBasicApi
.submitForm(formData.value, !formData.value.id)
.then((data) => {
resolve(data) resolve(data)
}).finally(() => { })
.finally(() => {
submitLoading.value = false submitLoading.value = false
}) })
}).catch((err) => { })
.catch((err) => {
reject(err) reject(err)
}) })
}) })

View File

@ -33,10 +33,7 @@
</template> </template>
<template v-if="column.dataIndex === 'dictTypeCode'"> <template v-if="column.dataIndex === 'dictTypeCode'">
<a-select <a-select
v-if=" v-if="record.effectType === 'radio' || record.effectType === 'select' || record.effectType === 'checkbox'"
record.effectType === 'radio' ||
record.effectType === 'select' ||
record.effectType === 'checkbox'"
style="width: 100%" style="width: 100%"
v-model:value="record.dictTypeCode" v-model:value="record.dictTypeCode"
:options="dictTypeCodeOptions" :options="dictTypeCodeOptions"
@ -54,7 +51,10 @@
<a-checkbox v-model:checked="record.whetherAddUpdate" :disabled="toFieldEstimate(record)" /> <a-checkbox v-model:checked="record.whetherAddUpdate" :disabled="toFieldEstimate(record)" />
</template> </template>
<template v-if="column.dataIndex === 'whetherRequired'"> <template v-if="column.dataIndex === 'whetherRequired'">
<a-checkbox v-model:checked="record.whetherRequired" :disabled="toFieldEstimate(record) || !record.whetherAddUpdate" /> <a-checkbox
v-model:checked="record.whetherRequired"
:disabled="toFieldEstimate(record) || !record.whetherAddUpdate"
/>
</template> </template>
<template v-if="column.dataIndex === 'queryWhether'"> <template v-if="column.dataIndex === 'queryWhether'">
<a-switch v-model:checked="record.queryWhether" :disabled="!record.whetherTable" /> <a-switch v-model:checked="record.queryWhether" :disabled="!record.whetherTable" />
@ -77,7 +77,7 @@
<script setup name="genConfig"> <script setup name="genConfig">
import tool from '@/utils/tool' import tool from '@/utils/tool'
import genConfigApi from "@/api/gen/genConfigApi"; import genConfigApi from '@/api/gen/genConfigApi'
import { cloneDeep } from 'lodash-es' import { cloneDeep } from 'lodash-es'
const table = ref() const table = ref()
@ -169,7 +169,7 @@
parameter.basicId = recordData.value.id parameter.basicId = recordData.value.id
return genConfigApi.configList(parameter).then((data) => { return genConfigApi.configList(parameter).then((data) => {
tableData.value = JSON.parse(JSON.stringify(data)) tableData.value = JSON.parse(JSON.stringify(data))
let deleteIndex = []; let deleteIndex = []
tableData.value.forEach((item, index) => { tableData.value.forEach((item, index) => {
for (const key in item) { for (const key in item) {
if (item[key] === 'Y') { if (item[key] === 'Y') {
@ -239,7 +239,7 @@
{ {
label: 'BigDecimal', label: 'BigDecimal',
value: 'BigDecimal' value: 'BigDecimal'
}, }
]) ])
// //
const effectTypeOptions = ref([ const effectTypeOptions = ref([
@ -324,20 +324,24 @@
]) ])
const emit = defineEmits({ successful: null }, { close: null }) const emit = defineEmits({ successful: null }, { close: null })
const toFieldEstimate = (data) => { const toFieldEstimate = (data) => {
if (data.fieldName.toLowerCase().indexOf('create_user') > -1 || if (
data.fieldName.toLowerCase().indexOf('create_user') > -1 ||
data.fieldName.toLowerCase().indexOf('create_time') > -1 || data.fieldName.toLowerCase().indexOf('create_time') > -1 ||
data.fieldName.toLowerCase().indexOf('update_user') > -1 || data.fieldName.toLowerCase().indexOf('update_user') > -1 ||
data.fieldName.toLowerCase().indexOf('update_time') > -1 || data.fieldName.toLowerCase().indexOf('update_time') > -1 ||
data.fieldName.toLowerCase().indexOf('delete_flag') > -1 || data.fieldName.toLowerCase().indexOf('delete_flag') > -1 ||
data.isTableKey === true) { data.isTableKey === true
) {
return true return true
} }
return false return false
} }
// //
const toCommonFieldEstimate = (record) => { const toCommonFieldEstimate = (record) => {
if (record.fieldName.toLowerCase().indexOf('create_user') > -1 || if (
record.fieldName.toLowerCase().indexOf('update_user') > -1 ) { record.fieldName.toLowerCase().indexOf('create_user') > -1 ||
record.fieldName.toLowerCase().indexOf('update_user') > -1
) {
return true return true
} }
return false return false
@ -358,8 +362,8 @@
// //
const onSubmit = (recordData) => { const onSubmit = (recordData) => {
let submitParam = cloneDeep(tableData.value) let submitParam = cloneDeep(tableData.value)
let errStatus = 100; let errStatus = 100
submitParam.forEach(item => { submitParam.forEach((item) => {
// //
for (const key in item) { for (const key in item) {
if (item[key] === true) { if (item[key] === true) {
@ -375,9 +379,10 @@
errStatus++ errStatus++
} }
} }
if ((item.effectType === 'select' || if (
item.effectType === 'radio' || (item.effectType === 'select' || item.effectType === 'radio' || item.effectType === 'checkbox') &&
item.effectType === 'checkbox') && !item.dictTypeCode) { !item.dictTypeCode
) {
errStatus++ errStatus++
} }
}) })
@ -386,9 +391,12 @@
reject('校验失败,请选择对应的下拉框选项') reject('校验失败,请选择对应的下拉框选项')
return return
} }
genConfigApi.configEditBatch(submitParam).then((data) => { genConfigApi
.configEditBatch(submitParam)
.then((data) => {
resolve(data) resolve(data)
}).catch((err) => { })
.catch((err) => {
reject(err) reject(err)
}) })
}) })

View File

@ -14,9 +14,21 @@
<template #operator class="table-operator"> <template #operator class="table-operator">
<a-space> <a-space>
<a-button type="primary" @click="openConfig()"> <a-button type="primary" @click="openConfig()">
<template #icon><plus-outlined /></template>
新建 新建
</a-button> </a-button>
<a-button danger @click="deleteBatchCodeGen()"></a-button>
<a-popconfirm
title="删除此信息?"
:visible="deleteVisible"
@visibleChange="deleteVisibleChange"
@confirm="deleteBatchCodeGen"
>
<a-button type="danger">
<template #icon><delete-outlined /></template>
删除
</a-button>
</a-popconfirm>
</a-space> </a-space>
</template> </template>
<template #bodyCell="{ column, record }"> <template #bodyCell="{ column, record }">
@ -35,7 +47,7 @@
<a-divider type="vertical" /> <a-divider type="vertical" />
<a @click="openConfig(record)"></a> <a @click="openConfig(record)"></a>
<a-divider type="vertical" /> <a-divider type="vertical" />
<a-popconfirm title="删除此信息?" @confirm="deleteCodeGen(record)"> <a-popconfirm title="删除此信息?" placement="topRight" @confirm="deleteCodeGen(record)">
<a-button type="link" danger size="small">删除</a-button> <a-button type="link" danger size="small">删除</a-button>
</a-popconfirm> </a-popconfirm>
</template> </template>
@ -56,6 +68,7 @@
const indexShow = ref(true) const indexShow = ref(true)
const stepsRef = ref() const stepsRef = ref()
const genPreviewRef = ref() const genPreviewRef = ref()
const deleteVisible = ref(false)
const columns = [ const columns = [
{ {
@ -160,16 +173,16 @@
} else { } else {
// //
genBasicApi.basicExecGenBiz(param).then((res) => { genBasicApi.basicExecGenBiz(param).then((res) => {
const blob = new Blob([res.data],{type: 'application/octet-stream;charset=UTF-8'}); const blob = new Blob([res.data], { type: 'application/octet-stream;charset=UTF-8' })
const contentDisposition = res.headers['content-disposition'] const contentDisposition = res.headers['content-disposition']
const patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*') const patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*')
const $link = document.createElement("a"); const $link = document.createElement('a')
$link.href = URL.createObjectURL(blob); $link.href = URL.createObjectURL(blob)
$link.download = decodeURIComponent(patt.exec(contentDisposition)[1]) $link.download = decodeURIComponent(patt.exec(contentDisposition)[1])
$link.click(); $link.click()
document.body.appendChild($link); document.body.appendChild($link)
document.body.removeChild($link); // document.body.removeChild($link) //
window.URL.revokeObjectURL($link.href); // blob window.URL.revokeObjectURL($link.href) // blob
}) })
} }
} }
@ -184,12 +197,22 @@
table.value.refresh() table.value.refresh()
}) })
} }
// //
const deleteBatchCodeGen = () => { const deleteVisibleChange = () => {
if (selectedRowKeys.value.length < 1) { if (deleteVisible.value) {
message.warning('请选择一条或多条数据') deleteVisible.value = false
return false return false
} }
if (selectedRowKeys.value.length < 1) {
message.warning('请选择一条或多条数据')
deleteVisible.value = false
return false
} else {
deleteVisible.value = true
}
}
//
const deleteBatchCodeGen = () => {
const params = selectedRowKeys.value.map((m) => { const params = selectedRowKeys.value.map((m) => {
return { return {
id: m id: m

View File

@ -9,11 +9,16 @@
> >
<a-spin :spinning="loadingSpinning"> <a-spin :spinning="loadingSpinning">
<a-tabs v-model:activeKey="codeTypeActiveKey" @change="codeTypeChange"> <a-tabs v-model:activeKey="codeTypeActiveKey" @change="codeTypeChange">
<a-tab-pane v-for="codeType in codeTypeArray" :key="codeType.codeTypeKey" :tab="codeType.codeTypeTitle" force-render> <a-tab-pane
v-for="codeType in codeTypeArray"
:key="codeType.codeTypeKey"
:tab="codeType.codeTypeTitle"
force-render
>
<a-tabs v-model:activeKey="typeListActiveKey" tab-position="left" hide-add type="card"> <a-tabs v-model:activeKey="typeListActiveKey" tab-position="left" hide-add type="card">
<a-tab-pane v-for="pan in codeType.codeTypeList" :key="pan.codeFileName" :tab="pan.codeFileName"> <a-tab-pane v-for="pan in codeType.codeTypeList" :key="pan.codeFileName" :tab="pan.codeFileName">
<div style="height: calc(100vh - 160px); overflow: auto"> <div class="gen-preview-content">
<a-textarea ref="textareaRef" v-model:value="pan.codeFileContent" :autoSize="true" /> <XnHighlightjs :code="pan.codeFileContent" />
</div> </div>
</a-tab-pane> </a-tab-pane>
</a-tabs> </a-tabs>
@ -39,7 +44,9 @@
const param = { const param = {
id: record.id id: record.id
} }
genBasicApi.basicPreviewGen(param).then((data) => { genBasicApi
.basicPreviewGen(param)
.then((data) => {
if (data) { if (data) {
codeTypeArray.value = [ codeTypeArray.value = [
{ {
@ -61,7 +68,8 @@
} else { } else {
message.warning('预览失败:请检查问题或反馈小诺官方') message.warning('预览失败:请检查问题或反馈小诺官方')
} }
}).finally(() => { })
.finally(() => {
loadingSpinning.value = false loadingSpinning.value = false
}) })
} }
@ -77,3 +85,9 @@
onOpen onOpen
}) })
</script> </script>
<style type="less" scoped>
.gen-preview-content {
height: calc(100vh - 160px);
overflow: auto;
}
</style>

View File

@ -12,9 +12,7 @@
<div style="float: right"> <div style="float: right">
<a-button :disabled="current === 0" style="margin-left: 8px" @click="prev"> </a-button> <a-button :disabled="current === 0" style="margin-left: 8px" @click="prev"> </a-button>
<a-button :disabled="current === 2" type="primary" style="margin-left: 8px" @click="next"> </a-button> <a-button :disabled="current === 2" type="primary" style="margin-left: 8px" @click="next"> </a-button>
<a-button type="primary" danger ghost style="margin-left: 8px" @click="emit('closed')"> <a-button type="primary" danger ghost style="margin-left: 8px" @click="emit('closed')"> </a-button>
关闭
</a-button>
</div> </div>
</a-col> </a-col>
</a-row> </a-row>
@ -31,7 +29,9 @@
<a-result status="success" title="操作成功" sub-title=""> <a-result status="success" title="操作成功" sub-title="">
<template #extra> <template #extra>
<a-space size="middle"> <a-space size="middle">
<a-button v-if="current > 0" style="margin-left: 8px" @click="genPreviewRef.onOpen(recordData)"></a-button> <a-button v-if="current > 0" style="margin-left: 8px" @click="genPreviewRef.onOpen(recordData)"
>预览</a-button
>
<a-button <a-button
v-if="current === steps.length - 1" v-if="current === steps.length - 1"
type="primary" type="primary"
@ -52,7 +52,7 @@
import basic from './basic.vue' import basic from './basic.vue'
import config from './config.vue' import config from './config.vue'
import genPreview from './preview.vue' import genPreview from './preview.vue'
import genBasicApi from "@/api/gen/genBasicApi"; import genBasicApi from '@/api/gen/genBasicApi'
const emit = defineEmits({ closed: null }) const emit = defineEmits({ closed: null })
const current = ref(0) const current = ref(0)
@ -80,9 +80,12 @@
current.value-- current.value--
} }
if (current.value === 2) { if (current.value === 2) {
configRef.value.onSubmit(recordData.value).then((data) => { configRef.value
.onSubmit(recordData.value)
.then((data) => {
current.value++ current.value++
}).catch((err) => { })
.catch((err) => {
message.warning(err) message.warning(err)
}) })
current.value-- current.value--
@ -130,16 +133,16 @@
} else { } else {
// //
genBasicApi.basicExecGenBiz(param).then((res) => { genBasicApi.basicExecGenBiz(param).then((res) => {
const blob = new Blob([res.data],{type: 'application/octet-stream;charset=UTF-8'}); const blob = new Blob([res.data], { type: 'application/octet-stream;charset=UTF-8' })
const contentDisposition = res.headers['content-disposition'] const contentDisposition = res.headers['content-disposition']
const patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*') const patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*')
const $link = document.createElement("a"); const $link = document.createElement('a')
$link.href = URL.createObjectURL(blob); $link.href = URL.createObjectURL(blob)
$link.download = decodeURIComponent(patt.exec(contentDisposition)[1]) $link.download = decodeURIComponent(patt.exec(contentDisposition)[1])
$link.click(); $link.click()
document.body.appendChild($link); document.body.appendChild($link)
document.body.removeChild($link); // document.body.removeChild($link) //
window.URL.revokeObjectURL($link.href); // blob window.URL.revokeObjectURL($link.href) // blob
emit('closed') emit('closed')
}) })
} }

View File

@ -41,51 +41,59 @@ public class GenBasic extends CommonEntity {
@ApiModelProperty(value = "主表主键", position = 3) @ApiModelProperty(value = "主表主键", position = 3)
private String dbTableKey; private String dbTableKey;
/** 插件名 */
@ApiModelProperty(value = "插件名", position = 4)
private String pluginName;
/** 模块名 */
@ApiModelProperty(value = "模块名", position = 5)
private String moduleName;
/** 表前缀移除 */ /** 表前缀移除 */
@ApiModelProperty(value = "表前缀移除", position = 4) @ApiModelProperty(value = "表前缀移除", position = 6)
private String tablePrefix; private String tablePrefix;
/** 生成方式 */ /** 生成方式 */
@ApiModelProperty(value = "生成方式", position = 5) @ApiModelProperty(value = "生成方式", position = 7)
private String generateType; private String generateType;
/** 所属模块 */ /** 所属模块 */
@ApiModelProperty(value = "所属模块", position = 6) @ApiModelProperty(value = "所属模块", position = 8)
private String module; private String module;
/** 上级目录 */ /** 上级目录 */
@ApiModelProperty(value = "上级目录", position = 7) @ApiModelProperty(value = "上级目录", position = 9)
private String menuPid; private String menuPid;
/** 功能名 */ /** 功能名 */
@ApiModelProperty(value = "功能名", position = 8) @ApiModelProperty(value = "功能名", position = 10)
private String functionName; private String functionName;
/** 业务名 */ /** 业务名 */
@ApiModelProperty(value = "业务名", position = 9) @ApiModelProperty(value = "业务名", position = 11)
private String busName; private String busName;
/** 类名 */ /** 类名 */
@ApiModelProperty(value = "类名", position = 10) @ApiModelProperty(value = "类名", position = 12)
private String className; private String className;
/** 表单布局 */ /** 表单布局 */
@ApiModelProperty(value = "表单布局", position = 11) @ApiModelProperty(value = "表单布局", position = 13)
private String formLayout; private String formLayout;
/** 使用栅格 */ /** 使用栅格 */
@ApiModelProperty(value = "使用栅格", position = 12) @ApiModelProperty(value = "使用栅格", position = 14)
private String gridWhether; private String gridWhether;
/** 排序 */ /** 排序 */
@ApiModelProperty(value = "排序", position = 13) @ApiModelProperty(value = "排序", position = 15)
private Integer sortCode; private Integer sortCode;
/** 包名 */ /** 包名 */
@ApiModelProperty(value = "包名", position = 14) @ApiModelProperty(value = "包名", position = 16)
private String packageName; private String packageName;
/** 作者 */ /** 作者 */
@ApiModelProperty(value = "作者", position = 15) @ApiModelProperty(value = "作者", position = 17)
private String authorName; private String authorName;
} }

View File

@ -38,61 +38,71 @@ public class GenBasicAddParam {
@NotNull(message = "dbTableKey不能为空") @NotNull(message = "dbTableKey不能为空")
private String dbTableKey; private String dbTableKey;
/** 插件名 */
@ApiModelProperty(value = "插件名", required = true, position = 3)
@NotNull(message = "pluginName不能为空")
private String pluginName;
/** 模块名 */
@ApiModelProperty(value = "模块名", required = true, position = 4)
@NotNull(message = "moduleName不能为空")
private String moduleName;
/** 表前缀移除 */ /** 表前缀移除 */
@ApiModelProperty(value = "表前缀移除", required = true, position = 3) @ApiModelProperty(value = "表前缀移除", required = true, position = 5)
@NotNull(message = "tablePrefix不能为空") @NotNull(message = "tablePrefix不能为空")
private String tablePrefix; private String tablePrefix;
/** 生成方式 */ /** 生成方式 */
@ApiModelProperty(value = "生成方式", required = true, position = 4) @ApiModelProperty(value = "生成方式", required = true, position = 6)
@NotNull(message = "generateType不能为空") @NotNull(message = "generateType不能为空")
private String generateType; private String generateType;
/** 所属模块 */ /** 所属模块 */
@ApiModelProperty(value = "所属模块", required = true, position = 5) @ApiModelProperty(value = "所属模块", required = true, position = 7)
@NotNull(message = "module不能为空") @NotNull(message = "module不能为空")
private String module; private String module;
/** 上级目录 */ /** 上级目录 */
@ApiModelProperty(value = "上级目录", required = true, position = 6) @ApiModelProperty(value = "上级目录", required = true, position = 8)
@NotNull(message = "menuPid不能为空") @NotNull(message = "menuPid不能为空")
private String menuPid; private String menuPid;
/** 功能名 */ /** 功能名 */
@ApiModelProperty(value = "功能名", required = true, position = 7) @ApiModelProperty(value = "功能名", required = true, position = 8)
@NotNull(message = "functionName不能为空") @NotNull(message = "functionName不能为空")
private String functionName; private String functionName;
/** 业务名 */ /** 业务名 */
@ApiModelProperty(value = "业务名", required = true, position = 8) @ApiModelProperty(value = "业务名", required = true, position = 10)
@NotNull(message = "busName不能为空") @NotNull(message = "busName不能为空")
private String busName; private String busName;
/** 类名 */ /** 类名 */
@ApiModelProperty(value = "类名", required = true, position = 9) @ApiModelProperty(value = "类名", required = true, position = 11)
@NotNull(message = "className不能为空") @NotNull(message = "className不能为空")
private String className; private String className;
/** 表单布局 */ /** 表单布局 */
@ApiModelProperty(value = "表单布局", required = true, position = 10) @ApiModelProperty(value = "表单布局", required = true, position = 12)
@NotNull(message = "formLayout不能为空") @NotNull(message = "formLayout不能为空")
private String formLayout; private String formLayout;
/** 使用栅格 */ /** 使用栅格 */
@ApiModelProperty(value = "使用栅格", required = true, position = 11) @ApiModelProperty(value = "使用栅格", required = true, position = 13)
@NotNull(message = "gridWhether不能为空") @NotNull(message = "gridWhether不能为空")
private String gridWhether; private String gridWhether;
/** 排序 */ /** 排序 */
@ApiModelProperty(value = "排序", required = true, position = 12) @ApiModelProperty(value = "排序", required = true, position = 14)
@NotNull(message = "sortCode不能为空") @NotNull(message = "sortCode不能为空")
private Integer sortCode; private Integer sortCode;
/** 作者名 */ /** 作者名 */
@ApiModelProperty(value = "作者名", required = true, position = 13) @ApiModelProperty(value = "作者名", required = true, position = 15)
private String authorName; private String authorName;
/** 包名 */ /** 包名 */
@ApiModelProperty(value = "包名", required = true, position = 14) @ApiModelProperty(value = "包名", required = true, position = 16)
private String packageName; private String packageName;
} }

View File

@ -43,62 +43,72 @@ public class GenBasicEditParam {
@NotNull(message = "dbTableKey不能为空") @NotNull(message = "dbTableKey不能为空")
private String dbTableKey; private String dbTableKey;
/** 插件名 */
@ApiModelProperty(value = "插件名", required = true, position = 4)
@NotNull(message = "pluginName不能为空")
private String pluginName;
/** 模块名 */
@ApiModelProperty(value = "模块名", required = true, position = 5)
@NotNull(message = "moduleName不能为空")
private String moduleName;
/** 表前缀移除 */ /** 表前缀移除 */
@ApiModelProperty(value = "表前缀移除", position = 4) @ApiModelProperty(value = "表前缀移除", position = 6)
@NotNull(message = "tablePrefix不能为空") @NotNull(message = "tablePrefix不能为空")
private String tablePrefix; private String tablePrefix;
/** 生成方式 */ /** 生成方式 */
@ApiModelProperty(value = "生成方式", position = 5) @ApiModelProperty(value = "生成方式", position = 7)
@NotNull(message = "generateType不能为空") @NotNull(message = "generateType不能为空")
private String generateType; private String generateType;
/** 所属模块 */ /** 所属模块 */
@ApiModelProperty(value = "所属模块", position = 6) @ApiModelProperty(value = "所属模块", position = 8)
@NotNull(message = "module不能为空") @NotNull(message = "module不能为空")
private String module; private String module;
/** 上级目录 */ /** 上级目录 */
@ApiModelProperty(value = "上级目录", position = 7) @ApiModelProperty(value = "上级目录", position = 9)
@NotNull(message = "menuPid不能为空") @NotNull(message = "menuPid不能为空")
private String menuPid; private String menuPid;
/** 功能名 */ /** 功能名 */
@ApiModelProperty(value = "功能名", position = 8) @ApiModelProperty(value = "功能名", position = 10)
@NotNull(message = "functionName不能为空") @NotNull(message = "functionName不能为空")
private String functionName; private String functionName;
/** 业务名 */ /** 业务名 */
@ApiModelProperty(value = "业务名", position = 9) @ApiModelProperty(value = "业务名", position = 11)
@NotNull(message = "busName不能为空") @NotNull(message = "busName不能为空")
private String busName; private String busName;
/** 类名 */ /** 类名 */
@ApiModelProperty(value = "类名", position = 10) @ApiModelProperty(value = "类名", position = 12)
@NotNull(message = "className不能为空") @NotNull(message = "className不能为空")
private String className; private String className;
/** 表单布局 */ /** 表单布局 */
@ApiModelProperty(value = "表单布局", position = 11) @ApiModelProperty(value = "表单布局", position = 13)
@NotNull(message = "formLayout不能为空") @NotNull(message = "formLayout不能为空")
private String formLayout; private String formLayout;
/** 使用栅格 */ /** 使用栅格 */
@ApiModelProperty(value = "使用栅格", position = 12) @ApiModelProperty(value = "使用栅格", position = 14)
@NotNull(message = "gridWhether不能为空") @NotNull(message = "gridWhether不能为空")
private String gridWhether; private String gridWhether;
/** 排序 */ /** 排序 */
@ApiModelProperty(value = "排序", position = 13) @ApiModelProperty(value = "排序", position = 15)
@NotNull(message = "sortCode不能为空") @NotNull(message = "sortCode不能为空")
private Integer sortCode; private Integer sortCode;
/** 作者名 */ /** 作者名 */
@ApiModelProperty(value = "作者名", required = true, position = 14) @ApiModelProperty(value = "作者名", required = true, position = 16)
@NotNull(message = "authorName不能为空") @NotNull(message = "authorName不能为空")
private String authorName; private String authorName;
/** 包名 */ /** 包名 */
@ApiModelProperty(value = "包名 */", position = 15) @ApiModelProperty(value = "包名 */", position = 17)
private String packageName; private String packageName;
} }

View File

@ -85,22 +85,18 @@ public class GenBasicServiceImpl extends ServiceImpl<GenBasicMapper, GenBasic> i
private static final String DB_PASSWORD_KEY = "spring.datasource.dynamic.datasource.master.password"; private static final String DB_PASSWORD_KEY = "spring.datasource.dynamic.datasource.master.password";
private static final String MODULE_KEY = "biz";
private static final String GEN_PROJECT_FRONT_PLUGIN_KEY = "snowy-admin-web"; private static final String GEN_PROJECT_FRONT_PLUGIN_KEY = "snowy-admin-web";
private static final String GEN_PROJECT_PLUGIN_KEY = "snowy-plugin"; private static final String GEN_PROJECT_PLUGIN_KEY = "snowy-plugin";
private static final String GEN_PROJECT_PLUGIN_BIZ_KEY = GEN_PROJECT_PLUGIN_KEY + File.separator + "snowy-plugin-biz";
private static final List<JSONObject> GEN_SQL_FILE_LIST = CollectionUtil.newArrayList( private static final List<JSONObject> GEN_SQL_FILE_LIST = CollectionUtil.newArrayList(
JSONUtil.createObj().set("name", "Mysql.sql.btl"), JSONUtil.createObj().set("name", "Mysql.sql.btl"),
JSONUtil.createObj().set("name", "Oracle.sql.btl")); JSONUtil.createObj().set("name", "Oracle.sql.btl"));
private static final List<JSONObject> GEN_FRONT_FILE_LIST = CollectionUtil.newArrayList( private static final List<JSONObject> GEN_FRONT_FILE_LIST = CollectionUtil.newArrayList(
JSONUtil.createObj().set("name", "Api.js.btl").set("path", "api" + File.separator + MODULE_KEY), JSONUtil.createObj().set("name", "Api.js.btl").set("path", "api"),
JSONUtil.createObj().set("name", "form.vue.btl").set("path", "views" + File.separator + MODULE_KEY), JSONUtil.createObj().set("name", "form.vue.btl").set("path", "views"),
JSONUtil.createObj().set("name", "index.vue.btl").set("path", "views" + File.separator + MODULE_KEY)); JSONUtil.createObj().set("name", "index.vue.btl").set("path", "views"));
private static final List<JSONObject> GEN_BACKEND_FILE_LIST = CollectionUtil.newArrayList( private static final List<JSONObject> GEN_BACKEND_FILE_LIST = CollectionUtil.newArrayList(
JSONUtil.createObj().set("name", "Controller.java.btl").set("path", "controller"), JSONUtil.createObj().set("name", "Controller.java.btl").set("path", "controller"),
@ -162,6 +158,34 @@ public class GenBasicServiceImpl extends ServiceImpl<GenBasicMapper, GenBasic> i
public GenBasic add(GenBasicAddParam genBasicAddParam) { public GenBasic add(GenBasicAddParam genBasicAddParam) {
GenBasic genBasic = BeanUtil.toBean(genBasicAddParam, GenBasic.class); GenBasic genBasic = BeanUtil.toBean(genBasicAddParam, GenBasic.class);
this.save(genBasic); this.save(genBasic);
addGenConfig(genBasic);
return genBasic;
}
@Transactional(rollbackFor = Exception.class)
@Override
public GenBasic edit(GenBasicEditParam genBasicEditParam) {
GenBasic genBasic = this.queryEntity(genBasicEditParam.getId());
if (!genBasic.getDbTable().equals(genBasicEditParam.getDbTable())) {
// 删除配置表内该表的字段
QueryWrapper<GenConfig> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(GenConfig::getBasicId, genBasic.getId());
genConfigService.remove(queryWrapper);
// 新增新表的数据字段
addGenConfig(genBasic);
}
BeanUtil.copyProperties(genBasicEditParam, genBasic);
this.updateById(genBasic);
return genBasic;
}
/**
*
*
* @author yubaoshan
* @date 2023/02/22 00:54
*/
private void addGenConfig (GenBasic genBasic) {
GenBasicTableColumnParam tableColumnParam = new GenBasicTableColumnParam(); GenBasicTableColumnParam tableColumnParam = new GenBasicTableColumnParam();
tableColumnParam.setTableName(genBasic.getDbTable()); tableColumnParam.setTableName(genBasic.getDbTable());
List<GenBasicTableColumnResult> resultList = this.tableColumns(tableColumnParam); List<GenBasicTableColumnResult> resultList = this.tableColumns(tableColumnParam);
@ -203,16 +227,6 @@ public class GenBasicServiceImpl extends ServiceImpl<GenBasicMapper, GenBasic> i
GenConfig genConfig = BeanUtil.toBean(addParam, GenConfig.class); GenConfig genConfig = BeanUtil.toBean(addParam, GenConfig.class);
genConfigService.save(genConfig); genConfigService.save(genConfig);
} }
return genBasic;
}
@Transactional(rollbackFor = Exception.class)
@Override
public GenBasic edit(GenBasicEditParam genBasicEditParam) {
GenBasic genBasic = this.queryEntity(genBasicEditParam.getId());
BeanUtil.copyProperties(genBasicEditParam, genBasic);
this.updateById(genBasic);
return genBasic;
} }
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@ -352,6 +366,11 @@ public class GenBasicServiceImpl extends ServiceImpl<GenBasicMapper, GenBasic> i
throw new CommonException("前端代码生成位置:{}不存在,请检查位置", genProjectFrontendPath); throw new CommonException("前端代码生成位置:{}不存在,请检查位置", genProjectFrontendPath);
} }
GenBasic genBasic = this.queryEntity(genBasicIdParam.getId());
String genModuleName = genBasic.getModuleName();
String genPluginName = genBasic.getPluginName();
String GEN_PROJECT_PLUGIN_BIZ_KEY = GEN_PROJECT_PLUGIN_KEY + File.separator + genPluginName;
// 定义后端生成的目录 // 定义后端生成的目录
String genProjectBackendPath = System.getProperty("user.dir") + File.separator + GEN_PROJECT_PLUGIN_BIZ_KEY + File.separator + "src" + String genProjectBackendPath = System.getProperty("user.dir") + File.separator + GEN_PROJECT_PLUGIN_BIZ_KEY + File.separator + "src" +
File.separator + "main" + File.separator + "java"; File.separator + "main" + File.separator + "java";
@ -360,11 +379,9 @@ public class GenBasicServiceImpl extends ServiceImpl<GenBasicMapper, GenBasic> i
throw new CommonException("后端代码生成位置:{}不存在,请检查位置", genProjectBackendPath); throw new CommonException("后端代码生成位置:{}不存在,请检查位置", genProjectBackendPath);
} }
try { try {
GenBasic genBasic = this.queryEntity(genBasicIdParam.getId());
// 生成菜单 // 生成菜单
String menuId = sysMenuApi.addForGenMenu(genBasic.getMenuPid(), genBasic.getBusName(), genBasic.getModule(), genBasic.getFunctionName(), String menuId = sysMenuApi.addForGenMenu(genBasic.getMenuPid(), genBasic.getBusName(), genBasic.getModule(), genBasic.getFunctionName(),
StrUtil.SLASH + MODULE_KEY + StrUtil.SLASH + genBasic.getBusName()); StrUtil.SLASH + genModuleName + StrUtil.SLASH + genBasic.getBusName());
// 生成按钮 // 生成按钮
sysButtonApi.addForGenButton(menuId, genBasic.getClassName(), genBasic.getFunctionName()); sysButtonApi.addForGenButton(menuId, genBasic.getClassName(), genBasic.getFunctionName());
@ -456,7 +473,7 @@ public class GenBasicServiceImpl extends ServiceImpl<GenBasicMapper, GenBasic> i
List<GenBasicPreviewResult.GenBasicCodeResult> genBasicCodeFrontendResultList = CollectionUtil.newArrayList(); List<GenBasicPreviewResult.GenBasicCodeResult> genBasicCodeFrontendResultList = CollectionUtil.newArrayList();
GEN_FRONT_FILE_LIST.forEach(fileJsonObject -> { GEN_FRONT_FILE_LIST.forEach(fileJsonObject -> {
String fileTemplateName = fileJsonObject.getStr("name"); String fileTemplateName = fileJsonObject.getStr("name");
String fileTemplatePath = fileJsonObject.getStr("path"); String fileTemplatePath = fileJsonObject.getStr("path") + File.separator + genBasic.getModuleName();
GenBasicPreviewResult.GenBasicCodeResult genBasicCodeFrontResult = new GenBasicPreviewResult.GenBasicCodeResult(); GenBasicPreviewResult.GenBasicCodeResult genBasicCodeFrontResult = new GenBasicPreviewResult.GenBasicCodeResult();
Template templateFront = groupTemplateFront.getTemplate(fileTemplateName); Template templateFront = groupTemplateFront.getTemplate(fileTemplateName);
templateFront.binding(bindingJsonObject); templateFront.binding(bindingJsonObject);
@ -476,7 +493,7 @@ public class GenBasicServiceImpl extends ServiceImpl<GenBasicMapper, GenBasic> i
// 后端基础路径 // 后端基础路径
String genBackendBasicPath = StrUtil.replace(genBasic.getPackageName(), StrUtil.DOT, File.separator) + String genBackendBasicPath = StrUtil.replace(genBasic.getPackageName(), StrUtil.DOT, File.separator) +
File.separator + MODULE_KEY + File.separator + "modular" + File.separator + genBasic.getBusName() + File.separator; File.separator + genBasic.getModuleName() + File.separator + "modular" + File.separator + genBasic.getBusName() + File.separator;
// 后端 // 后端
GroupTemplate groupTemplateBackEnd = new GroupTemplate(new ClasspathResourceLoader("backend"), GroupTemplate groupTemplateBackEnd = new GroupTemplate(new ClasspathResourceLoader("backend"),
Configuration.defaultConfiguration()); Configuration.defaultConfiguration());
@ -513,7 +530,7 @@ public class GenBasicServiceImpl extends ServiceImpl<GenBasicMapper, GenBasic> i
public JSONObject getBindingJsonObject(GenBasic genBasic) { public JSONObject getBindingJsonObject(GenBasic genBasic) {
JSONObject bindingJsonObject = JSONUtil.createObj(); JSONObject bindingJsonObject = JSONUtil.createObj();
// 代码模块名 // 代码模块名
bindingJsonObject.set("moduleName", MODULE_KEY); bindingJsonObject.set("moduleName", genBasic.getModuleName());
// 功能名 // 功能名
bindingJsonObject.set("functionName", genBasic.getFunctionName()); bindingJsonObject.set("functionName", genBasic.getFunctionName());
// 业务名 // 业务名
@ -547,9 +564,9 @@ public class GenBasicServiceImpl extends ServiceImpl<GenBasicMapper, GenBasic> i
// 菜单编码 // 菜单编码
bindingJsonObject.set("menuCode", RandomUtil.randomString(10)); bindingJsonObject.set("menuCode", RandomUtil.randomString(10));
// 菜单路径 // 菜单路径
bindingJsonObject.set("menuPath", StrUtil.SLASH + MODULE_KEY + StrUtil.SLASH + genBasic.getBusName()); bindingJsonObject.set("menuPath", StrUtil.SLASH + genBasic.getModuleName() + StrUtil.SLASH + genBasic.getBusName());
// 菜单组件 // 菜单组件
bindingJsonObject.set("menuComponent", MODULE_KEY + StrUtil.SLASH + genBasic.getBusName() + StrUtil.SLASH + "index"); bindingJsonObject.set("menuComponent", genBasic.getModuleName() + StrUtil.SLASH + genBasic.getBusName() + StrUtil.SLASH + "index");
// 模块ID // 模块ID
bindingJsonObject.set("moduleId", genBasic.getModule()); bindingJsonObject.set("moduleId", genBasic.getModule());
// 添加按钮ID // 添加按钮ID

View File

@ -73,12 +73,14 @@ public class ${className}ServiceImpl extends ServiceImpl<${className}Mapper, ${c
return this.page(CommonPageRequest.defaultPage(), queryWrapper); return this.page(CommonPageRequest.defaultPage(), queryWrapper);
} }
@Transactional(rollbackFor = Exception.class)
@Override @Override
public void add(${className}AddParam ${classNameFirstLower}AddParam) { public void add(${className}AddParam ${classNameFirstLower}AddParam) {
${className} ${classNameFirstLower} = BeanUtil.toBean(${classNameFirstLower}AddParam, ${className}.class); ${className} ${classNameFirstLower} = BeanUtil.toBean(${classNameFirstLower}AddParam, ${className}.class);
this.save(${classNameFirstLower}); this.save(${classNameFirstLower});
} }
@Transactional(rollbackFor = Exception.class)
@Override @Override
public void edit(${className}EditParam ${classNameFirstLower}EditParam) { public void edit(${className}EditParam ${classNameFirstLower}EditParam) {
<% for(var i = 0; i < configList.~size; i++) { %> <% for(var i = 0; i < configList.~size; i++) { %>

View File

@ -519,6 +519,8 @@ CREATE TABLE `GEN_BASIC` (
`ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键', `ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键',
`DB_TABLE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '主表', `DB_TABLE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '主表',
`DB_TABLE_KEY` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '主表主键', `DB_TABLE_KEY` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '主表主键',
`PLUGIN_NAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '插件名',
`MODULE_NAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模块名',
`TABLE_PREFIX` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '移除表前缀', `TABLE_PREFIX` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '移除表前缀',
`GENERATE_TYPE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '生成方式', `GENERATE_TYPE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '生成方式',
`MODULE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属模块', `MODULE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属模块',

View File

@ -847,6 +847,8 @@ CREATE TABLE "SNOWY"."GEN_BASIC" (
"ID" NVARCHAR2(20) NOT NULL, "ID" NVARCHAR2(20) NOT NULL,
"DB_TABLE" NVARCHAR2(255), "DB_TABLE" NVARCHAR2(255),
"DB_TABLE_KEY" NVARCHAR2(255), "DB_TABLE_KEY" NVARCHAR2(255),
"PLUGIN_NAME" NVARCHAR2(255),
"MODULE_NAME" NVARCHAR2(255),
"TABLE_PREFIX" NVARCHAR2(255), "TABLE_PREFIX" NVARCHAR2(255),
"GENERATE_TYPE" NVARCHAR2(255), "GENERATE_TYPE" NVARCHAR2(255),
"MODULE" NVARCHAR2(255), "MODULE" NVARCHAR2(255),

File diff suppressed because one or more lines are too long