vue-apps/com.actionsoft.apps.coe.pal/views/repository/RepositoryInfoProperty.vue

725 lines
28 KiB
Vue
Raw Normal View History

2022-06-28 01:29:37 +08:00
<template>
<el-container>
<div id="repositoryInfoProperty" style="height: 500px;width: 100%;overflow: auto;">
<template v-for="(group, i) in propertyData">
<div class="property-group"><p style="padding-left: 5px;"><b>{{group.groupPathName}}</b></p></div>
<div style="margin: 0 50px 0 30px;">
<template v-for="(item, j) in group.data">
<!-- 模型名称单独处理 -->
<template v-if="item.type=='string' && item.id == 'PLNAME'">
<div class="property-item">
<label class="property-label">{{item.label}}</label>
<div class="property-value">
<el-input :size=size :disabled="item.readonly" v-model="item.value" @blur="saveRepositoryNameVal(item.value)"></el-input>
</div>
</div>
</template>
<!--string类型-->
<template v-if="item.type=='string' && item.id != 'PLNAME'">
<div class="property-item">
<label class="property-label">{{item.label}}</label>
<div class="property-value">
<el-input :size=size :disabled="item.readonly" v-model="item.value" @blur="saveStringPropVal(item.id, item.value, item.attrSource)"></el-input>
</div>
</div>
</template>
<!--textarea类型-->
<template v-if="item.type=='textarea'">
<div class="property-item">
<label class="property-label" style="vertical-align: bottom;">{{item.label}}</label>
<div class="property-value">
<el-input
:size=size
type="textarea"
:rows="2"
placeholder="请输入内容"
v-model="item.value"
:disabled="item.readonly"
@blur="saveStringPropVal(item.id, item.value, item.attrSource)"
>
</el-input>
</div>
</div>
</template>
<!--number类型-->
<template v-if="item.type=='number'">
<div class="property-item">
<label class="property-label">{{item.label}}</label>
<div class="property-value">
<el-input-number @change="saveNumberPropVal(item.id, item.value, item.attrSource)" :size=size style="width: 100%;cursor: pointer;" controls-position="right" :step="1" v-model="item.value" :disabled="item.readonly"></el-input-number>
</div>
</div>
</template>
<!--boolean类型-->
<template v-if="item.type=='boolean'">
<div class="property-item">
<label class="property-label">{{item.label}}</label>
<div class="property-value">
<template>
<el-select @change="saveSingleSelectVal(item.id, item.value, item.attrSource)" :disabled="item.readonly" clearable :size=size style="width: 100%" v-model="item.value" placeholder="请选择">
<el-option
v-for="option in item.options"
:key="option.value"
:label="option.label"
:value="option.value">
</el-option>
</el-select>
</template>
</div>
</div>
</template>
<!--select类型-->
<template v-if="item.type=='select'">
<div class="property-item">
<label class="property-label">{{item.label}}</label>
<div class="property-value">
<template>
<el-select @change="saveSingleSelectVal(item.id, item.value, item.attrSource)" :disabled="item.readonly" clearable :size=size style="width: 100%" v-model="item.value" placeholder="请选择">
<el-option
v-for="option in item.options"
:key="option.value"
:label="option.label"
:value="option.value">
</el-option>
</el-select>
</template>
</div>
</div>
</template>
<!--select_m类型-->
<template v-if="item.type=='select_m'">
<div class="property-item">
<label class="property-label">{{item.label}}</label>
<div class="property-value">
<template>
<el-select @change="saveMultipleSelectVal(item.id, item.value, item.attrSource)" :disabled="item.readonly" :size=size style="width: 100%" multiple v-model="item.value" placeholder="请选择">
<el-option
v-for="option in item.options"
:key="option.value"
:label="option.label"
:value="option.value">
</el-option>
</el-select>
</template>
</div>
</div>
</template>
<!--deptAddress类型平台部门地址簿-->
<template v-if="item.type=='deptAddress'">
<div class="property-item">
<label class="property-label">{{item.label}}</label>
<div class="property-value">
<el-input :size=size :disabled="item.readonly" readonly @click.native="choiceBpmOrgAddressComponent(group.groupPath, item.type, item.id, item.readonly)" v-model="item.value"></el-input>
</div>
</div>
</template>
<!--userAddress类型平台人员地址簿-->
<template v-if="item.type=='userAddress'">
<div class="property-item">
<label class="property-label">{{item.label}}</label>
<div class="property-value">
<el-input :size=size :disabled="item.readonly" readonly @click.native="choiceBpmOrgAddressComponent(group.groupPath,item.type, item.id, item.readonly)" v-model="item.value"></el-input>
</div>
</div>
</template>
<!--relation-org-shape类型PAL组织形状调用-->
<template v-if="item.type=='relationOrg'">
<div class="property-item">
<label class="property-label">{{item.label}}</label>
<div class="property-value">
<el-input :size=size :disabled="item.readonly" readonly v-model="item.value"></el-input>
</div>
</div>
</template>
<!--awsorg类型-->
<template v-if="item.type=='awsorg'">
<div class="property-item">
<label class="property-label">{{item.label}}</label>
<div class="property-value">
<el-input :size=size :disabled="item.readonly" readonly @click.native="choiceAwsOrgComponent(item.ref, item.type, item.id, item.label, item.readonly)" v-model="item.value"></el-input>
</div>
</div>
</template>
<!--relation类型-->
<template v-if="item.type=='relation'">
<div class="property-item">
<label class="property-label">{{item.label}}</label>
<div class="property-value">
<el-input :size=size :disabled="item.readonly" readonly @click.native="choiceRelationComponent(item.ref, item.type, item.id, item.label, item.readonly, item.fileIds, item.shapeIds)" v-model="item.value"></el-input>
</div>
</div>
</template>
<!-- link类型 -->
<template v-if="item.type=='link' && item.id != 'PLNAME'">
<div class="property-item">
<label class="property-label">{{item.label}}</label>
<div class="property-value">
<el-input :size=size :disabled="item.readonly" v-model="item.value" @blur="saveStringPropVal(item.id, item.value, item.attrSource)"></el-input>
</div>
</div>
</template>
<!-- DateTimePicker 类型 -->
<template v-if="item.type=='DateTimePicker'">
<div class="property-item">
<label class="property-label">{{item.label}}</label>
<div class="property-value">
<el-date-picker value-format="yyyy-MM-dd HH:mm:ss" style="width: 100%;" type="datetime" placeholder="请选择日期时间" @blur="saveStringPropVal(item.id, item.value, item.attrSource)" :disabled="item.readonly" v-model="item.value" ></el-date-picker>
</div>
</div>
</template>
<!-- table 类型 -->
<template v-if="item.type=='table'">
<div class="property-item">
<label class="property-label">{{item.label}}</label>
<div class="property-value">
<el-input :size=size :disabled="item.readonly" v-model="item.value.name">
<template slot="suffix">
<i style="font-size: 20px;line-height: 36px" class="el-icon-s-grid" @click="openTableDialog(item.id,item.value,item.attrSource)"></i>
</template>
</el-input>
</div>
</div>
</template>
</template>
</div>
</template>
</div>
<BPMOrgAddress
ref="palAwsOrgAddress"
:visible.sync="bpmOrgAddress.visible"
:addressType="bpmOrgAddress.addressType"
v-on:cancel="bpmOrgAddress.visible = false"
v-on:getResult="saveBpmOrgAddressResult"
multiple
:title="title"
:multiple="bpmOrgAddress.multiple"
/>
<pal-relation-address
ref="palRelationAddress"
:visible.sync="palRelationAddressVisible"
v-on:cancel="palRelationAddressVisible = false"
v-on:getResult="saveRelationResult"
:title="title"
:selectFileId="relation.selectFileId"
:selectShapeId="relation.selectShapeId"
:relationType="relation.relationType"
:categorys="relation.category"
:methods="relation.method"
:wsId="relation.wsId"
:teamId="relation.teamId"
:multiple = relation.multiple
/>
<el-container>
<el-dialog
id="tableDialog"
width="500px"
:visible.sync="tableDialogVisible"
v-if="tableDialogVisible"
:modal-append-to-body=true
:close-on-click-modal=false
:append-to-body=true
:show-close=false
destroy-on-close
>
<template slot="title">
<el-tooltip placement="top-start">
<div slot="content">{{ dialogTableNewValue.name }}</div>
<el-input class="titleInput" v-model="dialogTableNewValue.name"/>
</el-tooltip>
</template>
<div style="height: 300px;overflow: auto;">
<table class="table">
<tr>
<td style="width: 25%">
<el-tooltip placement="top-start">
<div slot="content">{{ dialogTableNewValue.table[0].name }}</div>
<el-input class="headInput" v-model="dialogTableNewValue.table[0].name" size="mini"/>
</el-tooltip>
</td>
<td style="width: 55%">
<el-tooltip placement="top-start">
<div slot="content">{{ dialogTableNewValue.table[0].name }}</div>
<el-input class="headInput" v-model="dialogTableNewValue.table[0].desc" size="mini"/>
</el-tooltip>
</td>
<td><span style="font-size: 14px;color: #909399;font-weight: bold;font-family: PingFangSC-Light;">操作</span></td>
</tr>
<tr v-for="item in dialogTableNewValue.table.slice(1)">
<td>
<el-tooltip placement="top-start">
<div slot="content">{{ item.name }}</div>
<el-input class="contentInput" v-model="item.name" size="mini"/>
</el-tooltip>
</td>
<td>
<el-tooltip placement="top-start">
<div slot="content">{{ item.desc }}</div>
<el-input class="contentInput" v-model="item.desc" size="mini"/>
</el-tooltip>
</td>
<td><span style="color: red;text-decoration: underline" @click="deleteTableTr(item.id)">删除</span></td>
</tr>
</table>
</div>
<awsui-button style="margin-top: 10px;" class="button-general-color" type="primary" @click="addNewTr">新增</awsui-button>
<span slot="footer" class="dialog-footer">
<awsui-button class="button-general-color" type="primary" @click="confirmTableDialog()">确定</awsui-button>
<awsui-button @click="cancelTableDialog">取消</awsui-button>
</span>
</el-dialog>
</el-container>
</el-container>
</template>
<script>
import BPMOrgAddress from "@/components/common/BPMOrgAddress/index.js";// pal平台组织架构地址簿调用平台部门人员角色
import PalRelationAddress from "@/components/common/PalRelationAddress/index.js";
import awsuiAxios from "../../awsuiAxios";
// pal关联关系地址簿
export default {
name: "RepositoryInfoProperty",
components: {BPMOrgAddress, PalRelationAddress},
props: {
id: {
type: String,
default: ''
},
versionId: {
type: String,
default: ''
},
repositoryRefresh: {
type: Function,
default: null
}
},
data() {
return {
bpmOrgAddress: {
visible: false,
addressType: "user",
multiple: false
},
palRelationAddressVisible: false,
title: '',
relation: {
selectFileId: '',
selectShapeId: '',
relationType: 'shape',
category: '',
method: '',
wsId: this.$store.getters.getWsIdFn,
teamId: this.$store.getters.getTeamIdFn,
multiple: false
},
propertyData: [
{
groupPath: 'basic',
groupPathName: '基本属性',
data: []
}
],
size: 'medium',
currPropertyId: '',
currPropertyType: '',
currGroup: '',
currCategory: '',
currMethod: '',
currRelationType: '',
currPropSource: '',
tableDialogVisible: false,
dialogTableId: '',
dialogTableOldValue: {}, // 弹框表格值副本 刚打开dialog的值 点击取消会把该值保存到数据库
dialogTableNewValue: { // 弹框表格值 对表格的更新操作在此进行 点击确定会把该值保存到数据库
name: '',
table: [
{ id: '',name: '',desc: '' },
]
},
dialogTableAttrSource: undefined
};
},
created() {
this.initData();
},
methods: {
initData() {
const that = this;
const data = {
url:'jd',
data:{
cmd: 'com.actionsoft.apps.coe.pal_processlevel_property_data_query',
id: that.id,
wsId: that.$store.getters.getWsIdFn,
teamId: that.$store.getters.getTeamIdFn
}
};
// 查询数据
awsuiAxios.post(data).then(function (ro) {
if (ro.result == 'ok') {
let propertyData = ro.data.propertyData;
// table 类型value默认为空对象 初始赋值
propertyData.forEach(item => {
item.data.forEach(item1 => {
if (item1.type == 'table' && JSON.stringify(item1.value) == '{}') {
item1.value = {
name: '未命名表单',
table: [
{ id: 'table_head',name: '命名',desc: '描述'}
]
}
}
})
})
that.propertyData = propertyData;
} else {
that.$message.error(ro.msg);
}
}).catch(error=>{
console.log(error);
})
},
openTableDialog(id,value,attrSource) {
this.tableDialogVisible = true
this.dialogTableId = id
this.dialogTableOldValue = JSON.parse(JSON.stringify(value))
this.dialogTableNewValue = value
this.dialogTableAttrSource = attrSource
},
addNewTr() {
this.dialogTableNewValue.table.push({
id: Date.now().toString(36),name: '',desc: ''
})
},
deleteTableTr(id) {
let index = this.dialogTableNewValue.table.findIndex(item => {
return item.id == id
})
this.dialogTableNewValue.table.splice(index,1)
},
confirmTableDialog() {
if (this.dialogTableAttrSource && this.dialogTableAttrSource == 'default') {
this.saveDefaultpropToDb(this.dialogTableId, JSON.stringify(this.dialogTableNewValue));
} else {
this.saveCustomPropToDb(this.dialogTableId, JSON.stringify(this.dialogTableNewValue));
}
this.tableDialogVisible = false
},
cancelTableDialog() {
if (this.dialogTableAttrSource && this.dialogTableAttrSource == 'default') {
this.saveDefaultpropToDb(this.dialogTableId, JSON.stringify(this.dialogTableOldValue));
} else {
this.saveCustomPropToDb(this.dialogTableId, JSON.stringify(this.dialogTableOldValue));
}
this.tableDialogVisible = false
},
saveStringPropVal(attrId, value, attrSource) {// 保存文本属性内容
if (value == undefined) {
value = '';
}
if (attrSource && attrSource == 'default') {
this.saveDefaultpropToDb(attrId, value);
} else {
this.saveCustomPropToDb(attrId, value);
}
},
saveNumberPropVal(attrId, value, attrSource) {// 保存数字类型内容
if (value == undefined) {
value = '';
}
if (attrSource && attrSource == 'default') {
this.saveDefaultpropToDb(attrId, value);
} else {
this.saveCustomPropToDb(attrId, value);
}
},
saveSingleSelectVal(attrId, value, attrSource) {// 保存boolean单选类型内容
if (value == undefined) {
value = '';
}
if (attrSource && attrSource == 'default') {
this.saveDefaultpropToDb(attrId, value);
} else {
this.saveCustomPropToDb(attrId, value);
}
},
saveMultipleSelectVal(attrId, value, attrSource) {// 保存多选类型内容
value = value.join(',');
if (attrSource && attrSource == 'default') {
this.saveDefaultpropToDb(attrId, value);
} else {
this.saveCustomPropToDb(attrId, value);
}
},
saveDefaultpropToDb(attrId, value) {// 保存固定属性至数据库
const that = this;
const data = {
url:'jd',
data:{
cmd: 'com.actionsoft.apps.coe.pal_processlevel_default_attr_content_save',
uuid: that.id,
josnKey: attrId,
josnContent: value
}
};
// 查询数据
awsuiAxios.post(data).then(function (ro) {
if (ro.result == 'ok') {
// that.$message({
// message: '保存成功',
// type: 'success'
// });
that.initData();
} else {
that.$message.error(ro.msg);
}
}).catch(error=>{
console.log(error);
})
},
saveCustomPropToDb(attrId, value) {// 保存属性内容至数据库
const that = this;
const data = {
url:'jd',
data:{
cmd: 'com.actionsoft.apps.coe.pal_processlevel_more_attr_content_save',
uuid: that.id,
josnKey: attrId,
josnContent: value
}
};
// 查询数据
awsuiAxios.post(data).then(function (ro) {
if (ro.result == 'ok') {
// that.$message({
// message: '保存成功',
// type: 'success'
// });
that.initData();
} else {
that.$message.error(ro.msg);
}
}).catch(error=>{
console.log(error);
})
},
choiceRelationComponent(ref, type, id, label, readonly, fileIds, shapeIds) {// PAL模型/形状选择组件
if (!readonly) {
this.currPropertyId = id;
this.currPropertyType = type;
const method = ref.method;
if (method.indexOf('.') > -1) {
this.currCategory = method.substring(0, method.indexOf('.'));
this.currMethod = method;
} else {
this.currCategory = method;
this.currMethod = '';
}
this.currPropSource = 'custom';// 自定义扩展属性
this.relation.multiple = true;
this.currRelationType = ref.type;
this.title = label;
this.relation.selectFileId = fileIds;// 已选中文件id
this.relation.selectShapeId = shapeIds;// 已选中形状id
this.relation.relationType = ref.type;
this.relation.category = this.currCategory;
this.relation.method = this.currMethod;
this.relation.multiple = ref.multiple;
this.palRelationAddressVisible = true;
}
},
choiceBpmOrgAddressComponent(group, type, id, readonly) {// 平台地址簿组件(责任部门责任人)
if (!readonly) {
this.currPropertyId = id;
this.currPropertyType = type;
if (type == "deptAddress") {// 责任部门
this.title = '责任部门';
this.bpmOrgAddress.addressType = 'dept';
this.bpmOrgAddress.visible = true;
} else if (type == "userAddress") {// 责任人
this.title = '责任人';
this.bpmOrgAddress.addressType = 'user';
this.bpmOrgAddress.visible = true;
}
}
},
choiceAwsOrgComponent(ref, type, id, label, readonly) {// AWS平台部门/人员/角色组件
if (!readonly) {
this.currPropertyId = id;
this.currPropertyType = type;
this.title = label;
this.bpmOrgAddress.addressType = ref.scope.join(',');
this.bpmOrgAddress.multiple = ref.multiple;
this.bpmOrgAddress.visible = true;
}
},
saveBpmOrgAddressResult(data) {
this.bpmOrgAddress.visible = false;
// 保存
const params = [];
for (let i = 0; i < data.length; i++) {
params.push({name: data[i].name, id: data[i].id, type: data[i].type})
}
this.saveCustomPropToDb(this.currPropertyId, JSON.stringify(params));
},
// 调用关联组件保存函数
saveRelationResult(data) {
// 返回结果
const jsonContent = {
fileId : this.id,
shapeId : "",
shapeText : "",
attrId : this.currPropertyId,
relationFileId : '',
relationShapeId : '',
relationShapeText : '',
groupPath : this.currGroup
}
const relationType = this.currRelationType;
if (relationType == 'file') {
const fileIds = [];
for (let i = 0; i < data.length; i++) {
fileIds.push(data[i].versionId);
}
jsonContent.relationFileId = fileIds.join(",");
}
else if (relationType == 'shapeAndFile') {
let fileIds = [];
let shapeIds = [];
let shapeNames = [];
for (let i = 0; i < data.length; i++) {
if (data[i].children.length == 0) { // 文件
fileIds.push(data[i].versionId);
shapeNames.push(data[i].name);
shapeIds.push(' ') // push 空格
}else { // 形状
for (let j = 0; j < data[i].children.length; j++) {
fileIds.push(data[i].versionId)
shapeIds.push(data[i].children[j].shapeId)
shapeNames.push(data[i].children[j].name)
}
}
}
jsonContent.relationFileId = fileIds.join(",");
jsonContent.relationShapeId = shapeIds.join(",");
jsonContent.relationShapeText = shapeNames.join(",");
}
else {// 形状
const fileIds = [];
const shapeIds = [];
const shapeNames = [];
for (let i = 0; i < data.length; i++) {
const currFile = data[i];
const children = currFile.children;
for (let j = 0; j < children.length; j++) {
const currShape = children[j];
fileIds.push(currFile.id);
shapeIds.push(currShape.shapeId);
shapeNames.push(currShape.name);
}
}
jsonContent.relationFileId = fileIds.join(",");
jsonContent.relationShapeId = shapeIds.join(",");
jsonContent.relationShapeText = shapeNames.join(",");
}
if (this.currPropSource == 'default') {// 固定属性,责任人、责任部门
this.saveDefaultpropToDb(this.currPropertyId, JSON.stringify(jsonContent));
} else {// 自定义属性
this.saveCustomPropToDb(this.currPropertyId, JSON.stringify(jsonContent));
}
this.palRelationAddressVisible = false;
},
saveRepositoryNameVal(name) {// 模型名称保存
const that = this;
const data = {
url:'jd',
data:{
cmd: 'com.actionsoft.apps.coe.pal_pl_repository_designer_updatetitle',
uuid: that.id,
title: name,
}
};
// 查询数据
awsuiAxios.post(data).then(function (ro) {
if (ro.result == 'ok') {
that.initData();
// 父页面左侧树和右侧
if (that.repositoryRefresh && that.id) {
that.repositoryRefresh(that.id);
}
} else {
that.$message.error(ro.msg);
}
}).catch(error=>{
console.log(error);
})
}
}
}
</script>
<style scoped>
.property-group {
height: 25px;
line-height: 25px;
vertical-align: center;
margin: 30px 30px 15px 20px;
border-left: 3px solid #4E7FF9;
}
.property-item {
margin-top: 15px;
}
.property-label {
width: 11%;
display: inline-block;
text-align: right;
padding-right: 12px;
vertical-align: middle;
}
.property-value {
display: inline-block;
width: 85%;
}
#tableDialog >>> .el-dialog__body {
padding: 10px 20px;
color: #606266;
font-size: 14px;
word-break: break-all;
cursor: pointer;
}
#tableDialog >>> .el-input__inner {
border: none;
padding: 0;
text-overflow: ellipsis;
cursor: pointer;
}
.table {
width: 100%;
}
.table tr td{
border-bottom: 1px solid #f2f2f2;
padding:0 5px;
white-space: normal;
}
.titleInput >>> .el-input__inner {
height: 25px;
width: 100%;
padding: 0;
border: none;
font-size: 18px;
font-family: PingFangSC-Light;
}
.headInput >>> .el-input__inner {
font-size: 14px;
color: #909399;
font-weight: bold;
font-family: PingFangSC-Light;
}
.contentInput >>> .el-input__inner {
font-size: 14px;
color: #606266;
font-family: PingFangSC-Light;
background: transparent;
}
</style>