提交 1cff2957 编写于 作者: tony001's avatar tony001

Revert "Revert "Merge branch 'dev'""

This reverts commit 2f857f0a.
上级 2f857f0a
因为 它太大了无法显示 源差异 。您可以改为 查看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 '../entity-service';
import EntityService from '@/service/entity-service';
/**
* 动态代码表服务类
......
<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 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 =`/getFormModel/${this.appCodeName}/${this.deCodeName}/${this.formCodeName}/${this.formDetailCodeName}`;
/**
* 动态表单配置对象
*
* @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-item">
<div v-if="Object.is(itemType,'BUTTON')" >
<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>
<div v-if="Object.is(itemType,'RAWITEM')">
<i v-if="icon" :class="icon"></i>
<span v-if="caption" class="app-panel-item-rawitem">{{caption}}</span>
<div :class="contentStyle">
<slot></slot>
</div>
</div>
</div>
</template>
......@@ -20,15 +11,7 @@
import { Vue, Component, Prop, Watch } from "vue-property-decorator";
@Component({})
export default class AppPanelItem extends Vue {
/**
* 面板成员类型
*
* @type {string}
* @memberof AppPanelItem
*/
@Prop() public itemType!: string;
export default class AppPanelButton extends Vue {
/**
* 图标
......@@ -62,22 +45,6 @@ export default class AppPanelItem extends Vue {
*/
@Prop() public lableStyle?: string;
/**
* 内容样式
*
* @type {boolean}
* @memberof AppPanelItem
*/
@Prop() public contentStyle?: string;
/**
* 部件样式
*
* @type {boolean}
* @memberof AppPanelItem
*/
@Prop() public partsStyle?: string;
/**
* 点击按钮
*
......@@ -91,5 +58,5 @@ export default class AppPanelItem extends Vue {
}
</script>
<style lang='less'>
@import "./app-panel-item.less";
</style>
\ No newline at end of file
.app-panel-item{
.app-panel-item-rawitem{
padding-right: 10px;
}
}
\ 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,25 +57,6 @@ 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));
}
}
/**
* 表单数据
*
......@@ -89,29 +75,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);
}
/**
* 订阅对象
*
* @protected
* @type {(Subscription | undefined)}
* @memberof AvueCustomForm
*/
protected formStateEvent: Subscription | undefined;
/**
* avue-form绑定值
* 当前组件配置设置属性
*
* @type {any}
* @memberof AvueCustomForm
*/
public formvalue: any = {};
public formOption: any = null;
/**
* avue-form默认配置
......@@ -189,10 +192,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 = JSON.parse(response.data);
if (this.isFormData) that.getFormData();
}
});
......@@ -214,7 +215,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 +243,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
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
......@@ -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;
}
/**
......
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>
......@@ -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);
......
import { Store } from 'vuex';
import { Util } from '@/utils/util/util';
import CodeListService from "@service/app/codelist-service";
import CodeListService from "@/codelist/codelist-service";
/**
* 部件服务基类
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册