提交 71ace5c0 编写于 作者: ibizdev's avatar ibizdev

ibiz4j 发布系统代码

上级 67565fa7
因为 它太大了无法显示 源差异 。您可以改为 查看blob
此差异已折叠。
......@@ -13,6 +13,7 @@ import { utilServiceRegister } from '@/utilservice/util-service-register';
import { entityServiceRegister } from '@/service/entity-service-register';
import { counterServiceRegister } from '@/counter/counter-service-register';
import { codeListRegister } from '@codelist/codelist-register';
import { messageServiceRegister } from '@/message/message-service-register';
import InputBox from './components/input-box/input-box.vue'
import AppKeepAlive from './components/app-keep-alive/app-keep-alive.vue'
......@@ -87,11 +88,15 @@ import ActionTimeline from './components/action-timeline/action-timeline.vue'
import CronEditor from './components/cron-editor/cron-editor.vue'
import AppMessagePopover from './components/app-message-popover/app-message-popover.vue'
import AppPanelField from './components/app-panel-field/app-panel-field.vue'
import AppPanelItem from './components/app-panel-item/app-panel-item.vue'
import AppPanelButton from './components/app-panel-button/app-panel-button.vue'
import AppDepartmentPersonnel from './components/app-department-personnel/app-department-personnel.vue'
import DiskFileUpload from './components/disk-file-upload/disk-file-upload.vue'
import AvueCustomForm from './components/avue-custom-form/avue-custom-form.vue'
import DiskImageUpload from './components/disk-image-upload/disk-image-upload.vue'
import AppFormPart from './components/app-form-part/app-form-part.vue'
import AppAlert from './components/app-alert/app-alert.vue'
import AppAlertGroup from './components/app-alert-group/app-alert-group.vue'
import AppRawItem from './components/app-rawitem/app-rawitem.vue'
// 全局挂载UI实体服务注册中心
window['uiServiceRegister'] = uiServiceRegister;
......@@ -105,6 +110,8 @@ window['entityServiceRegister'] = entityServiceRegister;
window['counterServiceRegister'] = counterServiceRegister;
// 全局挂载代码表服务注册中心
window['codeListRegister'] = codeListRegister;
// 全局挂载视图消息服务注册中心
window['messageServiceRegister'] = messageServiceRegister;
export const AppComponents = {
install(v: any, opt: any) {
......@@ -118,7 +125,7 @@ export const AppComponents = {
v.prototype.$viewTool = ViewTool;
v.prototype.$uiActionTool = UIActionTool;
v.component('app-department-personnel',AppDepartmentPersonnel);
v.component('app-panel-item',AppPanelItem);
v.component('app-panel-button',AppPanelButton);
v.component('app-panel-field',AppPanelField);
v.component('app-full-scren',AppFullScren);
v.component('app-lock-scren',AppLockScren);
......@@ -198,5 +205,9 @@ export const AppComponents = {
v.component('disk-file-upload', DiskFileUpload);
v.component('avue-custom-form', AvueCustomForm);
v.component('disk-image-upload', DiskImageUpload);
v.component('app-form-part', AppFormPart);
v.component('app-alert', AppAlert);
v.component('app-alert-group', AppAlertGroup);
v.component('app-rawitem',AppRawItem);
},
};
\ No newline at end of file
import store from '@/store';
import EntityService from '@/service/entity-service';
/**
* 动态代码表服务类
*
* @export
* @class CodeListService
*/
export default class CodeListService {
/**
* Vue 状态管理器
*
* @private
* @type {(any | null)}
* @memberof CodeListService
*/
private $store: any;
constructor(opts: any = {}) {
this.$store = store;
}
/**
* 获取状态管理器
*
* @returns {(any | null)}
* @memberof CodeListService
*/
public getStore(): any {
return this.$store;
}
/**
* 动态代码表缓存(加载中)
*
* @type {Map<string,any>}
* @memberof CodeListService
*/
public static codelistCache:Map<string,any> = new Map();
/**
* 动态代码表缓存(已完成)
*
* @type {Map<string,any>}
* @memberof CodeListService
*/
public static codelistCached:Map<string,any> = new Map();
/**
* 数据服务基类
*
* @type {Minorentity}
* @memberof CodeListService
*/
public entityService:EntityService = new EntityService();
/**
* 获取代码表服务
*
* @protected
* @param {string} name 实体名称
* @returns {Promise<any>}
* @memberof EntityService
*/
public getService(name: string): Promise<any> {
return (window as any)['codeListRegister'].getService(name);
}
/**
* 获取静态代码表
*
* @param {string} tag 代码表标识
* @returns {Promise<any[]>}
* @memberof CodeListService
*/
public getStaticItems(tag: string):Promise<any[]>{
return new Promise((resolve:any,reject:any) =>{
const codelist = this.$store.getters.getCodeList(tag);
if (codelist) {
let items: Array<any> = [...JSON.parse(JSON.stringify(codelist.items))];
resolve(items);
}
})
}
/**
* 获取预定义代码表
*
* @param {string} tag 代码表标识
* @returns {Promise<any[]>}
* @memberof CodeListService
*/
public getPredefinedItems(tag: string,data?: any, isloading?: boolean):Promise<any[]>{
return new Promise((resolve:any,reject:any) =>{
if(CodeListService.codelistCached.get(`${tag}`)){
let items:any = CodeListService.codelistCached.get(`${tag}`).items;
if(items.length >0) resolve(items);
}
const callback:Function = (tag:string,promise:Promise<any>) =>{
promise.then((res:any) =>{
let result:any = res.data;
if(result.items && result.items.length > 0){
CodeListService.codelistCached.set(`${tag}`,{items:result.items});
return resolve(result.items);
}else{
return resolve([]);
}
}).catch((result:any) =>{
return reject(result);
})
}
// 加载中,UI又需要数据,解决连续加载同一代码表问题
if(CodeListService.codelistCache.get(`${tag}`)){
callback(tag,CodeListService.codelistCache.get(`${tag}`));
}else{
let result:Promise<any> = this.entityService.getPredefinedCodelist(tag);
CodeListService.codelistCache.set(`${tag}`,result);
callback(tag,result);
}
})
}
/**
* 获取动态代码表
*
* @param {string} tag 代码表标识
* @param {string} context
* @returns {Promise<any[]>}
* @memberof CodeListService
*/
public getItems(tag: string,context:any = {}, data?: any, isloading?: boolean): Promise<any[]> {
let _this: any = this;
if(context && context.srfsessionid){
delete context.srfsessionid;
}
return new Promise((resolve:any,reject:any) =>{
this.getService(tag).then((codelist:any) =>{
if(Object.is(codelist.predefinedType,"RUNTIME")){
this.getPredefinedItems(tag).then((res:any) =>{
resolve(res);
})
return;
}
let isEnableCache:boolean = codelist.isEnableCache;
let cacheTimeout:any = codelist.cacheTimeout;
// 启用缓存
if(isEnableCache){
const callback:Function = (context:any ={},data:any ={},tag:string,promise:Promise<any>) =>{
promise.then((result:any) =>{
if(result.length > 0){
CodeListService.codelistCached.set(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`,{items:result});
CodeListService.codelistCache.delete(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`);
return resolve(result);
}else{
return resolve([]);
}
}).catch((result:any) =>{
return reject(result);
})
}
// 加载完成,从本地缓存获取
if(CodeListService.codelistCached.get(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`)){
let items:any = CodeListService.codelistCached.get(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`).items;
if(items.length >0){
if(new Date().getTime() <= codelist.getExpirationTime()){
return resolve(items);
}
}
}
if (codelist) {
// 加载中,UI又需要数据,解决连续加载同一代码表问题
if(CodeListService.codelistCache.get(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`)){
callback(context,data,tag,CodeListService.codelistCache.get(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`));
}else{
let result:Promise<any> = codelist.getItems(context,data,isloading);
CodeListService.codelistCache.set(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`,result);
codelist.setExpirationTime(new Date().getTime() + cacheTimeout);
callback(context,data,tag,result);
}
}
}else{
if (codelist) {
codelist.getItems(context,data,isloading).then((result:any) =>{
resolve(result);
}).catch((error:any) =>{
Promise.reject([]);
})
}else{
return Promise.reject([]);
}
}
}).catch((error:any) =>{
console.warn("获取代码表异常");
return Promise.reject([]);
})
})
}
}
\ No newline at end of file
<template>
<div class="app-alert-group">
<template v-for="(item, index) in items">
<app-alert
:key="index"
:tag="item.tag"
:position="item.position"/>
</template>
</div>
</template>
<script lang="ts">
import {Vue, Component, Prop} from 'vue-property-decorator';
import ViewMessageGroupService from '@/message/view-message-group-service';
@Component({})
export default class AppAlertGroup extends Vue {
/**
* 视图消息组服务
*
* @type {any}
* @memberof AppAlertGroup
*/
public viewMessageGroupService = ViewMessageGroupService.getInstance();
/**
* 视图消息组tag
*
* @type {any}
* @memberof AppAlertGroup
*/
@Prop() infoGroup: any;
/**
* 视图消息组显示位置
*
* @type {any}
* @memberof AppAlertGroup
*/
@Prop() position: any;
/**
* 当前位置视图消息集合
*
* @type {any}
* @memberof AppAlertGroup
*/
public items: any[] = [];
/**
* Vue生命周期
*
* @memberof AppAlertGroup
*/
public created() {
if(this.infoGroup) {
this.getItems();
}
}
/**
* 获取当前位置视图消息集合
*
* @memberof AppAlertGroup
*/
public getItems() {
this.viewMessageGroupService.getViewMessageDetailsByTag(this.infoGroup).then((response: any) => {
if(response) {
response.forEach((data: any) => {
if(this.position && Object.is(this.position, data.position)) {
this.items.push(data);
}
if(Object.is('TOP', this.position) && Object.is('POPUP', data.position)) {
this.items.push(data);
}
})
}
}).catch(error => {
console.log(error);
});
}
}
</script>
\ No newline at end of file
.el-message {
.el-message__content {
.title {
padding-bottom: 10px;
}
}
}
.app-alert-group {
.el-alert {
margin: 5px 0px;
}
}
\ No newline at end of file
<template>
<div class="app-alert">
<template v-if="items && items.length > 0">
<template v-for="(item, index) in items">
<template v-if="item.hasContent && !Object.is('POPUP', item.position)">
<el-alert
:key="index"
v-show="item.showState"
:title="item.title"
:type="item.type"
:closable="item.closable"
@close="alertClose(item)">
<template slot>
<span v-html="item.content"></span>
</template>
</el-alert>
</template>
</template>
</template>
</div>
</template>
<script lang="ts">
import {Vue, Component, Prop} from 'vue-property-decorator';
import ViewMessageService from '@/message/view-message-service';
@Component({})
export default class AppAlert extends Vue {
/**
* 视图消息标识
*
* @type {any}
* @memberof AppAlert
*/
@Prop() tag: any;
/**
* 显示位置
*
* @type {any}
* @memberof AppAlert
*/
@Prop() position: any;
/**
* 视图消息对象
*
* @type {any}
* @memberof AppAlert
*/
public items: any[]= [];
/**
* 视图消息服务
*
* @type {ViewMessageService}
* @memberof AppAlert
*/
public viewMessageService = ViewMessageService.getInstance();
/**
* Vue生命周期
*
* @memberof AppAlert
*/
public created() {
this.getData().then((result:any) =>{
if(!this.items) {
return;
}
})
}
/**
* 获取视图消息对象
*
* @memberof AppAlert
*/
public async getData() {
let response: any = await this.viewMessageService.getViewMessageByTag(this.tag, null, null)
if(response && response.length > 0) {
response.forEach((item: any) => {
let tempData: any = JSON.parse(JSON.stringify(item));
if(!tempData.type) {
tempData.type = "info";
}
// 判断是否存在内容
this.handleItemHasContent(tempData);
tempData.closable = tempData.isEnableRemove;
let flag = this.handleItemCloseMode(tempData);
this.handleItemPosition(tempData, flag);
this.items.push(tempData);
});
}
}
/**
* 处理数据项是否存在内容
*
* @memberof AppAlert
*/
public handleItemHasContent(data: any) {
data.hasContent = true;
if(!data.title && !data.content) {
data.hasContent = false;
}
}
/**
* 处理数据关闭模式
*
* @memberof AppAlert
*/
public handleItemCloseMode(data: any) {
let flag = true;
data.showState = true;
if(data.closeMode || data.closeMode == 0) {
if(data.closeMode == 1) {
const id = this.$store.getters.getViewMessage(data.codename);
if(id) {
data.showState = false;
flag = false;
}
}
if(data.closeMode == 0) {
data.closable = false;
}
}
return flag;
}
/**
* 处理数据显示位置
*
* @memberof AppAlert
*/
public handleItemPosition(data: any, flag: boolean) {
if(data.position) {
if(flag && Object.is('POPUP', data.position)) {
const h = this.$createElement;
data.showState = false;
if(Object.is('HTML',data.messageType) && data.hasMessageTemp) {
setTimeout(() => {
this.$message({
customClass: data.codename+","+data.closeMode,
message: h('div',{}, [
h('p',data.title),
h('p',{domProps:{innerHTML: data.content}})
]),
type: data.type,
showClose: data.closable,
onClose: this.alertClose,
})
}, 0)
} else {
setTimeout(() => {
this.$message({
customClass: data.codename+","+data.closeMode,
message: h('div',{}, [
h('p',data.title),
h('p',data.content)
]),
type: data.type,
showClose: data.closable,
onClose: this.alertClose,
})
}, 0)
}
}
}
}
/**
* 视图消息关闭
*
* @memberof AppAlert
*/
public alertClose(data: any) {
if(data.customClass) {
let tempArr: any[] = data.customClass.toString().split(',');
if(tempArr && tempArr.length > 0) {
if(Object.is("1", tempArr[1])) {
const args = { tag: tempArr[0], id: data.customClass };
this.$store.commit('addViewMessage', args);
}
}
}
if(data.closeMode && data.closeMode == 1) {
const args = {tag: data.codename, id: data.id};
this.$store.commit('addViewMessage', args);
}
}
}
</script>
<style lang="less">
@import './app-alert.less';
</style>
\ No newline at end of file
......@@ -8,7 +8,7 @@
<script lang="ts">
import { Component, Vue, Prop, Model, Watch } from 'vue-property-decorator';
import CodeListService from "@service/app/codelist-service";
import CodeListService from "@/codelist/codelist-service";
@Component({
})
......
......@@ -48,7 +48,7 @@
<script lang="ts">
import XLSX from 'xlsx';
import CodeListService from "@service/app/codelist-service";
import CodeListService from "@/codelist/codelist-service";
import EntityService from '@/service/entity-service';
import { Vue, Component, Prop, Provide, Emit, Watch } from 'vue-property-decorator';
import { Environment } from '@/environments/environment';
......
......@@ -13,7 +13,7 @@
import { Component, Vue, Prop, Watch } from 'vue-property-decorator';
import { Subject } from 'rxjs';
import { Http } from '../../utils';
import CodeListService from '@/service/app/codelist-service';
import CodeListService from "@/codelist/codelist-service";
@Component({})
export default class AppDepartmentPersonnel extends Vue {
......
......@@ -6,7 +6,7 @@
<script lang="ts">
import { Vue, Component, Watch, Prop, Model } from 'vue-property-decorator';
import CodeListService from '@/service/app/codelist-service';
import CodeListService from "@/codelist/codelist-service";
@Component({
})
export default class AppDepartmentSelect extends Vue {
......
......@@ -370,7 +370,7 @@ export default class AppFormDRUIPart extends Vue {
}
}
});
this.refreshDRUIPart();
// this.refreshDRUIPart();
}
/**
......
.app-form-part {
display: block;
}
\ No newline at end of file
<template>
<div class='app-form-part' v-if="loadState">
<avue-form :option="formOption" v-model="formVal"></avue-form>
</div>
</template>
<script lang = 'ts'>
import { Vue, Component, Prop, Watch } from 'vue-property-decorator';
import { Subject, Subscription } from "rxjs";
@Component({
})
export default class AppFormPart extends Vue {
/**
* 系统名称
*
* @type {string}
* @memberof AppFormPart
*/
@Prop() public systemCodeName!: string;
/**
* 应用名称
*
* @type {string}
* @memberof AppFormPart
*/
@Prop() public appCodeName!: string;
/**
* 实体名称
*
* @type {string}
* @memberof AppFormPart
*/
@Prop() public deCodeName!: string;
/**
* 表单代码标识
*
* @type {string}
* @memberof AppFormPart
*/
@Prop() public formCodeName!: string;
/**
* 表单成员标识
*
* @type {string}
* @memberof AppFormPart
*/
@Prop() public formDetailCodeName!: string;
/**
* 当前表单项名称
*
* @type {string}
* @memberof AppFormPart
*/
@Prop() public name!: string;
/**
* 导航上下文
*
* @type {string}
* @memberof AppFormPart
*/
@Prop() public context!: any;
/**
* 导航参数
*
* @type {string}
* @memberof AppFormPart
*/
@Prop() public viewparams!: any;
/**
* 表单数据
*
* @type {any}
* @memberof AppFormPart
*/
@Prop() public data: any;
/**
* 表单状态对象
*
* @type {Subject<any>}
* @memberof AppFormPart
*/
@Prop() public formState!: Subject<any>;
/**
* 订阅对象
*
* @protected
* @type {(Subscription | undefined)}
* @memberof AppFormPart
*/
public formStateEvent: Subscription | undefined;
/**
* 远程地址
*
* @protected
* @type {(Subscription | undefined)}
* @memberof AppFormPart
*/
public remoteUrl:string =`/lite/${this.systemCodeName.toLowerCase()}-${this.appCodeName.toLowerCase()}/components/${this.formDetailCodeName.toLowerCase()}`;
/**
* 动态表单配置对象
*
* @type {*}
* @memberof AppFormPart
*/
public formOption:any;
/**
* 当前动态表单绑定值
*
* @type {*}
* @memberof AppFormPart
*/
public curFormValue:any = {};
/**
* 获取动态表单值对象
*
* @type {*}
* @memberof AppFormPart
*/
get formVal(){
return this.curFormValue;
}
/**
* 设置动态表单值对象
*
* @type {*}
* @memberof AppFormPart
*/
set formVal(data:any){
this.$emit("change",{name:this.name,value:data});
}
/**
* 加载数据状态
*
* @type {*}
* @memberof AppFormPart
*/
public loadState:boolean = false;
/**
* 初始化组件(vue生命周期)
*
* @type {Subject<any>}
* @memberof AppFormPart
*/
public created(){
if (this.formState) {
this.formStateEvent = this.formState.subscribe(({ type, data }) => {
if (Object.is("load", type)){
this.loadRemoteFormModel().then((result:any) =>{
this.initStateData(result);
})
}
});
}
}
/**
* 初始化状态数据
*
* @type {Subject<any>}
* @memberof AppFormPart
*/
public initStateData(modelData:any){
this.computedFormVal(modelData);
this.formOption = modelData;
this.loadState = true;
}
/**
* 计算动态表单绑定数据
*
* @type {Subject<any>}
* @memberof AppFormPart
*/
public computedFormVal(modelData:any){
this.curFormValue = {};
if(modelData && modelData.column && modelData.column.length > 0){
modelData.column.forEach((element:any) => {
Object.assign(this.curFormValue,{[element.prop]:null});
});
}
if(Object.keys(this.curFormValue).length > 0){
Object.keys(this.curFormValue).forEach((item:any) =>{
if(this.data && this.data[item]){
this.curFormValue[item] = this.data[item];
}
})
}
}
/**
* 加载动态表单数据模型
*
* @type {Subject<any>}
* @memberof AppFormPart
*/
public loadRemoteFormModel(){
return new Promise((resolve:any,reject:any) =>{
this.$http.get(this.remoteUrl).then((res:any) =>{
if(res.status && res.status == 200){
let result:any = res.data;
resolve(result);
}else{
console.warn("加载动态表单模型数据异常");
}
}).catch((error:any) =>{
console.warn("加载动态表单模型数据异常");
})
})
}
/**
* 销毁组件(vue生命周期)
*
* @type {Subject<any>}
* @memberof AppFormPart
*/
public destroy(){
if(this.formStateEvent){
this.formStateEvent.unsubscribe();
}
}
}
</script>
<style lang = "less">
@import './app-form-part.less';
</style>
\ No newline at end of file
......@@ -21,7 +21,7 @@
<script lang="ts">
import { Component, Vue, Prop, Watch } from 'vue-property-decorator';
import { Subject } from 'rxjs';
import CodeListService from '@/service/app/codelist-service';
import CodeListService from "@/codelist/codelist-service";
@Component({})
export default class AppGroupSelect extends Vue {
......
.item {
.app-message-popover {
height: 24px;
line-height: 24px;
padding: 0 5px 0 0;
......
<template>
<!-- 消息弹出框绘制开始 -->
<el-badge :is-dot="showIsDot" class="item">
<el-badge :is-dot="showIsDot" class="app-message-popover">
<el-popover
placement="bottom"
trigger="click"
......
......@@ -6,7 +6,7 @@
<script lang = 'ts'>
import { Vue, Component, Prop, Watch } from "vue-property-decorator";
import { Http } from '@/utils';
import CodeListService from "@service/app/codelist-service";
import CodeListService from "@/codelist/codelist-service";
import { observable } from 'rxjs';
@Component({})
export default class AppOrgSelect extends Vue {
......
<template>
<div class="app-panel-button">
<Button type="primary" long @click="onClick">
<i v-if="icon" :class="icon"></i>
<span v-if="showCaption" :class="lableStyle">{{caption ? caption : ''}}</span>
</Button>
</div>
</template>
<script lang="ts">
import { Vue, Component, Prop, Watch } from "vue-property-decorator";
@Component({})
export default class AppPanelButton extends Vue {
/**
* 图标
*
* @type {string}
* @memberof AppPanelItem
*/
@Prop() public icon?: string;
/**
* 标题
*
* @type {string}
* @memberof AppPanelItem
*/
@Prop() public caption?: string;
/**
* 显示标题
*
* @type {boolean}
* @memberof AppPanelItem
*/
@Prop() public showCaption?: boolean;
/**
* 标题样式
*
* @type {boolean}
* @memberof AppPanelItem
*/
@Prop() public lableStyle?: string;
/**
* 点击按钮
*
* @param {*} $event
* @memberof AppPanelItem
*/
public onClick($event: any){
this.$emit('onClick',$event);
}
}
</script>
<style lang='less'>
</style>
\ No newline at end of file
......@@ -7,7 +7,7 @@
</template>
<script lang = 'ts'>
import { Component, Vue, Prop, Model,Watch } from 'vue-property-decorator';
import CodeListService from "@service/app/codelist-service";
import CodeListService from "@/codelist/codelist-service";
@Component({})
export default class AppRadioGroup extends Vue {
......
<template>
<div>
<span v-if="caption">{{caption}}</span>
<div :class="contentStyle" :style="sizeStyle">
<template v-if="Object.is(contentType,'RAW')">
{{rawContent ? rawContent : ''}}
</template>
<template v-else-if="Object.is(contentType,'HTML')">
{{htmlContent ? htmlContent : ''}}
</template>
<template v-else-if="Object.is(contentType,'IMAGE')">
<i :class="imageClass ? imageClass : ''"></i>
</template>
</div>
</div>
</template>
<script lang='ts'>
import { Component, Vue, Prop, Model, Watch } from "vue-property-decorator";
@Component({})
export default class AppRawItem extends Vue {
/**
* 内容类型
*
* @type {string}
* @memberof AppRawItem
*/
@Prop() public contentType!: string;
/**
* 直接内容
*
* @type {strin}
* @memberof AppRawItem
*/
@Prop() public rawContent?: string;
/**
* html内容
*
* @type {strin}
* @memberof AppRawItem
*/
@Prop() public htmlContent?: string;
/**
* html内容
*
* @type {strin}
* @memberof AppRawItem
*/
@Prop() public imageClass?: string;
/**
* 标题
*
* @type {string}
* @memberof AppRawItem
*/
@Prop() public caption?: string;
/**
* 内容样式
*
* @type {strin}
* @memberof AppRawItem
*/
@Prop() public contentStyle!: string;
/**
* 内容宽高
*
* @type {strin}
* @memberof AppRawItem
*/
@Prop() public sizeStyle!: string;
}
</script>
<style lang='less'>
</style>
\ No newline at end of file
......@@ -21,7 +21,7 @@
<script lang="ts">
import { Vue, Component, Watch, Prop, Model } from "vue-property-decorator";
import CodeListService from "@service/app/codelist-service";
import CodeListService from "@/codelist/codelist-service";
import { ElSelect } from "element-ui/types/select";
@Component({})
......
<template>
<div v-if="formOption!=null" class="app-custom-form">
<avue-form :option="formOption" v-model="formvalue"></avue-form>
<avue-form :option="formOption" v-model="formVal"></avue-form>
</div>
</template>
<script lang="ts">
import {Vue,Component,Prop,Model,Emit,Watch,} from "vue-property-decorator";
import { Subject, Subscription } from "rxjs";
import {
Vue,
Component,
Prop,
Model,
Emit,
Watch,
} from "vue-property-decorator";
import { Subject, Subscription } from "rxjs";
@Component({})
export default class AvueCustomForm extends Vue {
/**
......@@ -16,8 +23,7 @@ export default class AvueCustomForm extends Vue {
* @type {any}
* @memberof AvueCustomForm
*/
@Prop()
public options?: any;
@Prop() public options?: any;
/**
* 是否需要转换为string类型
......@@ -25,8 +31,7 @@ export default class AvueCustomForm extends Vue {
* @type {boolean}
* @memberof AvueCustomForm
*/
@Prop()
public isParseString?: boolean;
@Prop() public isParseString?: boolean;
/**
* 远端地址
......@@ -42,7 +47,7 @@ export default class AvueCustomForm extends Vue {
* @type {any}
* @memberof AvueCustomForm
*/
@Prop() public value: any;
@Model('change') public value: any;
/**
* 是否将表单数据通过组件配置带入组件中
......@@ -52,33 +57,13 @@ export default class AvueCustomForm extends Vue {
*/
@Prop() public isFormData?: boolean;
/**
* 监听事件
*
* @param {*} newVal
* @param {*} oldVal
* @memberof AvueCustomForm
*/
@Watch("value")
public onValueChange(newVal: any, oldVal: any) {
if (newVal) {
let obj: any = {};
if (newVal && newVal != null) {
if (this.isParseString) obj = JSON.parse(newVal);
else obj = newVal;
}
if (obj) this.formvalue = JSON.parse(JSON.stringify(obj));
}
}
/**
* 表单数据
*
* @type {any}
* @memberof AvueCustomForm
*/
@Prop()
public formData: any;
@Prop() public formData: any;
/**
* 表单状态
......@@ -89,29 +74,46 @@ export default class AvueCustomForm extends Vue {
@Prop() public formState!: Subject<any>;
/**
* 视图状态事件
* 获取组件值
*
* @protected
* @type {(Subscription | undefined)}
* @return {any}
* @memberof AvueCustomForm
*/
protected formStateEvent: Subscription | undefined;
get formVal() {
let obj: any = {};
if (this.value) {
if (this.isParseString) obj = JSON.parse(this.value);
else obj = this.value;
}
return obj;
}
/**
* 当前组件配置设置属性
* 设置组件值
*
* @type {any}
* @param value
* @memberof AvueCustomForm
*/
public formOption: any = null;
set formVal(value: any) {
this.setValue(value);
}
/**
* avue-form绑定值
* 订阅对象
*
* @protected
* @type {(Subscription | undefined)}
* @memberof AvueCustomForm
*/
protected formStateEvent: Subscription | undefined;
/**
* 当前组件配置设置属性
*
* @type {any}
* @memberof AvueCustomForm
*/
public formvalue: any = {};
public formOption: any = null;
/**
* avue-form默认配置
......@@ -189,10 +191,8 @@ export default class AvueCustomForm extends Vue {
if (this.url && this.options == null) {
const get: Promise<any> = this.$http.get(this.url);
get.then((response: any) => {
if (response && response.data && response.data.view_config) {
that.formOption = JSON.parse(response.data.view_config)[
"formConfig"
];
if (response && response.data) {
that.formOption = response.data;
if (this.isFormData) that.getFormData();
}
});
......@@ -214,7 +214,7 @@ export default class AvueCustomForm extends Vue {
public getFormData() {
let that: any = this;
let obj: any;
if (this.value) obj = JSON.parse(JSON.stringify(this.value));
if (this.formVal) obj = JSON.parse(JSON.stringify(this.formVal));
else obj = {};
let recursionOption: any = function (group: any) {
group.column.forEach((gItem: any) => {
......@@ -242,5 +242,17 @@ export default class AvueCustomForm extends Vue {
if (this.isParseString) this.$emit("change", JSON.stringify(value));
else this.$emit("change", value);
}
/**
* 销毁组件(vue生命周期)
*
* @type {Subject<any>}
* @memberof AvueCustomForm
*/
public destroy(){
if(this.formStateEvent){
this.formStateEvent.unsubscribe();
}
}
}
</script>
\ No newline at end of file
......@@ -13,7 +13,7 @@
<script lang="ts">
import { Vue, Component, Prop, Model, Watch } from 'vue-property-decorator';
import CodeListService from "@service/app/codelist-service";
import CodeListService from "@/codelist/codelist-service";
@Component({})
export default class CodeList extends Vue {
......
......@@ -14,7 +14,7 @@
<script lang="ts">
import { Vue, Component, Watch, Prop, Model } from 'vue-property-decorator';
import CodeListService from "@service/app/codelist-service";
import CodeListService from "@/codelist/codelist-service";
@Component({
})
......
......@@ -24,7 +24,7 @@
<script lang="ts">
import { Vue, Component, Prop, Model } from 'vue-property-decorator';
import CodeListService from "@service/app/codelist-service";
import CodeListService from "@/codelist/codelist-service";
import { Util } from '@/utils';
@Component({
})
......
......@@ -17,8 +17,9 @@
<script lang="ts">
import { Vue, Component, Watch, Prop, Model } from 'vue-property-decorator';
import CodeListService from "@service/app/codelist-service";
import CodeListService from "@/codelist/codelist-service";
import { Util } from '@/utils';
import { Subject, Subscription } from 'rxjs';
@Component({
})
......@@ -84,6 +85,23 @@ export default class DropDownList extends Vue {
*/
@Prop() public data?: any;
/**
* 表单状态对象
*
* @type {Subject<any>}
* @memberof AppEmbedPicker
*/
@Prop() public formState!: Subject<any>
/**
* 订阅对象
*
* @protected
* @type {(Subscription | undefined)}
* @memberof SelectType
*/
protected formStateEvent: Subscription | undefined;
/**
* 监听表单数据
*
......@@ -241,6 +259,23 @@ export default class DropDownList extends Vue {
* @memberof DropDownList
*/
public created() {
if(this.formState) {
this.formStateEvent = this.formState.subscribe(({ type, data }) => {
if (Object.is('load', type)) {
this.loadData();
}
});
}else{
this.loadData();
}
}
/**
* 加载数据
*
* @memberof DropDownList
*/
public loadData(){
if(this.tag && Object.is(this.codelistType,"STATIC")){
const codelist = this.$store.getters.getCodeList(this.tag);
if (codelist) {
......@@ -372,6 +407,17 @@ export default class DropDownList extends Vue {
}
})
}
/**
* vue 生命周期
*
* @memberof DropDownList
*/
public destroyed() {
if (this.formStateEvent) {
this.formStateEvent.unsubscribe();
}
}
}
</script>
......
......@@ -17,10 +17,10 @@ export default class DataView9Engine extends DataViewEngine {
*/
public load(opts: any = {},isnotify:boolean=false): void {
if(!this.view.isformDruipart){
super.load(opts);
super.load(opts, isnotify);
}else{
if(isnotify){
super.load(opts);
super.load(opts, isnotify);
}
}
}
......
......@@ -45,10 +45,10 @@ export default class GridViewEngine extends MDViewEngine {
*/
public load(opts: any = {},isnotify:boolean=false): void {
if(!this.view.isformDruipart){
super.load(opts);
super.load(opts, isnotify);
}else{
if(isnotify){
super.load(opts);
super.load(opts, isnotify);
}
}
}
......
......@@ -17,10 +17,10 @@ export default class ListView9Engine extends ListViewEngine {
*/
public load(opts: any = {},isnotify:boolean=false): void {
if(!this.view.isformDruipart){
super.load(opts);
super.load(opts, isnotify);
}else{
if(isnotify){
super.load(opts);
super.load(opts, isnotify);
}
}
......
......@@ -78,12 +78,12 @@ export default class MDViewEngine extends ViewEngine {
* @param {*} [opts={}]
* @memberof MDViewEngine
*/
public load(opts: any = {}): void {
public load(opts: any = {}, isnotify: boolean=false): void {
super.load(opts);
if (this.getSearchForm()) {
if (this.getSearchForm() && (this.isLoadDefault || isnotify)) {
const tag = this.getSearchForm().name;
this.setViewState2({ tag: tag, action: 'loaddraft', viewdata: this.view.viewparams });
} else if (this.getMDCtrl() && this.isLoadDefault) {
} else if (this.getMDCtrl() && (this.isLoadDefault || isnotify)) {
const tag = this.getMDCtrl().name;
this.setViewState2({ tag: tag, action: 'load', viewdata: Object.assign(this.view.viewparams,opts) });
} else {
......
......@@ -29,10 +29,10 @@ export default class WFDynaExpGridViewEngine extends GridViewEngine {
return;
}
if(!this.view.isformDruipart){
super.load(opts);
super.load(opts, isnotify);
}else{
if(isnotify){
super.load(opts);
super.load(opts, isnotify);
}
}
})
......
......@@ -4,6 +4,7 @@ import { UtilServiceRegister } from '@/utilservice/util-service-register';
import { EntityServiceRegister } from '@/service/entity-service-register';
import { CounterServiceRegister } from '@/counter/counter-service-register';
import { CodeListRegister } from '@codelist/codelist-register';
import { MessageServiceRegister } from '@/message/message-service-register';
declare global {
interface Window {
uiServiceRegister: UIServiceRegister,
......@@ -11,6 +12,7 @@ declare global {
utilServiceRegister: UtilServiceRegister,
entityServiceRegister: EntityServiceRegister,
counterServiceRegister: CounterServiceRegister,
codeListRegister:CodeListRegister
codeListRegister:CodeListRegister,
messageServiceRegister:MessageServiceRegister
}
}
\ No newline at end of file
/**
* 视图消息
*
* @interface ViewMessage
*/
export interface ViewMessage {
/**
* 视图消息标识
*
* @type {string}
* @memberof ViewMessage
*/
id:string;
/**
* 视图消息名称
*
* @type {string}
* @memberof ViewMessage
*/
name:string;
/**
* 视图消息代码名称
*
* @type {string}
* @memberof ViewMessage
*/
codename:string;
/**
* 视图消息标题
*
* @type {string}
* @memberof ViewMessage
*/
title:string;
/**
* 视图消息内容
*
* @type {string}
* @memberof ViewMessage
*/
content:string;
/**
* 视图消息关闭模式
*
* @type {number}
* @memberof ViewMessage
*/
closeMode:number;
/**
* 视图消息位置
*
* @type {string}
* @memberof ViewMessage
*/
position:string;
/**
* 视图消息类型
*
* @type {string}
* @memberof ViewMessage
*/
type:string;
/**
* 视图消息是否支持删除
*
* @type {boolean}
* @memberof ViewMessage
*/
isEnableRemove:boolean;
/**
* 排序值
*
* @type {number}
* @memberof ViewMessage
*/
order:number;
/**
* 动态模式
*
* @type {string}
* @memberof ViewMessage
*/
dynamicMode:string;
/**
* 消息类型
*
* @type {string}
* @memberof ViewMessage
*/
messageType:string;
}
\ No newline at end of file
/**
* 视图消息服务注册中心
*
* @export
* @class MessageServiceRegister
*/
export class MessageServiceRegister {
/**
* 所有视图消息服务Map
*
* @protected
* @type {*}
* @memberof MessageServiceRegister
*/
protected allMessageService: Map<string, () => Promise<any>> = new Map();
/**
* 已加载视图消息服务Map缓存
*
* @protected
* @type {Map<string, any>}
* @memberof MessageServiceRegister
*/
protected serviceCache: Map<string, any> = new Map();
/**
* Creates an instance of MessageServiceRegister.
* @memberof MessageServiceRegister
*/
constructor() {
this.init();
}
/**
* 初始化
*
* @protected
* @memberof MessageServiceRegister
*/
protected init(): void {
}
/**
* 加载视图消息服务
*
* @protected
* @param {string} codeName
* @returns {Promise<any>}
* @memberof MessageServiceRegister
*/
protected async loadService(codeName: string): Promise<any> {
const service = this.allMessageService.get(codeName);
if (service) {
return service();
}
}
/**
* 获取视图消息服务
*
* @param {string} name
* @returns {Promise<any>}
* @memberof MessageServiceRegister
*/
public async getService(name: string): Promise<any> {
if (this.serviceCache.has(name)) {
return this.serviceCache.get(name);
}
const messageService: any = await this.loadService(name);
if (messageService && messageService.default) {
const instance: any = new messageService.default();
this.serviceCache.set(name, instance);
return instance;
}
}
}
export const messageServiceRegister: MessageServiceRegister = new MessageServiceRegister();
\ No newline at end of file
import { Http } from '@/utils/http/http';
/**
* 视图消息组
*
* @export
* @class ViewMessageGroupService
*/
export default class ViewMessageGroupService {
/**
* 单例变量声明
*
* @private
* @static
* @type {ViewMessageGroupService}
* @memberof ViewMessageGroupService
*/
private static ViewMessageGroup: ViewMessageGroupService;
/**
* 所有视图消息组对象
*
* @private
* @static
* @type {ViewMessageGroupService}
* @memberof ViewMessageGroupService
*/
private static allViewMessageGroup:any;
/**
* 初始化实例
*
* @memberof ViewMessageGroupService
*/
constructor(opts:any = {}){}
/**
* 获取 ViewMessageGroupService 单例对象
*
* @static
* @returns {ViewMessageGroupService}
* @memberof ViewMessageGroupService
*/
public static getInstance(): ViewMessageGroupService {
if (!ViewMessageGroupService.ViewMessageGroup) {
ViewMessageGroupService.ViewMessageGroup = new ViewMessageGroupService();
}
return this.ViewMessageGroup;
}
/**
* 获取视图消息组成员集合
*
* @returns {Promise<any></any>}
* @memberof ViewMessageGroupService
*/
public async getViewMessageDetailsByTag(tag:string):Promise<any>{
if(ViewMessageGroupService.allViewMessageGroup){
return ViewMessageGroupService.allViewMessageGroup[tag]?ViewMessageGroupService.allViewMessageGroup[tag]:[];
}else{
let result:any = await this.loadAllViewMessageGroup();
return result[tag]?result[tag]:[];
}
}
/**
* 加载应用所有视图消息组集合
*
* @returns {Promise<any></any>}
* @memberof ViewMessageGroupService
*/
public loadAllViewMessageGroup():Promise<any>{
return new Promise((resolve:any,reject:any) =>{
Http.getInstance().get('./assets/json/view-message-group.json').then((response: any) => {
if (response && response.status === 200 && response.data) {
ViewMessageGroupService.allViewMessageGroup = response.data;
resolve(response.data);
}
}).catch((error: any) => {
console.log(error);
});
})
}
}
\ No newline at end of file
import { ViewMessage } from '@/interface/message';
import EntityService from '@/service/entity-service';
/**
* 视图消息
*
* @export
* @class ViewMessage
*/
export default class ViewMessageService {
/**
* 单例变量声明
*
* @private
* @static
* @type {ViewMessageService}
* @memberof ViewMessageService
*/
private static ViewMessage: ViewMessageService;
/**
* 实体数据服务对象
*
* @protected
* @type {EntityService}
* @memberof ViewMessageService
*/
protected entityService:EntityService = new EntityService();
/**
* 视图消息标识
*
* @type {string}
* @memberof ViewMessageService
*/
public id:string ="";
/**
* 视图消息名称
*
* @type {string}
* @memberof ViewMessageService
*/
public name:string ="";
/**
* 视图消息代码名称
*
* @type {string}
* @memberof ViewMessageService
*/
public codename:string ="";
/**
* 视图消息标题
*
* @type {string}
* @memberof ViewMessageService
*/
public title:string ="";
/**
* 视图消息内容
*
* @type {string}
* @memberof ViewMessageService
*/
public content:string ="";
/**
* 视图消息关闭模式(0:无关闭,1:默认关闭,2:本次关闭)
*
* @type {number}
* @memberof ViewMessageService
*/
public closeMode:number = 0;
/**
* 视图消息位置
*
* @type {string}
* @memberof ViewMessageService
*/
public position:string ="";
/**
* 视图消息类型
*
* @type {string}
* @memberof ViewMessageService
*/
public type:string = "info";
/**
* 视图消息是否支持删除
*
* @type {boolean}
* @memberof ViewMessageService
*/
public isEnableRemove:boolean = true;
/**
* 视图消息排序值
*
* @type {boolean}
* @memberof ViewMessageService
*/
public order:number = 1;
/**
* 动态模式
*
* @type {string}
* @memberof ViewMessageService
*/
public dynamicMode:string = "STATIC";
/**
* 消息类型(可选值:TEXT/HTML)
*
* @type {string}
* @memberof ViewMessageService
*/
public messageType:string = "TEXT";
/**
* 是否含有消息模板
*
* @type {boolean}
* @memberof ViewMessageService
*/
public hasMessageTemp:boolean = false;
/**
* 视图消息缓存(加载中)
*
* @type {Map<string,any>}
* @memberof ViewMessageService
*/
public static messageCache:Map<string,any> = new Map();
/**
* 视图消息缓存(已完成)
*
* @type {Map<string,any>}
* @memberof ViewMessageService
*/
public static messageCached:Map<string,any> = new Map();
/**
* 初始化实例
*
* @memberof ViewMessageService
*/
constructor(opts: any = {}) {
this.initBasicParam();
}
/**
* 获取 ViewMessageService 单例对象
*
* @static
* @returns {ViewMessageService}
* @memberof ViewMessageService
*/
public static getInstance(): ViewMessageService {
if (!ViewMessageService.ViewMessage) {
ViewMessageService.ViewMessage = new ViewMessageService();
}
return this.ViewMessage;
}
/**
* 初始化基础参数
*
* @memberof ViewMessageService
*/
public initBasicParam(){}
/**
* 获取视图消息服务
*
* @protected
* @param {string} name 视图消息codename
* @returns {Promise<any>}
* @memberof ViewMessageService
*/
public getService(name: string): Promise<any> {
return (window as any)['messageServiceRegister'].getService(name);
}
/**
* 通过tag获取视图消息
*
* @param {tag:string} 视图消息标识
* @param {context:any} 导航上下文
* @param {viewparam:any} 导航参数
* @memberof ViewMessageService
*/
public async getViewMessageByTag(tag:string,context:any = {},viewparam:any = {}){
let messageService:any = await this.getService(tag);
if(messageService.dynamicMode && Object.is(messageService.dynamicMode,"STATIC")){
return messageService.getStaticViewMessage();
}else{
return messageService.getDynamicViewMessage(tag,messageService,context,viewparam);
}
}
/**
* 转化消息模板标题和内容
*
* @memberof ViewMessageService
*/
public translateMessageTemp(target:any,item?:any){
}
/**
* 获取动态模式(静态)类型视图消息
*
* @memberof ViewMessageService
*/
public getStaticViewMessage():Array<ViewMessage>{
let returnViewMessage:ViewMessage ={
id:this.id,
name:this.name,
codename:this.codename,
title:this.title,
content:this.content,
closeMode:this.closeMode,
position:this.position,
type:this.type,
isEnableRemove:this.isEnableRemove,
order:this.order,
dynamicMode:this.dynamicMode,
messageType:this.messageType
};
this.translateMessageTemp(returnViewMessage);
return [returnViewMessage];
}
/**
* 获取动态模式(实体数据集合)类型视图消息
*
* @param {any} tag 视图消息标识
* @param {any} messageService 消息服务
* @param {string} context
* @returns {Promise<any[]>}
* @memberof ViewMessageService
*/
public getDynamicViewMessage(tag:string,messageService: any,context:any = {}, data: any = {}, isloading?: boolean): Promise<any[]> {
if(context && context.srfsessionid){
delete context.srfsessionid;
}
return new Promise((resolve:any,reject:any) =>{
let isEnableCache:boolean = messageService.isEnableCache;
let cacheTimeout:any = messageService.cacheTimeout;
// 启用缓存
if(isEnableCache){
const callback:Function = (context:any ={},data:any ={},tag:string,promise:Promise<any>) =>{
promise.then((result:any) =>{
if(result.length > 0){
ViewMessageService.messageCached.set(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`,{items:result});
ViewMessageService.messageCache.delete(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`);
return resolve(result);
}else{
return resolve([]);
}
}).catch((result:any) =>{
return reject(result);
})
}
// 加载完成,从本地缓存获取
if(ViewMessageService.messageCached.get(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`)){
let items:any = ViewMessageService.messageCached.get(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`).items;
if(items.length >0){
if(new Date().getTime() <= messageService.getExpirationTime()){
return resolve(items);
}
}
}
if (messageService) {
// 加载中,UI又需要数据,解决连续加载同一代码表问题
if(ViewMessageService.messageCache.get(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`)){
callback(context,data,tag,ViewMessageService.messageCache.get(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`));
}else{
let result:Promise<any> = messageService.getItems(context,data,isloading);
ViewMessageService.messageCache.set(`${JSON.stringify(context)}-${JSON.stringify(data)}-${tag}`,result);
messageService.setExpirationTime(new Date().getTime() + cacheTimeout);
callback(context,data,tag,result);
}
}
}else{
if (messageService) {
messageService.getItems(context,data,isloading).then((result:any) =>{
resolve(result);
}).catch((error:any) =>{
Promise.reject([]);
})
}else{
return Promise.reject([]);
}
}
})
}
}
\ No newline at end of file
......@@ -32,4 +32,11 @@ mock.onGet('./assets/json/view-config.json').reply((config: any) => {
"viewtag": "c0a8e8c1058d9a5cdb5a6edbf9855886"
}
}];
});
// 获取视图消息分组信息
mock.onGet('./assets/json/view-message-group.json').reply((config: any) => {
let status = MockAdapter.mockStatus(config);
return [status,{
}];
});
\ No newline at end of file
......@@ -38,6 +38,14 @@ export class FormItemModel extends FormDetailModel {
*/
public enableCond: number | 0 | 1 | 2 | 3 = 3;
/**
* 是否必填
*
* @type {boolean}
* @memberof FormItemModel
*/
public required:boolean = false;
/**
* Creates an instance of FormItemModel.
* FormItemModel 实例
......@@ -49,6 +57,7 @@ export class FormItemModel extends FormDetailModel {
super(opts);
this.disabled = opts.disabled ? true : false;
this.enableCond = opts.enableCond;
this.required = opts.required;
}
/**
......
......@@ -250,7 +250,9 @@ export default class SDFileEditViewBase extends Vue {
for(let key in this.viewparams){
delete this.viewparams[key];
}
Object.assign(this.viewparams, JSON.parse(this.viewparam));
if(typeof this.viewparams == 'string') {
Object.assign(this.viewparams, JSON.parse(this.viewparam));
}
}
}
......@@ -271,7 +273,7 @@ export default class SDFileEditViewBase extends Vue {
_this.engine.load();
});
} else if(!Object.is(newVal, oldVal) && _this.refresh() && Object.is(_this.$util.typeOf(_this.refresh()), 'function')) {
} else if(!Object.is(newVal, oldVal) && _this.refresh && _this.refresh instanceof Function) {
_this.refresh();
}
}
......@@ -439,7 +441,9 @@ export default class SDFileEditViewBase extends Vue {
Object.assign(this.context,this.$store.getters.getAppData().context);
}
if (!this.viewDefaultUsage && this.viewdata && !Object.is(this.viewdata, '')) {
Object.assign(this.context, JSON.parse(this.viewdata));
if(typeof this.viewdata == 'string') {
Object.assign(this.context, JSON.parse(this.viewdata));
}
if(this.context && this.context.srfparentdename){
Object.assign(this.viewparams,{srfparentdename:this.context.srfparentdename});
}
......
......@@ -158,7 +158,7 @@ import GridViewEngine from '@engine/view/grid-view-engine';
import SDFileUIService from '@/uiservice/sdfile/sdfile-ui-service';
import CodeListService from "@service/app/codelist-service";
import CodeListService from "@/codelist/codelist-service";
@Component({
......@@ -280,7 +280,9 @@ export default class SDFileGridViewBase extends Vue {
for(let key in this.viewparams){
delete this.viewparams[key];
}
Object.assign(this.viewparams, JSON.parse(this.viewparam));
if(typeof this.viewparams == 'string') {
Object.assign(this.viewparams, JSON.parse(this.viewparam));
}
}
}
......@@ -301,7 +303,7 @@ export default class SDFileGridViewBase extends Vue {
_this.engine.load();
});
} else if(!Object.is(newVal, oldVal) && _this.refresh() && Object.is(_this.$util.typeOf(_this.refresh()), 'function')) {
} else if(!Object.is(newVal, oldVal) && _this.refresh && _this.refresh instanceof Function) {
_this.refresh();
}
}
......@@ -474,7 +476,9 @@ export default class SDFileGridViewBase extends Vue {
Object.assign(this.context,this.$store.getters.getAppData().context);
}
if (!this.viewDefaultUsage && this.viewdata && !Object.is(this.viewdata, '')) {
Object.assign(this.context, JSON.parse(this.viewdata));
if(typeof this.viewdata == 'string') {
Object.assign(this.context, JSON.parse(this.viewdata));
}
if(this.context && this.context.srfparentdename){
Object.assign(this.viewparams,{srfparentdename:this.context.srfparentdename});
}
......
......@@ -5,6 +5,7 @@ import App from '@/App.vue';
import ElementUi from 'element-ui';
import ViewUI from 'view-design';
import ibizLab from 'ibiz-vue-lib';
import axios from "axios";
import { Interceptors } from '@/utils';
import {Print} from '@/utils/print';
import i18n from '@/locale'
......@@ -27,13 +28,18 @@ import { PortletComponent } from '@/portlet-register';
import store from '@/store';
import router from './router';
const win: any = window;
win.axios = axios;
Vue.config.errorHandler = function (err: any, vm: any, info: any) {
console.log(err);
}
Vue.config.productionTip = false;
Vue.use(Print);
Vue.use(ibizLab);
Vue.use(Vuex);
Vue.use(win.AVUE);
Vue.use(VueRouter);;
Vue.use(ElementUi, {
i18n: (key: any, value: any) => i18n.t(key, value)
......
......@@ -170,7 +170,9 @@ export default class SDIndexViewBase extends Vue {
for(let key in this.viewparams){
delete this.viewparams[key];
}
Object.assign(this.viewparams, JSON.parse(this.viewparam));
if(typeof this.viewparams == 'string') {
Object.assign(this.viewparams, JSON.parse(this.viewparam));
}
}
}
......@@ -191,7 +193,7 @@ export default class SDIndexViewBase extends Vue {
_this.engine.load();
});
} else if(!Object.is(newVal, oldVal) && _this.refresh() && Object.is(_this.$util.typeOf(_this.refresh()), 'function')) {
} else if(!Object.is(newVal, oldVal) && _this.refresh && _this.refresh instanceof Function) {
_this.refresh();
}
}
......@@ -307,7 +309,9 @@ export default class SDIndexViewBase extends Vue {
Object.assign(this.context,this.$store.getters.getAppData().context);
}
if (!this.viewDefaultUsage && this.viewdata && !Object.is(this.viewdata, '')) {
Object.assign(this.context, JSON.parse(this.viewdata));
if(typeof this.viewdata == 'string') {
Object.assign(this.context, JSON.parse(this.viewdata));
}
if(this.context && this.context.srfparentdename){
Object.assign(this.viewparams,{srfparentdename:this.context.srfparentdename});
}
......
import { Http } from '@/utils';
import CodeListService from "@service/app/codelist-service";
import CodeListService from "@/codelist/codelist-service";
/**
* 实体服务基类
......
......@@ -47,7 +47,13 @@ export const getLocalData = (state: any) => () => {
* @param state
*/
export const getAppData = (state: any) => () => {
return state.appdata;
let result:any = JSON.parse(JSON.stringify(state.appdata));
if(state.localdata && Object.keys(state.localdata).length >0){
let copyContext:any = result.context?result.context:{};
Object.assign(copyContext,state.localdata);
result.context = copyContext;
}
return result;
}
/**
......@@ -104,4 +110,14 @@ export const getOrgData = (state: any) => (srfkey: string) => {
export const getDepData = (state: any) => (srfkey: string) => {
let depData = state.depDataMap[srfkey];
return depData;
}
/**
* 获取视图信息
*
* @param state
*/
export const getViewMessage = (state: any) => (tag: string) => {
let id = state.viewMessage[tag];
return id;
}
\ No newline at end of file
......@@ -29,8 +29,8 @@ export const addCodeLists = (state: any, codelists: any) => {
* @param localdata
*/
export const addLocalData = (state: any, localdata: any = {}) => {
state.localdata = {};
Object.assign(state.localdata, localdata);
localStorage.setItem('localdata',JSON.stringify(state.localdata));
}
/**
......@@ -291,4 +291,16 @@ export const addDepData = (state: any, args: {srfkey: string,depData: any}) => {
if(args && args.srfkey && args.depData){
state.depDataMap[args.srfkey] = JSON.parse(JSON.stringify(args.depData));
}
}
/**
* 添加视图信息
*
* @param state
* @param args
*/
export const addViewMessage = (state: any, args: { tag: string, id: any }) => {
if(args && args.tag && args.id) {
state.viewMessage[args.tag] = args.id;
}
}
\ No newline at end of file
......@@ -16,4 +16,5 @@ export const rootstate: any = {
viewSplit: {},
orgDataMap:{},
depDataMap:{},
viewMessage: {},
}
\ No newline at end of file
@import '../../node_modules/font-awesome/less/font-awesome.less';
@import'/assets/styles/index.css';
@import '../theme/blue.theme.less';
@import '../theme/dark-blue.theme.less';
@import '../theme/default.theme.less';
......
......@@ -13,5 +13,6 @@
</noscript>
<div id="app"></div>
<script src="./environments/environment.js"></script>
<script src="../assets/js/avue.min.js"></script>
</body>
</html>
......@@ -203,13 +203,13 @@ export default class SDFileUIServiceBase extends UIService {
}
})
for (let i = 0; i <= 1; i++) {
let strTag:string = (curData[this.mainStateFields[0]])?(i == 0) ? curData[this.mainStateFields[0]] : "":"";
let strTag:string = (curData[this.mainStateFields[0]])?(i == 0) ? `${curData[this.mainStateFields[0]]}` : "":"";
if (this.mainStateFields.length >= 2) {
for (let j = 0; j <= 1; j++) {
let strTag2:string = (curData[this.mainStateFields[1]])?`${strTag}__${(j == 0) ? curData[this.mainStateFields[1]] : ""}`:strTag;
let strTag2:string = (curData[this.mainStateFields[1]])?`${strTag}__${(j == 0) ? `${curData[this.mainStateFields[1]]}` : ""}`:strTag;
if (this.mainStateFields.length >= 3) {
for (let k = 0; k <= 1; k++) {
let strTag3:string = (curData[this.mainStateFields[2]])?`${strTag2}__${(k == 0) ? curData[this.mainStateFields[2]] : ""}`:strTag2;
let strTag3:string = (curData[this.mainStateFields[2]])?`${strTag2}__${(k == 0) ? `${curData[this.mainStateFields[2]]}` : ""}`:strTag2;
// 判断是否存在
return this.allDeMainStateMap.get(strTag3);
}
......
......@@ -41,10 +41,11 @@ export class AuthGuard {
private constructor() { }
/**
* post请求
* 获取应用数据
*
* @param {string} url url 请求路径
* @param {*} [params={}] 请求参数
* @param {*} [router] 路由对象
* @returns {Promise<any>} 请求相响应对象
* @memberof AuthGuard
*/
......@@ -65,6 +66,9 @@ export class AuthGuard {
}
data = JSON.parse(JSON.stringify(localAppData));
}
if(localStorage.getItem('localdata')){
router.app.$store.commit('addLocalData', JSON.parse(localStorage.getItem('localdata') as string));
}
router.app.$store.commit('addAppData', data);
// 提交统一资源数据
router.app.$store.dispatch('authresource/commitAuthData', data);
......
......@@ -122,6 +122,7 @@ import AppCenterService from "@service/app/app-center-service";
import SDIndexViewService from './sdindex-view-appmenu-service';
import SDIndexViewModel from './sdindex-view-appmenu-model';
import { Environment } from '@/environments/environment';
import AuthService from '@/authservice/auth-service';
@Component({
......@@ -386,6 +387,15 @@ export default class SDIndexViewBase extends Vue implements ControlInterface {
* @memberof SDIndexViewBase
*/
public counterdata: any = {};
/**
* 建构权限服务对象
*
* @type {AuthService}
* @memberof SDIndexViewBase
*/
public authService:AuthService = new AuthService({ $store: this.$store });
/**
* vue 生命周期
*
......@@ -649,7 +659,7 @@ export default class SDIndexViewBase extends Vue implements ControlInterface {
*/
public computedEffectiveMenus(inputMenus:Array<any>){
inputMenus.forEach((_item:any) =>{
if(!this.$store.getters['authresource/getAuthMenu'](_item)){
if(!this.authService.getMenusPermission(_item)){
_item.hidden = true;
if (_item.items && _item.items.length > 0) {
this.computedEffectiveMenus(_item.items);
......
import { Store } from 'vuex';
import { Util } from '@/utils/util/util';
import CodeListService from "@service/app/codelist-service";
import CodeListService from "@/codelist/codelist-service";
/**
* 部件服务基类
......
......@@ -277,6 +277,19 @@ export default class DefaultBase extends Vue implements ControlInterface {
n_filename_like: null,
};
/**
* 详情模型集合
*
* @type {*}
* @memberof DefaultBase
*/
public detailsModel: any = {
formpage1: new FormPageModel({ caption: '常规条件', detailType: 'FORMPAGE', name: 'formpage1', visible: true, isShowCaption: true, form: this })
,
n_filename_like: new FormItemModel({ caption: '名称(文本包含(%))', detailType: 'FORMITEM', name: 'n_filename_like', visible: true, isShowCaption: true, form: this,required:false, disabled: false, enableCond: 3 })
,
};
/**
* 属性值规则
*
......@@ -287,24 +300,11 @@ export default class DefaultBase extends Vue implements ControlInterface {
n_filename_like: [
{ type: 'string', message: '名称(文本包含(%)) 值必须为字符串类型', trigger: 'change' },
{ type: 'string', message: '名称(文本包含(%)) 值必须为字符串类型', trigger: 'blur' },
{ required: false, type: 'string', message: '名称(文本包含(%)) 值不能为空', trigger: 'change' },
{ required: false, type: 'string', message: '名称(文本包含(%)) 值不能为空', trigger: 'blur' },
{ required: this.detailsModel.n_filename_like.required, type: 'string', message: '名称(文本包含(%)) 值不能为空', trigger: 'change' },
{ required: this.detailsModel.n_filename_like.required, type: 'string', message: '名称(文本包含(%)) 值不能为空', trigger: 'blur' },
],
}
/**
* 详情模型集合
*
* @type {*}
* @memberof DefaultBase
*/
public detailsModel: any = {
formpage1: new FormPageModel({ caption: '常规条件', detailType: 'FORMPAGE', name: 'formpage1', visible: true, isShowCaption: true, form: this })
,
n_filename_like: new FormItemModel({ caption: '名称(文本包含(%))', detailType: 'FORMITEM', name: 'n_filename_like', visible: true, isShowCaption: true, form: this, disabled: false, enableCond: 3 })
,
};
/**
* 监控表单属性 n_filename_like 值
*
......
......@@ -363,6 +363,10 @@ export default class DefaultService extends ControlService {
}else{
if(item && item.prop){
requestData[item.prop] = data[item.name];
}else{
if(item.dataType && Object.is(item.dataType,"FORMPART")){
Object.assign(requestData,data[item.name]);
}
}
}
});
......@@ -395,4 +399,40 @@ export default class DefaultService extends ControlService {
return itemName.trim();
}
/**
* 重写处理返回数据
*
* @param {string} action
* @param {*} response
* @memberof DefaultService
*/
public handleResponseData(action: string, data: any = {},isCreate?:boolean,codelistArray?:any){
let model: any = this.getMode();
if (!model && model.getDataItems instanceof Function) {
return data;
}
let item: any = {};
let dataItems: any[] = model.getDataItems();
dataItems.forEach(dataitem => {
let val = data.hasOwnProperty(dataitem.prop) ? data[dataitem.prop] : null;
if (val === null) {
val = data.hasOwnProperty(dataitem.name) ? data[dataitem.name] : null;
}
if((isCreate === undefined || isCreate === null ) && Object.is(dataitem.dataType, 'GUID') && Object.is(dataitem.name, 'srfkey') && (val && !Object.is(val, ''))){
isCreate = true;
}
item[dataitem.name] = val;
// 转化代码表
if(codelistArray && dataitem.codelist){
if(codelistArray.get(dataitem.codelist.tag) && codelistArray.get(dataitem.codelist.tag).get(val)){
item[dataitem.name] = codelistArray.get(dataitem.codelist.tag).get(val);
}
}
});
item.srfuf = data.srfuf ? data.srfuf : (isCreate ? "0" : "1");
item = Object.assign(data,item);
return item;
}
}
\ No newline at end of file
......@@ -37,11 +37,6 @@
git clone -b master $para2 ibzdisk/
export NODE_OPTIONS=--max-old-space-size=4096
cd ibzdisk/
mvn clean package -Papi
cd ibzdisk-provider/ibzdisk-provider-api
mvn -Papi docker:build
mvn -Papi docker:push
docker -H $para1 stack deploy --compose-file=src/main/docker/ibzdisk-provider-api.yaml ibzlab-rt --with-registry-auth
</command>
</hudson.tasks.Shell>
</builders>
......
......@@ -12,6 +12,6 @@ CMD echo "The application will start in ${IBIZ_SLEEP}s..." && \
sleep ${IBIZ_SLEEP} && \
java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /ibzdisk-provider-api.jar
EXPOSE 40006
EXPOSE 8081
ADD ibzdisk-provider-api.jar /ibzdisk-provider-api.jar
......@@ -3,22 +3,9 @@ services:
ibzdisk-provider-api:
image: registry.cn-shanghai.aliyuncs.com/ibizsys/ibzdisk-provider-api:latest
ports:
- "40006:40006"
- "8081:8081"
networks:
- agent_network
environment:
- SPRING_CLOUD_NACOS_DISCOVERY_IP=172.16.180.237
- SERVER_PORT=40006
- SPRING_CLOUD_NACOS_DISCOVERY_SERVER-ADDR=172.16.102.211:8848
- SPRING_REDIS_HOST=172.16.100.243
- SPRING_REDIS_PORT=6379
- SPRING_REDIS_DATABASE=0
- SPRING_DATASOURCE_USERNAME=a_A_5d9d78509
- SPRING_DATASOURCE_PASSWORD=@6dEfb3@
- SPRING_DATASOURCE_URL=jdbc:mysql://172.16.180.232:3306/a_A_5d9d78509?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true&allowMultiQueries=true
- SPRING_DATASOURCE_DRIVER-CLASS-NAME=com.mysql.jdbc.Driver
- SPRING_DATASOURCE_DEFAULTSCHEMA=a_A_5d9d78509
- NACOS=172.16.102.211:8848
deploy:
resources:
limits:
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册