提交 77d1b188 编写于 作者: ibizdev's avatar ibizdev

ibiz4j 发布系统代码

上级 5ca37fb5
## v7.0.0-alpha.14 [2020-7-18]
### Bug修复
修复表格列千分位格式化
修复标签值格式化
修复表格转化数据错误问题
修复嵌套关系无数据时设置数据为空数组
### 功能新增及优化
#### 模板
新增编辑器插件
新增数据服务增加临时模式判断
新增支持实体行为定义检查方法
新增实体行为执行前、后逻辑
新增操作栏主状态无权限模式
优化开发环境错误提示友好性
优化应用菜单多层嵌套问题
#### 基础文件
优化popover组件
实体数据服务基类增加saveBatch方法
优化应用菜单多层嵌套问题
## v7.0.0-alpha.13 [2020-7-12]
### Bug修复
修复表格设置更新默认值不生效
修复行编辑中文本字段修改数据保存无法生效
修复行编辑时的错误提示
修复表格开关部件保存异常问题
修复表单可以修改数据主键问题
修复表格操作列问题
#### 基础文件
优化关系界面逻辑
## v7.0.0-alpha.12 [2020-7-2]
### Bug修复
......@@ -14,6 +72,14 @@
修复多行输入十行 高度问题
修复调整实体处理逻辑(参数name转化为codeName)
修复表单项更新值规则校验
修复单位部门选择器禁用功能
修复修复去掉某个子菜单后,主菜单不显示
### 功能新增及优化
#### 模板
......@@ -24,14 +90,28 @@
新增状态向导面板(658)
优化门户操作栏
新增门户操作栏图标(654)
新增首页空白模式支持
新增表格支持列拖动
优化应用级数据状态同步功能
新增主状态操作标识权限逻辑
新增工具栏、表格操作列、表单分组主状态操作标识判断
优化应用级数据状态同步功能(654)
优化应用国际化部分
#### 基础文件
新增修改密码功能(654)
优化无权限错误信息友好提示
优化应用国际化部分
## v7.0.0-alpha.11 [2020-6-21]
### Bug修复
......
......@@ -20,6 +20,7 @@
"@fullcalendar/vue": "^4.4.0",
"vuedraggable": "^2.23.2",
"async-validator": "^3.3.0",
"@popperjs/core": "^2.4.3",
"axios": "^0.19.1",
"core-js": "^3.4.4",
"echarts": "^4.6.0",
......
......@@ -78,6 +78,7 @@ import AppOrgSelect from './components/app-org-select/app-org-select.vue'
import AppDepartmentSelect from './components/app-department-select/app-department-select.vue'
import AppGroupSelect from './components/app-group-select/app-group-select.vue'
import UpdatePwd from './components/app-update-password/app-update-password.vue'
import AppMenuItem from './components/app-menu-item/app-menu-item.vue'
// 全局挂载UI实体服务注册中心
window['uiServiceRegister'] = uiServiceRegister;
// 全局挂载实体权限服务注册中心
......@@ -168,5 +169,6 @@ export const AppComponents = {
v.component('app-transfer',AppTransfer);
v.component('context-menu-drag',ContextMenuDrag);
v.component('app-update-password',UpdatePwd);
v.component('app-menu-item', AppMenuItem);
},
};
\ No newline at end of file
<template>
<div class="app-actionbar">
<div class="app-actionbar-item" v-for="(item,index) in items" :key="index">
<Badge v-if="item.counterService&&item.counterService.counterData" :count="item.counterService.counterData[item.counterId]" type="primary">
<i-button @click="handleClick(item.viewlogicname)"><i v-if="item.icon" style="margin-right: 5px;" :class="item.icon"></i>{{item.actionName}}</i-button>
<Badge v-if="item.counterService&&item.counterService.counterData" v-show="item.visabled" :count="item.counterService.counterData[item.counterId]" type="primary">
<i-button :style="{'pointer-events':item.disabled?'none':'auto'}" @click="handleClick(item.viewlogicname)"><i v-if="item.icon" style="margin-right: 5px;" :class="item.icon"></i>{{item.actionName}}</i-button>
</Badge>
<i-button v-else @click="handleClick(item.viewlogicname)">{{item.actionName}}</i-button>
<i-button v-show="item.visabled" :style="{'pointer-events':item.disabled?'none':'auto'}" v-else @click="handleClick(item.viewlogicname)">{{item.actionName}}</i-button>
</div>
</div>
</template>
<script lang="ts">
import { Vue, Component, Prop, Model, Emit } from "vue-property-decorator";
import { Subject } from "rxjs";
import { Vue, Component, Prop, Model, Emit,Inject, Watch } from "vue-property-decorator";
import { Subject,Subscription } from "rxjs";
@Component({})
export default class AppActionBar extends Vue {
......@@ -24,6 +24,49 @@ export default class AppActionBar extends Vue {
*/
@Prop() public items!:any;
/**
* 注入的UI服务
*
* @type {*}
* @memberof AppActionBar
*/
@Prop() public uiService!: any;
/**
* 视图通讯对象
*
* @type {Subject<ViewState>}
* @memberof AppActionBar
*/
@Prop() public viewState!: Subject<ViewState>;
/**
* 视图状态事件
*
* @public
* @type {(Subscription | undefined)}
* @memberof ActionlinetestBase
*/
public viewStateEvent: Subscription | undefined;
/**
* 组件初始化
*
* @memberof AppActionBar
*/
public created(){
if (this.viewState) {
this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => {
if (!Object.is(tag, "app-actionbar")) {
return;
}
if(Object.is(action,'loadmodel')){
this.calcActionItemAuthState(data,this.items,this.uiService);
}
});
}
}
/**
* 触发界面行为
*
......@@ -33,6 +76,52 @@ export default class AppActionBar extends Vue {
this.$emit('itemClick',$event);
}
/**
* 计算界面行为项权限状态
*
* @param {*} [data] 传入数据
* @param {*} [ActionModel] 界面行为模型
* @param {*} [UIService] 界面行为服务
* @memberof AppActionBar
*/
public calcActionItemAuthState(data:any,ActionModel:any,UIService:any){
for (const key in ActionModel) {
if (!ActionModel.hasOwnProperty(key)) {
return;
}
const _item = ActionModel[key];
if(_item && _item['dataaccaction'] && UIService && data && Object.keys(data).length >0){
let dataActionResult:any = UIService.getAllOPPrivs(data)[_item['dataaccaction']];
// 无权限:0;有权限:1
if(dataActionResult === 0){
// 禁用:1;隐藏:2;隐藏且默认隐藏:6
if(_item.noprivdisplaymode === 1){
_item.disabled = true;
}
if((_item.noprivdisplaymode === 2) || (_item.noprivdisplaymode === 6)){
_item.visabled = false;
}else{
_item.visabled = true;
}
}
if(dataActionResult === 1){
_item.visabled = true;
_item.disabled = false;
}
}
}
}
/**
* 组件销毁
*
* @memberof AppActionBar
*/
public destory(){
if (this.viewStateEvent) {
this.viewStateEvent.unsubscribe();
}
}
}
</script>
......
......@@ -161,6 +161,7 @@ export default class Breadcrumb extends Vue {
if(item && item.meta && item.meta.viewType && Object.is(item.meta.viewType,"APPINDEX")){
let path: string | null = window.sessionStorage.getItem(Environment.AppName);
if (path) {
this.$store.commit("removeAllPage");
this.$router.push({ path: path });
} else {
this.$router.push("/");
......
......@@ -271,6 +271,7 @@ export default class AppFormDRUIPart extends Vue {
//设置顶层视图唯一标识
Object.assign(tempContext,this.context);
Object.assign(tempContext,{srfparentdename:this.parentName,srfparentkey:_paramitem});
Object.assign(tempParam,{srfparentdename:this.parentName,srfparentkey:_paramitem});
// 设置局部上下文
if(this.localContext && Object.keys(this.localContext).length >0){
let _context:any = this.$util.computedNavData(formData,tempContext,this.viewparams,this.localContext);
......@@ -292,9 +293,9 @@ export default class AppFormDRUIPart extends Vue {
}
}
if(!this.isForbidLoad){
this.$nextTick(() => {
setTimeout(() => {
this.formDruipart.next({action:'load',data:{srfparentdename:this.parentName,srfparentkey:_paramitem}});
});
}, 0);
}
}
......
......@@ -165,7 +165,7 @@ export default class AppFormGroup extends Vue {
if(_item && _item['dataaccaction'] && UIService && data && Object.keys(data).length >0){
let dataActionResult:any = UIService.getAllOPPrivs(data)[_item['dataaccaction']];
// 无权限:0;有权限:1
if(!dataActionResult){
if(dataActionResult === 0){
// 禁用:1;隐藏:2;隐藏且默认隐藏:6
if(_item.noprivdisplaymode === 1){
_item.disabled = true;
......@@ -175,7 +175,8 @@ export default class AppFormGroup extends Vue {
}else{
_item.visabled = true;
}
}else{
}
if(dataActionResult === 1){
_item.visabled = true;
_item.disabled = false;
}
......
<template>
<div class="app-menu-item">
<template v-for="item in menus">
<template v-if="item.items && Array.isArray(item.items) && item.items.length > 0">
<el-submenu v-show="!item.hidden" :index="item.name" :popper-class="popperClass" :key="item.id">
<template slot='title'>
<template v-if="item.icon && item.icon != ''">
<img :src="item.icon" class='app-menu-icon' />
</template>
<template v-else-if="item.iconcls && item.iconcls != ''">
<i :class="[item.iconcls, 'app-menu-icon']"></i>
</template>
<template v-else>
<i v-if="isFirst" class='fa fa-cogs app-menu-icon'></i>
</template>
<span class='text' :title="$t(`app.menus.${ctrlName}.${item.name}`)">{{$t(`app.menus.${ctrlName}.${item.name}`)}}</span>
</template>
<app-menu-item :menus="item.items" :ctrlName="ctrlName" :isFirst="false" :counterdata="counterdata" :popperclass="popperClass"></app-menu-item>
</el-submenu>
</template>
<template v-else>
<template v-if="item.type =='MENUITEM'">
<el-menu-item v-show="!item.hidden" :index="item.name" :key="item.id">
<template v-if="item.icon && item.icon != ''">
<img :src="item.icon" class='app-menu-icon' />
</template>
<template v-else-if="item.iconcls && item.iconcls != ''">
<i :class="[item.iconcls, 'app-menu-icon']"></i>
</template>
<template v-else>
<i v-if="isFirst" class='fa fa-cogs app-menu-icon'></i>
</template>
<template slot="title">
<span class="text" :title="$t(`app.menus.${ctrlName}.${item.name}`)">{{$t(`app.menus.${ctrlName}.${item.name}`)}}</span>
<template v-if="counterdata && counterdata[item.counterid] && counterdata[item.counterid] > 0">
<span class="pull-right">
<badge :count="counterdata[item.counterid]" :overflow-count="9999"></badge>
</span>
</template>
</template>
</el-menu-item>
</template>
<template v-if="item.type =='SEPERATOR'">
<divider :key="item.id" />
</template>
</template>
</template>
</div>
</template>
<script lang="ts">
import { Component, Vue, Prop } from 'vue-property-decorator';
@Component({})
export default class AppMenuItem extends Vue {
/**
* 菜单数据
*
* @type {*}
* @memberof AppMenuItem
*/
@Prop( {default: []} ) public menus!: any;
/**
* 部件名称
*
* @type {*}
* @memberof AppMenuItem
*/
@Prop() public ctrlName!: string;
/**
* 计数器数据
*
* @type {*}
* @memberof AppMenuItem
*/
@Prop() public counterdata!: any;
/**
* 提示框主题样式
*
* @type {*}
* @memberof AppMenuItem
*/
@Prop() public popperClass!: any;
/**
* 是否是一级菜单
*
* @type {*}
* @memberof AppMenuItem
*/
@Prop() public isFirst!: boolean;
}
</script>
\ No newline at end of file
......@@ -242,7 +242,7 @@ export default class AppPicker extends Vue {
* @param {*} oldVal
* @memberof AppPicker
*/
@Watch('value')
@Watch('value',{immediate:true})
public onValueChange(newVal: any, oldVal: any) {
this.curvalue = newVal;
if (Object.is(this.editortype, 'dropdown') && this.valueitem) {
......
......@@ -6,7 +6,7 @@
<script lang="ts">
import { Vue, Component, Prop, Watch, Model } from 'vue-property-decorator';
import moment from "moment";
@Component({})
export default class AppSpan extends Vue {
......@@ -18,6 +18,38 @@ export default class AppSpan extends Vue {
*/
@Prop() public value?: any;
/**
* 数据类型
*
* @type {string}
* @memberof AppSpan
*/
@Prop() public dataType?: string;
/**
* 单位名称
*
* @type {string}
* @memberof AppSpan
*/
@Prop({default:''}) public unitName?: string;
/**
* 精度
*
* @type {number}
* @memberof AppSpan
*/
@Prop({default:'2'}) public precision?:number;
/**
* 日期值格式化
*
* @type {string}
* @memberof AppSpan
*/
@Prop() public valueFormat?: string;
/**
* 当前表单项名称
*
......@@ -158,12 +190,52 @@ export default class AppSpan extends Vue {
}else{
if(this.$util.isEmpty(this.value)){
this.text = '';
}else if(this.dataType){
this.dataFormat();
}else{
this.text = this.value;
}
}
}
/**
* 数据格式化
*
* @memberof AppSpan
*/
public dataFormat(){
if(this.valueFormat){
this.dateFormat() ;
return;
}
if(Object.is(this.dataType,"CURRENCY")){
let number:any = Number(this.value);
this.text = Number(number.toFixed(this.precision)).toLocaleString('en-US')+ ' '+ this.unitName;
}else if(Object.is(this.dataType,"FLOAT") || Object.is(this.dataType,"DECIMAL")){
let number:any = Number(this.value);
this.text = number.toFixed(this.precision);
}else {
this.text = this.value;
}
}
/**
* 日期格式化
*
* @memberof AppSpan
*/
public dateFormat(){
if(this.valueFormat){
if(this.valueFormat.indexOf('%1$t') !== -1){
this.text= moment(this.data).format("YYYY-MM-DD HH:mm:ss");
}else if(this.valueFormat.indexOf('%1$s') == -1){
this.text= moment(this.data).format(this.valueFormat);
}else{
this.text= this.value;
}
}
}
}
</script>
......
......@@ -7,8 +7,7 @@
:precision="precision"
v-model="CurrentVal"
:disabled="disabled ? true : false"
:formatter="formatter"
:parser="parser"
:active-change="false"
></InputNumber>
<i-input v-else
:placeholder="placeholder"
......@@ -188,29 +187,7 @@ export default class InputBox extends Vue {
}
}
/**
* 指定输入框展示值的格式
*/
public formatter(value:any){
if(this.precision===0) return this.CurrentVal;
if(value.indexOf('.')!==-1){
let arr:Array<any> = value.split('.');
if(arr[1]==='00'){
return arr[0];
}
if(parseInt(arr[1])%10===0){
return arr[0]+'.'+parseInt(arr[1])/10;
}
}
return value;
}
/**
* 指定从 formatter 里转换回数字的方式
*/
public parser(value:any){
return value;
}
}
</script>
......
......@@ -193,7 +193,7 @@ export default class ViewEngine {
if(_item && _item['dataaccaction'] && _this.view.appUIService && data && Object.keys(data).length >0){
let dataActionResult:any = _this.view.appUIService.getAllOPPrivs(data)[_item['dataaccaction']];
// 无权限:0;有权限:1
if(!dataActionResult){
if(dataActionResult === 0){
// 禁用:1;隐藏:2;隐藏且默认隐藏:6
if(_item.noprivdisplaymode === 1){
_this.view.toolBarModels[key].disabled = true;
......@@ -203,8 +203,10 @@ export default class ViewEngine {
}else{
_this.view.toolBarModels[key].visabled = true;
}
}else{
}
if(dataActionResult === 1){
_this.view.toolBarModels[key].visabled = true;
_this.view.toolBarModels[key].disabled = false;
}
}
}
......
......@@ -146,7 +146,7 @@ export default class DictCatalogEditViewBase extends Vue {
public appEntityService: DictCatalogService = new DictCatalogService;
/**
* 实体权限服务对象
* 实体UI服务对象
*
* @type DictCatalogUIService
* @memberof DictCatalogEditViewBase
......
......@@ -168,7 +168,7 @@ export default class DictCatalogGridViewBase extends Vue {
public appEntityService: DictCatalogService = new DictCatalogService;
/**
* 实体权限服务对象
* 实体UI服务对象
*
* @type DictCatalogUIService
* @memberof DictCatalogGridViewBase
......@@ -1367,7 +1367,7 @@ export default class DictCatalogGridViewBase extends Vue {
public NewRow(args: any[],contextJO?:any, params?: any, $event?: any, xData?: any,actionContext?:any,srfParentDeName?:string) {
const _this: any = this;
const data: any = {};
if (_this.newRow && _this.newRow instanceof Function) {
if (_this.hasOwnProperty('newRow') && _this.newRow instanceof Function) {
_this.newRow([{ ...data }], params, $event, xData);
} else if(xData.newRow && xData.newRow instanceof Function) {
xData.newRow([{ ...data }], params, $event, xData);
......
......@@ -73,7 +73,7 @@ export default class DictCatalogPickupGridViewBase extends Vue {
public appEntityService: DictCatalogService = new DictCatalogService;
/**
* 实体权限服务对象
* 实体UI服务对象
*
* @type DictCatalogUIService
* @memberof DictCatalogPickupGridViewBase
......
......@@ -58,7 +58,7 @@ export default class DictCatalogPickupViewBase extends Vue {
public appEntityService: DictCatalogService = new DictCatalogService;
/**
* 实体权限服务对象
* 实体UI服务对象
*
* @type DictCatalogUIService
* @memberof DictCatalogPickupViewBase
......@@ -661,6 +661,7 @@ export default class DictCatalogPickupViewBase extends Vue {
* @memberof DictCatalogPickupViewBase
*/
public onClickCancel(): void {
this.$emit('viewdataschange', null);
this.$emit('close', null);
}
......
......@@ -83,7 +83,7 @@ export default class DictOptionEditViewBase extends Vue {
public appEntityService: DictOptionService = new DictOptionService;
/**
* 实体权限服务对象
* 实体UI服务对象
*
* @type DictOptionUIService
* @memberof DictOptionEditViewBase
......
......@@ -155,7 +155,7 @@ export default class DictOptionGridEditViewBase extends Vue {
public appEntityService: DictOptionService = new DictOptionService;
/**
* 实体权限服务对象
* 实体UI服务对象
*
* @type DictOptionUIService
* @memberof DictOptionGridEditViewBase
......@@ -1359,7 +1359,7 @@ export default class DictOptionGridEditViewBase extends Vue {
public NewRow(args: any[],contextJO?:any, params?: any, $event?: any, xData?: any,actionContext?:any,srfParentDeName?:string) {
const _this: any = this;
const data: any = {};
if (_this.newRow && _this.newRow instanceof Function) {
if (_this.hasOwnProperty('newRow') && _this.newRow instanceof Function) {
_this.newRow([{ ...data }], params, $event, xData);
} else if(xData.newRow && xData.newRow instanceof Function) {
xData.newRow([{ ...data }], params, $event, xData);
......
......@@ -155,7 +155,7 @@ export default class DictOptionGridViewBase extends Vue {
public appEntityService: DictOptionService = new DictOptionService;
/**
* 实体权限服务对象
* 实体UI服务对象
*
* @type DictOptionUIService
* @memberof DictOptionGridViewBase
......@@ -1359,7 +1359,7 @@ export default class DictOptionGridViewBase extends Vue {
public NewRow(args: any[],contextJO?:any, params?: any, $event?: any, xData?: any,actionContext?:any,srfParentDeName?:string) {
const _this: any = this;
const data: any = {};
if (_this.newRow && _this.newRow instanceof Function) {
if (_this.hasOwnProperty('newRow') && _this.newRow instanceof Function) {
_this.newRow([{ ...data }], params, $event, xData);
} else if(xData.newRow && xData.newRow instanceof Function) {
xData.newRow([{ ...data }], params, $event, xData);
......
......@@ -48,7 +48,9 @@ export default class DictCatalogServiceBase extends EntityService {
* @memberof DictCatalogServiceBase
*/
public async Select(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
return Http.getInstance().get(`/dictcatalogs/${context.dictcatalog}/select`,isloading);
let res:any = Http.getInstance().get(`/dictcatalogs/${context.dictcatalog}/select`,isloading);
return res;
}
/**
......@@ -62,21 +64,6 @@ export default class DictCatalogServiceBase extends EntityService {
*/
public async Create(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
let masterData:any = {};
let dictoptionsData:any = [];
if(!Object.is(this.tempStorage.getItem(context.srfsessionkey+'_dictoptions'),'undefined')){
dictoptionsData = JSON.parse(this.tempStorage.getItem(context.srfsessionkey+'_dictoptions') as any);
if(dictoptionsData && dictoptionsData.length && dictoptionsData.length > 0){
dictoptionsData.forEach((item:any) => {
if(item.srffrontuf){
if(Object.is(item.srffrontuf,"0")){
item.value_key = null;
}
delete item.srffrontuf;
}
});
}
}
masterData.dictoptions = dictoptionsData;
Object.assign(data,masterData);
if(!data.srffrontuf || data.srffrontuf !== "1"){
data[this.APPDEKEY] = null;
......@@ -86,7 +73,8 @@ export default class DictCatalogServiceBase extends EntityService {
}
let tempContext:any = JSON.parse(JSON.stringify(context));
let res:any = await Http.getInstance().post(`/dictcatalogs`,data,isloading);
this.tempStorage.setItem(tempContext.srfsessionkey+'_dictoptions',JSON.stringify(res.data.dictoptions));
this.tempStorage.setItem(tempContext.srfsessionkey+'_dictoptions',JSON.stringify(res.data.dictoptions?res.data.dictoptions:[]));
return res;
}
......@@ -101,24 +89,9 @@ export default class DictCatalogServiceBase extends EntityService {
*/
public async Update(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
let masterData:any = {};
let dictoptionsData:any = [];
if(!Object.is(this.tempStorage.getItem(context.srfsessionkey+'_dictoptions'),'undefined')){
dictoptionsData = JSON.parse(this.tempStorage.getItem(context.srfsessionkey+'_dictoptions') as any);
if(dictoptionsData && dictoptionsData.length && dictoptionsData.length > 0){
dictoptionsData.forEach((item:any) => {
if(item.srffrontuf){
if(Object.is(item.srffrontuf,"0")){
item.value_key = null;
}
delete item.srffrontuf;
}
});
}
}
masterData.dictoptions = dictoptionsData;
Object.assign(data,masterData);
let res:any = await Http.getInstance().put(`/dictcatalogs/${context.dictcatalog}`,data,isloading);
this.tempStorage.setItem(context.srfsessionkey+'_dictoptions',JSON.stringify(res.data.dictoptions));
return res;
}
......@@ -132,7 +105,8 @@ export default class DictCatalogServiceBase extends EntityService {
* @memberof DictCatalogServiceBase
*/
public async Remove(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
return Http.getInstance().delete(`/dictcatalogs/${context.dictcatalog}`,isloading);
let res:any = Http.getInstance().delete(`/dictcatalogs/${context.dictcatalog}`,isloading);
return res;
}
/**
......@@ -146,7 +120,7 @@ export default class DictCatalogServiceBase extends EntityService {
*/
public async Get(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
let res:any = await Http.getInstance().get(`/dictcatalogs/${context.dictcatalog}`,isloading);
this.tempStorage.setItem(context.srfsessionkey+'_dictoptions',JSON.stringify(res.data.dictoptions));
return res;
}
......@@ -162,7 +136,7 @@ export default class DictCatalogServiceBase extends EntityService {
public async GetDraft(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
let res:any = await Http.getInstance().get(`/dictcatalogs/getdraft`,isloading);
res.data.dictcatalog = data.dictcatalog;
this.tempStorage.setItem(context.srfsessionkey+'_dictoptions',JSON.stringify(res.data.dictoptions));
return res;
}
......@@ -176,7 +150,8 @@ export default class DictCatalogServiceBase extends EntityService {
* @memberof DictCatalogServiceBase
*/
public async CheckKey(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
return Http.getInstance().post(`/dictcatalogs/${context.dictcatalog}/checkkey`,data,isloading);
let res:any = Http.getInstance().post(`/dictcatalogs/${context.dictcatalog}/checkkey`,data,isloading);
return res;
}
/**
......@@ -190,24 +165,9 @@ export default class DictCatalogServiceBase extends EntityService {
*/
public async Save(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
let masterData:any = {};
let dictoptionsData:any = [];
if(!Object.is(this.tempStorage.getItem(context.srfsessionkey+'_dictoptions'),'undefined')){
dictoptionsData = JSON.parse(this.tempStorage.getItem(context.srfsessionkey+'_dictoptions') as any);
if(dictoptionsData && dictoptionsData.length && dictoptionsData.length > 0){
dictoptionsData.forEach((item:any) => {
if(item.srffrontuf){
if(Object.is(item.srffrontuf,"0")){
item.value_key = null;
}
delete item.srffrontuf;
}
});
}
}
masterData.dictoptions = dictoptionsData;
Object.assign(data,masterData);
let res:any = await Http.getInstance().post(`/dictcatalogs/${context.dictcatalog}/save`,data,isloading);
this.tempStorage.setItem(context.srfsessionkey+'_dictoptions',JSON.stringify(res.data.dictoptions));
return res;
}
......@@ -222,6 +182,7 @@ export default class DictCatalogServiceBase extends EntityService {
*/
public async FetchDefault(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
let tempData:any = JSON.parse(JSON.stringify(data));
return Http.getInstance().get(`/dictcatalogs/fetchdefault`,tempData,isloading);
let res:any = Http.getInstance().get(`/dictcatalogs/fetchdefault`,tempData,isloading);
return res;
}
}
\ No newline at end of file
......@@ -49,9 +49,13 @@ export default class DictOptionServiceBase extends EntityService {
*/
public async Select(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
if(context.dictcatalog && context.dictoption){
return Http.getInstance().get(`/dictcatalogs/${context.dictcatalog}/dictoptions/${context.dictoption}/select`,isloading);
let res:any = Http.getInstance().get(`/dictcatalogs/${context.dictcatalog}/dictoptions/${context.dictoption}/select`,isloading);
return res;
}
return Http.getInstance().get(`/dictoptions/${context.dictoption}/select`,isloading);
let res:any = Http.getInstance().get(`/dictoptions/${context.dictoption}/select`,isloading);
return res;
}
/**
......@@ -75,6 +79,7 @@ export default class DictOptionServiceBase extends EntityService {
}
let tempContext:any = JSON.parse(JSON.stringify(context));
let res:any = await Http.getInstance().post(`/dictcatalogs/${context.dictcatalog}/dictoptions`,data,isloading);
return res;
}
let masterData:any = {};
......@@ -87,6 +92,7 @@ export default class DictOptionServiceBase extends EntityService {
}
let tempContext:any = JSON.parse(JSON.stringify(context));
let res:any = await Http.getInstance().post(`/dictoptions`,data,isloading);
return res;
}
......@@ -104,11 +110,13 @@ export default class DictOptionServiceBase extends EntityService {
let masterData:any = {};
Object.assign(data,masterData);
let res:any = await Http.getInstance().put(`/dictcatalogs/${context.dictcatalog}/dictoptions/${context.dictoption}`,data,isloading);
return res;
}
let masterData:any = {};
Object.assign(data,masterData);
let res:any = await Http.getInstance().put(`/dictoptions/${context.dictoption}`,data,isloading);
return res;
}
......@@ -123,9 +131,11 @@ export default class DictOptionServiceBase extends EntityService {
*/
public async Remove(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
if(context.dictcatalog && context.dictoption){
return Http.getInstance().delete(`/dictcatalogs/${context.dictcatalog}/dictoptions/${context.dictoption}`,isloading);
let res:any = Http.getInstance().delete(`/dictcatalogs/${context.dictcatalog}/dictoptions/${context.dictoption}`,isloading);
return res;
}
return Http.getInstance().delete(`/dictoptions/${context.dictoption}`,isloading);
let res:any = Http.getInstance().delete(`/dictoptions/${context.dictoption}`,isloading);
return res;
}
/**
......@@ -140,9 +150,11 @@ export default class DictOptionServiceBase extends EntityService {
public async Get(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
if(context.dictcatalog && context.dictoption){
let res:any = await Http.getInstance().get(`/dictcatalogs/${context.dictcatalog}/dictoptions/${context.dictoption}`,isloading);
return res;
}
let res:any = await Http.getInstance().get(`/dictoptions/${context.dictoption}`,isloading);
return res;
}
......@@ -159,10 +171,12 @@ export default class DictOptionServiceBase extends EntityService {
if(context.dictcatalog && true){
let res:any = await Http.getInstance().get(`/dictcatalogs/${context.dictcatalog}/dictoptions/getdraft`,isloading);
res.data.dictoption = data.dictoption;
return res;
}
let res:any = await Http.getInstance().get(`/dictoptions/getdraft`,isloading);
res.data.dictoption = data.dictoption;
return res;
}
......@@ -180,9 +194,11 @@ export default class DictOptionServiceBase extends EntityService {
let masterData:any = {};
Object.assign(data,masterData);
let res:any = await Http.getInstance().post(`/dictcatalogs/${context.dictcatalog}/dictoptions/${context.dictoption}/checkkey`,data,isloading);
return res;
}
return Http.getInstance().post(`/dictoptions/${context.dictoption}/checkkey`,data,isloading);
let res:any = Http.getInstance().post(`/dictoptions/${context.dictoption}/checkkey`,data,isloading);
return res;
}
/**
......@@ -199,11 +215,13 @@ export default class DictOptionServiceBase extends EntityService {
let masterData:any = {};
Object.assign(data,masterData);
let res:any = await Http.getInstance().post(`/dictcatalogs/${context.dictcatalog}/dictoptions/${context.dictoption}/save`,data,isloading);
return res;
}
let masterData:any = {};
Object.assign(data,masterData);
let res:any = await Http.getInstance().post(`/dictoptions/${context.dictoption}/save`,data,isloading);
return res;
}
......@@ -219,9 +237,11 @@ export default class DictOptionServiceBase extends EntityService {
public async FetchDefault(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
if(context.dictcatalog && true){
let tempData:any = JSON.parse(JSON.stringify(data));
return Http.getInstance().get(`/dictcatalogs/${context.dictcatalog}/dictoptions/fetchdefault`,tempData,isloading);
let res:any = Http.getInstance().get(`/dictcatalogs/${context.dictcatalog}/dictoptions/fetchdefault`,tempData,isloading);
return res;
}
let tempData:any = JSON.parse(JSON.stringify(data));
return Http.getInstance().get(`/dictoptions/fetchdefault`,tempData,isloading);
let res:any = Http.getInstance().get(`/dictoptions/fetchdefault`,tempData,isloading);
return res;
}
}
\ No newline at end of file
......@@ -294,7 +294,8 @@ export default class EntityService {
let result:any = JSON.parse(this.tempStorage.getItem(context.srfsessionkey+'_'+this.APPDENAME) as any);
if(result){
let tempResult:any = result.filter((item:any) =>{
return !( Object.is(item[this.APPDEKEY],data[this.APPDEKEY]) && Object.is(item[this.APPDETEXT],data[this.APPDETEXT]));
// return !( Object.is(item[this.APPDEKEY],data[this.APPDEKEY]) && Object.is(item[this.APPDETEXT],data[this.APPDETEXT]));
return !Object.is(item[this.APPDEKEY],data[this.APPDEKEY]);
})
this.tempStorage.setItem(context.srfsessionkey+'_'+this.APPDENAME,JSON.stringify(tempResult));
return {"status":200,"data":data};
......@@ -596,6 +597,19 @@ export default class EntityService {
return Http.getInstance().post(`/${this.APPDENAME}/batch`,data,isloading);
}
/**
* saveBatch接口方法
*
* @param {*} [context={}]
* @param {*} [data]
* @param {boolean} [isloading]
* @returns {Promise<any>}
* @memberof EntityService
*/
public async saveBatch(context: any = {},data: any, isloading?: boolean): Promise<any> {
return Http.getInstance().post(`/${this.APPDENAME}/savebatch`,data,isloading);
}
/**
* updateBatch接口方法
*
......
......@@ -202,7 +202,7 @@ export default class DictCatalogUIServiceBase extends UIService {
this.mainStateFields.forEach((singleMainField:any) =>{
if(!(singleMainField in curData)){
console.error(`当前数据对象不包含属性singleMainField,可能会发生错误`);
console.warn(`当前数据对象不包含属性${singleMainField},可能会发生错误`);
}
})
for (let i = 0; i <= 1; i++) {
......
......@@ -201,7 +201,7 @@ export default class DictOptionUIServiceBase extends UIService {
this.mainStateFields.forEach((singleMainField:any) =>{
if(!(singleMainField in curData)){
console.error(`当前数据对象不包含属性singleMainField,可能会发生错误`);
console.warn(`当前数据对象不包含属性${singleMainField},可能会发生错误`);
}
})
for (let i = 0; i <= 1; i++) {
......
.el-popover {
overflow-y: auto;
//z-index: 99 !important;
background: #ffffff;
border: 1px solid #dee0e4;
padding: 0px;
z-index: 2000;
color: var(--app-color-font-content);
line-height: 1.4;
text-align: justify;
font-size: 14px;
overflow-y: hidden;
overflow-x: hidden;
.el-card__header {
padding: 5px 10px;
border-bottom: 1px solid #dee0e4;
color: var(--app-color-font-content);
}
.el-card{
min-width: 150px;
border: none;
background-color: #ffffff;
color: var(--app-color-font-content);
}
.el-card__body {
padding: 0px;
overflow-x:hidden;
overflow-y: auto;
.viewcontainer2{
.content-container{
margin: 0;
}
}
}
}
.clearfix{
position: relative;
.cancel{
position: absolute;
right: 5px;
top: 5px;
}
.app-popover-wrapper {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
.app-popover.app-popper {
border-radius: 5px;
overflow: auto;
border: 1px solid #bfbfbf;
padding: 5px;
background: #e8e8e8;
}
}
\ No newline at end of file
import { Notice } from 'view-design';
export function Errorlog(target: Object, propertyKey: string, descriptor: TypedPropertyDescriptor<any>){
let origin=descriptor.value;
let $Notice: any = Notice;
descriptor.value=function(...args:any[]){
return new Promise((resolve: any, reject: any) => {
// 原方法调用方法
......@@ -12,7 +9,7 @@ export function Errorlog(target: Object, propertyKey: string, descriptor: TypedP
}).catch((error:any)=>{
// 开发模式下页面报错
if (process.env.NODE_ENV === 'development') {
$Notice.error({ title: '错误', desc: target.constructor.name+'类'+propertyKey+'方法产生异常' });
console.error(target.constructor.name+'类'+propertyKey+'方法产生异常');
}
// 控制台报错
console.error(error);
......
......@@ -260,7 +260,7 @@ export class ViewTool {
if(_item && _item['dataaccaction'] && UIService && data && Object.keys(data).length >0){
let dataActionResult:any = UIService.getAllOPPrivs(data)[_item['dataaccaction']];
// 无权限:0;有权限:1
if(!dataActionResult){
if(dataActionResult === 0){
// 禁用:1;隐藏:2;隐藏且默认隐藏:6
if(_item.noprivdisplaymode === 1){
_item.disabled = true;
......@@ -270,7 +270,8 @@ export class ViewTool {
}else{
_item.visabled = true;
}
}else{
}
if(dataActionResult === 1){
_item.visabled = true;
_item.disabled = false;
}
......
......@@ -8,111 +8,7 @@
:collapse="isCollapse"
@select="select"
:default-active="defaultActive">
<template v-for="item0 in menus">
<template v-if="item0.items && Array.isArray(item0.items) && item0.items.length > 0">
<el-submenu v-show="!item0.hidden" :index="item0.name" :popper-class="popperClass" :key="item0.id">
<template slot='title'>
<template v-if="item0.icon && item0.icon != ''">
<img :src="item0.icon" class='app-menu-icon' />
</template>
<template v-else-if="item0.iconcls && item0.iconcls != ''">
<i :class="[item0.iconcls, 'app-menu-icon']"></i>
</template>
<template v-else>
<i class='fa fa-cogs app-menu-icon'></i>
</template>
<span class='text' :title="$t('app.menus.appindexview.' + item0.name)">{{$t('app.menus.appindexview.' + item0.name)}}</span>
</template>
<template v-for="item1 in item0.items">
<template v-if="item1.items && Array.isArray(item1.items) && item1.items.length > 0">
<el-submenu v-show="!item1.hidden" :index="item1.name" :popper-class="popperClass" :key="item1.id">
<template slot='title'>
<template v-if="item1.icon && item1.icon != ''">
<img :src="item1.icon" class='app-menu-icon' />
</template>
<template v-else-if="item1.iconcls && item1.iconcls != ''">
<i :class="[item1.iconcls, 'app-menu-icon']"></i>
</template>
<span class='text' :title="$t('app.menus.appindexview.' + item1.name)">{{$t('app.menus.appindexview.' + item1.name)}}</span>
</template>
<template v-for="item2 in item1.items">
<template v-if="item2.type =='MENUITEM'">
<el-menu-item v-show="!item2.hidden" :index="item2.name" :key="item2.id">
<template v-if="item2.icon && item2.icon != ''">
<img :src="item2.icon" class='app-menu-icon' />
</template>
<template v-else-if="item2.iconcls && item2.iconcls != ''">
<i :class="[item2.iconcls, 'app-menu-icon']"></i>
</template>
<template slot="title">
<span class="text" :title="$t('app.menus.appindexview.' + item2.name)">{{$t('app.menus.appindexview.' + item2.name)}}</span>
<template v-if="counterdata && counterdata[item2.counterid] && counterdata[item2.counterid] > 0">
<span class="pull-right">
<badge :count="counterdata[item2.counterid]" :overflow-count="9999"></badge>
</span>
</template>
</template>
</el-menu-item>
</template>
<template v-if="item2.type =='SEPERATOR'">
<divider :key="item2.id" />
</template>
</template>
</el-submenu>
</template>
<template v-else>
<template v-if="item1.type =='MENUITEM'">
<el-menu-item v-show="!item1.hidden" :index="item1.name" :key="item1.id">
<template v-if="item1.icon && item1.icon != ''">
<img :src="item1.icon" class='app-menu-icon' />
</template>
<template v-else-if="item1.iconcls && item1.iconcls != ''">
<i :class="[item1.iconcls, 'app-menu-icon']"></i>
</template>
<template slot="title">
<span class="text" :title="$t('app.menus.appindexview.' + item1.name)">{{$t('app.menus.appindexview.' + item1.name)}} </span>
<template v-if="counterdata && counterdata[item1.counterid] && counterdata[item1.counterid] > 0">
<span class="pull-right">
<badge :count="counterdata[item1.counterid]" :overflow-count="9999"></badge>
</span>
</template>
</template>
</el-menu-item>
</template>
<template v-if="item1.type =='SEPERATOR'">
<divider :key="item1.id" />
</template>
</template>
</template>
</el-submenu>
</template>
<template v-else>
<template v-if="item0.type =='MENUITEM'">
<el-menu-item v-show="!item0.hidden" :index="item0.name" :key="item0.id">
<template v-if="item0.icon && item0.icon != ''">
<img :src="item0.icon" class='app-menu-icon' />
</template>
<template v-else-if="item0.iconcls && item0.iconcls != ''">
<i :class="[item0.iconcls, 'app-menu-icon']"></i>
</template>
<template v-else>
<i class='fa fa-cogs app-menu-icon'></i>
</template>
<template slot="title">
<span class="text" :title="$t('app.menus.appindexview.' + item0.name)">{{$t('app.menus.appindexview.' + item0.name)}}</span>
<template v-if="counterdata && counterdata[item0.counterid] && counterdata[item0.counterid] > 0">
<span class="pull-right">
<badge :count="counterdata[item0.counterid]" :overflow-count="9999"></badge>
</span>
</template>
</template>
</el-menu-item>
</template>
<template v-if="item0.type =='SEPERATOR'">
<divider :key="item0.id" />
</template>
</template>
</template>
<app-menu-item :menus="menus" :ctrlName="'appindexview'" :isFirst="true" :counterdata="counterdata" :popperclass="popperClass"></app-menu-item>
</el-menu>
</div>
</template>
......
......@@ -7,18 +7,21 @@
<i-col v-show="detailsModel.n_ccode_like.visible" :style="{}" :sm="{ span: 24, offset: 0 }" :md="{ span: 8, offset: 0 }" :lg="{ span: 8, offset: 0 }" :xl="{ span: 8, offset: 0 }">
<app-form-item name='n_ccode_like' :itemRules="this.rules.n_ccode_like" class='' :caption="$t('entities.dictcatalog.default_searchform.details.n_ccode_like')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.n_ccode_like.error" :isEmptyCaption="false" labelPos="LEFT">
<input-box v-model="data.n_ccode_like" @enter="onEnter($event)" :disabled="detailsModel.n_ccode_like.disabled" type='text' style="width:100px;"></input-box>
</app-form-item>
</i-col>
<i-col v-show="detailsModel.n_cname_like.visible" :style="{}" :sm="{ span: 24, offset: 0 }" :md="{ span: 8, offset: 0 }" :lg="{ span: 8, offset: 0 }" :xl="{ span: 8, offset: 0 }">
<app-form-item name='n_cname_like' :itemRules="this.rules.n_cname_like" class='' :caption="$t('entities.dictcatalog.default_searchform.details.n_cname_like')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.n_cname_like.error" :isEmptyCaption="false" labelPos="LEFT">
<input-box v-model="data.n_cname_like" @enter="onEnter($event)" :disabled="detailsModel.n_cname_like.disabled" type='text' style="width:100px;"></input-box>
</app-form-item>
</i-col>
<i-col v-show="detailsModel.n_cgroup_like.visible" :style="{}" :sm="{ span: 24, offset: 0 }" :md="{ span: 8, offset: 0 }" :lg="{ span: 8, offset: 0 }" :xl="{ span: 8, offset: 0 }">
<app-form-item name='n_cgroup_like' :itemRules="this.rules.n_cgroup_like" class='' :caption="$t('entities.dictcatalog.default_searchform.details.n_cgroup_like')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.n_cgroup_like.error" :isEmptyCaption="false" labelPos="LEFT">
<input-box v-model="data.n_cgroup_like" @enter="onEnter($event)" :disabled="detailsModel.n_cgroup_like.disabled" type='text' style="width:100px;"></input-box>
</app-form-item>
</i-col>
......
......@@ -150,7 +150,6 @@ export default class DefaultService extends ControlService {
});
}
/**
* 添加数据
*
......@@ -365,4 +364,25 @@ export default class DefaultService extends ControlService {
return {context:tempContext,data:requestData};
}
/**
* 通过属性名称获取表单项名称
*
* @param name 实体属性名称
* @memberof DefaultService
*/
public getItemNameByDeName(name:string) :string{
let itemName = name;
let mode: any = this.getMode();
if (!mode && mode.getDataItems instanceof Function) {
return name;
}
let formItemItems: any[] = mode.getDataItems();
formItemItems.forEach((item:any)=>{
if(item.prop === name){
itemName = item.name;
}
});
return itemName.trim();
}
}
\ No newline at end of file
......@@ -7,26 +7,30 @@
<app-form-group :uiService="appUIService" :data="transformData(data)" :manageContainerStatus="detailsModel.group1.manageContainerStatus" :isManageContainer="detailsModel.group1.isManageContainer" @managecontainerclick="manageContainerClick('group1')" layoutType="TABLE_24COL" titleStyle="" class='' :uiActionGroup="detailsModel.group1.uiActionGroup" @groupuiactionclick="groupUIActionClick($event)" :caption="$t('entities.dictcatalog.main_form.details.group1')" :isShowCaption="false" uiStyle="DEFAULT" :titleBarCloseMode="0" :isInfoGroupMode="false" >
<row>
<i-col v-show="detailsModel.ccode.visible" :style="{}" :sm="{ span: 24, offset: 0 }" :md="{ span: 8, offset: 0 }" :lg="{ span: 8, offset: 0 }" :xl="{ span: 8, offset: 0 }">
<app-form-item name='ccode' :itemRules="this.rules.ccode" class='' :caption="$t('entities.dictcatalog.main_form.details.ccode')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.ccode.error" :isEmptyCaption="false" labelPos="LEFT">
<app-form-item name='ccode' :itemRules="this.rules().ccode" class='' :caption="$t('entities.dictcatalog.main_form.details.ccode')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.ccode.error" :isEmptyCaption="false" labelPos="LEFT">
<input-box v-model="data.ccode" @enter="onEnter($event)" unit="" :disabled="detailsModel.ccode.disabled" type='text' style=""></input-box>
</app-form-item>
</i-col>
<i-col v-show="detailsModel.cname.visible" :style="{}" :sm="{ span: 24, offset: 0 }" :md="{ span: 8, offset: 0 }" :lg="{ span: 8, offset: 0 }" :xl="{ span: 8, offset: 0 }">
<app-form-item name='cname' :itemRules="this.rules.cname" class='' :caption="$t('entities.dictcatalog.main_form.details.cname')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.cname.error" :isEmptyCaption="false" labelPos="LEFT">
<app-form-item name='cname' :itemRules="this.rules().cname" class='' :caption="$t('entities.dictcatalog.main_form.details.cname')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.cname.error" :isEmptyCaption="false" labelPos="LEFT">
<input-box v-model="data.cname" @enter="onEnter($event)" unit="" :disabled="detailsModel.cname.disabled" type='text' style=""></input-box>
</app-form-item>
</i-col>
<i-col v-show="detailsModel.cgroup.visible" :style="{}" :sm="{ span: 24, offset: 0 }" :md="{ span: 8, offset: 0 }" :lg="{ span: 8, offset: 0 }" :xl="{ span: 8, offset: 0 }">
<app-form-item name='cgroup' :itemRules="this.rules.cgroup" class='' :caption="$t('entities.dictcatalog.main_form.details.cgroup')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.cgroup.error" :isEmptyCaption="false" labelPos="LEFT">
<app-form-item name='cgroup' :itemRules="this.rules().cgroup" class='' :caption="$t('entities.dictcatalog.main_form.details.cgroup')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.cgroup.error" :isEmptyCaption="false" labelPos="LEFT">
<input-box v-model="data.cgroup" @enter="onEnter($event)" unit="" :disabled="detailsModel.cgroup.disabled" type='text' style=""></input-box>
</app-form-item>
</i-col>
<i-col v-show="detailsModel.memo.visible" :style="{}" :sm="{ span: 24, offset: 0 }" :md="{ span: 24, offset: 0 }" :lg="{ span: 24, offset: 0 }" :xl="{ span: 24, offset: 0 }">
<app-form-item name='memo' :itemRules="this.rules.memo" class='' :caption="$t('entities.dictcatalog.main_form.details.memo')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.memo.error" :isEmptyCaption="false" labelPos="LEFT">
<app-form-item name='memo' :itemRules="this.rules().memo" class='' :caption="$t('entities.dictcatalog.main_form.details.memo')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.memo.error" :isEmptyCaption="false" labelPos="LEFT">
<input-box v-model="data.memo" @enter="onEnter($event)" unit="" :disabled="detailsModel.memo.disabled" type='text' style=""></input-box>
</app-form-item>
</i-col>
......@@ -446,7 +450,8 @@ export default class MainBase extends Vue implements ControlInterface {
* @type {*}
* @memberof MainBase
*/
public rules: any = {
public rules() :any {
return {
srfupdatedate: [
{ type: 'string', message: '最后修改时间 值必须为字符串类型', trigger: 'change' },
{ type: 'string', message: '最后修改时间 值必须为字符串类型', trigger: 'blur' },
......@@ -525,6 +530,51 @@ export default class MainBase extends Vue implements ControlInterface {
{ required: false, type: 'string', message: '标识 值不能为空', trigger: 'change' },
{ required: false, type: 'string', message: '标识 值不能为空', trigger: 'blur' },
],
}
}
/**
* 属性值规则
*
* @type {*}
* @memberof MainBase
*/
public deRules:any = {
};
/**
* 校验属性值规则
*
* @public
* @param {{ name: string }} { name }
* @memberof MainBase
*/
public verifyDeRules(name:string,rule:any = this.deRules) :{isPast:boolean,infoMessage:string}{
let falg = {isPast:true,infoMessage:""};
if(!rule[name]){
return falg;
}
rule[name].forEach((item:any) => {
if(item.type == 'SIMPLE' && this.data[this.service.getItemNameByDeName(item.deName)] != item.paramValue){
falg.isPast = false;
falg.infoMessage = item.ruleInfo;
}
if(item.type == 'REGEX' && (item.isNotMode? item.RegExCode.test(this.data[name]) : !item.RegExCode.test(this.data[name]))){
falg.isPast = false;
falg.infoMessage = item.ruleInfo;
}
if(item.type == 'STRINGLENGTH' ){
let valueLength :number = this.data[name]?this.data[name].length:0;
if(item.isNotMode? valueLength > item.minValue && valueLength < item.maxValue : !(valueLength > item.minValue && valueLength < item.maxValue)){
falg.isPast = false;
falg.infoMessage = item.ruleInfo;
}
}
if(item.type == 'GROUP'){
falg = this.verifyDeRules('group',item)
}
});
return falg;
}
/**
......@@ -805,7 +855,7 @@ export default class MainBase extends Vue implements ControlInterface {
*/
public checkItem(name:string):Promise<any> {
return new Promise((resolve, reject) => {
var validator = new schema({[name]:this.rules[name]});
var validator = new schema({[name]:this.rules()[name]});
validator.validate({[name]:this.data[name]}).then(()=>{
resolve(true);
})
......@@ -1236,9 +1286,6 @@ export default class MainBase extends Vue implements ControlInterface {
}
const data = response.data;
if(data.dictcatalog){
Object.assign(this.context,{dictcatalog:data.dictcatalog})
}
this.resetDraftFormStates();
this.onFormLoad(data,'loadDraft');
this.$emit('load', data);
......
......@@ -150,7 +150,6 @@ export default class MainService extends ControlService {
});
}
/**
* 添加数据
*
......@@ -370,4 +369,25 @@ export default class MainService extends ControlService {
return {context:tempContext,data:requestData};
}
/**
* 通过属性名称获取表单项名称
*
* @param name 实体属性名称
* @memberof MainService
*/
public getItemNameByDeName(name:string) :string{
let itemName = name;
let mode: any = this.getMode();
if (!mode && mode.getDataItems instanceof Function) {
return name;
}
let formItemItems: any[] = mode.getDataItems();
formItemItems.forEach((item:any)=>{
if(item.prop === name){
itemName = item.name;
}
});
return itemName.trim();
}
}
\ No newline at end of file
......@@ -543,7 +543,7 @@ export default class MainBase extends Vue implements ControlInterface {
*
* @memberof MainBase
*/
public defaultUpdateItems:Array<any> =['srfkey'];
public defaultUpdateItems:Array<any> =[];
/**
* 选中行数据
......@@ -1515,7 +1515,7 @@ export default class MainBase extends Vue implements ControlInterface {
this.$Notice.success({ title: '', desc: (this.$t('app.commonWords.saveSuccess') as string) });
}else{
errorItems.forEach((item:any,index:number)=>{
this.$Notice.error({ title: (this.$t('app.commonWords.saveFailed') as string), desc: item.majorentityname+(this.$t('app.commonWords.saveFailed') as string)+'!' });
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: errorMessage[index].data.message });
console.error(errorMessage[index]);
});
}
......
......@@ -60,6 +60,7 @@ export default class MainModel {
name: 'srfkey',
prop: 'id',
dataType: 'TEXT',
isEditable:true
},
{
name: 'cname',
......
......@@ -99,7 +99,7 @@ export default class MainService extends ControlService {
*/
@Errorlog
public add(action: string, context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
const {data:Data,context:Context} = this.handleRequestData(action,context,data,true);
const {data:Data,context:Context} = this.handleRequestDataWithUpdate(action,context,data,true);
return new Promise((resolve: any, reject: any) => {
const _appEntityService: any = this.appEntityService;
let result: Promise<any>;
......@@ -158,14 +158,14 @@ export default class MainService extends ControlService {
*/
@Errorlog
public update(action: string, context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
const {data:Data,context:Context} = this.handleRequestData(action,context,data,true);
const {data:Data,context:Context} = this.handleRequestDataWithUpdate(action,context,data,true);
return new Promise((resolve: any, reject: any) => {
const _appEntityService: any = this.appEntityService;
let result: Promise<any>;
if (_appEntityService[action] && _appEntityService[action] instanceof Function) {
result = _appEntityService[action](Data,Context,isloading);
result = _appEntityService[action](Context,Data,isloading);
}else{
result =_appEntityService.Update(Data,Context,isloading);
result =_appEntityService.Update(Context,Data,isloading);
}
result.then((response) => {
this.handleResponse(action, response);
......@@ -305,5 +305,41 @@ export default class MainService extends ControlService {
});
})
}
/**
* 处理请求数据(修改或增加数据)
*
* @param action 行为
* @param data 数据
* @memberof MainService
*/
public handleRequestDataWithUpdate(action: string,context:any ={},data: any = {},isMerge:boolean = false){
let model: any = this.getMode();
if (!model && model.getDataItems instanceof Function) {
return data;
}
let dataItems: any[] = model.getDataItems();
let requestData:any = {};
if(isMerge && (data && data.viewparams)){
Object.assign(requestData,data.viewparams);
}
dataItems.forEach((item:any) =>{
if(item && item.dataType && Object.is(item.dataType,'FONTKEY')){
if(item && item.prop && item.name ){
requestData[item.prop] = context[item.name];
}
}else{
if(item && item.isEditable && item.prop && item.name && (data[item.name] || Object.is(data[item.name],0)) ){
requestData[item.prop] = data[item.name];
}
}
});
let tempContext:any = JSON.parse(JSON.stringify(context));
if(tempContext && tempContext.srfsessionid){
tempContext.srfsessionkey = tempContext.srfsessionid;
delete tempContext.srfsessionid;
}
return {context:tempContext,data:requestData};
}
}
\ No newline at end of file
......@@ -7,18 +7,21 @@
<i-col v-show="detailsModel.n_cname_like.visible" :style="{}" :sm="{ span: 24, offset: 0 }" :md="{ span: 8, offset: 0 }" :lg="{ span: 8, offset: 0 }" :xl="{ span: 8, offset: 0 }">
<app-form-item name='n_cname_like' :itemRules="this.rules.n_cname_like" class='' :caption="$t('entities.dictoption.default_searchform.details.n_cname_like')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.n_cname_like.error" :isEmptyCaption="false" labelPos="LEFT">
<input-box v-model="data.n_cname_like" @enter="onEnter($event)" :disabled="detailsModel.n_cname_like.disabled" type='text' style="width:100px;"></input-box>
</app-form-item>
</i-col>
<i-col v-show="detailsModel.n_val_like.visible" :style="{}" :sm="{ span: 24, offset: 0 }" :md="{ span: 8, offset: 0 }" :lg="{ span: 8, offset: 0 }" :xl="{ span: 8, offset: 0 }">
<app-form-item name='n_val_like' :itemRules="this.rules.n_val_like" class='' :caption="$t('entities.dictoption.default_searchform.details.n_val_like')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.n_val_like.error" :isEmptyCaption="false" labelPos="LEFT">
<input-box v-model="data.n_val_like" @enter="onEnter($event)" :disabled="detailsModel.n_val_like.disabled" type='text' style="width:100px;"></input-box>
</app-form-item>
</i-col>
<i-col v-show="detailsModel.n_label_like.visible" :style="{}" :sm="{ span: 24, offset: 0 }" :md="{ span: 8, offset: 0 }" :lg="{ span: 8, offset: 0 }" :xl="{ span: 8, offset: 0 }">
<app-form-item name='n_label_like' :itemRules="this.rules.n_label_like" class='' :caption="$t('entities.dictoption.default_searchform.details.n_label_like')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.n_label_like.error" :isEmptyCaption="false" labelPos="LEFT">
<input-box v-model="data.n_label_like" @enter="onEnter($event)" :disabled="detailsModel.n_label_like.disabled" type='text' style="width:100px;"></input-box>
</app-form-item>
</i-col>
......
......@@ -150,7 +150,6 @@ export default class DefaultService extends ControlService {
});
}
/**
* 添加数据
*
......@@ -365,4 +364,25 @@ export default class DefaultService extends ControlService {
return {context:tempContext,data:requestData};
}
/**
* 通过属性名称获取表单项名称
*
* @param name 实体属性名称
* @memberof DefaultService
*/
public getItemNameByDeName(name:string) :string{
let itemName = name;
let mode: any = this.getMode();
if (!mode && mode.getDataItems instanceof Function) {
return name;
}
let formItemItems: any[] = mode.getDataItems();
formItemItems.forEach((item:any)=>{
if(item.prop === name){
itemName = item.name;
}
});
return itemName.trim();
}
}
\ No newline at end of file
......@@ -162,7 +162,6 @@ export default class MainService extends ControlService {
});
}
/**
* 添加数据
*
......@@ -382,4 +381,25 @@ export default class MainService extends ControlService {
return {context:tempContext,data:requestData};
}
/**
* 通过属性名称获取表单项名称
*
* @param name 实体属性名称
* @memberof MainService
*/
public getItemNameByDeName(name:string) :string{
let itemName = name;
let mode: any = this.getMode();
if (!mode && mode.getDataItems instanceof Function) {
return name;
}
let formItemItems: any[] = mode.getDataItems();
formItemItems.forEach((item:any)=>{
if(item.prop === name){
itemName = item.name;
}
});
return itemName.trim();
}
}
\ No newline at end of file
......@@ -40,10 +40,11 @@
@change="($event)=>{gridEditItemChange(row, column.property, $event, $index)}">
</input-box>
</app-form-item>
</template>
<template v-if="!actualIsOpenEdit">
<app-span name='cid' editorType="HIDDEN" :value="row.cid"></app-span>
<app-span name='cid' editorType="HIDDEN" :value="row.cid" dataType="PICKUP" precision="0" ></app-span>
</template>
</template>
</el-table-column>
......@@ -67,10 +68,11 @@
@change="($event)=>{gridEditItemChange(row, column.property, $event, $index)}">
</input-box>
</app-form-item>
</template>
<template v-if="!actualIsOpenEdit">
<app-span name='val' editorType="TEXTBOX" :value="row.val"></app-span>
<app-span name='val' editorType="TEXTBOX" :value="row.val" dataType="TEXT" precision="0" ></app-span>
</template>
</template>
</el-table-column>
......@@ -94,10 +96,11 @@
@change="($event)=>{gridEditItemChange(row, column.property, $event, $index)}">
</input-box>
</app-form-item>
</template>
<template v-if="!actualIsOpenEdit">
<app-span name='label' editorType="TEXTBOX" :value="row.label"></app-span>
<app-span name='label' editorType="TEXTBOX" :value="row.label" dataType="TEXT" precision="0" ></app-span>
</template>
</template>
</el-table-column>
......@@ -121,10 +124,11 @@
@change="($event)=>{gridEditItemChange(row, column.property, $event, $index)}">
</input-box>
</app-form-item>
</template>
<template v-if="!actualIsOpenEdit">
<app-span name='pval' editorType="TEXTBOX" :value="row.pval"></app-span>
<app-span name='pval' editorType="TEXTBOX" :value="row.pval" dataType="TEXT" precision="0" ></app-span>
</template>
</template>
</el-table-column>
......@@ -148,10 +152,11 @@
@change="($event)=>{gridEditItemChange(row, column.property, $event, $index)}">
</input-box>
</app-form-item>
</template>
<template v-if="!actualIsOpenEdit">
<app-span name='showorder' editorType="TEXTBOX" :value="row.showorder"></app-span>
<app-span name='showorder' editorType="TEXTBOX" :value="row.showorder" dataType="INT" precision="0" ></app-span>
</template>
</template>
</el-table-column>
......@@ -191,7 +196,7 @@
</app-form-item>
</template>
<template v-if="!actualIsOpenEdit">
<app-span name='cname' editorType="PICKER" :value="row.cname"></app-span>
<app-span name='cname' editorType="PICKER" :value="row.cname" dataType="PICKUPTEXT" precision="0" ></app-span>
</template>
</template>
</el-table-column>
......@@ -215,10 +220,11 @@
@change="($event)=>{gridEditItemChange(row, column.property, $event, $index)}">
</input-box>
</app-form-item>
</template>
<template v-if="!actualIsOpenEdit">
<app-span name='cls' editorType="TEXTBOX" :value="row.cls"></app-span>
<app-span name='cls' editorType="TEXTBOX" :value="row.cls" dataType="TEXT" precision="0" ></app-span>
</template>
</template>
</el-table-column>
......@@ -242,10 +248,11 @@
@change="($event)=>{gridEditItemChange(row, column.property, $event, $index)}">
</input-box>
</app-form-item>
</template>
<template v-if="!actualIsOpenEdit">
<app-span name='iconcls' editorType="TEXTBOX" :value="row.iconcls"></app-span>
<app-span name='iconcls' editorType="TEXTBOX" :value="row.iconcls" dataType="TEXT" precision="0" ></app-span>
</template>
</template>
</el-table-column>
......@@ -269,10 +276,11 @@
@change="($event)=>{gridEditItemChange(row, column.property, $event, $index)}">
</input-box>
</app-form-item>
</template>
<template v-if="!actualIsOpenEdit">
<app-span name='vfilter' editorType="TEXTBOX" :value="row.vfilter"></app-span>
<app-span name='vfilter' editorType="TEXTBOX" :value="row.vfilter" dataType="TEXT" precision="0" ></app-span>
</template>
</template>
</el-table-column>
......@@ -364,10 +372,11 @@
@change="($event)=>{gridEditItemChange(row, column.property, $event, $index)}">
</input-box>
</app-form-item>
</template>
<template v-if="!actualIsOpenEdit">
<app-span name='extension' editorType="TEXTBOX" :value="row.extension"></app-span>
<app-span name='extension' editorType="TEXTBOX" :value="row.extension" dataType="LONGTEXT_1000" precision="0" ></app-span>
</template>
</template>
</el-table-column>
......@@ -846,7 +855,7 @@ export default class MainBase extends Vue implements ControlInterface {
*
* @memberof MainBase
*/
public defaultUpdateItems:Array<any> =['val','pval','cls','expired','label','cid','srfkey','iconcls','extension','vfilter','showorder','cname','disabled'];
public defaultUpdateItems:Array<any> =[,,,,,,,,,,,,];
/**
* 选中行数据
......@@ -1958,7 +1967,7 @@ export default class MainBase extends Vue implements ControlInterface {
this.$Notice.success({ title: '', desc: (this.$t('app.commonWords.saveSuccess') as string) });
}else{
errorItems.forEach((item:any,index:number)=>{
this.$Notice.error({ title: (this.$t('app.commonWords.saveFailed') as string), desc: item.majorentityname+(this.$t('app.commonWords.saveFailed') as string)+'!' });
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: errorMessage[index].data.message });
console.error(errorMessage[index]);
});
}
......
......@@ -30,31 +30,37 @@ export default class MainModel {
name: 'val',
prop: 'value',
dataType: 'TEXT',
isEditable:true
},
{
name: 'pval',
prop: 'parent',
dataType: 'TEXT',
isEditable:true
},
{
name: 'cls',
prop: 'cls',
dataType: 'TEXT',
isEditable:true
},
{
name: 'expired',
prop: 'expired',
dataType: 'YESNO',
isEditable:true
},
{
name: 'label',
prop: 'label',
dataType: 'TEXT',
isEditable:true
},
{
name: 'cid',
prop: 'catalog_id',
dataType: 'PICKUP',
isEditable:true
},
{
name: 'srfmajortext',
......@@ -70,26 +76,31 @@ export default class MainModel {
name: 'srfkey',
prop: 'value_key',
dataType: 'TEXT',
isEditable:true
},
{
name: 'iconcls',
prop: 'icon_class',
dataType: 'TEXT',
isEditable:true
},
{
name: 'extension',
prop: 'extension',
dataType: 'LONGTEXT_1000',
isEditable:true
},
{
name: 'vfilter',
prop: 'filter',
dataType: 'TEXT',
isEditable:true
},
{
name: 'showorder',
prop: 'showorder',
dataType: 'INT',
isEditable:true
},
{
name: 'updatedate',
......@@ -100,11 +111,13 @@ export default class MainModel {
name: 'cname',
prop: 'catalog_name',
dataType: 'PICKUPTEXT',
isEditable:true
},
{
name: 'disabled',
prop: 'disabled',
dataType: 'YESNO',
isEditable:true
},
{
name: 'dictoption',
......
......@@ -111,7 +111,7 @@ export default class MainService extends ControlService {
*/
@Errorlog
public add(action: string, context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
const {data:Data,context:Context} = this.handleRequestData(action,context,data,true);
const {data:Data,context:Context} = this.handleRequestDataWithUpdate(action,context,data,true);
return new Promise((resolve: any, reject: any) => {
const _appEntityService: any = this.appEntityService;
let result: Promise<any>;
......@@ -170,14 +170,14 @@ export default class MainService extends ControlService {
*/
@Errorlog
public update(action: string, context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
const {data:Data,context:Context} = this.handleRequestData(action,context,data,true);
const {data:Data,context:Context} = this.handleRequestDataWithUpdate(action,context,data,true);
return new Promise((resolve: any, reject: any) => {
const _appEntityService: any = this.appEntityService;
let result: Promise<any>;
if (_appEntityService[action] && _appEntityService[action] instanceof Function) {
result = _appEntityService[action](Data,Context,isloading);
result = _appEntityService[action](Context,Data,isloading);
}else{
result =_appEntityService.Update(Data,Context,isloading);
result =_appEntityService.Update(Context,Data,isloading);
}
result.then((response) => {
this.handleResponse(action, response);
......@@ -317,5 +317,41 @@ export default class MainService extends ControlService {
});
})
}
/**
* 处理请求数据(修改或增加数据)
*
* @param action 行为
* @param data 数据
* @memberof MainService
*/
public handleRequestDataWithUpdate(action: string,context:any ={},data: any = {},isMerge:boolean = false){
let model: any = this.getMode();
if (!model && model.getDataItems instanceof Function) {
return data;
}
let dataItems: any[] = model.getDataItems();
let requestData:any = {};
if(isMerge && (data && data.viewparams)){
Object.assign(requestData,data.viewparams);
}
dataItems.forEach((item:any) =>{
if(item && item.dataType && Object.is(item.dataType,'FONTKEY')){
if(item && item.prop && item.name ){
requestData[item.prop] = context[item.name];
}
}else{
if(item && item.isEditable && item.prop && item.name && (data[item.name] || Object.is(data[item.name],0)) ){
requestData[item.prop] = data[item.name];
}
}
});
let tempContext:any = JSON.parse(JSON.stringify(context));
if(tempContext && tempContext.srfsessionid){
tempContext.srfsessionkey = tempContext.srfsessionid;
delete tempContext.srfsessionid;
}
return {context:tempContext,data:requestData};
}
}
\ No newline at end of file
......@@ -40,10 +40,11 @@
@change="($event)=>{gridEditItemChange(row, column.property, $event, $index)}">
</input-box>
</app-form-item>
</template>
<template v-if="!actualIsOpenEdit">
<app-span name='cid' editorType="HIDDEN" :value="row.cid"></app-span>
<app-span name='cid' editorType="HIDDEN" :value="row.cid" dataType="PICKUP" precision="0" ></app-span>
</template>
</template>
</el-table-column>
......@@ -67,10 +68,11 @@
@change="($event)=>{gridEditItemChange(row, column.property, $event, $index)}">
</input-box>
</app-form-item>
</template>
<template v-if="!actualIsOpenEdit">
<app-span name='val' editorType="TEXTBOX" :value="row.val"></app-span>
<app-span name='val' editorType="TEXTBOX" :value="row.val" dataType="TEXT" precision="0" ></app-span>
</template>
</template>
</el-table-column>
......@@ -94,10 +96,11 @@
@change="($event)=>{gridEditItemChange(row, column.property, $event, $index)}">
</input-box>
</app-form-item>
</template>
<template v-if="!actualIsOpenEdit">
<app-span name='label' editorType="TEXTBOX" :value="row.label"></app-span>
<app-span name='label' editorType="TEXTBOX" :value="row.label" dataType="TEXT" precision="0" ></app-span>
</template>
</template>
</el-table-column>
......@@ -121,10 +124,11 @@
@change="($event)=>{gridEditItemChange(row, column.property, $event, $index)}">
</input-box>
</app-form-item>
</template>
<template v-if="!actualIsOpenEdit">
<app-span name='pval' editorType="TEXTBOX" :value="row.pval"></app-span>
<app-span name='pval' editorType="TEXTBOX" :value="row.pval" dataType="TEXT" precision="0" ></app-span>
</template>
</template>
</el-table-column>
......@@ -148,10 +152,11 @@
@change="($event)=>{gridEditItemChange(row, column.property, $event, $index)}">
</input-box>
</app-form-item>
</template>
<template v-if="!actualIsOpenEdit">
<app-span name='showorder' editorType="TEXTBOX" :value="row.showorder"></app-span>
<app-span name='showorder' editorType="TEXTBOX" :value="row.showorder" dataType="INT" precision="0" ></app-span>
</template>
</template>
</el-table-column>
......@@ -191,7 +196,7 @@
</app-form-item>
</template>
<template v-if="!actualIsOpenEdit">
<app-span name='cname' editorType="PICKER" :value="row.cname"></app-span>
<app-span name='cname' editorType="PICKER" :value="row.cname" dataType="PICKUPTEXT" precision="0" ></app-span>
</template>
</template>
</el-table-column>
......@@ -215,10 +220,11 @@
@change="($event)=>{gridEditItemChange(row, column.property, $event, $index)}">
</input-box>
</app-form-item>
</template>
<template v-if="!actualIsOpenEdit">
<app-span name='cls' editorType="TEXTBOX" :value="row.cls"></app-span>
<app-span name='cls' editorType="TEXTBOX" :value="row.cls" dataType="TEXT" precision="0" ></app-span>
</template>
</template>
</el-table-column>
......@@ -242,10 +248,11 @@
@change="($event)=>{gridEditItemChange(row, column.property, $event, $index)}">
</input-box>
</app-form-item>
</template>
<template v-if="!actualIsOpenEdit">
<app-span name='iconcls' editorType="TEXTBOX" :value="row.iconcls"></app-span>
<app-span name='iconcls' editorType="TEXTBOX" :value="row.iconcls" dataType="TEXT" precision="0" ></app-span>
</template>
</template>
</el-table-column>
......@@ -269,10 +276,11 @@
@change="($event)=>{gridEditItemChange(row, column.property, $event, $index)}">
</input-box>
</app-form-item>
</template>
<template v-if="!actualIsOpenEdit">
<app-span name='vfilter' editorType="TEXTBOX" :value="row.vfilter"></app-span>
<app-span name='vfilter' editorType="TEXTBOX" :value="row.vfilter" dataType="TEXT" precision="0" ></app-span>
</template>
</template>
</el-table-column>
......@@ -364,10 +372,11 @@
@change="($event)=>{gridEditItemChange(row, column.property, $event, $index)}">
</input-box>
</app-form-item>
</template>
<template v-if="!actualIsOpenEdit">
<app-span name='extension' editorType="TEXTBOX" :value="row.extension"></app-span>
<app-span name='extension' editorType="TEXTBOX" :value="row.extension" dataType="LONGTEXT_1000" precision="0" ></app-span>
</template>
</template>
</el-table-column>
......@@ -834,7 +843,7 @@ export default class OptionsBase extends Vue implements ControlInterface {
*
* @memberof OptionsBase
*/
public defaultUpdateItems:Array<any> =['val','pval','cls','expired','label','cid','srfkey','iconcls','extension','vfilter','showorder','cname','disabled'];
public defaultUpdateItems:Array<any> =[,,,,,,,,,,,,];
/**
* 选中行数据
......@@ -1938,7 +1947,7 @@ export default class OptionsBase extends Vue implements ControlInterface {
this.$Notice.success({ title: '', desc: (this.$t('app.commonWords.saveSuccess') as string) });
}else{
errorItems.forEach((item:any,index:number)=>{
this.$Notice.error({ title: (this.$t('app.commonWords.saveFailed') as string), desc: item.majorentityname+(this.$t('app.commonWords.saveFailed') as string)+'!' });
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: errorMessage[index].data.message });
console.error(errorMessage[index]);
});
}
......
......@@ -30,31 +30,37 @@ export default class OptionsModel {
name: 'val',
prop: 'value',
dataType: 'TEXT',
isEditable:true
},
{
name: 'pval',
prop: 'parent',
dataType: 'TEXT',
isEditable:true
},
{
name: 'cls',
prop: 'cls',
dataType: 'TEXT',
isEditable:true
},
{
name: 'expired',
prop: 'expired',
dataType: 'YESNO',
isEditable:true
},
{
name: 'label',
prop: 'label',
dataType: 'TEXT',
isEditable:true
},
{
name: 'cid',
prop: 'catalog_id',
dataType: 'PICKUP',
isEditable:true
},
{
name: 'srfmajortext',
......@@ -70,36 +76,43 @@ export default class OptionsModel {
name: 'srfkey',
prop: 'value_key',
dataType: 'TEXT',
isEditable:true
},
{
name: 'iconcls',
prop: 'icon_class',
dataType: 'TEXT',
isEditable:true
},
{
name: 'extension',
prop: 'extension',
dataType: 'LONGTEXT_1000',
isEditable:true
},
{
name: 'vfilter',
prop: 'filter',
dataType: 'TEXT',
isEditable:true
},
{
name: 'showorder',
prop: 'showorder',
dataType: 'INT',
isEditable:true
},
{
name: 'cname',
prop: 'catalog_name',
dataType: 'PICKUPTEXT',
isEditable:true
},
{
name: 'disabled',
prop: 'disabled',
dataType: 'YESNO',
isEditable:true
},
{
name: 'dictoption',
......
......@@ -111,7 +111,7 @@ export default class OptionsService extends ControlService {
*/
@Errorlog
public add(action: string, context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
const {data:Data,context:Context} = this.handleRequestData(action,context,data,true);
const {data:Data,context:Context} = this.handleRequestDataWithUpdate(action,context,data,true);
return new Promise((resolve: any, reject: any) => {
const _appEntityService: any = this.appEntityService;
let result: Promise<any>;
......@@ -170,14 +170,14 @@ export default class OptionsService extends ControlService {
*/
@Errorlog
public update(action: string, context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
const {data:Data,context:Context} = this.handleRequestData(action,context,data,true);
const {data:Data,context:Context} = this.handleRequestDataWithUpdate(action,context,data,true);
return new Promise((resolve: any, reject: any) => {
const _appEntityService: any = this.appEntityService;
let result: Promise<any>;
if (_appEntityService[action] && _appEntityService[action] instanceof Function) {
result = _appEntityService[action](Data,Context,isloading);
result = _appEntityService[action](Context,Data,isloading);
}else{
result =_appEntityService.Update(Data,Context,isloading);
result =_appEntityService.Update(Context,Data,isloading);
}
result.then((response) => {
this.handleResponse(action, response);
......@@ -296,7 +296,7 @@ export default class OptionsService extends ControlService {
* @param {*} [data={}]
* @param {boolean} [isloading]
* @returns {Promise<any>}
* @memberof MainService
* @memberof OptionsService
*/
@Errorlog
public frontLogic(action:string,context: any = {}, data: any = {}, isloading?: boolean): Promise<any> {
......@@ -317,5 +317,41 @@ export default class OptionsService extends ControlService {
});
})
}
/**
* 处理请求数据(修改或增加数据)
*
* @param action 行为
* @param data 数据
* @memberof OptionsService
*/
public handleRequestDataWithUpdate(action: string,context:any ={},data: any = {},isMerge:boolean = false){
let model: any = this.getMode();
if (!model && model.getDataItems instanceof Function) {
return data;
}
let dataItems: any[] = model.getDataItems();
let requestData:any = {};
if(isMerge && (data && data.viewparams)){
Object.assign(requestData,data.viewparams);
}
dataItems.forEach((item:any) =>{
if(item && item.dataType && Object.is(item.dataType,'FONTKEY')){
if(item && item.prop && item.name ){
requestData[item.prop] = context[item.name];
}
}else{
if(item && item.isEditable && item.prop && item.name && (data[item.name] || Object.is(data[item.name],0)) ){
requestData[item.prop] = data[item.name];
}
}
});
let tempContext:any = JSON.parse(JSON.stringify(context));
if(tempContext && tempContext.srfsessionid){
tempContext.srfsessionkey = tempContext.srfsessionid;
delete tempContext.srfsessionid;
}
return {context:tempContext,data:requestData};
}
}
\ No newline at end of file
......@@ -1210,6 +1210,11 @@
dependencies:
mkdirp "^1.0.4"
"@popperjs/core@^2.4.3":
version "2.4.4"
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.4.4.tgz#11d5db19bd178936ec89cd84519c4de439574398"
integrity sha512-1oO6+dN5kdIA3sKPZhRGJTfGVP4SWV6KqlMOwry4J3HfyD68sl/3KmG7DeYUzvN+RbhXDnv/D8vNNB8168tAMg==
"@soda/friendly-errors-webpack-plugin@^1.7.1":
version "1.7.1"
resolved "https://registry.yarnpkg.com/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.1.tgz#706f64bcb4a8b9642b48ae3ace444c70334d615d"
......
......@@ -9,31 +9,31 @@ zuul:
routes:
dict_catalog:
path: /dictcatalogs/**
serviceId: ibzdict-api
serviceId: ${ibiz.ref.service.ibzdict-api:ibzdict-api}
stripPrefix: false
dict_option:
path: /dictoptions/**
serviceId: ibzdict-api
serviceId: ${ibiz.ref.service.ibzdict-api:ibzdict-api}
stripPrefix: false
loginv7:
path: /v7/login
serviceId: ibzuaa-api
serviceId: ${ibiz.ref.service.uaa:ibzuaa-api}
stripPrefix: false
changepwd:
path: /v7/changepwd
serviceId: ibzuaa-api
serviceId: ${ibiz.ref.service.uaa:ibzuaa-api}
stripPrefix: false
uaa:
path: /uaa/**
serviceId: ibzuaa-api
serviceId: ${ibiz.ref.service.uaa:ibzuaa-api}
stripPrefix: false
config:
path: /config/**
serviceId: ibzuaa-api
serviceId: ${ibiz.ref.service.uaa:ibzuaa-api}
stripPrefix: false
oucore:
path: /ibzorganizations/**
serviceId: ibzou-api
serviceId: ${ibiz.ref.service.ou:ibzou-api}
stripPrefix: false
sensitive-headers:
- Cookie,Set-Cookie,Authorization
spring:
profiles:
include: sys , web-prod
include: sys ,nacos, web-prod
application:
name: ibzdict-web
spring:
profiles:
include: sys , web-dev, api-dev, dev
include: sys ,nacos, web-dev, api-dev, dev
application:
name: ibzdict
main:
......
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
<!--输出实体[DICT_CATALOG]数据结构 -->
<changeSet author="a_A_5d9d78509" id="tab-dict_catalog-67-1">
<createTable tableName="IBZDICTCATALOG">
<column name="CID" remarks="" type="VARCHAR(100)">
<constraints primaryKey="true" primaryKeyName="PK_DICT_CATALOG_CID"/>
</column>
<column name="CCODE" remarks="" type="VARCHAR(100)">
</column>
<column name="CNAME" remarks="" type="VARCHAR(100)">
</column>
<column name="CGROUP" remarks="" type="VARCHAR(100)">
</column>
<column name="MEMO" remarks="" type="VARCHAR(255)">
</column>
<column name="ENABLE" remarks="" type="INT">
</column>
<column name="UPDATEDATE" remarks="" type="DATETIME">
</column>
</createTable>
</changeSet>
<!--输出实体[DICT_OPTION]数据结构 -->
<changeSet author="a_A_5d9d78509" id="tab-dict_option-95-2">
<createTable tableName="IBZDICTOPTION">
<column name="VKEY" remarks="" type="VARCHAR(100)">
<constraints primaryKey="true" primaryKeyName="PK_DICT_OPTION_VKEY"/>
</column>
<column name="CID" remarks="" type="VARCHAR(100)">
</column>
<column name="CNAME" remarks="" type="VARCHAR(100)">
</column>
<column name="VAL" remarks="" type="VARCHAR(40)">
</column>
<column name="LABEL" remarks="" type="VARCHAR(100)">
</column>
<column name="PVAL" remarks="" type="VARCHAR(40)">
</column>
<column name="VFILTER" remarks="" type="VARCHAR(500)">
</column>
<column name="CLS" remarks="" type="VARCHAR(500)">
</column>
<column name="ICONCLS" remarks="" type="VARCHAR(255)">
</column>
<column name="DISABLED" remarks="" type="INT">
</column>
<column name="EXPIRED" remarks="" type="INT">
</column>
<column name="SHOWORDER" remarks="" type="INT">
</column>
<column name="EXTENSION" remarks="" type="VARCHAR(1000)">
</column>
<column name="UPDATEDATE" remarks="" type="DATETIME">
</column>
</createTable>
</changeSet>
<!--输出实体[DICT_CATALOG]外键关系 -->
<!--输出实体[DICT_OPTION]外键关系 -->
<changeSet author="a_A_5d9d78509" id="fk-dict_option-95-3">
<addForeignKeyConstraint baseColumnNames="CID" baseTableName="IBZDICTOPTION" constraintName="DER1N_DICT_OPTION_DICT_CATALOG" deferrable="false" initiallyDeferred="false" onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="CID" referencedTableName="IBZDICTCATALOG" validate="true"/>
</changeSet>
</databaseChangeLog>
!!!!模版产生代码错误:----
Tip: If the failing expression is known to be legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
- Failed at: ${dbinst.getUserName()} [in template "CODETEMPL_zh_CN" at line 28, column 24]
----
\ No newline at end of file
......@@ -77,6 +77,9 @@
<!--baomidou-jobs定时服务 -->
<baomidou-jobs.version>1.0.3</baomidou-jobs.version>
<!-- eureka微服务注册中心 -->
<eureka-client.version>2.2.1.RELEASE</eureka-client.version>
<oracle.version>11.2.0.3</oracle.version>
<postgresql.version>42.2.6</postgresql.version>
......@@ -314,6 +317,13 @@
<artifactId>h2</artifactId>
</dependency>
<!-- eureka服务注册中心 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>${eureka-client.version}</version>
</dependency>
<!-- Oracle驱动包 -->
<dependency>
<groupId>com.oracle</groupId>
......@@ -332,6 +342,7 @@
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
</project>
spring:
profiles:
include: sys , api-prod
include: sys ,nacos, api-prod
application:
name: ibzdict-api
\ No newline at end of file
......@@ -7,7 +7,7 @@ import org.springframework.web.bind.annotation.PathVariable;
import java.util.Map;
import java.util.Set;
@FeignClient(value = "ibzou-api",fallback = IBZOUFallback.class)
@FeignClient(value = "${ibiz.ref.service.ou:ibzou-api}",fallback = IBZOUFallback.class)
public interface IBZOUFeignClient
{
/**
......
......@@ -7,7 +7,7 @@ import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
import com.alibaba.fastjson.JSONObject;
@FeignClient(value = "ibzuaa-api",fallback = IBZUAAFallback.class)
@FeignClient(value = "${ibiz.ref.service.uaa:ibzuaa-api}",fallback = IBZUAAFallback.class)
public interface IBZUAAFeignClient
{
/**
......
......@@ -4,7 +4,7 @@ import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@FeignClient(value = "ibzwf-api",fallback = IBZWFFallback.class)
@FeignClient(value = "${ibiz.ref.service.wf:ibzwf-api}",fallback = IBZWFFallback.class)
public interface IBZWFFeignClient
{
@RequestMapping(method = RequestMethod.GET, value = "/{system}-app-{appname}/{entity}/process-definitions/{processDefinitionKey}/usertasks/{taskDefinitionKey}/tasks")
......
......@@ -4,9 +4,9 @@ import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "spring.datasource")
@Data
public class LiquibaseProp{
private String url;
......
......@@ -65,6 +65,10 @@ public class AuthenticationUser implements UserDetails
@JsonIgnore
private Map<String,Object> userSessionParam;//用户自定义session值
private Map<String, Set<String>> orgInfo;//上下级组织信息
private String porg;
private String sorg;
private String pdept;
private String sdept;
@JsonIgnore
......@@ -133,6 +137,10 @@ public class AuthenticationUser implements UserDetails
sessionParams.put("srflocale", this.getLang());
sessionParams.put("srftimezone", "");
sessionParams.put("srfusercode", this.getUsercode());
sessionParams.put("srfporg", this.getPorg());
sessionParams.put("srfsorg", this.getSorg());
sessionParams.put("srfpdept", this.getPdept());
sessionParams.put("srfsdept", this.getSdept());
}
return this.sessionParams;
}
......@@ -143,6 +151,26 @@ public class AuthenticationUser implements UserDetails
return new HashMap<>();
}
public void setOrgInfo(Map<String, Set<String>> orgInfo) {
this.orgInfo = orgInfo;
if(!ObjectUtils.isEmpty(orgInfo) && !ObjectUtils.isEmpty(orgInfo.get("parentorg"))){
porg=(String.format("'%s'",String.join("','",orgInfo.get("parentorg"))));
this.getSessionParams().put("srfporg",porg);
}
if(!ObjectUtils.isEmpty(orgInfo) && !ObjectUtils.isEmpty(orgInfo.get("suborg")) ){
sorg=(String.format("'%s'",String.join("','",orgInfo.get("suborg"))));
this.getSessionParams().put("srfsorg",sorg);
}
if(!ObjectUtils.isEmpty(orgInfo) && !ObjectUtils.isEmpty(orgInfo.get("parentdept"))){
pdept=(String.format("'%s'",String.join("','",orgInfo.get("parentdept"))));
this.getSessionParams().put("srfpdept",pdept);
}
if(!ObjectUtils.isEmpty(orgInfo) && !ObjectUtils.isEmpty(orgInfo.get("subdept"))){
sdept=(String.format("'%s'",String.join("','",orgInfo.get("subdept"))));
this.getSessionParams().put("srfsdept",sdept);
}
}
public void setPermissionList(JSONObject permissionList) {
this.permissionList = permissionList;
if(authorities==null && permissionList !=null){
......
#eureka配置中心
spring:
cloud:
nacos:
discovery:
enabled: false
eureka:
client:
enabled: true
serviceUrl:
defaultZone: http://127.0.0.1:8762/eureka/
#nacos配置中心
spring:
cloud:
nacos:
discovery:
server-addr: 172.16.102.211:8848
enabled: true
eureka:
client:
enabled: false
#nacos配置中心、数据源
#缓存、数据源
spring:
cloud:
nacos:
discovery:
server-addr: 172.16.102.211:8848
cache:
redis:
time-to-live: 3600
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册