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

ibiz4j 部署微服务应用

上级 90cbaeec
## v7.0.0-alpha.6 [2020-5-23]
### Bug修复
修复处理快速分组模型动态数据部分
修复列表,数据视图默认排序
### 功能新增及优化
#### 模板
补充单位选择器、部门选择器、人员选择器
#### 基础文件
补充单位选择器、部门选择器、人员选择器
## v7.0.0-alpha.5 [2020-5-21] ## v7.0.0-alpha.5 [2020-5-21]
### Bug修复 ### Bug修复
......
...@@ -18,14 +18,16 @@ ...@@ -18,14 +18,16 @@
"@fullcalendar/list": "^4.4.0", "@fullcalendar/list": "^4.4.0",
"@fullcalendar/timegrid": "^4.4.0", "@fullcalendar/timegrid": "^4.4.0",
"@fullcalendar/vue": "^4.4.0", "@fullcalendar/vue": "^4.4.0",
"vuedraggable": "^2.23.2",
"async-validator": "^3.3.0",
"axios": "^0.19.1", "axios": "^0.19.1",
"core-js": "^3.4.4", "core-js": "^3.4.4",
"echarts": "^4.6.0", "echarts": "^4.6.0",
"element-ui": "^2.13.0", "element-ui": "^2.13.0",
"file-saver": "^2.0.2", "file-saver": "^2.0.2",
"font-awesome": "^4.7.0", "font-awesome": "^4.7.0",
"ibiz-gantt-elastic": "^1.0.12", "ibiz-gantt-elastic": "^1.0.15",
"ibiz-vue-lib": "^0.1.4", "ibiz-vue-lib": "^0.1.9",
"interactjs": "^1.9.4", "interactjs": "^1.9.4",
"moment": "^2.24.0", "moment": "^2.24.0",
"path-to-regexp": "^6.1.0", "path-to-regexp": "^6.1.0",
......
...@@ -75,8 +75,7 @@ import AppOrgSelect from './components/app-org-select/app-org-select.vue' ...@@ -75,8 +75,7 @@ import AppOrgSelect from './components/app-org-select/app-org-select.vue'
import AppDepartmentSelect from './components/app-department-select/app-department-select.vue' import AppDepartmentSelect from './components/app-department-select/app-department-select.vue'
import IBizGroupSelect from './components/ibiz-group-select/ibiz-group-select.vue' import IBizGroupSelect from './components/ibiz-group-select/ibiz-group-select.vue'
import IBizGroupPicker from './components/ibiz-group-picker/ibiz-group-picker.vue' import IBizGroupPicker from './components/ibiz-group-picker/ibiz-group-picker.vue'
import AppWFApproval from './components/app-wf-approval/app-wf-approval.vue'
// 全局挂载UI实体服务注册中心 // 全局挂载UI实体服务注册中心
window['uiServiceRegister'] = uiServiceRegister; window['uiServiceRegister'] = uiServiceRegister;
...@@ -161,5 +160,6 @@ export const AppComponents = { ...@@ -161,5 +160,6 @@ export const AppComponents = {
v.component('app-department-select',AppDepartmentSelect); v.component('app-department-select',AppDepartmentSelect);
v.component('ibiz-group-select',IBizGroupSelect); v.component('ibiz-group-select',IBizGroupSelect);
v.component('ibiz-group-picker',IBizGroupPicker); v.component('ibiz-group-picker',IBizGroupPicker);
v.component('app-wf-approval',AppWFApproval);
}, },
}; };
\ No newline at end of file
<template> <template>
<div class="app-department-select"> <div class="app-department-select">
<ibiz-select-tree :NodesData="Nodesdata" :value="value" :multiple="multiple" @select="onSelect"></ibiz-select-tree> <ibiz-select-tree :NodesData="Nodesdata" v-model="selectTreeValue" :multiple="multiple" @select="onSelect"></ibiz-select-tree>
</div> </div>
</template> </template>
...@@ -17,7 +17,7 @@ export default class AppDepartmentSelect extends Vue { ...@@ -17,7 +17,7 @@ export default class AppDepartmentSelect extends Vue {
* @type {*} * @type {*}
* @memberof AppDepartmentSelect * @memberof AppDepartmentSelect
*/ */
@Prop({default:'/ibzorganizations/{orgid}/ibzdepartments/picker'}) public url?: any; @Prop() public url?: any;
/** /**
* 过滤项 * 过滤项
...@@ -43,14 +43,6 @@ export default class AppDepartmentSelect extends Vue { ...@@ -43,14 +43,6 @@ export default class AppDepartmentSelect extends Vue {
*/ */
@Prop({default:false}) public multiple?: any; @Prop({default:false}) public multiple?: any;
/**
* 表单项名称
*
* @type {*}
* @memberof AppDepartmentSelect
*/
@Prop() public name!: any;
/** /**
* 表单数据 * 表单数据
* *
...@@ -60,20 +52,20 @@ export default class AppDepartmentSelect extends Vue { ...@@ -60,20 +52,20 @@ export default class AppDepartmentSelect extends Vue {
@Prop() public data!: any; @Prop() public data!: any;
/** /**
* 表单项值 * 上下文变量
* *
* @type {*} * @type {*}
* @memberof AppDepartmentSelect * @memberof AppDepartmentSelect
*/ */
@Prop() public value!: any; @Prop() public context!: any;
/** /**
* 上下文变量 * 选中数值
* *
* @type {*} * @type {*}
* @memberof AppDepartmentSelect * @memberof AppDepartmentSelect
*/ */
@Prop() public context!: any; public selectTreeValue:any = "";
/** /**
* 树节点数据 * 树节点数据
...@@ -96,26 +88,40 @@ export default class AppDepartmentSelect extends Vue { ...@@ -96,26 +88,40 @@ export default class AppDepartmentSelect extends Vue {
* *
* @memberof AppDepartmentSelect * @memberof AppDepartmentSelect
*/ */
public searchNodesData(){ public handleFilter(){
// 处理请求参数
let param = ''
if(this.filter){ if(this.filter){
if(this.data && this.data[this.filter]){ if(this.data && this.data[this.filter]){
param= this.data[this.filter]; return this.data[this.filter];
}else if(this.context && this.context[this.filter]){ }else if(this.context && this.context[this.filter]){
param= this.context[this.filter]; return this.context[this.filter];
} }
}else{ }else{
param = this.context.srforgid; return this.context.srforgid;
} }
let _url = this.url.replace(/{orgid}/,param) }
/**
* 获取节点数据
*
* @memberof AppDepartmentSelect
*/
public searchNodesData(){
// 处理过滤参数,生成url
let param = this.handleFilter();
let _url = this.url.replace('${orgid}',param)
if(this.oldurl === _url){ if(this.oldurl === _url){
return; return;
} }
this.oldurl = _url;
// 缓存机制
const result:any = this.$store.getters.getCopyData(_url);
if(result){
this.Nodesdata = result;
return;
}
this.$http.get(_url).then((response: any) => { this.$http.get(_url).then((response: any) => {
console.log(response)
this.Nodesdata = response.data; this.Nodesdata = response.data;
this.oldurl = _url; this.$store.commit('addDepData', { srfkey: this.filter, orgData: response.data });
}).catch((response: any) => { }).catch((response: any) => {
if (!response || !response.status || !response.data) { if (!response || !response.status || !response.data) {
this.$Notice.error({ title: '错误', desc: '系统异常!' }); this.$Notice.error({ title: '错误', desc: '系统异常!' });
...@@ -131,11 +137,55 @@ export default class AppDepartmentSelect extends Vue { ...@@ -131,11 +137,55 @@ export default class AppDepartmentSelect extends Vue {
* @param {*} oldVal * @param {*} oldVal
* @memberof AppDepartmentSelect * @memberof AppDepartmentSelect
*/ */
@Watch('data',{deep:true}) @Watch('data',{immediate:true,deep:true})
public onValueChange(newVal: any, oldVal: any) { public onValueChange(newVal: any, oldVal: any) {
this.searchNodesData(); if(newVal){
this.computedSelectedData();
this.$nextTick(()=>{
this.searchNodesData();
});
}
} }
/**
* 计算选中值
*
* @memberof AppOrgSelect
*/
public computedSelectedData(){
// 单选
if(!this.multiple){
if(this.fillMap && Object.keys(this.fillMap).length >0){
let templateValue = {};
Object.keys(this.fillMap).forEach((item:any) =>{
if(this.data && this.data[this.fillMap[item]]){
Object.assign(templateValue,{[item]:this.data[this.fillMap[item]]});
}
})
this.selectTreeValue = JSON.stringify([templateValue]);
}
}else{
// 多选
if(this.fillMap && Object.keys(this.fillMap).length >0){
let tempArray:Array<any> = [];
Object.keys(this.fillMap).forEach((item:any) =>{
if(this.data && this.data[this.fillMap[item]]){
let tempDataArray:Array<any> = (this.data[this.fillMap[item]]).split(",");
tempDataArray.forEach((tempData:any,index:number) =>{
if(tempArray.length < tempDataArray.length){
let singleData:any ={[item]:tempData};
tempArray.push(singleData);
}else{
Object.assign(tempArray[index],{[item]:tempData});
}
})
}
})
this.selectTreeValue = JSON.stringify(tempArray);
}
}
}
/** /**
* select事件处理 * select事件处理
* *
...@@ -145,17 +195,12 @@ export default class AppDepartmentSelect extends Vue { ...@@ -145,17 +195,12 @@ export default class AppDepartmentSelect extends Vue {
public onSelect($event:any){ public onSelect($event:any){
// 组件自身抛值事件 // 组件自身抛值事件
let selectArr = JSON.parse($event); let selectArr = JSON.parse($event);
if(selectArr.length === 0){
return;
}
let valueArr = selectArr.map((item:any)=>{return {id:item.id,label:item.label}});
this.$emit('select-change', { name: this.name, value: JSON.stringify(valueArr) });
// fillMap抛值事件 // fillMap抛值事件
if(this.fillMap && Object.keys(this.fillMap).length > 0){ if(this.fillMap && Object.keys(this.fillMap).length > 0){
Object.keys(this.fillMap).forEach((attribute:string) => { Object.keys(this.fillMap).forEach((attribute:string) => {
let _name = this.fillMap[attribute]; let _name = this.fillMap[attribute];
let _value = selectArr.map((item:any) => item[attribute]); let _value = selectArr.map((item:any) => item[attribute]);
this.$emit('select-change',{name: _name, value: _value.join(",")}) this.$emit('select-change',{name: this.fillMap[attribute], value: _value.join(",")})
}); });
} }
......
<template> <template>
<div class="app-org-select"> <div class="app-org-select">
<ibiz-select-tree :NodesData="NodesData" v-model="selectTreeValue" :multiple="false" @select="treeSelectChange"></ibiz-select-tree> <ibiz-select-tree :NodesData="NodesData" v-model="selectTreeValue" :multiple="multiple" @select="treeSelectChange"></ibiz-select-tree>
</div> </div>
</template> </template>
<script lang = 'ts'> <script lang = 'ts'>
...@@ -44,6 +44,13 @@ export default class AppOrgSelect extends Vue { ...@@ -44,6 +44,13 @@ export default class AppOrgSelect extends Vue {
*/ */
@Prop({default:false}) public multiple?:boolean; @Prop({default:false}) public multiple?:boolean;
/**
* 查询单位路径
*
* @memberof AppOrgSelect
*/
@Prop() public url!:string;
/** /**
* 监听表单数据变化 * 监听表单数据变化
* *
...@@ -57,20 +64,13 @@ export default class AppOrgSelect extends Vue { ...@@ -57,20 +64,13 @@ export default class AppOrgSelect extends Vue {
let tempFilterValue:any = this.initBasicData(); let tempFilterValue:any = this.initBasicData();
// filter值变化才去请求数据 // filter值变化才去请求数据
if(tempFilterValue && (this.copyFilterValue !== tempFilterValue)){ if(tempFilterValue && (this.copyFilterValue !== tempFilterValue)){
this.loadTreeData(this.orgDataUrl.replace('${orgid}',tempFilterValue)); this.loadTreeData(this.url.replace('${orgid}',tempFilterValue));
this.copyFilterValue = tempFilterValue; this.copyFilterValue = tempFilterValue;
} }
} }
} }
} }
/**
* 查询单位路径
*
* @memberof AppOrgSelect
*/
public orgDataUrl:string ="/ibzorganizations/${orgid}/suborg/picker";
/** /**
* 选择值 * 选择值
* *
...@@ -99,7 +99,7 @@ export default class AppOrgSelect extends Vue { ...@@ -99,7 +99,7 @@ export default class AppOrgSelect extends Vue {
*/ */
public created(){ public created(){
if(!this.filter){ if(!this.filter){
this.loadTreeData(this.orgDataUrl.replace('${orgid}','alls')); this.loadTreeData(this.url);
} }
} }
...@@ -140,7 +140,23 @@ export default class AppOrgSelect extends Vue { ...@@ -140,7 +140,23 @@ export default class AppOrgSelect extends Vue {
} }
}else{ }else{
// 多选 // 多选
if(this.fillMap && Object.keys(this.fillMap).length >0){
let tempArray:Array<any> = [];
Object.keys(this.fillMap).forEach((item:any) =>{
if(this.data && this.data[this.fillMap[item]]){
let tempDataArray:Array<any> = (this.data[this.fillMap[item]]).split(",");
tempDataArray.forEach((tempData:any,index:number) =>{
if(tempArray.length < tempDataArray.length){
let singleData:any ={[item]:tempData};
tempArray.push(singleData);
}else{
Object.assign(tempArray[index],{[item]:tempData});
}
})
}
})
this.selectTreeValue = JSON.stringify(tempArray);
}
} }
} }
...@@ -150,13 +166,22 @@ export default class AppOrgSelect extends Vue { ...@@ -150,13 +166,22 @@ export default class AppOrgSelect extends Vue {
* @memberof AppOrgSelect * @memberof AppOrgSelect
*/ */
public loadTreeData(requestUrl:string){ public loadTreeData(requestUrl:string){
if(this.filter){
const result:any = this.$store.getters.getCopyData(this.filter);
if(result){
this.NodesData = result;
return;
}
}
Http.getInstance().get(requestUrl).then((res:any) =>{ Http.getInstance().get(requestUrl).then((res:any) =>{
if(!res.status && res.status !== 200){ if(!res.status && res.status !== 200){
console.error("加载数据失败"); console.error("加载数据失败");
return; return;
} }
this.NodesData = res.data; this.NodesData = res.data;
console.log(this.NodesData); if(this.filter){
this.$store.commit('addOrgData', { srfkey: this.filter, orgData: res.data });
}
}) })
} }
...@@ -168,10 +193,27 @@ export default class AppOrgSelect extends Vue { ...@@ -168,10 +193,27 @@ export default class AppOrgSelect extends Vue {
public treeSelectChange($event:any){ public treeSelectChange($event:any){
// 多选 // 多选
if(this.multiple){ if(this.multiple){
if(!Object.is($event,'[]')){
const tempValue:any = JSON.parse($event);
if(this.fillMap && Object.keys(this.fillMap).length >0){
Object.keys(this.fillMap).forEach((item:any) =>{
let tempResult:any ="";
tempValue.forEach((value:any,index:number) =>{
tempResult += index>0?`,${value[item]}`:`${value[item]}`;
})
this.emitValue(this.fillMap[item],tempResult);
})
}
}else{
if(this.fillMap && Object.keys(this.fillMap).length >0){
Object.keys(this.fillMap).forEach((item:any) =>{
this.emitValue(this.fillMap[item],null);
})
}
}
}else{ }else{
// 单选 // 单选
if($event){ if(!Object.is($event,'[]')){
const tempValue:any = JSON.parse($event)[0]; const tempValue:any = JSON.parse($event)[0];
if(this.fillMap && Object.keys(this.fillMap).length >0){ if(this.fillMap && Object.keys(this.fillMap).length >0){
Object.keys(this.fillMap).forEach((item:any) =>{ Object.keys(this.fillMap).forEach((item:any) =>{
...@@ -194,7 +236,7 @@ export default class AppOrgSelect extends Vue { ...@@ -194,7 +236,7 @@ export default class AppOrgSelect extends Vue {
* @memberof AppOrgSelect * @memberof AppOrgSelect
*/ */
public emitValue(name:string,value:any){ public emitValue(name:string,value:any){
this.$emit('formitemvaluechange',{name:name,value:value}); this.$emit('select-change',{name:name,value:value});
} }
} }
......
.app-wf-approval{
width:100%;
.app-wf-approval-header{
width: 100%;
text-align: center;
background: #e5eaef;
height: 32px;
line-height: 32px;
font-size: 16px;
border: 1px solid #565656;
.approval-header-left{
margin-right: 24px;
}
}
.app-wf-approval-bottom{
width: 100%;
text-align: center;
background: #e5eaef;
height: 32px;
line-height: 32px;
font-size: 16px;
border-style: solid;
border-width: 0px 1px 1px 1px;
border-color: #565656;
}
.app-wf-approval-content{
border-left: 1px solid #565656;
border-right: 1px solid #565656;
.approval-content-item{
display: flex;
align-items: center;
font-size: 16px;
border-bottom: 1px solid #565656;
.approval-content-item-left{
width: 130px;
padding: 8px;
text-align: center;
}
.approval-content-item-right{
width: calc(100% - 130px);
border-left:1px solid #565656;
.approval-content-item-wait{
padding: 0px 4px;
height: 32px;
line-height: 32px;
font-size: 16px;
border-bottom:1px solid #565656;
background: #d1ef5c;
>span{
font-size: 18px;
color: #000;
font-weight: 600;
}
}
.approval-content-item-info{
.approval-content-item-info-item {
padding: 0px 4px;
height: 32px;
line-height: 32px;
border-bottom:1px solid #565656;
}
.approval-content-item-info-top{
font-size: 16px;
}
.approval-content-item-info-bottom{
font-size: 14px;
text-align: right;
>span{
margin-right:6px;
}
.info-bottom-name{
font-size: 18px;
font-weight: 600;
}
}
> div:nth-last-child(1){
> .approval-content-item-info-item:nth-last-child(1){
border-bottom: 0;
}
}
}
.approval-content-item-memo{
padding: 0px 4px;
.el-textarea__inner{
border: 0px !important;
padding: 0px !important;
}
}
}
}
}
}
\ No newline at end of file
<template>
<div class='app-wf-approval'>
<div class="app-wf-approval-header">
<span class="approval-header-left">{{data.startTime}}</span>
<span>{{data.startUserName}}提交</span>
</div>
<div class="app-wf-approval-content" v-if="data.usertasks && data.usertasks.length >0">
<div class="approval-content-item" v-for="(usertask,index) in data.usertasks" :key="index">
<div class="approval-content-item-left">
{{usertask.userTaskName}}
</div>
<div class="approval-content-item-right">
<div class="approval-content-item-wait" v-if="usertask.identitylinks.length >0">
等待<span v-for="(identitylink,inx) in usertask.identitylinks" :key="inx">{{identitylink.displayname}}<span v-if="inx >0"></span></span>处理
</div>
<div class="approval-content-item-info" v-if="usertask.comments.length >0">
<div v-for="(comment,commentInx) in usertask.comments" :key="commentInx">
<div class="approval-content-item-info-item approval-content-item-info-top">
{{`【${comment.type}】${comment.fullMessage}`}}
</div>
<div class="approval-content-item-info-item approval-content-item-info-bottom">
<span class="info-bottom-name">{{comment.authorName}}</span>
<span>{{comment.time}}</span>
</div>
</div>
</div>
<div class="approval-content-item-memo" v-if="usertask.userTaskId === viewparams.userTaskId">
<el-input type="textarea" v-model="initmemo" :rows="2" @blur="handleBlur" placeholder="请输入内容"></el-input>
</div>
</div>
</div>
</div>
<div class="app-wf-approval-bottom">
<span v-if="data.endTime">{{data.endTime}}结束</span>
</div>
</div>
</template>
<script lang = 'ts'>
import { Vue, Component,Prop,Model } from 'vue-property-decorator';
@Component({
})
export default class AppWFApproval extends Vue {
/**
* 双向绑定值
*
* @memberof AppWFApproval
*/
@Model ('change') value!: string;
/**
* 数据
*
* @memberof AppWFApproval
*/
public data:any = {};
/**
* 初始化memo
*
* @memberof AppWFApproval
*/
public initmemo:string = "";
/**
* 传入数据服务
*
* @memberof AppWFApproval
*/
@Prop() public service:any;
/**
* 上下文
*
* @memberof AppWFApproval
*/
@Prop() public context:any;
/**
* 视图参数
*
* @memberof AppWFApproval
*/
@Prop() public viewparams:any;
/**
* 初始化数据
*
* @memberof AppWFApproval
*/
public created(){
if(this.service){
this.service.GetWFHistory(this.context).then((res:any) =>{
if(res && (res.status === 200)){
this.data = res.data;
}
})
}
}
/**
* 抛出wfprocmemo
*
* @memberof AppWFApproval
*/
public handleBlur($event:any){
this.$emit('change',$event.target.value);
}
}
</script>
<style lang="less">
@import './app-wf-approval.less';
</style>
\ No newline at end of file
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<div class="ibiz-group-picker"> <div class="ibiz-group-picker">
<div class="ibiz-group-container"> <div class="ibiz-group-container">
<div v-if="showTree" class="ibiz-group-tree"> <div v-if="showTree" class="ibiz-group-tree">
<ibiz-select-tree :NodesData="treeItems" v-model="treeSelectVal" :isShowSearchBar="false" @select="treeSelect"></ibiz-select-tree> <ibiz-select-tree :NodesData="treeItems" v-model="treeSelectVal" :treeOnly="true" :defaultChecked="true" @select="treeSelect"></ibiz-select-tree>
</div> </div>
<div class="ibiz-group-content"> <div class="ibiz-group-content">
<ibiz-group-card :data="cardItems" text="label" value="id" groupName="group" :multiple="multiple" :defaultSelect="cardSelctVal" @select="groupSelect"></ibiz-group-card> <ibiz-group-card :data="cardItems" text="label" value="id" groupName="group" :multiple="multiple" :defaultSelect="cardSelctVal" @select="groupSelect"></ibiz-group-card>
...@@ -47,6 +47,22 @@ export default class IBizGroupPicker extends Vue { ...@@ -47,6 +47,22 @@ export default class IBizGroupPicker extends Vue {
*/ */
protected multiple: boolean = false; protected multiple: boolean = false;
/**
* 加载树url
*
* @type {*}
* @memberof IBizGroupPicker
*/
protected treeurl:any;
/**
* 加载人员url
*
* @type {*}
* @memberof IBizGroupPicker
*/
protected url:any;
/** /**
* 树数据集 * 树数据集
* *
...@@ -110,8 +126,8 @@ export default class IBizGroupPicker extends Vue { ...@@ -110,8 +126,8 @@ export default class IBizGroupPicker extends Vue {
* @memberof IBizGroupPicker * @memberof IBizGroupPicker
*/ */
get showTree() { get showTree() {
if(!Object.is(this.viewData.srforgid, this.viewParam.srforgid)) { if(this.viewParam) {
return true; return this.viewParam.showtree;
} }
} }
...@@ -128,8 +144,13 @@ export default class IBizGroupPicker extends Vue { ...@@ -128,8 +144,13 @@ export default class IBizGroupPicker extends Vue {
this.viewData = JSON.parse(this.viewdata); this.viewData = JSON.parse(this.viewdata);
this.viewParam = JSON.parse(this.viewparam); this.viewParam = JSON.parse(this.viewparam);
this.multiple = this.viewParam.multiple; this.multiple = this.viewParam.multiple;
this.treeurl = this.viewParam.treeurl;
this.url = this.viewParam.url;
if (this.viewParam.selects) { if (this.viewParam.selects) {
this.cardSelctVal = this.viewParam.selects; this.viewParam.selects.forEach((select: any) => {
this.selects.push(select);
this.cardSelctVal.push(select.id)
})
} }
this.load(); this.load();
} }
...@@ -144,7 +165,7 @@ export default class IBizGroupPicker extends Vue { ...@@ -144,7 +165,7 @@ export default class IBizGroupPicker extends Vue {
if(this.showTree) { if(this.showTree) {
this.loadTree(); this.loadTree();
} else { } else {
this.loadGroupData(this.viewParam.srforgid); this.loadGroupData(this.viewParam.filtervalue);
} }
} }
...@@ -155,7 +176,9 @@ export default class IBizGroupPicker extends Vue { ...@@ -155,7 +176,9 @@ export default class IBizGroupPicker extends Vue {
* @memberof IBizGroupPicker * @memberof IBizGroupPicker
*/ */
public loadTree() { public loadTree() {
let get = Http.getInstance().get(`/ibzorganizations/450000/suborg/ibzdepartments/picker`, true); let orgid = this.viewParam.filtervalue;
let tempTreeUrl:string = this.treeurl.replace('${orgid}',orgid);
let get = Http.getInstance().get(tempTreeUrl, true);
get.then((response: any) => { get.then((response: any) => {
if(response.status === 200) { if(response.status === 200) {
this.treeItems = response.data; this.treeItems = response.data;
...@@ -172,7 +195,8 @@ export default class IBizGroupPicker extends Vue { ...@@ -172,7 +195,8 @@ export default class IBizGroupPicker extends Vue {
* @memberof IBizGroupPicker * @memberof IBizGroupPicker
*/ */
public loadGroupData(key: string) { public loadGroupData(key: string) {
let get = Http.getInstance().get(`/ibzorganizations/${key}/ibzemployees/picker`, true); let tempUrl = this.url.replace('${selected-orgid}',key);
let get = Http.getInstance().get(tempUrl, true);
get.then((response: any) => { get.then((response: any) => {
if(response.status === 200) { if(response.status === 200) {
this.cardItems = response.data; this.cardItems = response.data;
...@@ -203,7 +227,7 @@ export default class IBizGroupPicker extends Vue { ...@@ -203,7 +227,7 @@ export default class IBizGroupPicker extends Vue {
* @memberof IBizGroupPicker * @memberof IBizGroupPicker
*/ */
public groupSelect(event: any) { public groupSelect(event: any) {
if (!event || !event.selects) { if (!event || !event.select) {
return; return;
} }
if(!this.multiple) { if(!this.multiple) {
...@@ -215,7 +239,7 @@ export default class IBizGroupPicker extends Vue { ...@@ -215,7 +239,7 @@ export default class IBizGroupPicker extends Vue {
this.selects.splice(index, 1); this.selects.splice(index, 1);
} }
} else { } else {
event.selects.forEach((key: string) => { event.select.forEach((key: string) => {
let index: number = this.selects.findIndex((item: any) => Object.is(key, item.id)); let index: number = this.selects.findIndex((item: any) => Object.is(key, item.id));
if(index >= 0) { if(index >= 0) {
return; return;
...@@ -226,22 +250,6 @@ export default class IBizGroupPicker extends Vue { ...@@ -226,22 +250,6 @@ export default class IBizGroupPicker extends Vue {
} }
}); });
} }
// 测试 start
// if(!this.multiple) {
// this.selects = [];
// }
// event.forEach((key: string) => {
// let index: number = this.selects.findIndex((item: any) => Object.is(key, item.id));
// if(index >= 0) {
// return;
// }
// let item: any = this.cardItems.find((item: any) => Object.is(key, item.id));
// if (item) {
// this.selects.push(item);
// }
// });
// 测试 end
} }
/** /**
......
...@@ -32,13 +32,21 @@ export default class IBizGroupSelect extends Vue { ...@@ -32,13 +32,21 @@ export default class IBizGroupSelect extends Vue {
*/ */
@Prop() name!: string; @Prop() name!: string;
/**
* 树加载地址
*
* @type {*}
* @memberof IBizGroupSelect
*/
@Prop() treeurl?:boolean;
/** /**
* 数据接口地址 * 数据接口地址
* *
* @type {*} * @type {*}
* @memberof IBizGroupSelect * @memberof IBizGroupSelect
*/ */
@Prop() url?: string; @Prop() url!: string;
/** /**
* 多选 * 多选
...@@ -62,7 +70,7 @@ export default class IBizGroupSelect extends Vue { ...@@ -62,7 +70,7 @@ export default class IBizGroupSelect extends Vue {
* @type {*} * @type {*}
* @memberof IBizGroupSelect * @memberof IBizGroupSelect
*/ */
@Prop({default: 'orgid'}) filter?: string; @Prop() filter?: string;
/** /**
* 是否启用 * 是否启用
...@@ -96,6 +104,14 @@ export default class IBizGroupSelect extends Vue { ...@@ -96,6 +104,14 @@ export default class IBizGroupSelect extends Vue {
*/ */
@Prop() valueitem: any; @Prop() valueitem: any;
/**
* 填充属性
*
* @type {*}
* @memberof IBizGroupSelect
*/
@Prop() fillmap: any;
/** /**
* 选中项集合 * 选中项集合
* *
...@@ -114,17 +130,22 @@ export default class IBizGroupSelect extends Vue { ...@@ -114,17 +130,22 @@ export default class IBizGroupSelect extends Vue {
onValueChange(newVal: any) { onValueChange(newVal: any) {
this.selects = []; this.selects = [];
if (newVal) { if (newVal) {
let vals: any[] = newVal.split(','); let item: any = {};
let vals2: any[] = []; item.label = newVal.split(',');
if(this.valueitem) { if(this.valueitem) {
vals2 = this.data[this.valueitem].split(','); item.id = this.data[this.valueitem] ? this.data[this.valueitem].split(',') : [];
}
if(this.fillmap) {
for(let key in this.fillmap) {
item[this.fillmap[key]] = this.data[key] ? this.data[key].split(',') : [];
}
} }
console.log(this.data[this.valueitem]) item.label.forEach((val: string, index: number) => {
vals.forEach((val: string, index: number) => { let _item: any = {};
this.selects.push({ for(let key in item) {
label: val, _item[key] = item[key][index] ? item[key][index] : null;
id: vals2.length > 0 ? vals2[index] : null }
}) this.selects.push(_item)
}) })
} }
} }
...@@ -152,16 +173,27 @@ export default class IBizGroupSelect extends Vue { ...@@ -152,16 +173,27 @@ export default class IBizGroupSelect extends Vue {
viewname: 'ibiz-group-picker', viewname: 'ibiz-group-picker',
title: '分组选择' title: '分组选择'
}; };
let sels: any = this.selects.map((select: any) => {
return select.id;
})
const context: any = JSON.parse(JSON.stringify(this.context)); const context: any = JSON.parse(JSON.stringify(this.context));
let filtervalue:string = "";
if(this.filter){
if(this.data[this.filter]){
filtervalue = this.data[this.filter];
}else if(context[this.filter]){
filtervalue = context[this.filter];
}else{
filtervalue = context.srforgid;
}
}else{
filtervalue = context.srforgid;
}
const param: any = {}; const param: any = {};
let orgid: any = this.filter;
Object.assign(param, { Object.assign(param, {
orgid: this.data[orgid], showtree: this.treeurl?true:false,
url:this.url,
treeurl:this.treeurl,
filtervalue: filtervalue,
multiple: this.multiple, multiple: this.multiple,
selects: sels selects: this.selects
}); });
let container: Subject<any> = this.$appmodal.openModal(view, context, param); let container: Subject<any> = this.$appmodal.openModal(view, context, param);
container.subscribe((result: any) => { container.subscribe((result: any) => {
...@@ -179,15 +211,9 @@ export default class IBizGroupSelect extends Vue { ...@@ -179,15 +211,9 @@ export default class IBizGroupSelect extends Vue {
* @memberof IBizGroupSelect * @memberof IBizGroupSelect
*/ */
public openViewClose(result: any) { public openViewClose(result: any) {
console.log(result)
this.selects = []; this.selects = [];
if (result.datas && result.datas.length > 0) { if (result.datas && result.datas.length > 0) {
result.datas.forEach((data: any) => { this.selects = result.datas
this.selects.push({
id: data.id,
label: data.label
})
});
} }
this.setValue() this.setValue()
} }
...@@ -211,26 +237,41 @@ export default class IBizGroupSelect extends Vue { ...@@ -211,26 +237,41 @@ export default class IBizGroupSelect extends Vue {
*/ */
public setValue() { public setValue() {
let item: any = {}; let item: any = {};
item[this.name] = null;
if(this.valueitem) {
item[this.valueitem] = null;
}
if(this.fillmap) {
for(let key in this.fillmap) {
item[key] = null;
}
}
if(this.multiple) { if(this.multiple) {
let label = '';
let value = '';
this.selects.forEach((select: any) => { this.selects.forEach((select: any) => {
label += ',' + select.label; item[this.name] = item[this.name] ? `${item[this.name]},${select.label}` : select.label;
value += ',' + select.id; if(this.valueitem) {
item[this.valueitem] = item[this.valueitem] ? `${item[this.valueitem]},${select.id}` : select.id;
}
if(this.fillmap) {
for(let key in this.fillmap) {
item[key] = item[key] ? `${item[key]},${select[this.fillmap[key]]}` : select[this.fillmap[key]];
}
}
}); });
Object.assign(item, {
label: label ? label.substring(1) : null,
id: value ? value.substring(1) : null
})
} else { } else {
item = this.selects.length > 0 ? this.selects[0] : {}; item = this.selects.length > 0 ? this.selects[0] : {};
item[this.name] = this.selects.length > 0 ? this.selects[0].label : null;
if(this.valueitem) {
item[this.valueitem] = this.selects.length > 0 ? this.selects[0].id : null;
}
if(this.fillmap) {
for(let key in this.fillmap) {
item[key] = this.selects.length > 0 ? this.selects[0][this.fillmap[key]] : null;
}
}
} }
if(this.name) { for(let key in item) {
this.$emit('formitemvaluechange', { name: this.name, value: item.label }); this.$emit('formitemvaluechange', { name: key, value: item[key] });
}
if(this.valueitem) {
this.$emit('formitemvaluechange', { name: this.valueitem, value: item.id });
} }
} }
} }
......
...@@ -201,11 +201,11 @@ export default class TabPageExp extends Vue { ...@@ -201,11 +201,11 @@ export default class TabPageExp extends Vue {
* @param {*} caption * @param {*} caption
* @memberof TabPageExp * @memberof TabPageExp
*/ */
public setCurPageCaption(routename: string, caption: any, info: string) { public setCurPageCaption(caption: string, title: any, info: string) {
if(!Object.is(this.$route.name, routename)) { if(this.$route.meta && (!Object.is(this.$route.meta.caption, caption))) {
return; return;
} }
this.$store.commit("setCurPageCaption", { route: this.$route, caption: caption, info: info }); this.$store.commit("setCurPageCaption", { route: this.$route, caption: title, info: info });
setTimeout(() => { setTimeout(() => {
this.moveToView(this.$route); this.moveToView(this.$route);
}, 1); }, 1);
......
...@@ -247,9 +247,9 @@ export default class EditViewEngine extends ViewEngine { ...@@ -247,9 +247,9 @@ export default class EditViewEngine extends ViewEngine {
*/ */
public setTabCaption(info: string): void { public setTabCaption(info: string): void {
let viewdata: any = this.view.model; let viewdata: any = this.view.model;
let viewParam = this.view.$store.getters['viewaction/getAppView'](this.view.viewtag); if (viewdata && info && !Object.is(info, '') && this.view.$tabPageExp && (viewdata.srfTitle.indexOf(" - ") === -1)) {
if (viewdata && viewParam && info && !Object.is(info, '') && this.view.$tabPageExp) { this.view.$tabPageExp.setCurPageCaption(viewdata.srfCaption, viewdata.srfTitle, info);
this.view.$tabPageExp.setCurPageCaption(`${viewParam.viewmodule}_${viewParam.viewname}`.toLocaleLowerCase(), viewdata.srfCaption, info); this.view.model.srfTitle = `${this.view.$t(viewdata.srfTitle)} - ${viewdata.dataInfo}`;
} }
} }
......
...@@ -11,6 +11,7 @@ import i18n from '@/locale' ...@@ -11,6 +11,7 @@ import i18n from '@/locale'
import 'element-ui/lib/theme-chalk/index.css'; import 'element-ui/lib/theme-chalk/index.css';
import 'view-design/dist/styles/iview.css'; import 'view-design/dist/styles/iview.css';
import 'ibiz-vue-lib/lib/ibiz-vue-lib.css';
import '@/styles/default.less'; import '@/styles/default.less';
......
...@@ -619,7 +619,22 @@ export default class EntityService { ...@@ -619,7 +619,22 @@ export default class EntityService {
* @memberof EntityService * @memberof EntityService
*/ */
public async removeBatch(context: any = {},data: any, isloading?: boolean): Promise<any> { public async removeBatch(context: any = {},data: any, isloading?: boolean): Promise<any> {
return Http.getInstance().delete(`/${this.APPDENAME}/batch`,isloading,data); return Http.getInstance().delete(`/${this.APPDENAME}/batch`,isloading,data[this.APPDEKEY]);
}
/**
* getDataInfo接口方法
*
* @param {*} [context={}]
* @param {*} [data]
* @param {boolean} [isloading]
* @returns {Promise<any>}
* @memberof EntityService
*/
public async getDataInfo(context: any = {},data: any, isloading?: boolean):Promise<any> {
if(context[this.APPLYDEKEY]){
return this.Get(context,data, isloading);
}
} }
/** /**
...@@ -765,6 +780,19 @@ export default class EntityService { ...@@ -765,6 +780,19 @@ export default class EntityService {
return Http.getInstance().get(`/wfcore/${this.SYSTEMNAME}-app-${this.APPNAME}/${this.APPDENAME}/${context[this.APPLYDEKEY]}/usertasks/${data['taskDefinitionKey']}/ways`); return Http.getInstance().get(`/wfcore/${this.SYSTEMNAME}-app-${this.APPNAME}/${this.APPDENAME}/${context[this.APPLYDEKEY]}/usertasks/${data['taskDefinitionKey']}/ways`);
} }
/**
* GetWFHistory接口方法(根据业务主键获取工作流程记录)
*
* @param {*} [context={}]
* @param {*} [data={}]
* @param {boolean} [isloading]
* @returns {Promise<any>}
* @memberof EntityService
*/
public async GetWFHistory(context: any = {},data: any = {}, isloading?: boolean):Promise<any> {
return Http.getInstance().get(`/wfcore/${this.SYSTEMNAME}-app-${this.APPNAME}/${this.APPDENAME}/${context[this.APPLYDEKEY]}/process-instances/alls/history`);
}
/** /**
* WFSubmit接口方法 * WFSubmit接口方法
* *
......
...@@ -88,4 +88,24 @@ export const getCopyData = (state: any) => (srfkey: string) => { ...@@ -88,4 +88,24 @@ export const getCopyData = (state: any) => (srfkey: string) => {
delete state.copyDataMap[srfkey]; delete state.copyDataMap[srfkey];
} }
return copyData; return copyData;
}
/**
* 获取单位数据
*
* @param state
*/
export const getOrgData = (state: any) => (srfkey: string) => {
let orgData = state.orgDataMap[srfkey];
return orgData;
}
/**
* 获取部门数据
*
* @param state
*/
export const getDepData = (state: any) => (srfkey: string) => {
let depData = state.depDataMap[srfkey];
return depData;
} }
\ No newline at end of file
...@@ -265,4 +265,28 @@ export const addCopyData = (state: any, args: {srfkey: string,copyData: any}) => ...@@ -265,4 +265,28 @@ export const addCopyData = (state: any, args: {srfkey: string,copyData: any}) =>
if(args && args.srfkey && args.copyData){ if(args && args.srfkey && args.copyData){
state.copyDataMap[args.srfkey] = JSON.parse(JSON.stringify(args.copyData)); state.copyDataMap[args.srfkey] = JSON.parse(JSON.stringify(args.copyData));
} }
}
/**
* 添加单位数据
*
* @param state
* @param args
*/
export const addOrgData = (state: any, args: {srfkey: string,orgData: any}) => {
if(args && args.srfkey && args.orgData){
state.orgDataMap[args.srfkey] = JSON.parse(JSON.stringify(args.orgData));
}
}
/**
* 添加部门数据
*
* @param state
* @param args
*/
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));
}
} }
\ No newline at end of file
...@@ -14,4 +14,6 @@ export const rootstate: any = { ...@@ -14,4 +14,6 @@ export const rootstate: any = {
zIndex: 300, zIndex: 300,
viewSplit: {}, viewSplit: {},
copyDataMap:{}, copyDataMap:{},
orgDataMap:{},
depDataMap:{},
} }
\ No newline at end of file
...@@ -138,6 +138,17 @@ export declare interface Util { ...@@ -138,6 +138,17 @@ export declare interface Util {
* @memberof Util * @memberof Util
*/ */
dateFormat(date: any,fmt?: string):string dateFormat(date: any,fmt?: string):string
/**
* 表单项校验
*
* @param property 表单项属性名
* @param data 表单数据
* @param rules 表单值规则
* @returns {Promise}
* @memberof Util
*/
validateItem(property: string, data:any, rules:any): Promise<any>
} }
declare module "vue/types/vue" { declare module "vue/types/vue" {
......
...@@ -73,7 +73,7 @@ export class UIActionTool { ...@@ -73,7 +73,7 @@ export class UIActionTool {
values.push(value); values.push(value);
}); });
} }
Object.assign(_data, { [name]: values.length > 0 ? values.join(';') : value }); Object.assign(_data, { [name]: values.length > 0 ? values.join(',') : value });
}); });
} }
return _data; return _data;
......
import qs from 'qs'; import qs from 'qs';
import { Route } from 'vue-router'; import { Route } from 'vue-router';
import Schema from "async-validator";
/** /**
* 平台工具类 * 平台工具类
...@@ -362,4 +363,23 @@ export class Util { ...@@ -362,4 +363,23 @@ export class Util {
return FirstOBJ; return FirstOBJ;
} }
/**
* 表单项校验
*
* @param property 表单项属性名
* @param data 表单数据
* @param rules 表单值规则
* @returns {Promise}
* @memberof Util
*/
public static validateItem(property: string, data:any, rules:any) {
// 1.获取数值和规则
const value = data[property];
const rule = rules[property];
// 2.创建校验规则
const schema = new Schema({ [property]: rule })
// 校验返回Promise
return schema.validate({ [property]: value })
}
} }
\ No newline at end of file
<template> <template>
<i-form :model="this.data" class='app-form' ref='form' id='form' style=""> <i-form :model="this.data" class='app-form' ref='form' id='wfgroup_main' style="">
<input style="display:none;" /> <input style="display:none;" />
<row > <row >
...@@ -180,6 +180,12 @@ export default class MainBase extends Vue implements ControlInterface { ...@@ -180,6 +180,12 @@ export default class MainBase extends Vue implements ControlInterface {
} }
/**
* 工作流审批意见控件绑定值
*
* @memberof Main
*/
public srfwfmemo:string = "";
/** /**
* 获取多项数据 * 获取多项数据
...@@ -976,7 +982,7 @@ export default class MainBase extends Vue implements ControlInterface { ...@@ -976,7 +982,7 @@ export default class MainBase extends Vue implements ControlInterface {
*/ */
public print(){ public print(){
let _this:any = this; let _this:any = this;
_this.$print({id:'form',popTitle:'主编辑表单'}); _this.$print({id:'wfgroup_main',popTitle:'主编辑表单'});
} }
/** /**
...@@ -1349,6 +1355,10 @@ export default class MainBase extends Vue implements ControlInterface { ...@@ -1349,6 +1355,10 @@ export default class MainBase extends Vue implements ControlInterface {
if(this.viewparams){ if(this.viewparams){
Object.assign(arg,{viewparams:this.viewparams}); Object.assign(arg,{viewparams:this.viewparams});
} }
// 强制补充srfwfmemo
if(this.srfwfmemo){
Object.assign(arg,{srfwfmemo:this.srfwfmemo});
}
const result: Promise<any> = this.service.wfsubmit(_this.WFSubmitAction, JSON.parse(JSON.stringify(this.context)),arg, this.showBusyIndicator,localdata); const result: Promise<any> = this.service.wfsubmit(_this.WFSubmitAction, JSON.parse(JSON.stringify(this.context)),arg, this.showBusyIndicator,localdata);
result.then((response: any) => { result.then((response: any) => {
if (!response || response.status !== 200) { if (!response || response.status !== 200) {
......
...@@ -25,6 +25,10 @@ ...@@ -25,6 +25,10 @@
overflow: hidden; overflow: hidden;
word-break: break-all; word-break: break-all;
} }
.el-table-column--selection .cell {
padding-left: 0px;
padding-right: 0px;
}
.app-column-link, .app-format-data{ .app-column-link, .app-format-data{
display: inline; display: inline;
} }
......
<template> <template>
<i-form :model="this.data" class='app-form' ref='form' id='form' style=""> <i-form :model="this.data" class='app-form' ref='form' id='wfmember_main' style="">
<input style="display:none;" /> <input style="display:none;" />
<row > <row >
...@@ -169,6 +169,12 @@ export default class MainBase extends Vue implements ControlInterface { ...@@ -169,6 +169,12 @@ export default class MainBase extends Vue implements ControlInterface {
} }
/**
* 工作流审批意见控件绑定值
*
* @memberof Main
*/
public srfwfmemo:string = "";
/** /**
* 获取多项数据 * 获取多项数据
...@@ -984,7 +990,7 @@ export default class MainBase extends Vue implements ControlInterface { ...@@ -984,7 +990,7 @@ export default class MainBase extends Vue implements ControlInterface {
*/ */
public print(){ public print(){
let _this:any = this; let _this:any = this;
_this.$print({id:'form',popTitle:'主编辑表单'}); _this.$print({id:'wfmember_main',popTitle:'主编辑表单'});
} }
/** /**
...@@ -1357,6 +1363,10 @@ export default class MainBase extends Vue implements ControlInterface { ...@@ -1357,6 +1363,10 @@ export default class MainBase extends Vue implements ControlInterface {
if(this.viewparams){ if(this.viewparams){
Object.assign(arg,{viewparams:this.viewparams}); Object.assign(arg,{viewparams:this.viewparams});
} }
// 强制补充srfwfmemo
if(this.srfwfmemo){
Object.assign(arg,{srfwfmemo:this.srfwfmemo});
}
const result: Promise<any> = this.service.wfsubmit(_this.WFSubmitAction, JSON.parse(JSON.stringify(this.context)),arg, this.showBusyIndicator,localdata); const result: Promise<any> = this.service.wfsubmit(_this.WFSubmitAction, JSON.parse(JSON.stringify(this.context)),arg, this.showBusyIndicator,localdata);
result.then((response: any) => { result.then((response: any) => {
if (!response || response.status !== 200) { if (!response || response.status !== 200) {
......
...@@ -25,6 +25,10 @@ ...@@ -25,6 +25,10 @@
overflow: hidden; overflow: hidden;
word-break: break-all; word-break: break-all;
} }
.el-table-column--selection .cell {
padding-left: 0px;
padding-right: 0px;
}
.app-column-link, .app-format-data{ .app-column-link, .app-format-data{
display: inline; display: inline;
} }
......
<template> <template>
<i-form :model="this.data" class='app-form' ref='form' id='form' style=""> <i-form :model="this.data" class='app-form' ref='form' id='wfprocessdefinition_main' style="">
<input style="display:none;" /> <input style="display:none;" />
<row > <row >
...@@ -186,6 +186,12 @@ export default class MainBase extends Vue implements ControlInterface { ...@@ -186,6 +186,12 @@ export default class MainBase extends Vue implements ControlInterface {
} }
/**
* 工作流审批意见控件绑定值
*
* @memberof Main
*/
public srfwfmemo:string = "";
/** /**
* 获取多项数据 * 获取多项数据
...@@ -1089,7 +1095,7 @@ export default class MainBase extends Vue implements ControlInterface { ...@@ -1089,7 +1095,7 @@ export default class MainBase extends Vue implements ControlInterface {
*/ */
public print(){ public print(){
let _this:any = this; let _this:any = this;
_this.$print({id:'form',popTitle:'主编辑表单'}); _this.$print({id:'wfprocessdefinition_main',popTitle:'主编辑表单'});
} }
/** /**
...@@ -1462,6 +1468,10 @@ export default class MainBase extends Vue implements ControlInterface { ...@@ -1462,6 +1468,10 @@ export default class MainBase extends Vue implements ControlInterface {
if(this.viewparams){ if(this.viewparams){
Object.assign(arg,{viewparams:this.viewparams}); Object.assign(arg,{viewparams:this.viewparams});
} }
// 强制补充srfwfmemo
if(this.srfwfmemo){
Object.assign(arg,{srfwfmemo:this.srfwfmemo});
}
const result: Promise<any> = this.service.wfsubmit(_this.WFSubmitAction, JSON.parse(JSON.stringify(this.context)),arg, this.showBusyIndicator,localdata); const result: Promise<any> = this.service.wfsubmit(_this.WFSubmitAction, JSON.parse(JSON.stringify(this.context)),arg, this.showBusyIndicator,localdata);
result.then((response: any) => { result.then((response: any) => {
if (!response || response.status !== 200) { if (!response || response.status !== 200) {
......
...@@ -25,6 +25,10 @@ ...@@ -25,6 +25,10 @@
overflow: hidden; overflow: hidden;
word-break: break-all; word-break: break-all;
} }
.el-table-column--selection .cell {
padding-left: 0px;
padding-right: 0px;
}
.app-column-link, .app-format-data{ .app-column-link, .app-format-data{
display: inline; display: inline;
} }
......
<template> <template>
<i-form :model="this.data" class='app-form' ref='form' id='form' style=""> <i-form :model="this.data" class='app-form' ref='form' id='wfremodel_main' style="">
<input style="display:none;" /> <input style="display:none;" />
<row > <row >
...@@ -150,6 +150,12 @@ export default class MainBase extends Vue implements ControlInterface { ...@@ -150,6 +150,12 @@ export default class MainBase extends Vue implements ControlInterface {
} }
/**
* 工作流审批意见控件绑定值
*
* @memberof Main
*/
public srfwfmemo:string = "";
/** /**
* 获取多项数据 * 获取多项数据
...@@ -921,7 +927,7 @@ export default class MainBase extends Vue implements ControlInterface { ...@@ -921,7 +927,7 @@ export default class MainBase extends Vue implements ControlInterface {
*/ */
public print(){ public print(){
let _this:any = this; let _this:any = this;
_this.$print({id:'form',popTitle:'主编辑表单'}); _this.$print({id:'wfremodel_main',popTitle:'主编辑表单'});
} }
/** /**
...@@ -1294,6 +1300,10 @@ export default class MainBase extends Vue implements ControlInterface { ...@@ -1294,6 +1300,10 @@ export default class MainBase extends Vue implements ControlInterface {
if(this.viewparams){ if(this.viewparams){
Object.assign(arg,{viewparams:this.viewparams}); Object.assign(arg,{viewparams:this.viewparams});
} }
// 强制补充srfwfmemo
if(this.srfwfmemo){
Object.assign(arg,{srfwfmemo:this.srfwfmemo});
}
const result: Promise<any> = this.service.wfsubmit(_this.WFSubmitAction, JSON.parse(JSON.stringify(this.context)),arg, this.showBusyIndicator,localdata); const result: Promise<any> = this.service.wfsubmit(_this.WFSubmitAction, JSON.parse(JSON.stringify(this.context)),arg, this.showBusyIndicator,localdata);
result.then((response: any) => { result.then((response: any) => {
if (!response || response.status !== 200) { if (!response || response.status !== 200) {
......
<template> <template>
<i-form :model="this.data" class='app-form' ref='form' id='form' style=""> <i-form :model="this.data" class='app-form' ref='form' id='wfuser_main' style="">
<input style="display:none;" /> <input style="display:none;" />
<row > <row >
...@@ -156,6 +156,12 @@ export default class MainBase extends Vue implements ControlInterface { ...@@ -156,6 +156,12 @@ export default class MainBase extends Vue implements ControlInterface {
} }
/**
* 工作流审批意见控件绑定值
*
* @memberof Main
*/
public srfwfmemo:string = "";
/** /**
* 获取多项数据 * 获取多项数据
...@@ -949,7 +955,7 @@ export default class MainBase extends Vue implements ControlInterface { ...@@ -949,7 +955,7 @@ export default class MainBase extends Vue implements ControlInterface {
*/ */
public print(){ public print(){
let _this:any = this; let _this:any = this;
_this.$print({id:'form',popTitle:'主编辑表单'}); _this.$print({id:'wfuser_main',popTitle:'主编辑表单'});
} }
/** /**
...@@ -1322,6 +1328,10 @@ export default class MainBase extends Vue implements ControlInterface { ...@@ -1322,6 +1328,10 @@ export default class MainBase extends Vue implements ControlInterface {
if(this.viewparams){ if(this.viewparams){
Object.assign(arg,{viewparams:this.viewparams}); Object.assign(arg,{viewparams:this.viewparams});
} }
// 强制补充srfwfmemo
if(this.srfwfmemo){
Object.assign(arg,{srfwfmemo:this.srfwfmemo});
}
const result: Promise<any> = this.service.wfsubmit(_this.WFSubmitAction, JSON.parse(JSON.stringify(this.context)),arg, this.showBusyIndicator,localdata); const result: Promise<any> = this.service.wfsubmit(_this.WFSubmitAction, JSON.parse(JSON.stringify(this.context)),arg, this.showBusyIndicator,localdata);
result.then((response: any) => { result.then((response: any) => {
if (!response || response.status !== 200) { if (!response || response.status !== 200) {
......
...@@ -25,6 +25,10 @@ ...@@ -25,6 +25,10 @@
overflow: hidden; overflow: hidden;
word-break: break-all; word-break: break-all;
} }
.el-table-column--selection .cell {
padding-left: 0px;
padding-right: 0px;
}
.app-column-link, .app-format-data{ .app-column-link, .app-format-data{
display: inline; display: inline;
} }
......
...@@ -2089,6 +2089,11 @@ async-validator@^1.10.0: ...@@ -2089,6 +2089,11 @@ async-validator@^1.10.0:
resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-1.12.2.tgz#beae671e7174d2938b7b4b69d2fb7e722b7fd72c" resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-1.12.2.tgz#beae671e7174d2938b7b4b69d2fb7e722b7fd72c"
integrity sha512-57EETfCPFiB7M4QscvQzWSGNsmtkjjzZv318SK1CBlstk+hycV72ocjriMOOM48HjvmoAoJGpJNjC7Z76RlnZA== integrity sha512-57EETfCPFiB7M4QscvQzWSGNsmtkjjzZv318SK1CBlstk+hycV72ocjriMOOM48HjvmoAoJGpJNjC7Z76RlnZA==
async-validator@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-3.3.0.tgz#1d92193bbe60d6d6c8b246692c7005e9ed14a8ee"
integrity sha512-cAHGD9EL8aCqWXjnb44q94MWiDFzUo1tMhvLb2WzcpWqGiKugsjWG9cvl+jPgkPca7asNbsBU3fa0cwkI/P+Xg==
async-validator@~1.8.1: async-validator@~1.8.1:
version "1.8.5" version "1.8.5"
resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-1.8.5.tgz#dc3e08ec1fd0dddb67e60842f02c0cd1cec6d7f0" resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-1.8.5.tgz#dc3e08ec1fd0dddb67e60842f02c0cd1cec6d7f0"
...@@ -2157,6 +2162,13 @@ axios@^0.19.1: ...@@ -2157,6 +2162,13 @@ axios@^0.19.1:
dependencies: dependencies:
follow-redirects "1.5.10" follow-redirects "1.5.10"
axios@^0.19.2:
version "0.19.2"
resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27"
integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==
dependencies:
follow-redirects "1.5.10"
babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
version "6.26.0" version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
...@@ -3258,6 +3270,11 @@ core-js@^3.4.4: ...@@ -3258,6 +3270,11 @@ core-js@^3.4.4:
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647"
integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==
core-js@^3.6.4:
version "3.6.5"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a"
integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==
core-util-is@1.0.2, core-util-is@~1.0.0: core-util-is@1.0.2, core-util-is@~1.0.0:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
...@@ -4022,6 +4039,18 @@ element-ui@^2.13.0: ...@@ -4022,6 +4039,18 @@ element-ui@^2.13.0:
resize-observer-polyfill "^1.5.0" resize-observer-polyfill "^1.5.0"
throttle-debounce "^1.0.1" throttle-debounce "^1.0.1"
element-ui@^2.13.2:
version "2.13.2"
resolved "https://registry.yarnpkg.com/element-ui/-/element-ui-2.13.2.tgz#582bf47aaaaaafe23ea1958fae217a687ad06447"
integrity sha512-r761DRPssMPKDiJZWFlG+4e4vr0cRG/atKr3Eqr8Xi0tQMNbtmYU1QXvFnKiFPFFGkgJ6zS6ASkG+sellcoHlQ==
dependencies:
async-validator "~1.8.1"
babel-helper-vue-jsx-merge-props "^2.0.0"
deepmerge "^1.2.0"
normalize-wheel "^1.0.1"
resize-observer-polyfill "^1.5.0"
throttle-debounce "^1.0.1"
elliptic@^6.0.0: elliptic@^6.0.0:
version "6.5.2" version "6.5.2"
resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762"
...@@ -5209,10 +5238,10 @@ human-signals@^1.1.1: ...@@ -5209,10 +5238,10 @@ human-signals@^1.1.1:
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
ibiz-gantt-elastic@^1.0.12: ibiz-gantt-elastic@^1.0.15:
version "1.0.12" version "1.0.15"
resolved "https://registry.yarnpkg.com/ibiz-gantt-elastic/-/ibiz-gantt-elastic-1.0.12.tgz#6865ef41e94b8b31f00f4cd1f0f60f132f7398d3" resolved "https://registry.yarnpkg.com/ibiz-gantt-elastic/-/ibiz-gantt-elastic-1.0.15.tgz#e57736254aaf5baea28225bce2d29d8bd8adcc2d"
integrity sha512-UHmnTG5q13xUuCKXSf73ZpwN/iOM9M73jFQ+C9wJWAsZcrDVc/36bPaSalMcfRWpfWREtU9wMnONXtFGVvS6pw== integrity sha512-V3uLoN3BN32BagpV1kLm4nFSs4neJ/Cnykd7OIyLv11rjqTWFAENHBpZekioPFF4k2iCyAdRr5smzZbGJdSQxg==
dependencies: dependencies:
dayjs "^1.8.16" dayjs "^1.8.16"
resize-observer-polyfill "^1.5.1" resize-observer-polyfill "^1.5.1"
...@@ -5220,6 +5249,17 @@ ibiz-gantt-elastic@^1.0.12: ...@@ -5220,6 +5249,17 @@ ibiz-gantt-elastic@^1.0.12:
vue-slider-component "^3.0.40" vue-slider-component "^3.0.40"
vue-switches "^2.0.1" vue-switches "^2.0.1"
ibiz-vue-lib@^0.1.9:
version "0.1.9"
resolved "https://registry.yarnpkg.com/ibiz-vue-lib/-/ibiz-vue-lib-0.1.9.tgz#d7088deb5577af3095887ca897c1710bae174682"
integrity sha512-CotV3xIB04+QUUeMlfsVj5BseVPQ+IHyKdwU+MXGh+2e91Nt7N/z/LElakhAiGkSpaaKoMdlKCOdhD0qqJ3wNQ==
dependencies:
axios "^0.19.2"
core-js "^3.6.4"
element-ui "^2.13.2"
view-design "^4.1.0"
vue "^2.6.11"
iconv-lite@0.4.24: iconv-lite@0.4.24:
version "0.4.24" version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
...@@ -9068,6 +9108,11 @@ sort-keys@^1.0.0: ...@@ -9068,6 +9108,11 @@ sort-keys@^1.0.0:
dependencies: dependencies:
is-plain-obj "^1.0.0" is-plain-obj "^1.0.0"
sortablejs@^1.10.1:
version "1.10.2"
resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.10.2.tgz#6e40364d913f98b85a14f6678f92b5c1221f5290"
integrity sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A==
source-list-map@^2.0.0: source-list-map@^2.0.0:
version "2.0.1" version "2.0.1"
resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
...@@ -10185,11 +10230,18 @@ vue-template-es2015-compiler@^1.6.0, vue-template-es2015-compiler@^1.9.0: ...@@ -10185,11 +10230,18 @@ vue-template-es2015-compiler@^1.6.0, vue-template-es2015-compiler@^1.9.0:
resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825"
integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==
vue@^2.2.6, vue@^2.6.10: vue@^2.2.6, vue@^2.6.10, vue@^2.6.11:
version "2.6.11" version "2.6.11"
resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.11.tgz#76594d877d4b12234406e84e35275c6d514125c5" resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.11.tgz#76594d877d4b12234406e84e35275c6d514125c5"
integrity sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ== integrity sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ==
vuedraggable@^2.23.2:
version "2.23.2"
resolved "https://registry.yarnpkg.com/vuedraggable/-/vuedraggable-2.23.2.tgz#0d95d7fdf4f02f56755a26b3c9dca5c7ca9cfa72"
integrity sha512-PgHCjUpxEAEZJq36ys49HfQmXglattf/7ofOzUrW2/rRdG7tu6fK84ir14t1jYv4kdXewTEa2ieKEAhhEMdwkQ==
dependencies:
sortablejs "^1.10.1"
vuex@^3.1.2: vuex@^3.1.2:
version "3.1.2" version "3.1.2"
resolved "https://registry.yarnpkg.com/vuex/-/vuex-3.1.2.tgz#a2863f4005aa73f2587e55c3fadf3f01f69c7d4d" resolved "https://registry.yarnpkg.com/vuex/-/vuex-3.1.2.tgz#a2863f4005aa73f2587e55c3fadf3f01f69c7d4d"
......
...@@ -37,11 +37,11 @@ ...@@ -37,11 +37,11 @@
git clone -b master $para2 ibzwf/ git clone -b master $para2 ibzwf/
export NODE_OPTIONS=--max-old-space-size=4096 export NODE_OPTIONS=--max-old-space-size=4096
cd ibzwf/ cd ibzwf/
mvn clean package -Papi mvn clean package -Pweb
cd ibzwf-provider/ibzwf-provider-api cd ibzwf-app/ibzwf-app-web
mvn -Papi docker:build mvn -Pweb docker:build
mvn -Papi docker:push mvn -Pweb docker:push
docker -H $para1 stack deploy --compose-file=src/main/docker/ibzwf-provider-api.yaml ibzlab-rt --with-registry-auth docker -H $para1 stack deploy --compose-file=src/main/docker/ibzwf-app-web.yaml ibzlab-rt --with-registry-auth
</command> </command>
</hudson.tasks.Shell> </hudson.tasks.Shell>
</builders> </builders>
......
...@@ -9,6 +9,6 @@ CMD echo "The application will start in ${IBZ_SLEEP}s..." && \ ...@@ -9,6 +9,6 @@ CMD echo "The application will start in ${IBZ_SLEEP}s..." && \
sleep ${IBZ_SLEEP} && \ sleep ${IBZ_SLEEP} && \
java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /ibzwf-app-web.jar java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /ibzwf-app-web.jar
EXPOSE 8080 EXPOSE 30003
ADD ibzwf-app-web.jar /ibzwf-app-web.jar ADD ibzwf-app-web.jar /ibzwf-app-web.jar
...@@ -3,9 +3,21 @@ services: ...@@ -3,9 +3,21 @@ services:
ibzwf-app-web: ibzwf-app-web:
image: registry.cn-shanghai.aliyuncs.com/ibizsys/ibzwf-app-web:latest image: registry.cn-shanghai.aliyuncs.com/ibizsys/ibzwf-app-web:latest
ports: ports:
- "8080:8080" - "30003:30003"
networks: networks:
- agent_network - agent_network
environment:
- SPRING_CLOUD_NACOS_DISCOVERY_IP=172.16.180.237
- SERVER_PORT=30003
- 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
- SPRING_DATASOURCE_DRIVER-CLASS-NAME=com.mysql.jdbc.Driver
- SPRING_DATASOURCE_DEFAULTSCHEMA=a_A_5d9d78509
deploy: deploy:
mode: replicated mode: replicated
replicas: 1 replicas: 1
......
...@@ -9,6 +9,6 @@ CMD echo "The application will start in ${IBZ_SLEEP}s..." && \ ...@@ -9,6 +9,6 @@ CMD echo "The application will start in ${IBZ_SLEEP}s..." && \
sleep ${IBZ_SLEEP} && \ sleep ${IBZ_SLEEP} && \
java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /ibzwf-provider-api.jar java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /ibzwf-provider-api.jar
EXPOSE 40003 EXPOSE 8081
ADD ibzwf-provider-api.jar /ibzwf-provider-api.jar ADD ibzwf-provider-api.jar /ibzwf-provider-api.jar
...@@ -3,21 +3,9 @@ services: ...@@ -3,21 +3,9 @@ services:
ibzwf-provider-api: ibzwf-provider-api:
image: registry.cn-shanghai.aliyuncs.com/ibizsys/ibzwf-provider-api:latest image: registry.cn-shanghai.aliyuncs.com/ibizsys/ibzwf-provider-api:latest
ports: ports:
- "40003:40003" - "8081:8081"
networks: networks:
- agent_network - agent_network
environment:
- SPRING_CLOUD_NACOS_DISCOVERY_IP=172.16.180.237
- SERVER_PORT=40003
- 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
- SPRING_DATASOURCE_DRIVER-CLASS-NAME=com.mysql.jdbc.Driver
- SPRING_DATASOURCE_DEFAULTSCHEMA=a_A_5d9d78509
deploy: deploy:
mode: replicated mode: replicated
replicas: 1 replicas: 1
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册