提交 06bd6c62 编写于 作者: ibizdev's avatar ibizdev

tony001 发布系统代码 [后台服务,演示应用]

上级 43afb56c
......@@ -139,6 +139,7 @@ import AppCtrlPos from './components/layout-element/structure/app-ctrl-pos/app-c
import AppPresetButton from './components/layout-element/interactive/app-preset-button/app-preset-button.vue';
import AppFieldImageDynamic from './components/layout-element/media/app-field-image-dynamic/app-field-image-dynamic.vue';
import AppTodoList from './components/app-todo-list/app-todo-list.vue';
import ExtendActionTimeline from './components/extend-action-timeline/extend-action-timeline.vue';
// 全局挂载UI实体服务注册中心
window['uiServiceRegister'] = uiServiceRegister;
......@@ -293,5 +294,6 @@ export const AppComponents = {
v.component('app-preset-button',AppPresetButton);
v.component('app-field-image-dynamic', AppFieldImageDynamic);
v.component('app-todo-list',AppTodoList);
v.component('extend-action-timeline',ExtendActionTimeline);
},
};
\ No newline at end of file
.extend-action-timeline {
height: 100%;
overflow: scroll;
}
.extend-action-timeline-table {
border-collapse: separate;
border-spacing: 0px 40px;
.extend-action-timeline-thead {
th:nth-child(1) {
min-width: 200px;
}
th:nth-child(2) {
width: 100%;
}
}
}
.extend-action-timeline-body__timeline.timeline-head {
padding: 8px 16px;
height: 45px;
line-height: 45px;
padding: 0 16px;
.timeline-wrapper>div {
height: 45px;
line-height: 45px;
}
.type {
padding-left: 16px;
}
}
.extend-action-timeline-body {
width: 100%;
.timeline-content .timeline-wrapper__authorname {
color: #57a3fd;
}
.timeline-wrapper__authorname__tooltips {
width: 214px;
display: flex;
flex-wrap: wrap;
.tooltips-content {
width: 30%;
margin: 5px 15px;
}
}
.timeline-draw {
height: auto;
background-color: #fafafa;
border-bottom: 1px solid #e8eaec;
}
.timeline-wrapper {
height: auto;
}
.timeline-wrapper__timeline-index {
width: 60px;
height: auto;
}
.timeline-wrapper__usertaskname {
width: 100%;
}
.timeline-wrapper__authorname {
display: flex;
width: 100%;
height: auto;
flex-wrap: wrap;
>div {
width: 110px;
}
}
}
.extend-action-timeline-body__timeline {
position: relative;
width: 100%;
padding: 0 16px;
height: 65px;
line-height: 65px;
font-size: 14px;
.timeline-wrapper {
display: flex;
width: 100%;
.timeline-wrapper__usertaskname,
.timeline-wrapper__authorname,
.timeline-wrapper__last-time,
.timeline-wrapper__type,
.timeline-wrapper__fullmessage {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.timeline-wrapper__tooltip .el-popover__reference {
max-width: 500px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
>div {
text-align: center;
margin: 0 5px;
}
.timeline-wrapper__type {
width: 9%;
min-width: 180px;
text-align: start;
.dot {
width: 8px;
height: 8px;
display: inline-block;
line-height: 100%;
margin: 0 10px 0 3px;
background-color: #46cf4a;
border-radius: 50%;
}
}
}
.timeline-wrapper__timeline-index {
width: 50px;
height: 65px;
position: relative;
span {
display: inline-block;
width: 25px;
height: 25px;
line-height: 25px;
color: #fff;
background-color: #57a3fd;
border-radius: 50%;
}
.icon-bottom {
color: #57a3fd;
position: absolute;
left: 50%;
top: 0;
height: 30px;
line-height: 0;
font-size: 18px;
transform: translateX(-50%) translateY(-2px);
}
.icon-top {
height: 14px;
width: 0;
border: 1px solid #57a3fd;
border-width: 0 1px 0 0;
position: absolute;
bottom: -1px;
left: 50%;
transform: translateX(-0.4px);
}
.icon-line {
height: 102%;
width: 0;
border: 1px solid #57a3fd;
border-width: 0 1px 0 0;
position: absolute;
bottom: -1px;
left: 50%;
transform: translateX(-0.4px);
}
}
.ivu-tooltip {
width: 100%;
}
.ivu-tooltip-rel {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.timeline-wrapper__usertaskname {
width: 9%;
min-width: 160px;
}
.timeline-wrapper__authorname {
width: 15%;
min-width: 110px;
}
.timeline-wrapper__last-time {
width: 15%;
min-width: 100px;
}
.timeline-arrow {
position: absolute;
right: 24px;
bottom: 50%;
transform: translateY(-50%);
float: right;
width: 24px;
height: 24px;
cursor: pointer;
font-size: 24px;
font-weight: bold;
color: #999;
}
}
\ No newline at end of file
<template>
<div class="extend-action-timeline">
<div class="extend-action-timeline-table">
<div class="extend-action-timeline-thead"></div>
<div class="extend-action-timeline-body" v-if="data && data.usertasks">
<div class="timeline-draw extend-action-timeline-body__timeline timeline-head">
<div class="timeline-wrapper">
<div class="timeline-wrapper__timeline-index">{{ $t('components.timeline.index') }}</div>
<div class="timeline-wrapper__usertaskname">{{ $t('components.timeline.node') }}</div>
<div class="timeline-wrapper__authorname">{{ $t('components.timeline.author') }}</div>
<div class="timeline-wrapper__type">{{ $t('components.timeline.type') }}</div>
<div class="timeline-wrapper__last-time">{{ $t('components.timeline.lasttime') }}</div>
<div class="timeline-wrapper__fullmessage">{{ $t('components.timeline.opinion') }}</div>
</div>
<div class="timeline-arrow"></div>
</div>
<template v-for="(usertask, usertaskIndex) in data.usertasks">
<div v-if="usertask.comments.length > 0" class="timeline-content" :key="usertaskIndex">
<div class="extend-action-timeline-body__timeline">
<div class="timeline-wrapper">
<div class="timeline-wrapper__timeline-index">
<span>{{ usertask.index }}</span>
<div class="icon-bottom" v-if="usertask.index != 1">
<i class="el-icon-bottom"></i>
</div>
<div class="icon-top" v-if="usertask.index < usertasksLength"></div>
</div>
<div class="timeline-wrapper__usertaskname">{{ usertask.userTaskName }}</div>
<div class="timeline-wrapper__authorname">
<Tooltip
placement="bottom"
theme="light"
:disabled="
acceptingOfficerNodup('authorName', usertask.comments).length > 1
? false
: true
"
>
{{
acceptingOfficerNodup('authorName', usertask.comments)
.map(item => item)
.toString()
}}
<div slot="content">
<div class="timeline-wrapper__authorname__tooltips">
<div
class="tooltips-content"
v-for="(item, toolindex) in acceptingOfficerNodup(
'authorName',
usertask.comments,
)"
:key="toolindex"
>
{{ item }}
</div>
</div>
</div>
</Tooltip>
</div>
<div class="timeline-wrapper__type">
<div
v-if="
usertask.comments[usertask.comments.length - 1] &&
usertask.comments[usertask.comments.length - 1].type
"
class="dot"
></div>
<span>{{
usertask.comments[usertask.comments.length - 1] &&
usertask.comments[usertask.comments.length - 1].type
}}</span>
</div>
<div class="timeline-wrapper__last-time">
{{
usertask.comments[usertask.comments.length - 1] &&
formatDate(
usertask.comments[usertask.comments.length - 1].time,
'MM月DD日 HH:mm:ss',
)
}}
</div>
<el-popover class="timeline-wrapper__tooltip" placement="top" :width="500" trigger="hover">
<div slot="reference">
{{
usertask.comments[usertask.comments.length - 1] &&
usertask.comments[usertask.comments.length - 1].fullMessage
}}
</div>
<div class="fullmessage">
{{
usertask.comments[usertask.comments.length - 1] &&
usertask.comments[usertask.comments.length - 1].fullMessage
}}
</div>
</el-popover>
</div>
<div
v-if="usertask.comments.length > 1 || usertask.identitylinks.length > 0"
class="timeline-arrow"
@click="changeExpand(usertask)"
>
<i :class="usertask.isShow ? 'el-icon-minus' : 'el-icon-plus'" />
</div>
</div>
<div v-if="usertask.isShow">
<template v-for="(comment, index) in usertask.comments">
<div class="timeline-draw extend-action-timeline-body__timeline" :key="index">
<div class="timeline-wrapper">
<div class="timeline-wrapper__timeline-index">
<div v-if="usertask.index < usertasksLength" class="icon-line"></div>
</div>
<div class="timeline-wrapper__usertaskname"></div>
<div class="timeline-wrapper__authorname">
{{ comment.authorName }}
</div>
<div class="timeline-wrapper__type">
<div class="dot"></div>
<span>{{ comment.type }}</span>
</div>
<div class="timeline-wrapper__last-time">
{{ formatDate(comment.time, 'MM月DD日 HH:mm:ss') }}
</div>
<div class="timeline-wrapper__fullmessage">{{ comment.fullMessage }}</div>
</div>
<div class="timeline-arrow"></div>
</div>
</template>
<div
v-if="usertask.identitylinks.length > 0"
class="timeline-draw extend-action-timeline-body__timeline"
>
<div class="timeline-wrapper">
<div class="timeline-wrapper__timeline-index">
<div v-if="usertask.index < usertasksLength" class="icon-line"></div>
</div>
<div class="timeline-wrapper__usertaskname">
{{ $t('components.timeline.inhand') }}
</div>
<div
class="timeline-wrapper__authorname">
<div
v-for="(identitylink, index) in usertask.identitylinks"
:key="index"
>
{{ identitylink.displayname }}
</div>
</div>
</div>
</div>
</div>
</div>
<div v-else class="timeline-content" :key="usertaskIndex">
<div class="extend-action-timeline-body__timeline">
<div class="timeline-wrapper">
<div class="timeline-wrapper__timeline-index">
<span>{{ usertask.index }}</span>
<div class="icon-bottom" v-if="usertask.index != 1">
<i class="el-icon-bottom"></i>
</div>
<div class="icon-top" v-if="usertask.index < usertasksLength"></div>
</div>
<div class="timeline-wrapper__usertaskname">{{ usertask.userTaskName }}</div>
<div class="timeline-wrapper__authorname">
<Tooltip
placement="bottom"
theme="light"
:disabled="
acceptingOfficerNodup('displayname', usertask.identitylinks).length > 1
? false
: true
"
>
{{
acceptingOfficerNodup('displayname', usertask.identitylinks)
.map(item => item)
.toString()
}}
<div slot="content">
<div class="tooltips">
<div
class="tooltips-content"
v-for="(item, toolindex) in acceptingOfficerNodup(
'displayname',
usertask.identitylinks,
)"
:key="toolindex"
>
{{ item }}
</div>
</div>
</div>
</Tooltip>
</div>
</div>
<div v-if="usertask.identitylinks.length > 1" class="timeline-arrow" @click="changeExpand(usertask)">
<i :class="usertask.isShow ? 'el-icon-minus' : 'el-icon-plus'" />
</div>
</div>
<div v-if="usertask.isShow">
<template v-for="(identitylink, index) in usertask.identitylinks">
<div class="timeline-draw extend-action-timeline-body__timeline" :key="index">
<div class="timeline-wrapper">
<div class="timeline-wrapper__timeline-index">
<div v-if="usertask.index < usertasksLength" class="icon-line"></div>
</div>
<div class="timeline-wrapper__usertaskname"></div>
<div class="timeline-wrapper__authorname">
{{ identitylink.displayname }}
</div>
</div>
<div class="timeline-arrow"></div>
</div>
</template>
</div>
</div>
</template>
</div>
</div>
</div>
</template>
<script lang="ts">
import { Vue, Component, Prop } from 'vue-property-decorator';
import moment from 'moment';
import { Http } from '@/utils';
import EntityService from '@/service/entity-service';
import IBIZBOOKService from '@/service/ibizbook/ibizbook-service';
@Component({})
export default class ExtendActionTimeline extends Vue {
/**
* 上下文
*
* @memberof ExtendActionTimeline
*/
@Prop() public context: any;
/**
* 视图参数
*
* @memberof ExtendActionTimeline
*/
@Prop() public viewparams: any;
/**
* 实体名称
*
* @memberof ExtendActionTimeline
*/
@Prop() public appDeCodeName!: string;
/**
* 数据
*
* @memberof ExtendActionTimeline
*/
public data: any = {};
/**
* 初始化memo
*
* @memberof ExtendActionTimeline
*/
public initmemo: string = '';
/**
* 子项索引初始值
*
* @memberof ExtendActionTimeline
*/
public usertasksIndex: number = 1;
/**
* 子项长度初始值
*
* @memberof ExtendActionTimeline
*/
public usertasksLength: number = 1;
/**
* 实体服务
*
* @memberof ExtendActionTimeline
*/
public appEntityService: any;
/**
* 初始化数据
*
* @memberof ExtendActionTimeline
*/
public async created() {
this.appEntityService = await window.entityServiceRegister.getService(this.appDeCodeName.toLowerCase());
if (this.appEntityService) {
console.log(this.appEntityService);
this.appEntityService.GetWFHistory(this.context).then((response: any) => {
if (response && response.status === 200) {
this.data = response.data;
this.initUIStateData();
} else {
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: response });
}
}).catch((error: any) => {
const message = error.message ? error.message : '加载数据错误';
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: message });
})
}
}
/**
* 初始化数据添加标记
*
* @memberof ExtendActionTimeline
*/
public initUIStateData() {
if (this.data && this.data.usertasks) {
this.usertasksIndex = 1;
for (let i in this.data.usertasks) {
this.data.usertasks[i].isShow = false;
this.data.usertasks[i].index = this.usertasksIndex;
this.usertasksIndex++;
}
this.usertasksLength = this.usertasksIndex - 1;
this.$forceUpdate();
}
}
/**
* 时间转换
*
* @memberof ExtendActionTimeline
*/
public formatDate(date: string, format: string) {
return moment(date).format(format);
}
/**
* 点击事件
*
* @memberof ExtendActionTimeline
*/
public changeExpand(usertask: any) {
usertask.isShow = !usertask.isShow;
this.$forceUpdate();
}
/**
* 办理人员名称显示去重
*
* @param tag 需要去重的名称标识
* @param data 需要去重数据集
* @memberof ExtendActionTimeline
*/
public acceptingOfficerNodup(tag: string, data: any[]): any[] {
let tempData: any[] = [];
if (data.length > 0 && tag) {
data.forEach((data: any) => {
tempData.push(data[tag]);
});
}
const nodup = [...new Set(tempData)];
return nodup;
}
}
</script>
<style lang='less'>
@import './extend-action-timeline.less';
</style>
\ No newline at end of file
......@@ -6,7 +6,7 @@
<span class='caption-info' :title="$t(model.srfCaption)">{{$t(model.srfCaption)}}</span>
</div>
<div class='content-container'>
{{$t('app.viewLayoutPanel.appWfstepDataView.title')}}
<extend-action-timeline :context="context" :viewparams="viewparams" :appDeCodeName="appDeCodeName"/>
</div>
</card>
</div>
......
......@@ -1378,7 +1378,7 @@ export default class GuideBorrowFormBase extends Vue implements ControlInterface
*/
public async load(opt: any = {}): Promise<any> {
if(!this.loadAction){
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKWizardView' + (this.$t('app.formpage.notconfig.loadaction') as string) });
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKWizardView_layout' + (this.$t('app.formpage.notconfig.loadaction') as string) });
return;
}
const arg: any = { ...opt };
......@@ -1425,7 +1425,7 @@ export default class GuideBorrowFormBase extends Vue implements ControlInterface
*/
public async loadDraft(opt: any = {}): Promise<any> {
if (!this.loaddraftAction) {
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKWizardView' + (this.$t('app.formpage.notconfig.loaddraftaction') as string) });
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKWizardView_layout' + (this.$t('app.formpage.notconfig.loaddraftaction') as string) });
return;
}
const arg: any = { ...opt } ;
......@@ -1495,7 +1495,7 @@ export default class GuideBorrowFormBase extends Vue implements ControlInterface
const action: any = Object.is(data.srfuf, '1') ? this.updateAction : this.createAction;
if(!action){
let actionName:any = Object.is(data.srfuf, '1')?"updateAction":"createAction";
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKWizardView' + (this.$t('app.formpage.notconfig.actionname') as string) });
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKWizardView_layout' + (this.$t('app.formpage.notconfig.actionname') as string) });
return;
}
Object.assign(arg,{viewparams:this.viewparams});
......@@ -1603,7 +1603,7 @@ export default class GuideBorrowFormBase extends Vue implements ControlInterface
const action: any = Object.is(data.srfuf, '1') ? this.updateAction : this.createAction;
if(!action){
let actionName:any = Object.is(data.srfuf, '1')?"updateAction":"createAction";
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKWizardView' + (this.$t('app.formpage.notconfig.actionname') as string) });
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKWizardView_layout' + (this.$t('app.formpage.notconfig.actionname') as string) });
return;
}
Object.assign(arg, { viewparams: this.viewparams });
......@@ -1695,7 +1695,7 @@ export default class GuideBorrowFormBase extends Vue implements ControlInterface
public remove(opt:Array<any> = [],showResultInfo?: boolean): Promise<any> {
return new Promise((resolve: any, reject: any) => {
if(!this.removeAction){
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKWizardView' + (this.$t('app.formpage.notconfig.removeaction') as string) });
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKWizardView_layout' + (this.$t('app.formpage.notconfig.removeaction') as string) });
return;
}
const arg: any = opt[0];
......
......@@ -698,7 +698,7 @@ export default class Usr4Base extends Vue implements ControlInterface {
*/
public async load(opt: any = {}, isReset: boolean = false): Promise<any> {
if(!this.fetchAction){
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKTestCLDataView' + (this.$t('app.list.notConfig.fetchAction') as string) });
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKUsr4DataView' + (this.$t('app.list.notConfig.fetchAction') as string) });
return;
}
const arg: any = {...opt};
......@@ -792,7 +792,7 @@ export default class Usr4Base extends Vue implements ControlInterface {
*/
public async remove(datas: any[]): Promise<any> {
if(!this.removeAction){
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKTestCLDataView' + (this.$t('app.gridpage.notConfig.removeAction') as string) });
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKUsr4DataView' + (this.$t('app.gridpage.notConfig.removeAction') as string) });
return;
}
let _datas:any[] = [];
......@@ -908,7 +908,7 @@ export default class Usr4Base extends Vue implements ControlInterface {
try {
if(Object.is(item.rowDataState, 'create')){
if(!this.createAction){
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKTestCLDataView' + (this.$t('app.list.notConfig.createAction') as string) });
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKUsr4DataView' + (this.$t('app.list.notConfig.createAction') as string) });
}else{
Object.assign(item,{viewparams:this.viewparams});
let response = await this.service.add(this.createAction, JSON.parse(JSON.stringify(this.context)),item, this.showBusyIndicator);
......@@ -916,7 +916,7 @@ export default class Usr4Base extends Vue implements ControlInterface {
}
}else if(Object.is(item.rowDataState, 'update')){
if(!this.updateAction){
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKTestCLDataView' + (this.$t('app.list.notConfig.updateAction') as string) });
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKUsr4DataView' + (this.$t('app.list.notConfig.updateAction') as string) });
}else{
Object.assign(item,{viewparams:this.viewparams});
if(item.ibizbook){
......
......@@ -70,6 +70,11 @@ export default class Usr4Model {
prop: 'n_ibizbookname_like',
dataType: 'QUERYPARAM'
},
{
name: 'n_price_gtandeq',
prop: 'n_price_gtandeq',
dataType: 'QUERYPARAM'
},
{
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册