批处理前端

This commit is contained in:
446052889@qq.com 2022-07-12 08:49:40 +08:00
parent 916cf4ced3
commit f4f946a00d
63 changed files with 211505 additions and 0 deletions

View File

@ -0,0 +1,28 @@
.DS_Store
node_modules
# awsDevParams.js
/dist
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
.history/*
# Doc
~$*
.~*

View File

@ -0,0 +1,27 @@
module.exports = {
AWSPortalUrl: "http://localhost:8088/portal/",//aws平台启动地址用于开发时获取平台静态资源请求数据等注意最后的/,不要删)
AWSReleasePath: "/Users/sunlh/idea-workspace-aws6/release/", /*C:/work/workspace/release/*/ //aws的平台路径暂时写绝对路径用于build生成的主文件位置注意最后的/,不要删)
moduleTemplateInAWS: "apps/install/com.actionsoft.apps.coe.pal.batch/template/page/main.htm", /*apps/install/_bpm.platform/template/page/console.m.dw.design.vue.htm*/ //build后生成到平台的模板位置及名称
outputDir: "apps/install/com.actionsoft.apps.coe.pal.batch/web/com.actionsoft.apps.coe.pal.batch/main", /*webserver/webapps/portal/apps/_bpm.platform/dw/designer/main*/ //build后js或css生成到平台的位置
publicPath: "../apps/com.actionsoft.apps.coe.pal.batch/main", /*../apps/_bpm.platform/dw/designer/main*/ //build到平台后生成到模板中引入js文件的相对平台的位置
AWSJSAndCSSImport: [ //引入平台的js或css在portal目录开始,开发或build通用
/*
// 示例
{
type: "js",
path: "commons/js/util/Base64.js"
},
{
type: "css",
path: "commons/css/font/iconfont.css"
},
*/
],
devUserInfo: {//开发时通过用户名及密码获取sessionId前提必须需要安装并启动appcom.actionsoft.apps.getsession.app
userid: "admin", //具有后台管理的用户名
pwd: "admin", //密码
deviceType: "pc",
systemType: "C"
}
}

View File

@ -0,0 +1,24 @@
# dataviewsetting
## Project setup
```
yarn install
```
### Compiles and hot-reloads for development
```
yarn serve
```
### Compiles and minifies for production
```
yarn build
```
### Lints and fixes files
```
yarn lint
```
### Customize configuration
See [Configuration Reference](https://cli.vuejs.org/config/).

View File

@ -0,0 +1,5 @@
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
]
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,10 @@
<meta charset="utf-8">
<title>awsui-vue demo</title>
<script src="./awsui-vue.umd.js"></script>
<link rel="stylesheet" href="./awsui-vue.css">
<script>
console.log(awsui-vue)
</script>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 1.2 MiB

View File

@ -0,0 +1,50 @@
{
"name": "com.actionsoft.apps.coe.pal.batch",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
},
"dependencies": {
"axios": "^0.20.0",
"codemirror": "^5.61.1",
"core-js": "^3.12.1",
"element-ui": "^2.15.1",
"vue": "^2.6.12",
"vue-codemirror": "^4.0.6",
"vue-router": "^3.5.1",
"vuex": "^3.6.2"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~4.4.0",
"@vue/cli-plugin-eslint": "~4.4.0",
"@vue/cli-plugin-router": "~4.4.0",
"@vue/cli-plugin-vuex": "~4.4.0",
"@vue/cli-service": "~4.4.0",
"babel-eslint": "^10.1.0",
"eslint": "^6.7.2",
"eslint-plugin-vue": "^6.2.2",
"vue-template-compiler": "^2.6.11"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/essential",
"eslint:recommended"
],
"parserOptions": {
"parser": "babel-eslint"
},
"rules": {}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -0,0 +1,57 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= htmlWebpackPlugin.options.title %></title>
<%= htmlWebpackPlugin.options.AWSJSAndCSSImport %>
<!--
其它的js或css引用方式示例<%= htmlWebpackPlugin.options.awsjsandcsspath%>
<link rel="stylesheet" type="text/css" href="<%= htmlWebpackPlugin.options.awsjsandcsspath%>apps/_bpm.platform/css/model/console.m.dw.design.css"/>
-->
<script>
const settingParam = <%= htmlWebpackPlugin.options.settingParam %>;
const axiosBaseUrl = "<%= htmlWebpackPlugin.options.axiosBaseUrl %>";
const production = <%= htmlWebpackPlugin.options.isproduction %>;
</script>
<% if(!htmlWebpackPlugin.options.isproduction) {%>
<script>
const devUserInfo = <%= JSON.stringify(htmlWebpackPlugin.options.devUserInfo) %>;
</script>
<% }%>
<script>
<% if(!htmlWebpackPlugin.options.isproduction) {%>
var mainPage = 'replace';// create 批量创建 replace 批量替换
var wsId = 'f391f672-100b-4d4b-89d1-ba1b4b3d0132';
var teamId = '';
var methodCategory = 'process';
var appId = 'com.actionsoft.apps.coe.pal.batch';
var repositoryName = 'tmp';
var groupValue = 'upload';
var processFileValue = '1234';
var shapeFileValue = '5678';
var palId = '241e1259-2bf9-4e33-a362-bb94b7ec27b7';// 流程id不为空则为设计器内单只流程形状属性替换
var wHref = "http://localhost:8088/portal/r/w";
var jdHref = "http://localhost:8088/portal/r/jd";
<%}else {%>
var mainPage = '<#mainPage>';// create 批量创建 replace 批量替换
var wsId = '<#wsId>';
var teamId = '<#teamId>';
var methodCategory = '<#methodCategory>';
var appId = '<#appId>';
var repositoryName = '<#repositoryName>';
var groupValue = '<#groupValue>';
var processFileValue = '<#processFileValue>';
var shapeFileValue = '<#shapeFileValue>';
var palId = '<#palId>';// 流程id不为空则为设计器内单只流程形状属性替换
var wHref = "./w";
var jdHref = "./jd";
<%}%>
</script>
</head>
<body style="margin:0;">
<div id="app"></div>
</body>
</html>

View File

@ -0,0 +1,27 @@
<template>
<div id="app">
<router-view />
</div>
</template>
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
color: #2c3e50;
}
#nav {
padding: 30px;
}
#nav a {
font-weight: bold;
color: #2c3e50;
}
#nav a.router-link-exact-active {
color: #42b983;
}
</style>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@ -0,0 +1,109 @@
import axios from 'axios'
import store from '../store'
// 创建axios请求实例
// const request = axios.create({
// baseURL: axiosBaseUrl,
// timeout: 1000,
// headers: {
// 'Content-Type': 'application/json; charset=utf-8'
// }
// })
axios.defaults.baseURL = typeof axiosBaseUrl == "undefined" ? "" : axiosBaseUrl; // 设置跨域代理接口统一的前置地址
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8';
// 添加请求拦截器
axios.interceptors.request.use(function (request) {
// 在发送请求之前做些什么
if(request.method == 'post'){
request.params = {};
}
return request
}, function (error) {
// 对请求错误做些什么
return Promise.reject(error)
})
// 添加响应拦截器
axios.interceptors.response.use(function (response) {
// 只返回数据
return response.data
}, function (error) {
if(error.response == null){
throw error;
}
const status = error.response.status
if (status >= 500) {
alert('服务繁忙请稍后再试')
} else if (status >= 400) {
alert(error.response.data.message)
}
// 对响应错误做点什么
console.dir(error)
return Promise.reject(error)
})
function _toChangeData(data){
let dataArray = [];
for(let key in data){
dataArray.push(encodeURIComponent(key)+"="+encodeURIComponent(data[key]));
}
return dataArray.join("&");
}
//可能需要更改,暂时用不到
const get = (params) => {
return axios({
method: "get",
url: params.url,
params: params.params
});
}
const post = (params) => {
let postConfig = {
method: "post",
url: params.url,
data: params.data
}
//从vuex中获取sessionId
postConfig.data.sid = store.state.sessionId;
postConfig.data = _toChangeData(postConfig.data);
return axios(postConfig);
}
const aslp = (params) => {
// {
// portalUrl : "",
// authentication : store.state.sessionId,
// sourceAppId : "appid",
// aslp : "aslp://XXXX",
// params :{
// aa:1,
// bb:2
// }
// }
let datas = {
authentication : store.state.sessionId,
sourceAppId : params.sourceAppId,
aslp : params.aslp,
}
Object.assign(datas,params.params)
let postConfig = {
method: "post",
url: params.portalUrl,
params: datas
}
postConfig.data = _toChangeData(postConfig.data);
return axios(postConfig);
}
// const delete = (url, data) => request.delete(url, data)
// const head = (url, data) => request.head(url, data)
// const options = (url, data) => request.options(url, data)
// const put = (url, data) => request.put(url, data)
// const patch = (url, data) => request.patch(url, data)
export default {
get,
post,
aslp
}

View File

@ -0,0 +1,62 @@
<!-- 示例可删除 -->
<template>
<div class="hello">
<h1>{{ msg }}</h1>
<p>
For a guide and recipes on how to configure / customize this project,<br>
check out the
<a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
</p>
<h3>Installed CLI Plugins</h3>
<ul>
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank"
rel="noopener">babel</a></li>
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank"
rel="noopener">eslint</a></li>
</ul>
<h3>Essential Links</h3>
<ul>
<li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
<li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
<li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
<li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
<li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
</ul>
<h3>Ecosystem</h3>
<ul>
<li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
<li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
<li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a>
</li>
<li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
<li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
</ul>
</div>
</template>
<script>
export default {
name: "HelloWorld",
props: {
msg: String,
},
};
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h3 {
margin: 40px 0 0;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
</style>

View File

@ -0,0 +1,23 @@
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
// awsui-vue lib已包含element-ui
import Awsui from '../lib/awsui-vue.umd.min'
import '../lib/awsui-vue.css'
import '../static/common/common.css';
import '../static/common/theme1.css';// 主题颜色配置
import './assets/iconfont/iconfont.css';
import VueCodeMirror from 'vue-codemirror';
import 'codemirror/lib/codemirror.css';
Vue.use(VueCodeMirror)
Vue.config.productionTip = false
Vue.use(Awsui)
new Vue({
router,
store,
render: h => {
return h(App);
},
}).$mount('#app')

View File

@ -0,0 +1,66 @@
import Vue from 'vue'
import VueRouter from 'vue-router'
import store from '../store'
Vue.use(VueRouter)
const routes = [
{
path: '/devGetSession', //开发时获取session作用
name: 'devGetSession',
component: () => import('../views/DevGetSession.vue')
},
{
path: '/create',
name: 'create',
component: () => import('../views/create/create')
},
{
path: '/replace',
name: 'replace',
component: () => import('../views/replace/replace')
}
]
const router = new VueRouter({
routes
})
/**
*
* to 表示将要跳转到的组件 (目标组件)
* console.log(from); //(源组件)
* next();
* next 是一个函数
* next() 进入下一个组件的钩子函数
* next(false) 阻止跳转 中断导航
* next("/login") 进入指定的组件的钩子函数
*/
// 路由守卫
router.beforeEach((to, from, next) => {
if (production === false && store.state.sessionId == null && to.path != "/devGetSession") {
//进入一个路由获取session获取session后再进入主入口
next("/devGetSession");
} else {
//跳转前设置title
//window.document.title = to.meta.title;
if (store.state.mainPage == 'create') {
store.commit("edit", { mainPage: Math.random() });
next('/create');
} else if (store.state.mainPage == 'replace') {
store.commit("edit", { mainPage: Math.random() });
next('/replace');
} else {
next();
}
// next();
}
//to.matched.some(res=>{res.meta.isLogin}) 能够获取路由配置的参数
});
//跳转后设置scroll为原点
router.afterEach((to, from, next) => {
window.scrollTo(0, 0);
});
export default router

View File

@ -0,0 +1,22 @@
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
sessionId: settingParam.sessionId,
mainPage: mainPage
},
mutations: {
edit(state, data) {
for (let p in data) {
state[p] = data[p];
}
}
},
actions: {
},
modules: {
}
})

View File

@ -0,0 +1,71 @@
<!-- 获取session方法不可删除 -->
<template>
<div class="devGetSession">
正在获取session
</div>
</template>
<script>
import router from "../router/index";
import awsuiAxios from "../awsuiAxios/index";
import store from "../store/index";
/*
获取控制台用户会话注意如果使用是控制台移动端会话修改vueDeviceType:mobile
data: {
cmd: "CONSOLE_ADMIN_LOGIN",
userid: devUserInfo.userid,
pwd: devUserInfo.pwd,
lang: "cn",
vueDeviceType: "pc",
}
*/
/*
获取客户端用户会话deviceTypepc/mobile/weixin
data: {
cmd: "CLIENT_USER_LOGIN",
userid: devUserInfo.userid,
pwd: devUserInfo.pwd,
lang: "cn",
deviceType: "pc",
}
*/
/*
获取CoE用户会话
data: {
cmd: "com.actionsoft.apps.coe.pal_user_login",
userid: devUserInfo.userid,
pwd: devUserInfo.pwd,
lang: "cn",
deviceType: "pc",
}
*/
awsuiAxios
.post({
url: "jd",
data: {
cmd: "CONSOLE_ADMIN_LOGIN",
userid: devUserInfo.userid,
pwd: devUserInfo.pwd,
lang: "cn",
vueDeviceType: "pc",
},
})
.then(function (r) {
// let r = response.data;
if (r.result == "error") {
//$.simpleAlert(r.msg, "error");
alert("获取session错误" + r.msg);
} else {
store.commit("edit", { sessionId: r.data.sid });
router.replace("/" + mainPage);
}
});
export default {
data() {
return {
dwList: [], //dw
};
},
methods: {},
mounted() {},
};
</script>

View File

@ -0,0 +1,85 @@
function getError(action, option, xhr) {
let msg;
if (xhr.response) {
msg = `${xhr.response.error || xhr.response}`;
} else if (xhr.responseText) {
msg = `${xhr.responseText}`;
} else {
msg = `fail to post ${action} ${xhr.status}`;
}
const err = new Error(msg);
err.status = xhr.status;
err.method = 'post';
err.url = action;
return err;
}
function getBody(xhr) {
const text = xhr.responseText || xhr.response;
if (!text) {
return text;
}
try {
return JSON.parse(text);
} catch (e) {
return text;
}
}
export default function upload(option) {
if (typeof XMLHttpRequest === 'undefined') {
return;
}
const xhr = new XMLHttpRequest();
const action = option.action;
if (xhr.upload) {
xhr.upload.onprogress = function progress(e) {
if (e.total > 0) {
e.percent = e.loaded / e.total * 100;
}
option.onProgress(e);
};
}
const formData = new FormData();
if (option.data) {
Object.keys(option.data).forEach(key => {
formData.append(key, option.data[key]);
});
}
formData.append(option.filename, option.file, option.file.name);
xhr.onerror = function error(e) {
option.onError(e);
};
xhr.onload = function onload() {
if (xhr.status < 200 || xhr.status >= 300) {
return option.onError(getError(action, option, xhr));
}
option.onSuccess(getBody(xhr));
};
xhr.open('post', action, true);
if (option.withCredentials && 'withCredentials' in xhr) {
xhr.withCredentials = true;
}
const headers = option.headers || {};
for (let item in headers) {
if (headers.hasOwnProperty(item) && headers[item] !== null) {
xhr.setRequestHeader(item, headers[item]);
}
}
xhr.send(formData);
return xhr;
}

View File

@ -0,0 +1,353 @@
<script>
import UploadList from './upload-list';
import Upload from './upload';
import ElProgress from 'element-ui/packages/progress';
import Migrating from 'element-ui/src/mixins/migrating';
function noop() {}
export default {
name: 'ElUpload',
mixins: [Migrating],
components: {
ElProgress,
UploadList,
Upload
},
provide() {
return {
uploader: this
};
},
inject: {
elForm: {
default: ''
}
},
props: {
action: {
type: String,
default: ''
},
headers: {
type: Object,
default() {
return {};
}
},
data: Object,
multiple: Boolean,
name: {
type: String,
default: 'file'
},
drag: Boolean,
dragger: Boolean,
withCredentials: Boolean,
showFileList: {
type: Boolean,
default: true
},
accept: String,
type: {
type: String,
default: 'select'
},
beforeUpload: Function,
beforeRemove: Function,
onRemove: {
type: Function,
default: noop
},
onChange: {
type: Function,
default: noop
},
onPreview: {
type: Function
},
onSuccess: {
type: Function,
default: noop
},
onProgress: {
type: Function,
default: noop
},
onError: {
type: Function,
default: noop
},
fileList: {
type: Array,
default() {
return [];
}
},
autoUpload: {
type: Boolean,
default: true
},
listType: {
type: String,
default: 'text' // text,picture,picture-card
},
httpRequest: Function,
disabled: Boolean,
limit: Number,
onExceed: {
type: Function,
default: noop
},
appId: {
type: String,
required: true
},
repositoryName: {
type: String,
required: true
},
groupValue: {
type: String,
required: true
},
fileValue: {
type: String,
required: true
},
extParam: {
type: String,
default: ''
}
},
data() {
return {
uploadFiles: [],
dragOver: false,
draging: false,
tempIndex: 1,
sid: this.$store.state.sessionId
};
},
computed: {
uploadDisabled() {
return this.disabled || (this.elForm || {}).disabled;
}
},
watch: {
listType(type) {
if (type === 'picture-card' || type === 'picture') {
this.uploadFiles = this.uploadFiles.map(file => {
if (!file.url && file.raw) {
try {
file.url = URL.createObjectURL(file.raw);
} catch (err) {
console.error('[Element Error][Upload]', err);
}
}
return file;
});
}
},
fileList: {
immediate: true,
handler(fileList) {
this.uploadFiles = fileList.map(item => {
item.uid = item.uid || (Date.now() + this.tempIndex++);
item.status = item.status || 'success';
return item;
});
}
}
},
methods: {
handleStart(rawFile) {
rawFile.uid = Date.now() + this.tempIndex++;
let file = {
status: 'ready',
name: rawFile.name,
size: rawFile.size,
percentage: 0,
uid: rawFile.uid,
raw: rawFile
};
if (this.listType === 'picture-card' || this.listType === 'picture') {
try {
file.url = URL.createObjectURL(rawFile);
} catch (err) {
console.error('[Element Error][Upload]', err);
return;
}
}
this.uploadFiles.push(file);
this.onChange(file, this.uploadFiles);
},
handleProgress(ev, rawFile) {
const file = this.getFile(rawFile);
this.onProgress(ev, file, this.uploadFiles);
file.status = 'uploading';
file.percentage = ev.percent || 0;
},
handleSuccess(res, rawFile) {
const file = this.getFile(rawFile);
if (file) {
file.status = 'success';
file.response = res;
this.onSuccess(res, file, this.uploadFiles);
this.onChange(file, this.uploadFiles);
}
},
handleError(err, rawFile) {
const file = this.getFile(rawFile);
const fileList = this.uploadFiles;
file.status = 'fail';
fileList.splice(fileList.indexOf(file), 1);
this.onError(err, file, this.uploadFiles);
this.onChange(file, this.uploadFiles);
},
handleRemove(file, raw) {
if (raw) {
file = this.getFile(raw);
}
let doRemove = () => {
this.abort(file);
let fileList = this.uploadFiles;
fileList.splice(fileList.indexOf(file), 1);
this.onRemove(file, fileList);
};
if (!this.beforeRemove) {
doRemove();
} else if (typeof this.beforeRemove === 'function') {
const before = this.beforeRemove(file, this.uploadFiles);
if (before && before.then) {
before.then(() => {
doRemove();
}, noop);
} else if (before !== false) {
doRemove();
}
}
},
getFile(rawFile) {
let fileList = this.uploadFiles;
let target;
fileList.every(item => {
target = rawFile.uid === item.uid ? item : null;
return !target;
});
return target;
},
abort(file) {
this.$refs['upload-inner'].abort(file);
},
clearFiles() {
this.uploadFiles = [];
},
submit() {
this.uploadFiles
.filter(file => file.status === 'ready')
.forEach(file => {
this.$refs['upload-inner'].upload(file.raw);
});
},
getMigratingConfig() {
return {
props: {
'default-file-list': 'default-file-list is renamed to file-list.',
'show-upload-list': 'show-upload-list is renamed to show-file-list.',
'thumbnail-mode': 'thumbnail-mode has been deprecated, you can implement the same effect according to this case: http://element.eleme.io/#/zh-CN/component/upload#yong-hu-tou-xiang-shang-chuan'
}
};
}
},
beforeDestroy() {
this.uploadFiles.forEach(file => {
if (file.url && file.url.indexOf('blob:') === 0) {
URL.revokeObjectURL(file.url);
}
});
},
render(h) {
let uploadList;
if (this.showFileList) {
uploadList = (
<UploadList
disabled={this.uploadDisabled}
listType={this.listType}
files={this.uploadFiles}
on-remove={this.handleRemove}
handlePreview={this.onPreview}>
{
(props) => {
if (this.$scopedSlots.file) {
return this.$scopedSlots.file({
file: props.file
});
}
}
}
</UploadList>
);
}
const uploadData = {
props: {
type: this.type,
drag: this.drag,
action: this.action != undefined && this.action != '' ? this.action : encodeURI(getUploadDestination() + "appId=" + this.appId + "&sid=" + this.sid + "&groupValue=" + this.groupValue + "&fileValue=" + this.fileValue + "&repositoryName=" + this.repositoryName + "&extParam=" + this.extParam),
multiple: this.multiple,
'before-upload': this.beforeUpload,
'with-credentials': this.withCredentials,
headers: this.headers,
name: this.name,
data: this.data,
accept: this.accept,
fileList: this.uploadFiles,
autoUpload: this.autoUpload,
listType: this.listType,
disabled: this.uploadDisabled,
limit: this.limit,
'on-exceed': this.onExceed,
'on-start': this.handleStart,
'on-progress': this.handleProgress,
'on-success': this.handleSuccess,
'on-error': this.handleError,
'on-preview': this.onPreview,
'on-remove': this.handleRemove,
'http-request': this.httpRequest,
appId: this.appId,
repositoryName: this.repositoryName,
groupValue: this.groupValue,
fileValue: this.fileValue,
extParam: this.extParam,
sid: this.sid
},
ref: 'upload-inner'
};
const trigger = this.$slots.trigger || this.$slots.default;
const uploadComponent = <upload {...uploadData}>{trigger}</upload>;
return (
<div>
{ this.listType === 'picture-card' ? uploadList : ''}
{
this.$slots.trigger
? [uploadComponent, this.$slots.default]
: uploadComponent
}
{this.$slots.tip}
{ this.listType !== 'picture-card' ? uploadList : ''}
</div>
);
}
};
function getUploadDestination() {
var url = axiosBaseUrl;
var ret = "uf";
if (url && url.indexOf("/r/") != -1) {
ret = url.substring(0, url.indexOf("/r/")) + "/r/uf";
} else if (url && url.indexOf("/apps") > -1) {
ret = url.substring(0, url.indexOf("/apps")) + "/r/uf";
}
var finalUrl = ret + "?";
return finalUrl;
};
</script>

View File

@ -0,0 +1,69 @@
<template>
<div
class="el-upload-dragger"
:class="{
'is-dragover': dragover
}"
@drop.prevent="onDrop"
@dragover.prevent="onDragover"
@dragleave.prevent="dragover = false"
>
<slot></slot>
</div>
</template>
<script>
export default {
name: 'ElUploadDrag',
props: {
disabled: Boolean
},
inject: {
uploader: {
default: ''
}
},
data() {
return {
dragover: false
};
},
methods: {
onDragover() {
if (!this.disabled) {
this.dragover = true;
}
},
onDrop(e) {
if (this.disabled || !this.uploader) return;
const accept = this.uploader.accept;
this.dragover = false;
if (!accept) {
this.$emit('file', e.dataTransfer.files);
return;
}
this.$emit('file', [].slice.call(e.dataTransfer.files).filter(file => {
const { type, name } = file;
const extension = name.indexOf('.') > -1
? `.${ name.split('.').pop() }`
: '';
const baseType = type.replace(/\/.*$/, '');
return accept.split(',')
.map(type => type.trim())
.filter(type => type)
.some(acceptedType => {
if (/\..+$/.test(acceptedType)) {
return extension === acceptedType;
}
if (/\/\*$/.test(acceptedType)) {
return baseType === acceptedType.replace(/\/\*$/, '');
}
if (/^[^\/]+\/[^\/]+$/.test(acceptedType)) {
return type === acceptedType;
}
return false;
});
}));
}
}
};
</script>

View File

@ -0,0 +1,100 @@
<template>
<transition-group
tag="ul"
:class="[
'el-upload-list',
'el-upload-list--' + listType,
{ 'is-disabled': disabled }
]"
name="el-list"
>
<li
v-for="file in files"
:class="['el-upload-list__item', 'is-' + file.status, focusing ? 'focusing' : '']"
:key="file.uid"
tabindex="0"
@keydown.delete="!disabled && $emit('remove', file)"
@focus="focusing = true"
@blur="focusing = false"
@click="focusing = false"
>
<slot :file="file">
<img
class="el-upload-list__item-thumbnail"
v-if="file.status !== 'uploading' && ['picture-card', 'picture'].indexOf(listType) > -1"
:src="file.url" alt=""
>
<a class="el-upload-list__item-name" @click="handleClick(file)">
<i class="el-icon-document"></i>{{file.name}}
</a>
<label class="el-upload-list__item-status-label">
<i :class="{
'el-icon-upload-success': true,
'el-icon-circle-check': listType === 'text',
'el-icon-check': ['picture-card', 'picture'].indexOf(listType) > -1
}"></i>
</label>
<i class="el-icon-close" v-if="!disabled" @click="$emit('remove', file)"></i>
<i class="el-icon-close-tip" v-if="!disabled">{{ t('el.upload.deleteTip') }}</i> <!--因为close按钮只在li:focus的时候 display, li blur后就不存在了所以键盘导航时永远无法 focus到 close按钮上-->
<el-progress
v-if="file.status === 'uploading'"
:type="listType === 'picture-card' ? 'circle' : 'line'"
:stroke-width="listType === 'picture-card' ? 6 : 2"
:percentage="parsePercentage(file.percentage)">
</el-progress>
<span class="el-upload-list__item-actions" v-if="listType === 'picture-card'">
<span
class="el-upload-list__item-preview"
v-if="handlePreview && listType === 'picture-card'"
@click="handlePreview(file)"
>
<i class="el-icon-zoom-in"></i>
</span>
<span
v-if="!disabled"
class="el-upload-list__item-delete"
@click="$emit('remove', file)"
>
<i class="el-icon-delete"></i>
</span>
</span>
</slot>
</li>
</transition-group>
</template>
<script>
import Locale from 'element-ui/src/mixins/locale';
import ElProgress from 'element-ui/packages/progress';
export default {
name: 'ElUploadList',
mixins: [Locale],
data() {
return {
focusing: false
};
},
components: { ElProgress },
props: {
files: {
type: Array,
default() {
return [];
}
},
disabled: {
type: Boolean,
default: false
},
handlePreview: Function,
listType: String
},
methods: {
parsePercentage(val) {
return parseInt(val, 10);
},
handleClick(file) {
this.handlePreview && this.handlePreview(file);
}
}
};
</script>

View File

@ -0,0 +1,200 @@
<script>
import ajax from './ajax';
import UploadDragger from './upload-dragger.vue';
export default {
inject: ['uploader'],
components: {
UploadDragger
},
props: {
type: String,
action: {
type: String,
required: true
},
name: {
type: String,
default: 'file'
},
data: Object,
headers: Object,
withCredentials: Boolean,
multiple: Boolean,
accept: String,
onStart: Function,
onProgress: Function,
onSuccess: Function,
onError: Function,
beforeUpload: Function,
drag: Boolean,
onPreview: {
type: Function,
default: function() {}
},
onRemove: {
type: Function,
default: function() {}
},
fileList: Array,
autoUpload: Boolean,
listType: String,
httpRequest: {
type: Function,
default: ajax
},
disabled: Boolean,
limit: Number,
onExceed: Function
},
data() {
return {
mouseover: false,
reqs: {}
};
},
methods: {
isImage(str) {
return str.indexOf('image') !== -1;
},
handleChange(ev) {
const files = ev.target.files;
if (!files) return;
this.uploadFiles(files);
},
uploadFiles(files) {
if (this.limit && this.fileList.length + files.length > this.limit) {
this.onExceed && this.onExceed(files, this.fileList);
return;
}
let postFiles = Array.prototype.slice.call(files);
if (!this.multiple) { postFiles = postFiles.slice(0, 1); }
if (postFiles.length === 0) { return; }
postFiles.forEach(rawFile => {
this.onStart(rawFile);
if (this.autoUpload) this.upload(rawFile);
});
},
upload(rawFile) {
this.$refs.input.value = null;
if (!this.beforeUpload) {
return this.post(rawFile);
}
const before = this.beforeUpload(rawFile);
if (before && before.then) {
before.then(processedFile => {
const fileType = Object.prototype.toString.call(processedFile);
if (fileType === '[object File]' || fileType === '[object Blob]') {
if (fileType === '[object Blob]') {
processedFile = new File([processedFile], rawFile.name, {
type: rawFile.type
});
}
for (const p in rawFile) {
if (rawFile.hasOwnProperty(p)) {
processedFile[p] = rawFile[p];
}
}
this.post(processedFile);
} else {
this.post(rawFile);
}
}, () => {
this.onRemove(null, rawFile);
});
} else if (before !== false) {
this.post(rawFile);
} else {
this.onRemove(null, rawFile);
}
},
abort(file) {
const { reqs } = this;
if (file) {
let uid = file;
if (file.uid) uid = file.uid;
if (reqs[uid]) {
reqs[uid].abort();
}
} else {
Object.keys(reqs).forEach((uid) => {
if (reqs[uid]) reqs[uid].abort();
delete reqs[uid];
});
}
},
post(rawFile) {
const { uid } = rawFile;
const options = {
headers: this.headers,
withCredentials: this.withCredentials,
file: rawFile,
data: this.data,
filename: this.name,
action: this.action,
onProgress: e => {
this.onProgress(e, rawFile);
},
onSuccess: res => {
this.onSuccess(res, rawFile);
delete this.reqs[uid];
},
onError: err => {
this.onError(err, rawFile);
delete this.reqs[uid];
}
};
const req = this.httpRequest(options);
this.reqs[uid] = req;
if (req && req.then) {
req.then(options.onSuccess, options.onError);
}
},
handleClick() {
if (!this.disabled) {
this.$refs.input.value = null;
this.$refs.input.click();
}
},
handleKeydown(e) {
if (e.target !== e.currentTarget) return;
if (e.keyCode === 13 || e.keyCode === 32) {
this.handleClick();
}
}
},
render(h) {
let {
handleClick,
drag,
name,
handleChange,
multiple,
accept,
listType,
uploadFiles,
disabled,
handleKeydown
} = this;
const data = {
class: {
'el-upload': true
},
on: {
click: handleClick,
keydown: handleKeydown
}
};
data.class[`el-upload--${listType}`] = true;
return (
<div {...data} tabindex="0" >
{
drag
? <upload-dragger disabled={disabled} on-file={uploadFiles}>{this.$slots.default}</upload-dragger>
: this.$slots.default
}
<input class="el-upload__input" type="file" ref="input" name={name} on-change={handleChange} multiple={multiple} accept={accept}></input>
</div>
);
}
};
</script>

View File

@ -0,0 +1,219 @@
<template>
<div v-loading="loading">
<!--上传的清单内容预览-->
<div v-if="checkResult.checkTemplateResult == 'ok'">
<div :style="{height: msgHeight}" v-html="checkResult.resultMsg"></div>
<div>
<el-table
id='table'
:height="tableHeight"
:data="tableData"
border
size="medium"
style="width: 100%">
<el-table-column
prop='index'
label=''
align='center'
width=50px
>
</el-table-column>
<el-table-column
v-for="(item) in tableTitle"
:key=item
:prop=item
:label="item">
<template slot-scope="scope">
<template v-if="scope.row[item] != undefined">
{{scope.row[item].value}}
<!--警告类提示上传可忽略-->
<span v-if="!scope.row[item].isRowOk && item == '名称'" style="color: #E6A23C">
<br/><b>{{scope.row[item].rowMsg}}</b>
</span>
<!--错误类提示不能上传-->
<span v-if="!scope.row[item].isOk" style="color: #ff0000">
<br/><b>{{scope.row[item].msg}}</b>
</span>
</template>
</template>
</el-table-column>
</el-table>
</div>
</div>
<!--上传的清单校验失败时显示内容-->
<div v-if="checkResult.checkTemplateResult != 'ok'">
<div style="background-color:#F56C6C;padding: 10px;" v-html="checkResult.checkTemplateResultMsg"></div>
</div>
</div>
</template>
<script>
import awsuiAxios from "../../awsuiAxios";
export default {
name: "check-process",
props: {
fileName: {//
type: String,
default: ''
},
totalHeight: {
type: String,
default: 0
}
},
data() {
return {
loading: false,
wsId: wsId,
teamId: teamId,
processFileValue: processFileValue,
msgHeight: '20px',
tableHeight: parseInt(this.totalHeight) - 20 + 'px',
tableTitle: [],
tableData: [],
checkResult: {
okData: [],
errData: [],
existData: [],
excelExistData: [],
resultMsg: '正在校验...',
chheckDone: false,
checkTemplateResult: 'ok',
checkTemplateResultMsg: '',
}
}
},
mounted() {
this.initData();
},
methods: {
initData() {
const that = this;
that.loading = true;
const params = {
url:'jd',
data:{
cmd : "com.actionsoft.apps.coe.pal.batch_create_process_data_check",
wsId: that.wsId,
teamId: that.teamId,
type: 'processList',
fileValue: that.processFileValue,
fileName: that.fileName
}
};
awsuiAxios.post(params).then(function (ro) {
that.loading = false;
if (ro.result == 'ok') {
//
that.tableTitle = ro.data.data.titleRow;
//
const data = ro.data.data.data;
//
let totalCount = 0;//
let okCount = 0;//
let existCount = 0;//
let errCount = 0;//
let errRowIndexArr = [];//
for (let i = 0; i < data.length; i++) {
let isOk = true;
let rowData = [];
let isExist = false;//
let isExcelExist = false;// excel
let excelExistRow = 0;// excel
let isRowErr = false;// excel
for (let j = 0; j < data[i].length; j++) {
let cell = data[i][j];
//
if (j == 0) {//
if (cell.isExist) {//
isExist = true;
} else if (cell.isExcelExist) {// excel
isExcelExist = true;
excelExistRow = cell.excelExistRow;
}
}
data[i][j].isRowOk = true;//
data[i][j].rowMsg = '';//
if (isExist) {
isOk = false;
data[i][j].isRowOk = false;
data[i][j].rowMsg = '资产库中已存在该流程';
} else if (isExcelExist) {
isOk = false;
data[i][j].isRowOk = false;
data[i][j].rowMsg = '流程与第' + excelExistRow + '行重复';
} else {
if (cell.isOk) {//
} else {
isOk = false;
isRowErr = true;
}
}
}
if (isRowErr) {
errRowIndexArr.push(i);
}
// tableData.push(rowData);
totalCount++;
if (isExist) {//
that.checkResult.existData.push(data[i]);
existCount++;
} else if (isExcelExist) {// excel
that.checkResult.excelExistData.push(data[i]);
existCount++;
} else if (isOk) {// excel
that.checkResult.okData.push(JSON.parse(JSON.stringify(data[i])));
okCount++;
} else {//
that.checkResult.errData.push(data[i]);
errCount++;
}
}
let result = '清单共<span style="font-weight:bold;">' + totalCount + '</span>条记录';
if (okCount > 0) {
if (totalCount == okCount) {
result += ',全部校验通过';
} else {
result += ',校验通过<span style="font-weight:bold;">' + okCount + '</span>条';
}
}
if (errCount > 0) {
result += ',校验失败<span style="color:red;font-weight:bold;">' + errCount + '</span>条';
}
if (existCount > 0) {
result += ',重复数据<span style="color:red;font-weight:bold;">' + existCount + '</span>条(上传时忽略)';
}
that.checkResult.resultMsg = result;
const tableData = [];
for (let i = 0; i < data.length; i++) {
const row = {};
const rowArr = data[i];
for (let j = 0; j < rowArr.length; j++) {
row[rowArr[j].name2] = rowArr[j];
}
row.index = i + 1;// 便
tableData.push(row);
}
that.tableData = tableData;
that.checkResult.chheckDone = true;
} else if (ro.result == 'warning') {
that.$message({message: ro.msg, type: 'warning'});
} else {// excel
// that.$message.error(ro.msg);
that.checkResult.checkTemplateResult = 'error';
that.checkResult.checkTemplateResultMsg = ro.msg;
}
}).catch(error=>{
console.log(error);
})
}
}
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,179 @@
<template>
<div v-loading="loading">
<!-- 校验结果 -->
<div v-if="checkResult.checkTemplateResult == 'ok'">
<awsui-tabs v-model="activeName">
<awsui-tab-pane v-for="(tabItem, index) in tabData" :key="tabItem.id" :name="tabItem.id">
<span slot="label"><span :style="{color: tabItem.isOk ? '' : 'red'}">{{tabItem.sheetName}}</span></span>
<div :style="{height: msgHeight}" v-html="checkResult.resultMsg[index]"></div>
<div>
<el-table
id='table'
:height="tableHeight"
:data="tabItem.data"
border
size="medium"
style="width: 100%">
<el-table-column
prop='index'
label=''
align='center'
width=50px
>
</el-table-column>
<el-table-column
v-for="(item) in tabItem.titleRow"
:key=item
:prop=item
:label="item">
<template slot-scope="scope">
<template v-if="scope.row[item] != undefined">
{{scope.row[item].value}}
<!--警告类提示上传可忽略-->
<span v-if="!scope.row[item].isRowOk && item == '名称'" style="color: #E6A23C">
<br/><b>{{scope.row[item].rowMsg}}</b>
</span>
<!--错误类提示不能上传-->
<span v-if="!scope.row[item].isOk" style="color: #ff0000">
<br/><b>{{scope.row[item].msg}}</b>
</span>
</template>
</template>
</el-table-column>
</el-table>
</div>
</awsui-tab-pane>
</awsui-tabs>
</div>
<!-- excel错误提示 -->
<div v-if="checkResult.checkTemplateResult != 'ok'">
<div style="background-color:#F56C6C;padding: 10px;" v-html="checkResult.checkTemplateResultMsg"></div>
</div>
</div>
</template>
<script>
import awsuiAxios from "../../awsuiAxios";
export default {
name: "check-shape",
props: {
fileName: {//
type: String,
default: ''
},
totalHeight: {
type: String,
default: 0
}
},
data() {
return {
loading: false,
wsId: wsId,
teamId: teamId,
shapeFileValue: shapeFileValue,
msgHeight: '20px',
tableHeight: parseInt(this.totalHeight) - 20 - 45 + 'px',
activeName: 'first',
tabData: [],
checkResult: {
isOk: true,
okData: [],
resultMsg: [],
chheckDone: false,
checkTemplateResult: 'ok',
checkTemplateResultMsg: [],
}
}
},
mounted() {
this.initData();
},
methods: {
initData() {
const that = this;
that.loading = true;
const params = {
url:'jd',
data:{
cmd : "com.actionsoft.apps.coe.pal.batch_create_process_data_check",
wsId: that.wsId,
teamId: that.teamId,
type: 'shapeList',
fileValue: that.shapeFileValue,
fileName: that.fileName
}
};
awsuiAxios.post(params).then(function (ro) {
that.loading = false;
if (ro.result == 'ok') {
const data = ro.data;
that.checkResult.okData = JSON.parse(JSON.stringify(data));
for (let i = 0; i < data.length; i++) {
if (i == 0) {
that.activeName = data[i].id;
}
const tableDataTemp = [];
const tableData = data[i].data;
let msg = '清单共<span style="font-weight:bold;">' + tableData.length + '</span>条记录';
let okCount = 0;
let errCount = 0;
for (let j = 0; j < tableData.length; j++) {
const row = {};
const rowArr = tableData[j];
let isRowOk = true;//
for (let m = 0; m < rowArr.length; m++) {
if (!rowArr[m].isOk) {
isRowOk = false;
break;
}
}
for (let m = 0; m < rowArr.length; m++) {
row[rowArr[m].name2] = rowArr[m];
}
row.index = j + 1;// 便
tableDataTemp.push(row);
if (isRowOk) {
okCount++;
} else {
errCount++;
that.checkResult.isOk = false;
}
}
if (okCount == tableData.length) {
msg += ',全部校验通过';
} else if (errCount == tableData.length) {
msg += ',全部校验失败';
} else {
msg += ',校验通过<span style="font-weight:bold;">' + okCount + '</span>条';
msg += ',校验失败<span style="color:red;font-weight:bold;">' + errCount + '</span>条';
}
that.checkResult.resultMsg.push(msg);
data[i].data = tableDataTemp;
}
that.tabData = ro.data;
that.checkResult.chheckDone = true;
} else if (ro.result == 'warning') {
that.$message({message: ro.msg, type: 'warning'});
} else {// excel
// that.$message.error(ro.msg);
that.checkResult.checkTemplateResult = 'error';
that.checkResult.checkTemplateResultMsg = ro.msg;
}
}).catch(error=>{
console.log(error);
})
},
handleClick() {
alert(this.activeName)
}
}
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1 @@
说明:批量创建-批量创建模型结构-下载Excel模板-选择树组件

View File

@ -0,0 +1,360 @@
<template>
<el-container>
<el-dialog
id="palRepositoryTree"
:title="title"
:visible.sync="dialogVisible"
:destroy-on-close=true
:width="width"
:modal-append-to-body=false
:append-to-body=true
:close-on-click-modal=false
:before-close="handleClose">
<template v-if="refresh">
<div
v-loading="loading"
element-loading-text="拼命加载中">
<el-autocomplete
v-model="treeSearchKey"
size="small"
:fetch-suggestions="treeSearch"
@select="treeSearchSelect"
suffix-icon="el-icon-search"
placeholder="快速查询"
:trigger-on-focus=false
style="width:100%;"
>
<template slot-scope="{ item }">
<el-tooltip class="item" placement="bottom-start">
<div slot="content">{{item.pathName}}</div>
<span>{{ item.name }}</span>
</el-tooltip>
</template>
</el-autocomplete>
<div style="height: 200px;overflow: auto;border: 1px solid #f2f2f2;">
<div class="tree">
<el-tree
ref="tree"
:props="treeProps"
:expand-on-click-node=false
:highlight-current=true
@node-click="openNode"
@node-expand="expandNode"
@node-collapse="closeNode"
@check-change="checkedNode"
:show-checkbox=multiple
node-key="id"
check-strictly
lazy
:load="loadNode">
<span slot-scope="{node, data}">
<i class="awsui-iconfont tree-content-icon tree-content-icon-padding" :style="{'color': node.data.icon.color}" v-html="node.data.icon.icon"></i>
<span>{{node.label}}</span>
</span>
</el-tree>
</div>
</div>
</div>
</template>
<span slot="footer" class="dialog-footer">
<awsui-button class="button-general-color" type="primary" @click="submit">确定</awsui-button>
<awsui-button @click="cancel">取消</awsui-button>
</span>
</el-dialog>
</el-container>
</template>
<script>
import awsuiAxios from "../../../../awsuiAxios";
export default {
name: "PALRepositoryTree",
props: {
visible: {
type: Boolean,
default: false
},
wsId: {// ID
type: String,
default: '',
required: true
},
teamId: {// ID
type: String,
default: ''
},
categorys: {// ,
type: String,
default: ''
},
rootId: {//
type: String,
default: ''
},
multiple: {//
type: Boolean,
default: false
},
title: {//
type: String,
default: '请选择'
},
// width: {//
// type: String,
// default: '500px'
// },
selected: {// []
type: Array,
default: function () {
return []
}
}
},
data() {
return {
refresh: false,
dialogVisible: false,
loading: false,
searchKey: '',
treeSearchKey: '',
timeout: null,
pid: '',
width: '500px',
treeProps: {
label: 'name',
isLeaf: 'leaf'
},
data: [],
};
},
methods: {
handleClose(done) {
this.closeDlalog('cancel');
done();
},
cancel() {
this.closeDlalog('cancel');
this.dialogVisible = false;
},
submit() {
this.closeDlalog('save');
this.dialogVisible = false;
},
closeDlalog(type) {// /
if (type == 'save') {
let result = [];
if (this.multiple) {//
result = this.data;
} else {//
const node = this.$refs.tree.getCurrentNode();
if (node != null) {
result.push(node);
}
}
this.$emit('getResult', result);
} else {
this.$emit('cancel');
}
//
},
handleNodeClick(data) {
console.log(data);
},
openNode(obj, node, tree) {//
},
treeSearchSelect(item) {
this.queryTreeByIdAndPath(item.id, item.versionId, item.path);
},
treeSearch(key, cb) {
const that = this;
if (key != undefined && key.trim() != '') {
// that.loading = true;
const data = {
url:'jd',
data:{
cmd: 'com.actionsoft.apps.coe.pal_repository_tree_component_search',
wsId: that.wsId,
teamId: that.teamId,
categorys: that.categorys,
rootId: that.rootId,
name: key
}
};
//
awsuiAxios.post(data).then(function (ro) {
if (ro.result == 'ok') {
if (ro.data.length > 0) {
clearTimeout(that.timeout);
that.timeout = setTimeout(() => {
cb(ro.data);
}, 3000 * Math.random());
} else {
clearTimeout(that.timeout);
}
} else {
clearTimeout(that.timeout);
}
}).catch(error=>{
console.log(error);
})
} else {
clearTimeout(that.timeout);
}
},
queryTreeByIdAndPath(id, versionId, path) {//
const that= this;
const tree = that.$refs.tree;
//
const pathArr = path.split(',');
let index = 1;
for (let i = 0; i < pathArr.length; i++) {//
if (i > 0) {
if (tree.getNode(pathArr[i-1]) != null) {
setTimeout(that._expandNode(tree, pathArr[i-1]), index * 300);
index++;
}
}
}
setTimeout(function() {
if (tree.getNode(versionId) != null) {
tree.setCurrentKey(versionId);
}
}, index * 300);
},
_expandNode(tree, versionId) {
return function() {
tree.getNode(versionId).expand();
}
},
loadNode(node, resolve) {// ``
const that = this;
that.loading = true;
const data = {
url:'jd',
data:{
cmd: 'com.actionsoft.apps.coe.pal.batch_create_repository_tree_data',
wsId: that.wsId,
teamId: that.teamId,
categorys: that.categorys,
pid: ''
}
};
if (node.level === 0) {
//
data.data.pid = that.pid;
} else {
//
data.data.pid = node.data.id;
}
//
awsuiAxios.post(data).then(function (ro) {
resolve(ro.data);
that.loading = false;
if (node.level == 0 && ro.data.length > 0) {
const tree = that.$refs.tree;
tree.getNode(ro.data[0].id).expand();
setTimeout(function(){
const childNode = tree.getNode(ro.data[0].id).childNodes[0];
if (childNode != null) {
childNode.expand();
}
}, 500);
}
}).catch(error=>{
console.log(error);
})
},
expandNode(obj, node, tree) {//
},
closeNode(obj, node, tree) {//
node.childNodes = [];
node.loaded = false;
},
checkedNode(data, checked, subChecked) {//
//
const that = this;
const params = {
url:'jd',
data:{
cmd: 'com.actionsoft.apps.coe.pal.batch_create_repository_all_child_data_query',
wsId: that.wsId,
teamId: that.teamId,
pid: data.id
}
};
awsuiAxios.post(params).then(function (ro) {
const childVerIds = ro.data;//
const currVerId = data.versionId;// versionId
if (checked) {//
const checkedVerIds = that.data;
if (checkedVerIds.indexOf(currVerId) == -1) {
checkedVerIds.push(currVerId);
}
for (let i = 0; i < childVerIds.length; i++) {
if (checkedVerIds.indexOf(childVerIds[i]) == -1) {
checkedVerIds.push(childVerIds[i]);
}
}
that.$refs.tree.setCheckedKeys(checkedVerIds);
} else {//
const checkedVerIds = that.data;
const tempArr = [];
for (let i = 0; i < checkedVerIds.length; i++) {
if (checkedVerIds[i] != currVerId && childVerIds.indexOf(checkedVerIds[i]) == -1) {
tempArr.push(checkedVerIds[i]);
}
}
that.data = tempArr;
that.$refs.tree.setCheckedKeys(that.data);
}
}).catch(error=>{
console.log(error);
})
}
},
watch: {
visible(val) {
this.dialogVisible = val;
if (val) {//
this.pid = this.rootId;
this.refresh = true;
} else {//
this.refresh = false;
}
}
}
}
</script>
<style scoped>
#palRepositoryTree >>> .el-dialog__body {
padding: 10px 20px;
color: #606266;
font-size: 14px;
word-break: break-all;
}
#palRepositoryTree >>> .el-input__inner {
border-radius: 0px;
}
#palRepositoryTree >>> .el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content {
background-color: #F5F7FA;
color: #4E7FF9;
}
#palRepositoryTree >>> .el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content .awsui-iconfont {
color: #4E7FF9 !important;
}
/*#palRepositoryTree >>> .el-tree .el-tree-node>.el-tree-node__children{*/
/* overflow: visible;*/
/*}*/
.tree{
overflow: auto;
width:458px;
height: 200px;
}
#palRepositoryTree >>> .el-tree {
min-width: 100%;
display:inline-block !important;
}
</style>

View File

@ -0,0 +1,7 @@
import CreateTree from './component'
CreateTree.install = function(Vue) {
Vue.component(CreateTree.name, CreateTree);
}
export default CreateTree;

View File

@ -0,0 +1,457 @@
<template>
<awsui-layout>
<awsui-header id="header">
<el-steps :active="active" align-center>
<el-step title="上传" icon="el-icon-upload"></el-step>
<el-step title="校验" icon="el-icon-warning"></el-step>
<el-step title="结果" icon="el-icon-success"></el-step>
</el-steps>
</awsui-header>
<awsui-main :style="{height: mainHeight, padding: '0'}">
<!-- 上传 -->
<div v-if="this.active == 1" :style="{height: parseInt(mainHeight) - 40 + 'px', width: '100%'}">
<awsui-tabs v-model="uploadStep.activeName">
<awsui-tab-pane label="批量创建流程清单" name="processList">
<div v-loading="uploadStep.loading">
<!-- 文件上传功能 -->
<div v-show="uploadStep.processUpload.status == 0" style="text-align: center;padding-top: 220px;">
<awsui-button type="primary" class="button-general-color" style="margin: 0;" @click="uploadFile('process')">上传Excel文件</awsui-button>
<div style="padding-top: 30px;">
<span class="text-linker-color" style="cursor: pointer;" @click.stop="downloadTemplate('processList')">下载Excel模板</span>
</div>
</div>
<!-- 已上传文件删除 -->
<div v-show="uploadStep.processUpload.status == 1" style="text-align: center;">
<div style="padding-top: 220px;">
<div style="display:inline-block;height: 28px;width:119px;line-height: 28px;vertical-align: middle;background-color: #DEDEDE">
已上传文件
</div>
</div>
<div style="padding-top: 30px;">
<span class="text-linker-color" style="cursor: pointer;" @click="downLoadUploaded(processFileValue, uploadStep.processUpload.data.name)">{{uploadStep.processUpload.data.name}}</span>
<i class="awsui-iconfont" style="cursor: pointer;" @click="deleteUploaded(processFileValue, uploadStep.processUpload.data.name)">&#xe626;</i>
</div>
</div>
<div v-show="false">
<pal-upload ref="processUpload" style="width: 100%;"
class="upload-demo"
:appId=appId
:repositoryName=repositoryName
:groupValue=groupValue
:fileValue=processFileValue
:on-preview="handleProcessPreview"
:on-success="handleProcessSuccess"
:on-remove="handleProcessRemove"
:on-error="handleProcessError"
:before-remove="beforeProcessRemove"
:before-upload="beforeProcessUpload"
:limit="1"
:on-exceed="handleProcessExceed"
accept=".xlsx"
:file-list="uploadStep.processUpload.fileList">
<div style="display: none;">
<awsui-button id="selectProcessFileButton" style="width: 130px;" class="button-general-color" type="primary">本地文件上传</awsui-button>
</div>
</pal-upload>
</div>
</div>
</awsui-tab-pane>
<awsui-tab-pane label="批量创建模型结构" name="shapeList">
<div v-loading="uploadStep.loading">
<!-- 文件上传功能 -->
<div v-show="uploadStep.shapeUpload.status == 0" style="text-align: center;padding-top: 220px;">
<awsui-button type="primary" class="button-general-color" style="margin: 0;" @click="uploadFile('shape')">上传Excel文件</awsui-button>
<div style="padding-top: 30px;">
<span class="text-linker-color" style="cursor: pointer;" @click="openRepositoryTreeDlg">下载Excel模板</span>
</div>
</div>
<!-- 已上传文件删除 -->
<div v-show="uploadStep.shapeUpload.status == 1" style="text-align: center;">
<div style="padding-top: 220px;">
<div style="display:inline-block;height: 28px;width:119px;line-height: 28px;vertical-align: middle;background-color: #DEDEDE">
已上传文件
</div>
</div>
<div style="padding-top: 30px;">
<span class="text-linker-color" style="cursor: pointer;" @click="downLoadUploaded(shapeFileValue, uploadStep.shapeUpload.data.name)">{{uploadStep.shapeUpload.data.name}}</span>
<i class="awsui-iconfont" style="cursor: pointer;" @click="deleteUploaded(shapeFileValue, uploadStep.shapeUpload.data.name)">&#xe626;</i>
</div>
</div>
<div v-show="false">
<pal-upload ref="shapeUpload" style="width: 100%;"
class="upload-demo"
:appId=appId
:repositoryName=repositoryName
:groupValue=groupValue
:fileValue=shapeFileValue
:on-preview="handleShapePreview"
:on-success="handleShapeSuccess"
:on-remove="handleShapeRemove"
:on-error="handleShapeError"
:before-remove="beforeShapeRemove"
:before-upload="beforeShapeUpload"
:limit="1"
:on-exceed="handleShapeExceed"
accept=".xlsx"
:file-list="uploadStep.shapeUpload.fileList">
<div style="display: none;">
<awsui-button id="selectShapeFileButton" style="width: 130px;" class="button-general-color" type="primary">本地文件上传</awsui-button>
</div>
</pal-upload>
</div>
</div>
<create-tree
ref="createTree"
:visible.sync="uploadStep.shapeUpload.createTree.visible"
:wsId="wsId"
:teamId="teamId"
:categorys="methodCategory"
:multiple=true
v-on:cancel="uploadStep.shapeUpload.createTree.visible = false"
v-on:getResult="saveCreateTreeResult"
:title="uploadStep.shapeUpload.createTree.title"
></create-tree>
</awsui-tab-pane>
</awsui-tabs>
</div>
<!-- 校验 -->
<div v-if="this.active == 2" :style="{height: parseInt(mainHeight) - 40 + 'px', width: '100%'}">
<template v-if="checkStep.type == 'processList'">
<check-process ref="processListCheck" :file-name="uploadStep.processUpload.data.name" :totalHeight="mainHeight"/>
</template>
<template v-if="checkStep.type == 'shapeList'">
<check-shape ref="shapeListCheck" :file-name="uploadStep.shapeUpload.data.name" :totalHeight="mainHeight"/>
</template>
</div>
<!-- 结果 -->
<div v-if="this.active == 3" :style="{height: parseInt(mainHeight) - 40 + 'px', width: '100%'}">
<save ref="save" :totalHeight="mainHeight" :param="saveData"/>
</div>
</awsui-main>
<awsui-footer>
<div style="float: right;">
<awsui-button v-if="this.active == 2" style="margin-top: 12px;" @click="prev">上一步</awsui-button>
<awsui-button v-if="this.active == 1 || this.active == 2" style="margin-top: 12px;" @click="next">下一步</awsui-button>
<template v-if="this.active == 3">
<awsui-button style="margin-top: 12px;" @click="downloadLog">导出报告</awsui-button>
<awsui-button style="margin-top: 12px;" @click="success">完成</awsui-button>
</template>
</div>
</awsui-footer>
</awsui-layout>
</template>
<script>
import palUpload from '../components/upload/index';
import awsuiAxios from "../../awsuiAxios";
import createTree from './components/createTree/index';
import checkProcess from './check-process';
import checkShape from './check-shape';
import save from './save';
import Save from './save.vue';
export default {
name: "create",
components: {palUpload, createTree, checkProcess, checkShape, save},
data() {
return {
active: 1,
wsId: wsId,
teamId: teamId,
methodCategory: methodCategory,
appId: appId,
repositoryName: repositoryName,
groupValue: groupValue,
processFileValue: processFileValue,
shapeFileValue: shapeFileValue,
mainHeight: (document.documentElement.clientHeight) - 60 - 40 + 'px',
uploadStep: {
activeName: 'processList',
loading: false,
processUpload: {//
status: 0,
fileList: [],//
data: {},//
},
shapeUpload: {//
status: 0,
fileList: [],
data: {},
createTree : {
visible: false,
title: '请选择流程'
}
}
},
checkStep: {
type: ''
},
fileList: [],
saveData: {//
wsId: wsId,
teamId: teamId,
type: '',
fileValue: '',
fileName: '',
data: {
okData: []
}
}
};
},
mounted() {
const that = this;
that.resize();
},
methods: {
prev() {//
if (this.active == 2) {
this.checkStep.type = '';
}
this.active--;
},
next() {//
if (this.active == 1) {//
if (!this.checkUploadFile()) {
this.$message({message: '请上传Excel文件', type: 'warning'});
return;
}
this.checkStep.type = this.uploadStep.activeName;
} else if (this.active == 2) {
if (this.checkStep.type == 'processList') {//
const result = this.$refs.processListCheck.checkResult;
if (!result.chheckDone) {
this.$message({message: '正在校验或校验未通过,不支持此操作', type: 'warning'});
return;
}
if (result.errData.length > 0) {
this.$message({message: '校验未通过', type: 'warning'});
return;
}
if (result.okData.length == 0) {
this.$message({message: '上传文件无数据', type: 'warning'});
return;
}
this.saveData.type = 'processList';
this.saveData.fileValue = this.processFileValue;
this.saveData.fileName = this.uploadStep.processUpload.data.name;
this.saveData.data.okData = result.okData;
} else {//
const result = this.$refs.shapeListCheck.checkResult;
if (!result.chheckDone) {
this.$message({message: '正在校验或校验未通过,不支持此操作', type: 'warning'});
return;
}
if (!result.isOk) {
this.$message({message: '校验未通过', type: 'warning'});
return;
}
this.saveData.type = 'shapeList';
this.saveData.fileValue = this.shapeFileValue;
this.saveData.fileName = this.uploadStep.shapeUpload.data.name;
this.saveData.data.okData = result.okData;
}
}
this.active++;
},
success() {//
parent.closeBatchCreateFn([]);
},
downloadLog() {//
this.$refs.save.downloadLog();
},
checkUploadFile() {//
if (this.uploadStep.activeName == 'processList') {
if (this.uploadStep.processUpload.status == 1) {
return true;
}
} else if (this.uploadStep.activeName == 'shapeList') {
if (this.uploadStep.shapeUpload.status == 1) {
return true;
}
}
return false;
},
uploadFile(type) {//
if (type == 'process') {//
this.$refs.processUpload.clearFiles();
document.getElementById("selectProcessFileButton").click();
} else {//
this.$refs.shapeUpload.clearFiles();
document.getElementById("selectShapeFileButton").click();
}
},
downloadTemplate(type, versionIds) { //
const that = this;
that.uploadStep.loading = true;
const data = {
url:'jd',
data:{
cmd : "com.actionsoft.apps.coe.pal.batch_create_download_template",
wsId : that.wsId,
type : type,
versionIds : versionIds
}
};
awsuiAxios.post(data).then(function (ro) {
that.uploadStep.loading = false;
if (ro.result == 'ok') {
window.open(ro.data.url);
} else if (ro.result == 'warning') {
that.$message({message: ro.msg, type: 'warning'});
} else {
that.$message.error(ro.msg);
}
}).catch(error=>{
console.log(error);
})
},
downLoadUploaded(fileValue, name) {//
const that = this;
that.uploadStep.loading = true;
const data = {
url:'jd',
data:{
cmd : "com.actionsoft.apps.coe.pal.batch_create_uploaded_file_download",
fileValue : fileValue,
fileName : name
}
};
awsuiAxios.post(data).then(function (ro) {
that.uploadStep.loading = false;
if (ro.result == 'ok') {
window.location.href = ro.data.url;
} else if (ro.result == 'warning') {
that.$message({message: ro.msg, type: 'warning'});
} else {
that.$message.error(ro.msg);
}
}).catch(error=>{
console.log(error);
})
},
deleteUploaded(fileValue, name) {//
const that = this;
that.uploadStep.loading = true;
const data = {
url:'jd',
data:{
cmd : "com.actionsoft.apps.coe.pal.batch_create_uploaded_file_delete",
fileValue : fileValue,
fileName : name
}
};
awsuiAxios.post(data).then(function (ro) {
that.uploadStep.loading = false;
if (ro.result == 'ok') {
if (that.uploadStep.activeName == 'processList') {//
that.$refs.processUpload.clearFiles();
that.uploadStep.processUpload.status = 0;
that.uploadStep.processUpload.data = {};
} else {//
that.$refs.shapeUpload.clearFiles();
that.uploadStep.shapeUpload.status = 0;
that.uploadStep.shapeUpload.data = {};
}
} else if (ro.result == 'warning') {
that.$message({message: ro.msg, type: 'warning'});
} else {
that.$message.error(ro.msg);
}
}).catch(error=>{
console.log(error);
})
},
/******模型结构模板下载start*******/
openRepositoryTreeDlg () {//
this.uploadStep.shapeUpload.createTree.visible = true;
},
saveCreateTreeResult(data) {//
if (data.length == 0) {
this.$message({message: '未选择任何模型,下载模板被取消', type: 'warning'});
} else {
this.downloadTemplate('shapeList', data.join(','));
}
},
/******模型结构模板下载end*******/
/******模型清单模板上传start*********/
handleProcessRemove(file, fileList) {
this.uploadStep.processUpload.status = 0;
},
handleProcessPreview(file) {
},
handleProcessExceed(files, fileList) {
},
handleProcessError(err, file, fileList) {
},
beforeProcessUpload(file) {
//
if (file.size / 1024 / 1024 > 10) { //10M
this.$message.warning('文件不允许超过10M');
return false;
}
},
handleProcessSuccess(response, file, fileList) {
const that = this;
that.uploadStep.processUpload.status = 1;
that.uploadStep.processUpload.data = {
name: file.name,
size: file.size
};
},
beforeProcessRemove(file, fileList) {
},
/******模型清单模板上传end*********/
/******模型结构模板上传start*********/
handleShapeRemove(file, fileList) {
this.uploadStep.shapeUpload.status = 0;
},
handleShapePreview(file) {
},
handleShapeExceed(files, fileList) {
},
handleShapeError(err, file, fileList) {
},
beforeShapeUpload(file) {
//
if (file.size / 1024 / 1024 > 10) { //10M
this.$message.warning('文件不允许超过10M');
return false;
}
},
handleShapeSuccess(response, file, fileList) {
const that = this;
that.uploadStep.shapeUpload.status = 1;
that.uploadStep.shapeUpload.data = {
name: file.name,
size: file.size
};
},
beforeShapeRemove(file, fileList) {
},
/******模型结构模板上传end*********/
resize() {// window.resize
const that = this
let resizeTimer = null;
window.onresize = () => {
return (() => {
if (resizeTimer) clearTimeout(resizeTimer);
resizeTimer = setTimeout(function(){
that.mainHeight = (document.documentElement.clientHeight) - 60 - 40 + 'px';
} , 400);
})()
}
},
}
}
</script>
<style scoped>
#header >>> .el-step__title {
font-size: 14px;
}
</style>

View File

@ -0,0 +1,184 @@
<template>
<div v-loading="loading" :style="{height: mainHeight, 'background-color': '#2c2c2c'}">
<codemirror
id="mycode"
ref="mycode"
style="height: auto"
v-model="curCode"
:options="cmOptions"
class="code"
/>
</div>
</template>
<script>
import awsuiAxios from "../../awsuiAxios";
import { codemirror } from 'vue-codemirror'
import "codemirror/theme/ambiance.css"; // theme
require("codemirror/mode/javascript/javascript"); // jsmode
export default {
name: "check-process",
props: {
param: {//
type: Object,
default: function () {
return {}
}
},
totalHeight: {
type: String,
default: 0
}
},
components: {codemirror},
data() {
return {
loading: false,
wsId: wsId,
teamId: teamId,
processFileValue: processFileValue,
msgHeight: '20px',
mainHeight: parseInt(this.totalHeight) + 'px',
curCode: '正在导入',
cmOptions: {
value:'',
mode:"text/html",
theme: "ambiance",
lineNumbers: false,
styleActiveLine: true,
tabSize: 4,
autofocus: true,
scrollbarStyle: "null",
readOnly:true,
},
result: {//
path: '',
type: '',
logId: '',
count: 0,
executeDone: false,
interval: null, //
timer:0, //
}
}
},
mounted() {
this.save();
},
methods: {
save() {//
const that = this;
const data = {
url:'jd',
data:{
cmd : "com.actionsoft.apps.coe.pal.batch_create_data_save",
param : JSON.stringify(that.param)
}
};
awsuiAxios.post(data).then(function (ro) {
if (ro.result == 'ok') {
//
that.result.path = ro.data.path;
that.result.logId = ro.data.logId;
that.result.type = ro.data.type;
that.result.count = 0;
that.getImportInfoEvent();
} else if (ro.result == 'warning') {
that.$message({message: ro.msg, type: 'warning'});
} else {
that.$message.error(ro.msg);
}
}).catch(error=>{
console.log(error);
})
},
getImportInfoEvent() {//
this.result.interval = setInterval(this.queryLog, 1000)
},
queryLog() {
const that = this;
that.result.timer = new Date().getTime();
const data = {
url:'jd',
data:{
cmd : "com.actionsoft.apps.coe.pal.batch_create_log_query",
type: that.result.type,
logId: that.result.logId,
path: that.result.path,
timer: that.result.timer
}
};
awsuiAxios.post(data).then(function (ro) {
if (ro.result == 'ok') {
if (ro.data.timer == '') {
that.curCode = ro.data.content;
//
that.$nextTick(()=> {
that.$refs.mycode.codemirror.scrollIntoView(that.$refs.mycode.codemirror.lineCount() - 1);
});
that.result.executeDone = true;
that.clearInterval();
} else if (parseInt(ro.data.timer) <= that.result.timer){// axios
that.curCode = ro.data.content;
//
that.$nextTick(()=> {
that.$refs.mycode.codemirror.scrollIntoView(that.$refs.mycode.codemirror.lineCount() - 1);
});
}
} else if (ro.result == 'warning') {
that.$message({message: ro.msg, type: 'warning'});
} else {
that.$message.error(ro.msg);
}
}).catch(error=>{
console.log(error);
})
},
clearInterval() {
clearInterval(this.result.interval);
},
downloadLog() {
const that = this;
if (that.result.path == '') {
that.$message({message: '获取报告失败', type: 'warning'});
return;
}
if (!that.result.executeDone) {
that.$message({message: '正在导入,请稍等', type: 'warning'});
return;
}
const data = {
url:'jd',
data:{
cmd : "com.actionsoft.apps.coe.pal.batch_create_log_download",
type: that.result.type,
path: that.result.path
}
};
awsuiAxios.post(data).then(function (ro) {
if (ro.result == 'ok') {
window.open(ro.data.url);
parent.closeBatchCreateFn([]);
} else if (ro.result == 'warning') {
that.$message({message: ro.msg, type: 'warning'});
} else {
that.$message.error(ro.msg);
}
}).catch(error=>{
console.log(error);
})
}
}
}
</script>
<style scoped>
#mycode >>> .CodeMirror-lines {
background-color: #2c2c2c;
color: #58A0F0;
}
#mycode >>> .CodeMirror {
height: auto !important;
}
</style>

View File

@ -0,0 +1,3 @@
说明调用aws平台的部门、人员、角色组件
复制的com.actionsoft.apps.coe.pal/src/components/common/BPMOrgAddress组件
如有任何bug请修改com.actionsoft.apps.coe.pal/src/components/common/BPMOrgAddress中的组件并完全覆盖此组件并修改该组件的awsuiAxios引用地址

View File

@ -0,0 +1,352 @@
<template>
<el-container>
<el-dialog
id="bpmOrgAddress"
:title="title"
:visible.sync="dialogVisible"
:destroy-on-close=true
:width="width"
:modal-append-to-body=false
:append-to-body=true
:close-on-click-modal=false
:before-close="handleClose">
<template v-if="refresh">
<div
v-loading="loading"
element-loading-text="拼命加载中">
<!-- <el-autocomplete-->
<!-- v-model="treeSearchKey"-->
<!-- size="small"-->
<!-- :fetch-suggestions="treeSearch"-->
<!-- @select="treeSearchSelect"-->
<!-- suffix-icon="el-icon-search"-->
<!-- placeholder="快速查询"-->
<!-- :trigger-on-focus=false-->
<!-- style="width:100%;">-->
<!-- <template slot-scope="{ item }">-->
<!-- <el-tooltip class="item" placement="bottom">-->
<!-- <div slot="content">{{item.pathName}}</div>-->
<!-- <span>{{ item.name }}</span>-->
<!-- </el-tooltip>-->
<!-- </template>-->
<!-- </el-autocomplete>-->
<div style="height: 300px;overflow: auto;border: 1px solid #f2f2f2;">
<div class="tree">
<el-tree
ref="tree"
:props="treeProps"
:show-checkbox="multiple"
:expand-on-click-node=false
:check-strictly=true
:highlight-current=true
@node-click="openNode"
@node-expand="expandNode"
@node-collapse="closeNode"
node-key="id"
lazy
:load="loadNode">
<span slot-scope="{node, data}">
<i class="awsui-iconfont tree-content-icon tree-content-icon-padding" :style="{'color': node.data.icon.color}" v-html="node.data.icon.icon"></i>
<span>{{node.label}}</span>
</span>
</el-tree>
</div>
</div>
</div>
</template>
<span slot="footer" class="dialog-footer">
<awsui-button class="button-general-color" type="primary" @click="submit">确定</awsui-button>
<awsui-button @click="cancel">取消</awsui-button>
</span>
</el-dialog>
</el-container>
</template>
<script>
import awsuiAxios from "../../../../awsuiAxios";
export default {
name: "BpmOrgAddress",
props: {
visible: {
type: Boolean,
default: false
},
addressType: {// 簿簿departmentuserrole
type: String,
default: 'department'
},
multiple: {//
type: Boolean,
default: false
},
rootDeptId: {// ,
type: String,
default: ''
},
highSecurityFilter: {// 簿 簿usersysAdminsecAdminauditor
type: String,
default: ''// sysAdmin,auditor簿
},
title: {//
type: String,
default: ''
},
selected: {// {'department':[],'user':[],'role':[],'position':[]}
type: Object,
default: function () {
return {'department':[],'user':[],'role':[],'position':[]}
}
}
},
data() {
return {
refresh: false,
dialogVisible: false,
loading: false,
searchKey: '',
treeSearchKey: '',
timeout: null,
pid: '',
width: '500px',
treeProps: {
label: 'name',
isLeaf: 'leaf'
}
};
},
methods: {
handleClose(done) {
this.closeDlalog('cancel');
done();
},
cancel() {
this.closeDlalog('cancel');
this.dialogVisible = false;
},
submit() {
this.closeDlalog('save');
this.dialogVisible = false;
},
closeDlalog(type) {// /
if (type == 'save') {
let result = [];
if (this.multiple) {//
result = this.$refs.tree.getCheckedNodes();
} else {//
const node = this.$refs.tree.getCurrentNode();
if (node != null) {
result.push(node);
}
}
this.$emit('getResult', JSON.parse(JSON.stringify(result)));
} else {
this.$emit('cancel');
}
//
},
handleNodeClick(data) {
// console.log(data);
},
openNode(obj, node, tree) {//
},
treeSearchSelect(item) {
this.queryTreeByIdAndPath(item.id, item.path);
},
treeSearch(key, cb) {
const that = this;
if (key != undefined && key.trim() != '') {
// that.loading = true;
const data = {
url:'jd',
data:{
cmd: 'com.actionsoft.apps.coe.pal_repository_tree_component_search',
addressType: that.addressType,
rootDeptId: that.rootDeptId,
name: key
}
};
//
awsuiAxios.post(data).then(function (ro) {
if (ro.result == 'ok') {
if (ro.data.length > 0) {
clearTimeout(that.timeout);
that.timeout = setTimeout(() => {
cb(ro.data);
}, 3000 * Math.random());
} else {
clearTimeout(that.timeout);
}
} else {
clearTimeout(that.timeout);
}
}).catch(error=>{
console.log(error);
})
} else {
clearTimeout(that.timeout);
}
},
queryTreeByIdAndPath(id, path) {//
const that= this;
const tree = that.$refs.tree;
//
const pathArr = path.split(',');
let index = 1;
for (let i = 0; i < pathArr.length; i++) {//
if (i > 0) {
if (tree.getNode(pathArr[i-1]) != null) {
setTimeout(that._expandNode(tree, pathArr[i-1]), index * 300);
index++;
}
}
}
setTimeout(function() {
if (tree.getNode(id) != null) {
tree.setCurrentKey(id);
}
}, index * 300);
},
_expandNode(tree, id) {
return function() {
tree.getNode(id).expand();
}
},
loadNode(node, resolve) {// ``
const that = this;
that.loading = true;
const data = {
url:'jd',
data:{
cmd: 'com.actionsoft.apps.coe.pal_bpm_org_address_component_subjson',
addressType: that.addressType,
pid: '',
highSecurityFilter: that.highSecurityFilter
}
};
if (node.level === 0) {
//
data.data.pid = that.pid;
data.data.parentType = '';
} else {
//
data.data.pid = node.data.id;
data.data.parentType = node.data.type;
}
//
awsuiAxios.post(data).then(function (ro) {
//
if (that.multiple) {//
const isDept = that.addressType.indexOf('department') > -1;
const isUser = that.addressType.indexOf('user') > -1;
const isRole = that.addressType.indexOf('role') > -1;
const isPosition = that.addressType.indexOf('position') > -1;
for (let i = 0; i < ro.data.length; i++) {
const curr = ro.data[i];
if (curr.type == 'company' || curr.type == 'roleRoot' || curr.type == 'roleGroup' || curr.type == 'positionRoot' || curr.type == 'positionGroup') {
curr.disabled = true;
} else {
if (isDept && curr.type == 'department') curr.disabled = false;
if (!isDept && curr.type == 'department') curr.disabled = true;
if (isUser && curr.type == 'user') curr.disabled = false;
if (!isUser && curr.type == 'user') curr.disabled = true;
if (isRole && curr.type == 'role') curr.disabled = false;
if (!isRole && curr.type == 'role') curr.disabled = true;
if (isPosition && curr.type == 'position') curr.disabled = false;
if (!isPosition && curr.type == 'position') curr.disabled = true;
}
}
};
resolve(ro.data);
that.loading = false;
if (node.level == 0 && ro.data.length > 0) {
const tree = that.$refs.tree;
tree.getNode(ro.data[0].id).expand();
setTimeout(function(){
const childNode = tree.getNode(ro.data[0].id).childNodes[0];
if (childNode != null) {
childNode.expand();
}
}, 500);
}
}).catch(error=>{
console.log(error);
})
},
expandNode(obj, node, tree) {//
},
closeNode(obj, node, tree) {//
node.childNodes = [];
node.loaded = false;
},
refreshNode(id) {// loadNode
if (id == undefined) {//
const nodeData = this.$refs.tree.getCurrentNode();
if (nodeData != null) {
if (this.$refs.tree.store.nodesMap[nodeData.id] != undefined) {
this.$refs.tree.store.nodesMap[nodeData.id].expanded = false;
}
const node = this.$refs.tree.getNode(nodeData.id);
this.closeNode(null, node, null);
node.expand();
}
} else {//
if (this.$refs.tree.store.nodesMap[id] != undefined) {
this.$refs.tree.store.nodesMap[id].expanded = false;
}
const node = this.$refs.tree.getNode(id);
if (node != null) {
this.closeNode(null, node, null);
node.expand();
}
}
}
},
watch: {
visible(val) {
this.dialogVisible = val;
if (val) {//
if (this.addressType.indexOf('department') > 0) {
this.pid = this.rootDeptId;
}
this.refresh = true;
} else {//
this.refresh = false;
}
}
}
}
</script>
<style scoped>
#bpmOrgAddress >>> .el-dialog__body {
padding: 10px 20px;
color: #606266;
font-size: 14px;
word-break: break-all;
}
#bpmOrgAddress >>> .el-input__inner {
border-radius: 0px;
}
#bpmOrgAddress >>> .el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content {
background-color: #F5F7FA;
color: #4E7FF9;
}
#bpmOrgAddress >>> .el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content .awsui-iconfont {
color: #4E7FF9 !important;
}
/*#bpmOrgAddress >>> .el-tree .el-tree-node>.el-tree-node__children{*/
/* overflow: visible;*/
/*}*/
.tree{
overflow: auto;
width:458px;
height: 300px;
}
#bpmOrgAddress >>> .el-tree {
min-width: 100%;
display:inline-block !important;
}
</style>

View File

@ -0,0 +1,7 @@
import BPMOrgAddress from './component'
BPMOrgAddress.install = function(Vue) {
Vue.component(BPMOrgAddress.name, BPMOrgAddress);
}
export default BPMOrgAddress;

View File

@ -0,0 +1,2 @@
说明PAL模型树组件复制的com.actionsoft.apps.coe.pal/src/components/common/PALRepositoryTree组件
如有任何bug请修改com.actionsoft.apps.coe.pal/src/components/common/PALRepositoryTree中的组件并完全覆盖此组件并修改该组件的awsuiAxios引用地址

View File

@ -0,0 +1,338 @@
<template>
<el-container>
<el-dialog
id="palRepositoryTree"
:title="title"
:visible.sync="dialogVisible"
:destroy-on-close=true
:width="width"
:modal-append-to-body=false
:append-to-body=true
:close-on-click-modal=false
:before-close="handleClose">
<template v-if="refresh">
<div
v-loading="loading"
element-loading-text="拼命加载中">
<el-autocomplete
v-model="treeSearchKey"
size="small"
:fetch-suggestions="treeSearch"
@select="treeSearchSelect"
suffix-icon="el-icon-search"
placeholder="快速查询"
:trigger-on-focus=false
style="width:100%;"
>
<template slot-scope="{ item }">
<el-tooltip class="item" placement="bottom-start">
<div slot="content">{{item.pathName}}</div>
<span>{{ item.name }}</span>
</el-tooltip>
</template>
</el-autocomplete>
<div style="height: 300px;overflow: auto;border: 1px solid #f2f2f2;">
<div class="tree">
<el-tree
ref="tree"
:props="treeProps"
:expand-on-click-node=false
:highlight-current=true
@node-click="openNode"
@node-expand="expandNode"
@node-collapse="closeNode"
:show-checkbox=multiple
node-key="id"
lazy
:load="loadNode">
<span slot-scope="{node, data}">
<i class="awsui-iconfont tree-content-icon tree-content-icon-padding" :style="{'color': node.data.icon.color}" v-html="node.data.icon.icon"></i>
<span>{{node.label}}</span>
</span>
</el-tree>
</div>
</div>
</div>
</template>
<span slot="footer" class="dialog-footer">
<awsui-button class="button-general-color" type="primary" @click="submit">确定</awsui-button>
<awsui-button @click="cancel">取消</awsui-button>
</span>
</el-dialog>
</el-container>
</template>
<script>
import awsuiAxios from "../../../../awsuiAxios";
export default {
name: "PALRepositoryTree",
props: {
visible: {
type: Boolean,
default: false
},
wsId: {// ID
type: String,
default: '',
required: true
},
teamId: {// ID
type: String,
default: ''
},
categorys: {// ,
type: String,
default: ''
},
rootId: {//
type: String,
default: ''
},
multiple: {//
type: Boolean,
default: false
},
title: {//
type: String,
default: '请选择'
},
// width: {//
// type: String,
// default: '500px'
// },
selected: {// []
type: Array,
default: function () {
return []
}
}
},
data() {
return {
refresh: false,
dialogVisible: false,
loading: false,
searchKey: '',
treeSearchKey: '',
timeout: null,
pid: '',
width: '500px',
treeProps: {
label: 'name',
isLeaf: 'leaf'
}
};
},
methods: {
handleClose(done) {
this.closeDlalog('cancel');
done();
},
cancel() {
this.closeDlalog('cancel');
this.dialogVisible = false;
},
submit() {
this.closeDlalog('save');
this.dialogVisible = false;
},
closeDlalog(type) {// /
if (type == 'save') {
let result = [];
if (this.checkbox) {//
result = this.$refs.tree.getCheckedNodes();
} else {//
const node = this.$refs.tree.getCurrentNode();
if (node != null) {
result.push(node);
}
}
this.$emit('getResult', result);
} else {
this.$emit('cancel');
}
//
},
handleNodeClick(data) {
console.log(data);
},
openNode(obj, node, tree) {//
},
treeSearchSelect(item) {
this.queryTreeByIdAndPath(item.id, item.versionId, item.path);
},
treeSearch(key, cb) {
const that = this;
if (key != undefined && key.trim() != '') {
// that.loading = true;
const data = {
url:'jd',
data:{
cmd: 'com.actionsoft.apps.coe.pal_repository_tree_component_search',
wsId: that.wsId,
teamId: that.teamId,
categorys: that.categorys,
rootId: that.rootId,
name: key
}
};
//
awsuiAxios.post(data).then(function (ro) {
if (ro.result == 'ok') {
if (ro.data.length > 0) {
clearTimeout(that.timeout);
that.timeout = setTimeout(() => {
cb(ro.data);
}, 3000 * Math.random());
} else {
clearTimeout(that.timeout);
}
} else {
clearTimeout(that.timeout);
}
}).catch(error=>{
console.log(error);
})
} else {
clearTimeout(that.timeout);
}
},
queryTreeByIdAndPath(id, versionId, path) {//
const that= this;
const tree = that.$refs.tree;
//
const pathArr = path.split(',');
let index = 1;
for (let i = 0; i < pathArr.length; i++) {//
if (i > 0) {
if (tree.getNode(pathArr[i-1]) != null) {
setTimeout(that._expandNode(tree, pathArr[i-1]), index * 300);
index++;
}
}
}
setTimeout(function() {
if (tree.getNode(versionId) != null) {
tree.setCurrentKey(versionId);
}
}, index * 300);
},
_expandNode(tree, versionId) {
return function() {
tree.getNode(versionId).expand();
}
},
loadNode(node, resolve) {// ``
const that = this;
that.loading = true;
const data = {
url:'jd',
data:{
cmd: 'com.actionsoft.apps.coe.pal_repository_tree_component_subjson',
wsId: that.wsId,
teamId: that.teamId,
categorys: that.categorys,
pid: ''
}
};
if (node.level === 0) {
//
data.data.pid = that.pid;
} else {
//
data.data.pid = node.data.id;
}
//
awsuiAxios.post(data).then(function (ro) {
resolve(ro.data);
that.loading = false;
if (node.level == 0 && ro.data.length > 0) {
const tree = that.$refs.tree;
tree.getNode(ro.data[0].id).expand();
setTimeout(function(){
const childNode = tree.getNode(ro.data[0].id).childNodes[0];
if (childNode != null) {
childNode.expand();
}
}, 500);
}
}).catch(error=>{
console.log(error);
})
},
expandNode(obj, node, tree) {//
},
closeNode(obj, node, tree) {//
node.childNodes = [];
node.loaded = false;
},
refreshNode(id) {// loadNode
if (id == undefined) {//
const nodeData = this.$refs.tree.getCurrentNode();
if (nodeData != null) {
if (this.$refs.tree.store.nodesMap[nodeData.id] != undefined) {
this.$refs.tree.store.nodesMap[nodeData.id].expanded = false;
}
const node = this.$refs.tree.getNode(nodeData.id);
this.closeNode(null, node, null);
node.expand();
}
} else {//
if (this.$refs.tree.store.nodesMap[id] != undefined) {
this.$refs.tree.store.nodesMap[id].expanded = false;
}
const node = this.$refs.tree.getNode(id);
if (node != null) {
this.closeNode(null, node, null);
node.expand();
}
}
}
},
watch: {
visible(val) {
this.dialogVisible = val;
if (val) {//
this.pid = this.rootId;
this.refresh = true;
} else {//
this.refresh = false;
}
}
}
}
</script>
<style scoped>
#palRepositoryTree >>> .el-dialog__body {
padding: 10px 20px;
color: #606266;
font-size: 14px;
word-break: break-all;
}
#palRepositoryTree >>> .el-input__inner {
border-radius: 0px;
}
#palRepositoryTree >>> .el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content {
background-color: #F5F7FA;
color: #4E7FF9;
}
#palRepositoryTree >>> .el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content .awsui-iconfont {
color: #4E7FF9 !important;
}
/*#palRepositoryTree >>> .el-tree .el-tree-node>.el-tree-node__children{*/
/* overflow: visible;*/
/*}*/
.tree{
overflow: auto;
width:458px;
height: 300px;
}
#palRepositoryTree >>> .el-tree {
min-width: 100%;
display:inline-block !important;
}
</style>

View File

@ -0,0 +1,7 @@
import PALRepositoryTree from './component'
PALRepositoryTree.install = function(Vue) {
Vue.component(PALRepositoryTree.name, PALRepositoryTree);
}
export default PALRepositoryTree;

View File

@ -0,0 +1,141 @@
<template>
<awsui-dialog
title="请选择属性"
:visible.sync="dialogVisible"
destroy-on-close
:before-close="handleClose"
:close-on-click-modal=false
:modal-append-to-body=false
:append-to-body=true
width="500px"
height="300px">
<div v-if="refresh">
<el-tree
ref="attrTree"
:data="attributeDlg.tree.data"
:props="attributeDlg.tree.props"
highlight-current
:expand-on-click-node=false
default-expand-all
node-key="id">
<span slot-scope="{node, data}">
<i class="awsui-iconfont tree-content-icon tree-content-icon-padding" :style="{'color': data.iconColor}" v-html="node.data.iconCode"></i>
<span>{{node.label}}</span>
</span>
</el-tree>
</div>
<span slot="footer" class="dialog-footer">
<awsui-button type="primary" @click="submit">确定</awsui-button>
<awsui-button @click="cancel">取消</awsui-button>
</span>
</awsui-dialog>
</template>
<script>
import awsuiAxios from "../../../../awsuiAxios";
export default {
name: "PalAttributeTree",
props: {
visible: {
type: Boolean,
default: false
},
methodId: {
type: String,
default: '',
},
type: {
type: String,
default: 'file'
}
},
data() {
return {
refresh: false,
dialogVisible: false,
loading: false,
attributeDlg: {
tree: {
props: {
children: 'children',
label: 'label'
},
data: []
},
visible: false,
currGroup: 0,
currRow: 0
},
}
},
methods: {
initTree() {//
const that = this;
//
that.attributeDlg.tree.data = [];
that.attributeDlg.visible = true;
const data = {
url:'jd',
data:{
cmd: 'com.actionsoft.apps.coe.pal.batch_replace_attribute_tree_data_query',
wsId: wsId,
type: that.type,
methodId: that.methodId
}
};
//
awsuiAxios.post(data).then(function (ro) {
if(ro.result == 'ok') {
that.attributeDlg.tree.data = ro.data;
}
}).catch(error=>{
console.log(error);
})
},
handleClose(done) {
this.closeDlalog('cancel');
done();
},
cancel() {
this.closeDlalog('cancel');
this.dialogVisible = false;
},
submit() {
const isOk = this.closeDlalog('save');
if (isOk) {
this.dialogVisible = false;
}
},
closeDlalog(type) {// /
if (type == 'save') {
const node = this.$refs.attrTree.getCurrentNode();
if (node == null || node.type == 'group') {
this.$message({message: '请选择属性',type: 'warning'});
return false;
}
this.$emit('getResult', JSON.parse(JSON.stringify(node)));
} else {
this.$emit('cancel');
}
//
}
},
watch: {
visible(val) {
this.dialogVisible = val;
if (val) {//
this.refresh = true;
this.initTree();//
} else {//
this.refresh = false;
}
}
}
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,7 @@
import PalAttributeTree from './component'
PalAttributeTree.install = function(Vue) {
Vue.component(PalAttributeTree.name, PalAttributeTree);
}
export default PalAttributeTree;

View File

@ -0,0 +1,3 @@
说明调用pal的组织、数据、控制等关联属性包括前后置流程
复制的com.actionsoft.apps.coe.pal/src/components/common/PalRelationAddress组件
如有任何bug请修改com.actionsoft.apps.coe.pal/src/components/common/PalRelationAddress中的组件并完全覆盖此组件并修改该组件的awsuiAxios引用地址

View File

@ -0,0 +1,832 @@
<template>
<el-container>
<el-dialog
id="palRelationAddress"
:title="title"
:visible.sync="dialogVisible"
width="800px"
:modal-append-to-body=false
:destroy-on-close=true
:append-to-body=true
:close-on-click-modal=false
:before-close="handleClose">
<template>
<div v-if="dialogVisible" style="width:100%; height: 400px; border:1px solid #f2f2f2;">
<div class="div-left" :style="{'width': (relationType == 'file' ? '373px' : '249px')}">
<div style="width: 100%;height: 32px;">
<el-autocomplete
v-model="treeSearchKey"
size="small"
:fetch-suggestions="treeSearch"
@select="treeSearchSelect"
suffix-icon="el-icon-search"
placeholder="快速查询"
:trigger-on-focus=false
:style="{'width': (relationType == 'file' ? '373px' : '249px')}"
>
<template slot-scope="{ item }">
<el-tooltip class="item" placement="bottom-start">
<div slot="content">{{item.pathName}}</div>
<span>{{ item.name }}</span>
</el-tooltip>
</template>
</el-autocomplete>
</div>
<div>
<div style="height: 368px;overflow: auto;">
<div style="margin: 0px;">
<el-tree
ref="tree"
empty-text="无数据"
:expand-on-click-node=false
:props="treeProps"
:show-checkbox="relationType == 'file' && multiple"
:check-strictly=true
:highlight-current=true
@node-expand="expandNode"
@node-collapse="closeNode"
@check-change="handleNodeCheckChange"
node-key="id"
lazy
:load="loadNode"
@node-click="handleNodeClick">
<span slot-scope="{node, data}">
<i class="awsui-iconfont tree-content-icon tree-content-icon-padding" :style="{'color': node.data.icon.color}" v-html="node.data.icon.icon"></i>
<span>{{node.label}}</span>
</span>
</el-tree>
</div>
</div>
</div>
</div>
<div v-if="relationType != 'file'" class="div-middle">
<div style="width: 100%;height: 32px;">
<el-input
size="small"
placeholder="快速查询"
suffix-icon="el-icon-search"
v-model="shapeSearchKey"
@input="shapeSearch"
width="249px">
</el-input>
</div>
<div>
<div style="height: 368px;overflow: auto;">
<div style="margin: 0px;">
<template v-if="multiple">
<el-checkbox-group style="margin: 5px 0px 5px 5px;" v-model="shapeChecked" @change="handleChangeCheckShape">
<el-checkbox class="checkbox-item" v-for="item in shapeData" :label="item.id" :key="item.id" :disabled="item.isDisabled">{{item.name}}</el-checkbox>
</el-checkbox-group>
</template>
<template v-else>
<el-radio-group style="margin: 5px 0px 5px 5px;" v-model="shapeSelected" @change="handleChangeRadioShape">
<el-radio class="redio-item" v-for="item in shapeData" :label="item.id" :key="item.id" :disabled="item.isDisabled">{{item.name}}</el-radio>
</el-radio-group>
</template>
</div>
</div>
</div>
</div>
<div class="div-right" :style="{'width': (relationType == 'file' ? '373px' : '249px')}">
<div style="height: 100%;">
<template>
<el-table
:data="tableData"
:show-header=false
empty-text="请在左侧选择数据"
size="mini"
height="400px"
style="width: 100%">
<el-table-column
prop="name"
label="名称">
</el-table-column>
<el-table-column
prop="address"
label="操作"
width="40">
<template slot-scope="scope">
<div class="icon-delete-display">
<i class="iconfont" style="cursor: pointer;" @click="remove(scope.row.id)">&#xe644;</i>
</div>
</template>
</el-table-column>
</el-table>
</template>
</div>
</div>
</div>
</template>
<span slot="footer" class="dialog-footer">
<awsui-button class="button-general-color" type="primary" @click="submit">确定</awsui-button>
<awsui-button @click="cancel">取消</awsui-button>
</span>
</el-dialog>
</el-container>
</template>
<script>
import awsuiAxios from "../../../../awsuiAxios";
export default {
name: "PalRelationAddress",
props: {
visible: {
type: Boolean,
default: false
},
relationType: {// shape/file/
type: String,
default: 'shape'
},
multiple: {// singlemultiple
type: Boolean,
default: false
},
title: {//
type: String,
default: ''
},
selectFileId: {// id
type: String,
default: ''
},
selectShapeId: {// id
type: String,
default: ''
},
wsId: {// ID
type: String,
default: '',
required: true
},
teamId: {// ID
type: String,
default: ''
},
categorys: {// ,
type: String,
default: ''
},
methods: {//
type: String,
default: ''
},
rootId: {//
type: String,
default: ''
}
},
data() {
return {
dialogVisible: false,
pid: '',
shapeSearchKey: '',
shapeChecked: [],
shapeSelected: '',
shapeRecords: {},
treeProps: {
label: 'name',
isLeaf: 'leaf'
},
tableData: [],
shapeData: [],
shapeTempData: [],
treeSearchKey: '',
timeout: null,
result: [],// [{id:xxx,versionId:xxx,name:xxxx,children:[{shapeId:xxx,name:xxx},{shapeId:xxx,name:xxx}]}]
};
},
created() {
},
methods: {
clearAllParam() {
this.pid = '';
this.shapeSearchKey = '';
this.shapeChecked = [];
this.shapeSelected = '';
this.shapeRecords = {};
this.tableData = [];
this.shapeData = [];
this.shapeTempData = [];
this.treeSearchKey = '';
this.timeout = null;
this.result = [];
},
shapeSearch() {//
if (this.shapeSearchKey && this.shapeSearchKey.trim() != '') {
const key = this.shapeSearchKey.trim().toLocaleLowerCase();
const shapeData = [];
for (let i = 0; i < this.shapeTempData.length; i++) {
const shape = this.shapeTempData[i];
if (shape.name != '') {
let name = (shape.name + '').toLocaleLowerCase();
if (name.indexOf(key) != -1) {
shapeData.push(JSON.parse(JSON.stringify(shape)));
}
}
}
this.shapeData = shapeData;
} else {
this.shapeData = JSON.parse(JSON.stringify(this.shapeTempData));
}
},
treeSearchSelect(item) {
this.queryTreeByIdAndPath(item.id, item.path);
},
treeSearch(key, cb) {
const that = this;
if (key != undefined && key.trim() != '') {
const data = {
url:'jd',
data:{
cmd: 'com.actionsoft.apps.coe.pal_repository_tree_component_search',
wsId: that.wsId,
teamId: that.teamId,
categorys: that.categorys,
rootId: that.rootId,
name: key
}
};
//
awsuiAxios.post(data).then(function (ro) {
if (ro.result == 'ok') {
if (ro.data.length > 0) {
clearTimeout(that.timeout);
that.timeout = setTimeout(() => {
cb(ro.data);
}, 3000 * Math.random());
} else {
clearTimeout(that.timeout);
}
} else {
clearTimeout(that.timeout);
}
}).catch(error=>{
console.log(error);
})
} else {
clearTimeout(that.timeout);
}
},
queryTreeByIdAndPath(id, path) {//
const that= this;
const tree = that.$refs.tree;
//
const pathArr = path.split(',');
let index = 1;
for (let i = 0; i < pathArr.length; i++) {//
if (i > 0) {
if (tree.getNode(pathArr[i-1]) != null) {
setTimeout(that._expandNode(tree, pathArr[i-1]), index * 300);
index++;
}
}
}
setTimeout(function() {
if (tree.getNode(id) != null) {
tree.setCurrentKey(id);
}
}, index * 300);
},
_expandNode(tree, id) {
return function() {
tree.getNode(id).expand();
}
},
loadNode(node, resolve) {// ``
const that = this;
// that.loading = true;
const data = {
url:'jd',
data:{
cmd: 'com.actionsoft.apps.coe.pal_repository_tree_component_subjson',
wsId: that.wsId,
teamId: that.teamId,
categorys: that.categorys,
pid: ''
}
};
if (node.level === 0) {
//
data.data.pid = that.pid;
} else {
//
data.data.pid = node.data.id;
}
//
awsuiAxios.post(data).then(function (ro) {
for (let i = 0; i < ro.data.length; i++) {
if (ro.data[i].id.length < 36) {
ro.data[i].disabled = true;
} else {
if (that.categorys != '' && that.methods != '') {
if (that.methods.indexOf(ro.data[i].plMethodId) > -1) {
ro.data[i].disabled = false;
} else {
ro.data[i].disabled = true;
}
} else if (that.categorys != '') {
if (that.categorys.indexOf(ro.data[i].plCategory) > -1) {
ro.data[i].disabled = false;
} else {
ro.data[i].disabled = true;
}
} else {
if (that.methods.indexOf(ro.data[i].plMethodId) > -1) {
ro.data[i].disabled = false;
} else {
ro.data[i].disabled = true;
}
}
}
}
resolve(ro.data);
that.initTreeCheck();
// that.loading = false;
if (node.level == 0 && ro.data.length > 0) {
const tree = that.$refs.tree;
tree.getNode(ro.data[0].id).expand();
setTimeout(function(){
const childNode = tree.getNode(ro.data[0].id).childNodes[0];
if (childNode != null) {
childNode.expand();
}
}, 500);
}
}).catch(error=>{
console.log(error);
})
},
expandNode(obj, node, tree) {//
},
closeNode(obj, node, tree) {//
node.childNodes = [];
node.loaded = false;
},
initTreeCheck() {//
const relationType = this.relationType;
if (relationType == 'file') {//
if (this.multiple) {//
const result = this.result;
const tree = this.$refs.tree;
for (let i = 0; i < result.length; i++) {
if (tree.getNode(result[i].id) != null) {
tree.setChecked(result[i].id, true);
}
}
} else {//
const result = this.result;
const tree = this.$refs.tree;
for (let i = 0; i < result.length; i++) {
if (tree.getNode(result[i].id) != null) {
tree.setCurrentKey(result[i].id);
}
}
}
}
},
handleNodeCheckChange(data, isCheck) {// relationTypefile
if (isCheck) {//
const result = this.result;
if (!this.isFileExist(result,data.id, data.versionId)) {
const tempObj = {};
tempObj.id = data.id;
tempObj.versionId = data.versionId;
tempObj.name = data.name;
tempObj.children = [];
result.push(tempObj);
this.initTableData();
}
} else {//
this.remove(data.id);
}
},
handleClose(done) {
this.closeDlalog('cancel');
done();
},
cancel() {
this.closeDlalog('cancel');
this.dialogVisible = false;
},
submit() {
this.closeDlalog('save');
this.dialogVisible = false;
},
closeDlalog(type) {// /
if (type == 'save') {
const result = JSON.parse(JSON.stringify(this.result));
if (this.relationType == 'file') {
for (let i = 0; i < result.length; i++) {
delete result[i].children;
}
}
this.$emit('getResult', result);
} else {
this.$emit('cancel');
}
//
this.clearAllParam();
},
handleNodeClick(data) {//
const that = this;
const relationType = this.relationType;
if (relationType == 'file') {//
if (!this.multiple) {//
//
if (that.categorys != '' && that.methods != '') {
if (that.methods.indexOf(data.plMethodId) == -1) {
//
that.$message({message: '不支持关联的模型',type: 'warning'});
return;
}
} else if (that.categorys != '') {
if (that.categorys.indexOf(data.plCategory) == -1) {
that.$message({message: '不支持关联的模型',type: 'warning'});
return;
}
} else {
if (that.methods.indexOf(data.plMethodId) == -1) {
that.$message({message: '不支持关联的模型',type: 'warning'});
return;
}
}
this.result = [];//
const result = this.result;
const tempObj = {};
tempObj.id = data.id;
tempObj.versionId = data.versionId;
tempObj.name = data.name;
tempObj.children = [];
result.push(tempObj);
this.initTableData();
}
} else {//
//
const that = this;
that.shapeSearchKey = '';
const params = {
url:'jd',
data:{
cmd: 'com.actionsoft.apps.coe.pal_repository_tree_component_shapejson',
id: data.id
}
};
let isDisabled = true;
if (that.categorys != '' && that.methods != '') {
if (that.methods.indexOf(data.plMethodId) > -1) {
isDisabled = false;
} else {
isDisabled = true;
}
} else if (that.categorys != '') {
if (that.categorys.indexOf(data.plCategory) > -1) {
isDisabled = false;
} else {
isDisabled = true;
}
} else {
if (that.methods.indexOf(data.plMethodId) > -1) {
isDisabled = false;
} else {
isDisabled = true;
}
}
//
awsuiAxios.post(params).then(function (ro) {
if (ro.result == 'ok') {
const list = ro.data.list;
const tempData = [];
for (let i = 0; i < list.length; i++) {
const obj = {
id: list[i].id,
name: list[i].name,
fileId: list[i].fileId,
fileName: list[i].fileName,
versionId: list[i].versionId,
isDisabled: isDisabled
}
tempData.push(obj);
that.shapeRecords[list[i].id] = obj;
}
that.shapeData = tempData;
that.shapeTempData = JSON.parse(JSON.stringify(that.shapeData));//
}
}).catch(error=>{
console.log(error);
})
}
},
initTableData() {//
const relationType = this.relationType;
if (relationType == 'file') {//
const result = this.result;
const tempData = [];
for (let i = 0; i < result.length; i++) {
const tempObj = {
id: result[i].id,
name: result[i].name,
versionId: result[i].versionId
}
tempData.push(tempObj);
}
this.tableData = tempData;
} else {//
const result = this.result;
const tempData = [];
for (let i = 0; i < result.length; i++) {
const currFile = result[i];
const children = currFile.children;
for (let j = 0; j < children.length; j++) {
const currShape = children[j];
const tempObj = {
id: currShape.shapeId,
name: currShape.name,
fileId: currFile.id,
fileName: currFile.name,
versionId: currFile.versionId
}
tempData.push(tempObj);
}
}
this.tableData = tempData;
}
},
isFileExist(result, fileId, versionId){//
for (let i = 0; i < result.length; i++) {
const file = result[i];
if (file.versionId == versionId) {
return true;
}
}
return false;
},
remove(id) {//
const relationType = this.relationType;
if (relationType == 'file') {//
const result = this.result;
for (let i = 0; i < result.length; i++) {
const obj = result[i];
if (obj.id == id) {
result.splice(i, 1);
if (this.multiple) {
this.$refs.tree.setChecked(id, false);
} else {
this.$refs.tree.setCurrentKey(null);
}
break;
}
}
} else {//
if (this.multiple) {//
const data = this.shapeRecords[id];
if (data) {
const result = this.result;
const shapeId = data.id;
const name = data.name;
const fileId = data.fileId;
const fileName = data.fileName;
const fileVersionId = data.versionId;
for (let i = 0; i < result.length; i++) {
const file = result[i];
if (file.id == fileId) {
const children = file.children;
for (let j = 0; j < children.length; j++) {
if (children[j].shapeId == id) {
children.splice(j, 1);
break;
}
}
if (children.length == 0) {
result.splice(i, 1);
break;
}
}
}
}
//
for (let i = 0; i < this.shapeChecked.length; i++) {
if (this.shapeChecked[i] == id) {
this.shapeChecked.splice(i, 1);
break;
}
}
} else {//
this.result = [];
this.shapeSelected = '';
}
}
this.initTableData();
},
handleChangeRadioShape(id) {//
const data = this.shapeRecords[id];
if (data) {
const shapeId = data.id;
const name = data.name;
const fileId = data.fileId;
const fileName = data.fileName;
const fileVersionId = data.versionId;
this.result = [];
const result = this.result;
const tempObj = {};
tempObj.id = fileId;
tempObj.versionId = fileVersionId;
tempObj.name = fileName;
tempObj.children = [];
const children = {
shapeId: shapeId,
name: name
};
tempObj.children.push(children);
result.push(tempObj);
this.initTableData();
}
},
handleChangeCheckShape(ids) {//
this.result = [];
const result = this.result;
for (let i = 0; i < ids.length; i++) {
const id = ids[i];
const data = this.shapeRecords[id];
if (data) {
const shapeId = data.id;
const name = data.name;
const fileId = data.fileId;
const fileName = data.fileName;
const fileVersionId = data.versionId;
let fileExist = false;
for (let j = 0; j < result.length; j++) {
const file = result[j];
if (file.id == fileId) {
fileExist = true;
const children = {
shapeId: shapeId,
name: name
};
file.children.push(children);
}
}
if (!fileExist) {
const tempObj = {};
tempObj.id = fileId;
tempObj.versionId = fileVersionId;
tempObj.name = fileName;
tempObj.children = [];
const children = {
shapeId: shapeId,
name: name
};
tempObj.children.push(children);
result.push(tempObj);
}
}
}
this.initTableData();
},
initData() {//
// resultshapeSelectedshapeChecked
const that = this;
if (that.relationType == 'file') {
if (that.selectFileId != '') {
//
const data = {
url:'jd',
data:{
cmd: 'com.actionsoft.apps.coe.pal_repository_tree_component_file_query',
versionIds: that.selectFileId
}
};
//
awsuiAxios.post(data).then(function (ro) {
if (ro.result == 'ok') {
const result = [];
for (let i = 0; i < ro.data.length; i++) {
const currData = ro.data[i];
const tempObj = {};
tempObj.id = currData.id;
tempObj.versionId = currData.versionId;
tempObj.name = currData.name;
tempObj.children = [];
result.push(tempObj);
}
that.result = result;
that.initTableData();
}
}).catch(error=>{
console.log(error);
})
}
} else {
if (that.selectFileId != '' && that.selectShapeId != '') {
//
const data = {
url:'jd',
data:{
cmd: 'com.actionsoft.apps.coe.pal_repository_tree_component_file_shape_query',
fileIds: that.selectFileId,
shapeIds: that.selectShapeId
}
};
//
awsuiAxios.post(data).then(function (ro) {
if (ro.result == 'ok') {
if (ro.data.data.length > 0) {
that.shapeRecords = ro.data.shapes;
if (that.multiple) {
that.result = ro.data.data;
for (let i = 0; i < that.result.length; i++) {
const children = that.result[i].children;
for (let j = 0; j < children.length; j++) {
that.shapeChecked.push(children[j].shapeId);
}
}
} else {
that.result = ro.data.data;
for (let i = 0; i < that.result.length; i++) {
const children = that.result[i].children;
for (let j = 0; j < children.length; j++) {
that.shapeSelected = children[j].shapeId;//
}
}
}
that.initTableData();
}
}
}).catch(error=>{
console.log(error);
})
}
}
}
},
watch: {
visible(val) {
this.dialogVisible = val;
if (val) {//
this.clearAllParam();
this.pid = this.rootId;
this.initData();
} else {//
}
}
}
}
</script>
<style scoped>
#palRelationAddress >>> .el-dialog__body {
padding: 10px 20px;
color: #606266;
font-size: 14px;
word-break: break-all;
}
#palRelationAddress >>> .el-input__inner {
border-radius: 0px;
}
#palRelationAddress >>> .el-tree {
min-width: 100%;
display:inline-block !important;
}
.checkbox-item {
margin: 10px 0px;
display: block;
}
.redio-item {
margin: 10px 0px;
display: block;
}
.div-left {
float:left;
width:249px;
height:400px;
border-right: 1px dashed #f2f2f2;
}
.div-middle {
float:left;
width: 248px;
height:400px;
border-right: 1px dashed #f2f2f2;
}
.div-right {
float: right;
width: 249px;
height:400px;
background-color: #2a85a0;
}
#palRelationAddress >>> .el-table__row .icon-delete-display{
display: none;
}
#palRelationAddress >>> .el-table__row:hover .icon-delete-display{
display: inline;
}
#palRelationAddress >>> .el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content {
background-color: #F5F7FA;
color: #4E7FF9;
}
#palRelationAddress >>> .el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content .awsui-iconfont {
color: #4E7FF9 !important;
}
</style>

View File

@ -0,0 +1,7 @@
import PalRelationAddress from './component'
PalRelationAddress.install = function(Vue) {
Vue.component(PalRelationAddress.name, PalRelationAddress);
}
export default PalRelationAddress;

View File

@ -0,0 +1,542 @@
<template>
<div id="conditionFilter">
<div v-if="palId == ''">
<div class="opt-category-title"><p style="padding-left: 5px;"><b>文件信息</b></p></div>
<awsui-form ref="form" :model="form" label-width="80px" label-position="right">
<awsui-form-item label="对象">
<awsui-radio awsui-radio v-model="form.type" label="file" @change="initMethod">文件</awsui-radio>
<awsui-radio awsui-radio v-model="form.type" label="shape" @change="initMethod">文件内形状</awsui-radio>
</awsui-form-item>
<awsui-form-item label="范围">
<awsui-input v-model="form.rootFileName" placeholder="请选择一个根目录" readonly @click.native="rootFileTree.visible = true"></awsui-input>
<awsui-input type="hidden" v-model="form.rootFileId" placeholder="请选择一个根目录"></awsui-input>
</awsui-form-item>
<awsui-row :gutter="0">
<awsui-col :span="12">
<awsui-form-item label="名称">
<div style="display: inline-block;width: 20%;">
<awsui-select v-model="form.nameScope" :options="nameScopeOpts"></awsui-select>
</div>
<div style="display: inline-block;width: 80%;">
<awsui-input v-model="form.name" placeholder="请输入名称"></awsui-input>
</div>
</awsui-form-item>
</awsui-col>
<awsui-col :span="12">
<awsui-form-item label="文件类型">
<awsui-select style="width: 99%;" v-model="form.methodId" :options="methodOpts" @change="initExAttr"></awsui-select>
</awsui-form-item>
</awsui-col>
</awsui-row>
</awsui-form>
</div>
<div>
<div class="opt-category-title" style="margin-top: 10px;"><p style="padding-left: 5px;"><b>文件属性</b></p></div>
<div v-for="(attr, i) in extAttr">
<awsui-row v-for="(item, n) in attr" class="row">
<awsui-col :span="2">
<div style="text-align: center;line-height: 30px;height: 30px;">
<span v-if="n != 0"></span>
</div>
</awsui-col>
<awsui-col :span="8">
<awsui-input style="font-size: 0px" v-model="item.propertyName" placeholder="请选择属性" readonly @click.native="openAttrTree(i, n)"></awsui-input>
<awsui-input type="hidden" v-model="item.propertyKey" placeholder="请选择属性"></awsui-input>
</awsui-col>
<awsui-col :span="6">
<awsui-select v-model="item.propertyCondition" :options="extAttrConditionOpts"></awsui-select>
</awsui-col>
<awsui-col :span="8">
<div style="padding-right: 25px;">
<template v-if="item.propertyCondition!='null' && item.propertyCondition!='notNull'">
<!--单选类型-->
<awsui-select v-if="item.propertyType == 'select'" clearable v-model="item.propertyValue" :options="item.selectTypeOpts"></awsui-select>
<!--多选类型-->
<awsui-select v-else-if="item.propertyType == 'select_m'" multiple clearable v-model="item.propertyValue" :options="item.selectTypeOpts"></awsui-select>
<!--是否类型-->
<awsui-select v-else-if="item.propertyType == 'boolean'" v-model="item.propertyValue" :options="item.selectTypeOpts"></awsui-select>
<!--数字类型-->
<awsui-input-number v-else-if="item.propertyType == 'number'" v-model="item.propertyValue"></awsui-input-number>
<!--关联PAL类型-->
<awsui-input v-else-if="item.propertyType == 'relation'" v-model="item.propertyShowValue" placeholder="请选择" readonly @click.native="openPalRelationAddress(i, n)"></awsui-input>
<!--关联BPM组织架构类型-->
<awsui-input v-else-if="item.propertyType == 'awsorg'" v-model="item.propertyShowValue" placeholder="请选择" readonly @click.native="openBpmOrgAddress(i, n)"></awsui-input>
<!--文本多行文本其他类型-->
<awsui-input v-else v-model="item.propertyValue" placeholder="请输入"></awsui-input>
</template>
<template v-else>
<awsui-input value="" placeholder="不允许输入" readonly></awsui-input>
</template>
</div>
<i class="awsui-iconfont operate-icon-display" style="float: right;position: relative; top: -22px;padding-right: 5px;" @click="removeRowCondition(i, n)">&#xe626;</i>
</awsui-col>
</awsui-row>
<div>
<span class="cursor-pointer" @click="addAndCondition(i)"><u>+并条件</u></span>
</div>
<div v-if="i != extAttr.length - 1" style="width: 100%;text-align: center;">
<div style="display: inline-block;border-top:1px solid #c2c2c2;position: relative;bottom: -3px;width:100%;"></div>
<div style="display: inline-block;background-color:white;position: relative;bottom: 10px;color: #A8A5A5;"></div>
</div>
</div>
<div v-if="extAttr.length == 0">
<span class="cursor-pointer" @click="addAndCondition(undefined)"><u>+并条件</u></span>
</div>
<div>
<div style="display: inline-block;border-top:1px solid #c2c2c2;position: relative;bottom: -3px;width:100%;"></div>
<div class="cursor-pointer" style="display: inline-block;background-color:white;position: relative;bottom: 10px;left: 40px;" @click="addOrCondition"><u>+或条件</u></div>
</div>
</div>
<PALRepositoryTree
ref="rootFileTree"
:visible.sync="rootFileTree.visible"
:wsId="rootFileTree.wsId"
:teamId="rootFileTree.teamId"
:categorys="rootFileTree.categorys"
:multiple=false
v-on:cancel="rootFileTree.visible = false"
v-on:getResult="saveRootFileResult"
:title="rootFileTree.title"
></PALRepositoryTree>
<BPMOrgAddress
ref="palAwsOrgAddress"
:visible.sync="bpmOrgAddress.visible"
:addressType="bpmOrgAddress.addressType"
v-on:cancel="bpmOrgAddress.visible = false"
v-on:getResult="saveBpmOrgAddressResult"
:title="bpmOrgAddress.title"
:multiple="bpmOrgAddress.multiple"
/>
<pal-relation-address
ref="palRelationAddress"
:visible.sync="palRelationAddress.visible"
v-on:cancel="palRelationAddress.visible = false"
v-on:getResult="saveRelationResult"
:title="palRelationAddress.title"
:selectFileId="palRelationAddress.selectFileId"
:selectShapeId="palRelationAddress.selectShapeId"
:relationType="palRelationAddress.relationType"
:categorys="palRelationAddress.category"
:methods="palRelationAddress.method"
:wsId="palRelationAddress.wsId"
:teamId="palRelationAddress.teamId"
:multiple = palRelationAddress.multiple
/>
<pal-attribute-tree
ref="palAttributeTree"
:visible.sync="attributeDlg.visible"
:methodId="attributeDlg.methodId"
:type="attributeDlg.type"
v-on:cancel="attributeDlg.visible = false"
v-on:getResult="saveAttrTreeResult"
/>
</div>
</template>
<script>
import BPMOrgAddress from "./components/BPMOrgAddress";// pal簿
import PalRelationAddress from "./components/PalRelationAddress";
import PALRepositoryTree from './components/PALRepositoryTree/index';
import PalAttributeTree from './components/PalAttributeTree/index';
import awsuiAxios from "../../awsuiAxios";
export default {
name: "condition-filter",
components: {PALRepositoryTree, BPMOrgAddress, PalRelationAddress, PalAttributeTree},
data () {
return {
wsId: wsId,
teamId: teamId,
palId: palId,
attributeDlg: {
visible: false,
methodId: '',
type: '',
currGroup: 0,
currRow: 0
},
bpmOrgAddress: {
visible: false,
addressType: 'user',
title: '',
multiple: false,
currGroup: 0,
currRow: 0
},
palRelationAddress: {
visible: false,
selectFileId: '',
selectShapeId: '',
relationType: '',
category: '',
method: '',
wsId: wsId,
teamId: teamId,
multiple: false,
currGroup: 0,
currRow: 0
},
rootFileTree: {
visible: false,
wsId: wsId,
teamId: teamId,
categorys: 'process',
title: '请选择根目录'
},
form: {
type: 'file',//
rootFileName: '',//
rootFileId: '',// ID
nameScope: 'equals',//
name:'',//
methodId: '',//
},
nameScopeOpts: [
{
value: 'equals',
label: '等于'
},
{
value: 'contain',
label: '包含'
}
],
methodOpts: [],
extAttrConditionOpts: [
{value:'equals', label: '等于'},
{value:'notEquals', label: '不等于'},
{value:'contain', label: '包含'},
{value:'notContain', label: '不包含'},
{value: 'null', label: '为空'},
{value: 'notNull', label: '不为空'}
],
extAttr: [],
extAttr2: [
[
{"propertyName":"单选密级","propertyKey":"securityclass","propertyType":"select","propertyCondition":"equals","propertyValue":"绝密","selectTypeOpts": [
{value: '保密', label: '保密'},
{value: '绝密', label: '绝密'},
{value: '秘密', label: '秘密'},
]},
{"propertyName":"多选密级","propertyKey":"securityclass2","propertyType":"select_m","propertyCondition":"equals","propertyValue":['绝密','秘密'],"selectTypeOpts": [
{value: '保密', label: '保密'},
{value: '绝密', label: '绝密'},
{value: '秘密', label: '秘密'},
]},
{"propertyName":"是否类型","propertyKey":"securityclass3","propertyType":"boolean","propertyCondition":"equals","propertyValue":"是","selectTypeOpts": [
{value: '是', label: '是'},
{value: '否', label: '否'}
]},
{"propertyName":"数字类型","propertyKey":"securityclass4","propertyType":"number","propertyCondition":"equals","propertyValue":5},
{
"propertyName": "审批者(A)",
"propertyKey": "approval_a",
"propertyType": "relation",
"propertyCondition": "equals",
"propertyValue": "[{\"fileId\":\"\",\"shapeId\":\"\",\"shapeText\":\"\",\"attrId\":\"\",\"relationFileId\":\"de70f431-1143-4496-a109-a672f4e14a0d\",\"relationShapeId\":\"obj_c96e34f8b4e00001c1f4b45017301467\",\"relationShapeText\":\"角色3\"},{\"fileId\":\"\",\"shapeId\":\"\",\"shapeText\":\"\",\"attrId\":\"\",\"relationFileId\":\"de70f431-1143-4496-a109-a672f4e14a0d\",\"relationShapeId\":\"obj_c96e34f936b000019ebf1150e72099b0\",\"relationShapeText\":\"员工4\"}]",
"propertyShowValue": "角色3,岗位4"
},
{
"propertyName": "咨询者(C)XML",
"propertyKey": "counselor_c",
"propertyType": "awsorg",
"propertyCondition": "equals",
"propertyValue": "{\"admin\":{\"id\":\"admin\",\"type\":\"user\",\"name\":\"管理员\"},\"5bc3a2dc-3bd2-4376-bcc3-5612e28e55fe\":{\"name\":\"部门1\",\"id\":\"5bc3a2dc-3bd2-4376-bcc3-5612e28e55fe\",\"type\":\"department\"}}",
"propertyShowValue": "管理员,部门1"
},
{
"propertyName": "输出",
"propertyKey": "out",
"propertyType": "textarea",
"propertyCondition": "notEquals",
"propertyValue": "1"
},
{
"propertyName": "层次",
"propertyKey": "level",
"propertyType": "string",
"propertyCondition": "null",
"propertyValue": ""
}
]
],//
}
},
mounted() {
if (palId != '') {
this.form.type = 'shape';
}
this.initMethod();
},
methods: {
initMethod() {// /
const that = this;
const data = {
url:'jd',
data:{
cmd: 'com.actionsoft.apps.coe.pal.batch_replace_active_method_query',
type: that.form.type,
palId: that.palId
}
};
//
awsuiAxios.post(data).then(function (ro) {
if(ro.result == 'ok') {
that.methodOpts = ro.data.methodOpts;
if (that.palId != '') {
that.form.methodId = that.methodOpts[0].value;
} else {
that.form.methodId = '';
}
that.initExAttr();
}
}).catch(error=>{
console.log(error);
})
},
initExAttr() {
this.extAttr = [
[
{
"propertyName": "",
"propertyKey": "",
"propertyType": "string",
"propertyCondition": "equals",
"propertyValue": ""
}
]
];
},
openBpmOrgAddress(i, n) {// BPM
const that = this;
that.bpmOrgAddress.currGroup = i;
that.bpmOrgAddress.currRow = n;
const row = this.extAttr[this.bpmOrgAddress.currGroup][this.bpmOrgAddress.currRow];
const ref = row.ref;
const scope = ref.scope;
that.bpmOrgAddress.addressType = scope.join(',');
that.bpmOrgAddress.multiple = ref.multiple;
that.bpmOrgAddress.title = row.propertyName;
that.bpmOrgAddress.visible = true;
},
saveBpmOrgAddressResult(data) {// BPM
this.bpmOrgAddress.visible = false;
console.log(data);
//
const params = {};
const propertyShowValue = [];
for (let i = 0; i < data.length; i++) {
params[data[i].id] = {name: data[i].name, id: data[i].id, type: data[i].type};
propertyShowValue.push(data[i].name);
}
const row = this.extAttr[this.bpmOrgAddress.currGroup][this.bpmOrgAddress.currRow];
row.propertyValue = JSON.stringify(params);
row.propertyShowValue = propertyShowValue.join(',');
},
openPalRelationAddress(i, n) {// PAL
const that = this;
that.palRelationAddress.currGroup = i;
that.palRelationAddress.currRow = n;
const row = this.extAttr[this.palRelationAddress.currGroup][this.palRelationAddress.currRow];
const ref = row.ref;
const propertyValue = JSON.parse(row.propertyValue);
const selectFileId = [];
const selectShapeId = [];
for (let j = 0; j < propertyValue.length; j++) {
selectFileId.push(propertyValue[j].relationFileId);
selectShapeId.push(propertyValue[j].relationShapeId);
}
this.palRelationAddress.relationType = ref.type;
this.palRelationAddress.multiple = ref.multiple;
this.palRelationAddress.title = row.propertyName;
this.palRelationAddress.selectFileId = selectFileId.join(',');
this.palRelationAddress.selectShapeId = selectShapeId.join(',');
if (ref.method.indexOf('.') > 0) {
this.palRelationAddress.method = ref.method;
this.palRelationAddress.category = ref.method.split('.')[0];
} else {
this.palRelationAddress.category = ref.method;
}
this.palRelationAddress.visible = true;
},
saveRelationResult(data) {// PAL
this.palRelationAddress.visible = false
const row = this.extAttr[this.palRelationAddress.currGroup][this.palRelationAddress.currRow];
const ref = row.ref;
const propertyValue = [];
if (ref.type == 'file') {
for (let i = 0; i < data.length; i++) {
propertyValue.push({
fileId : "",
shapeId : "",
shapeText : "",
attrId : "",
relationFileId : data[i].versionId,
relationShapeId : '',
relationShapeText : data[i].name
});
}
} else {
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];
propertyValue.push({
fileId : "",
shapeId : "",
shapeText : "",
attrId : "",
relationFileId : currFile.id,
relationShapeId : currShape.shapeId,
relationShapeText : currShape.name
});
}
}
}
const propertyShowValue = [];
row.propertyValue = JSON.stringify(propertyValue);
for (let i = 0; i < propertyValue.length; i++) {
propertyShowValue.push(propertyValue[i].relationShapeText);
}
row.propertyShowValue = propertyShowValue.join(',');
},
saveRootFileResult(data) {//
this.rootFileTree.visible = false;
let id = '';
let name = '';
if (data.length > 0) {
const curr = data[0];
id = curr.currId;
name = curr.name;
}
this.form.rootFileId = id;
this.form.rootFileName = name;
},
openAttrTree(i ,n) {//
const that = this;
if (this.form.methodId == '') {
this.$message({message: '请选择文件类型',type: 'warning'});
return false;
}
//
that.attributeDlg.currGroup = i;
that.attributeDlg.currRow = n;
that.attributeDlg.methodId = that.form.methodId;
that.attributeDlg.type = that.form.type;
that.attributeDlg.visible = true;
},
saveAttrTreeResult(data) {//
const row = this.extAttr[this.attributeDlg.currGroup][this.attributeDlg.currRow];
row.propertyName = data.label;
row.propertyKey = data.id;
row.propertyType = 'string';// stringnextTick
row.propertyValue = '';
row.selectTypeOpts = [];
row.propertyShowValue = '';
row.ref = data.ref;
this.$nextTick(function() {
row.propertyType = data.attrType;
if (data.attrType == 'select' || data.attrType == 'select_m' || data.attrType == 'boolean') {
row.selectTypeOpts = [];
const refArr = data.ref.split(',');
for (let i = 0; i < refArr.length; i++) {
row.selectTypeOpts.push({value: refArr[i], label: refArr[i]});
}
} else if (data.attrType == 'relation') {
row.propertyShowValue = '';
row.propertyValue = JSON.stringify([]);
} else if (data.attrType == 'awsorg') {
row.propertyShowValue = '';
row.propertyValue = JSON.stringify({});
}
this.attributeDlg.visible = false;
})
},
addAndCondition(i) {// ""
if (i != undefined) {
this.extAttr[i].push(
{
"propertyName": "",
"propertyKey": "",
"propertyType": "string",
"propertyCondition": "equals",
"propertyValue": ""
}
);
} else {
this.extAttr.push([
{
"propertyName": "",
"propertyKey": "",
"propertyType": "string",
"propertyCondition": "equals",
"propertyValue": ""
}
])
}
},
addOrCondition() {// ""
if (this.extAttr.length == 0) {
this.$message({message: '请先添加一条[+并条件]',type: 'warning'});
return false;
}
this.extAttr.push([
{
"propertyName": "",
"propertyKey": "",
"propertyType": "string",
"propertyCondition": "equals",
"propertyValue": ""
}
])
},
removeRowCondition(i, n) {// ""
const group = this.extAttr[i];
group.splice(n, 1);
if (group.length == 0) {
this.extAttr.splice(i, 1);
}
},
getResults() {//
const result = {};
result.uuid = palId;
result.wsId = wsId;
result.type = this.form.type;
result.rootFileId = this.form.rootFileId;
result.nameScope = this.form.nameScope;
result.name = this.form.name;
result.methodId = this.form.methodId;
result.extAttr = this.extAttr;
return result;
}
}
}
</script>
<style scoped>
#conditionFilter >>> .awsui-form-item__label {
text-align: right;
}
.opt-category-title {
height: 25px;
line-height: 25px;
vertical-align: center;
margin: 20px 30px 15px 20px;
border-left: 3px solid #4E7FF9;
}
#conditionFilter >>> .row .operate-icon-display{
visibility: hidden;
cursor: pointer;
color: red;
}
#conditionFilter >>> .row:hover .operate-icon-display{
visibility: visible;
}
.cursor-pointer {
cursor: pointer;
color: #4E7FF9;
}
</style>

View File

@ -0,0 +1,496 @@
<template>
<div id="replaceRule">
<!--替换规则-->
<div>
<div class="opt-category-title"><p style="padding-left: 5px;"><b>替换规则</b></p></div>
<div>
<awsui-row v-for="(item, n) in ruleData" class="row">
<awsui-col :span="2">
<div style="text-align: center;line-height: 30px;height: 30px;">
<span></span>
</div>
</awsui-col>
<awsui-col :span="8">
<awsui-input style="font-size: 0px" v-model="item.propertyName" placeholder="请选择属性" readonly @click.native="openAttrTree(n)"></awsui-input>
<awsui-input type="hidden" v-model="item.propertyKey" placeholder="请选择属性"></awsui-input>
</awsui-col>
<awsui-col :span="4">
<div style="text-align: center;">
<span>的值更新为</span>
</div>
</awsui-col>
<awsui-col :span="10">
<div style="padding-right: 25px;">
<!--单选类型-->
<awsui-select v-if="item.propertyType == 'select'" clearable v-model="item.propertyValue" :options="item.selectTypeOpts"></awsui-select>
<!--多选类型-->
<awsui-select v-else-if="item.propertyType == 'select_m'" multiple clearable v-model="item.propertyValue" :options="item.selectTypeOpts"></awsui-select>
<!--是否类型-->
<awsui-select v-else-if="item.propertyType == 'boolean'" v-model="item.propertyValue" :options="item.selectTypeOpts"></awsui-select>
<!--数字类型-->
<awsui-input-number v-else-if="item.propertyType == 'number'" v-model="item.propertyValue"></awsui-input-number>
<!--关联PAL类型-->
<awsui-input v-else-if="item.propertyType == 'relation'" v-model="item.propertyShowValue" placeholder="请选择" readonly @click.native="openPalRelationAddress(n)"></awsui-input>
<!--关联BPM组织架构类型-->
<awsui-input v-else-if="item.propertyType == 'awsorg'" v-model="item.propertyShowValue" placeholder="请选择" readonly @click.native="openBpmOrgAddress(n)"></awsui-input>
<!--文本多行文本其他类型-->
<awsui-input v-else v-model="item.propertyValue" placeholder="请输入"></awsui-input>
</div>
<i class="awsui-iconfont operate-icon-display" style="float: right;position: relative; top: -22px;padding-right: 5px;" @click="removeRowRule(n)">&#xe626;</i>
</awsui-col>
</awsui-row>
</div>
<div>
<div style="display: inline-block;border-top:1px solid #c2c2c2;position: relative;bottom: -3px;width:100%;"></div>
<div class="cursor-pointer" style="display: inline-block;background-color:white;position: relative;bottom: 10px;left: 40px;" @click="addRule"><u>+添加规则</u></div>
</div>
</div>
<!--筛选结果-->
<div>
<div class="opt-category-title" style="margin-top: 10px;"><p style="padding-left: 5px;"><b>筛选结果<span>{{resultCount}}</span></b></p></div>
<div v-if="conditionData.type == 'file'">
<el-table
:data="fileTableData"
@selection-change="handleSelectionChange"
style="width: 100%">
<el-table-column
type="selection"
align="center"
min-width="5%">
</el-table-column>
<el-table-column
prop="name"
label="文件名称"
min-width="35%">
</el-table-column>
<el-table-column
prop="namePath"
label="路径"
min-width="25%">
</el-table-column>
<el-table-column
prop="updateDate"
align="center"
min-width="20%"
label="最后修改">
<template slot-scope="scope">
<div style="text-align: center;">
<p>{{scope.row.updateDate}}</p>
<p>({{scope.row.updateUser}})</p>
</div>
</template>
</el-table-column>
</el-table>
</div>
<div v-if="conditionData.type == 'shape'">
<el-table
:data="shapeTableData"
@selection-change="handleSelectionChange"
style="width: 100%">
<el-table-column
type="selection"
align="center"
min-width="5%">
</el-table-column>
<el-table-column
prop="name"
label="文件名称"
min-width="25%">
</el-table-column>
<el-table-column
prop="shapeName"
label="形状名称"
min-width="10%">
</el-table-column>
<el-table-column
prop="namePath"
label="路径"
min-width="30%">
</el-table-column>
<el-table-column
prop="updateDate"
align="center"
min-width="20%"
label="最后修改">
<template slot-scope="scope">
<div style="text-align: center;">
<p>{{scope.row.updateDate}}</p>
<p>({{scope.row.updateUser}})</p>
</div>
</template>
</el-table-column>
</el-table>
</div>
</div>
<BPMOrgAddress
ref="palAwsOrgAddress"
:visible.sync="bpmOrgAddress.visible"
:addressType="bpmOrgAddress.addressType"
v-on:cancel="bpmOrgAddress.visible = false"
v-on:getResult="saveBpmOrgAddressResult"
:title="bpmOrgAddress.title"
:multiple="bpmOrgAddress.multiple"
/>
<pal-relation-address
ref="palRelationAddress"
:visible.sync="palRelationAddress.visible"
v-on:cancel="palRelationAddress.visible = false"
v-on:getResult="saveRelationResult"
:title="palRelationAddress.title"
:selectFileId="palRelationAddress.selectFileId"
:selectShapeId="palRelationAddress.selectShapeId"
:relationType="palRelationAddress.relationType"
:categorys="palRelationAddress.category"
:methods="palRelationAddress.method"
:wsId="palRelationAddress.wsId"
:teamId="palRelationAddress.teamId"
:multiple = palRelationAddress.multiple
/>
<pal-attribute-tree
ref="palAttributeTree"
:visible.sync="attributeDlg.visible"
:methodId="attributeDlg.methodId"
:type="attributeDlg.type"
v-on:cancel="attributeDlg.visible = false"
v-on:getResult="saveAttrTreeResult"
/>
</div>
</template>
<script>
import awsuiAxios from "../../awsuiAxios";
import BPMOrgAddress from "./components/BPMOrgAddress";// pal簿
import PalRelationAddress from "./components/PalRelationAddress";
import PalAttributeTree from './components/PalAttributeTree/index';
export default {
name: "replace-rule",
components: {BPMOrgAddress, PalRelationAddress, PalAttributeTree},
props: {
conditionData: {//
type: Object,
default: function () {
return {}
}
}
},
data() {
return {
resultCount: 0,
wsId: wsId,
teamId: teamId,
attributeDlg: {
visible: false,
methodId: '',
type: '',
currRow: 0
},
bpmOrgAddress: {
visible: false,
addressType: 'user',
title: '',
multiple: false,
currRow: 0
},
palRelationAddress: {
visible: false,
selectFileId: '',
selectShapeId: '',
relationType: '',
category: '',
method: '',
wsId: wsId,
teamId: teamId,
multiple: false,
currRow: 0
},
palId: palId,//
ruleData: [
{
"propertyName": "",
"propertyKey": "",
"propertyType": "string",
"propertyCondition": "equals",
"propertyValue": ""
}
],
fileTableData: [],
shapeTableData: [],
checkedTableData: {},//
}
},
mounted() {
this.queryFilterResultData();
},
methods: {
queryFilterResultData() {//
const that = this;
const data = {
url:'jd',
data:{
cmd : "com.actionsoft.apps.coe.pal.batch_replace_process_condition_result_query",
conditionData : JSON.stringify(that.conditionData)
}
};
awsuiAxios.post(data).then(function (ro) {
if (ro.result == 'ok') {
if (that.conditionData.type == 'file') {
that.resultCount = ro.data.data.length;
for (let i = 0; i < ro.data.data.length; i++) {
ro.data.data[i].idVal = ro.data.data[i].versionId;
}
that.fileTableData = ro.data.data;
} else {
let count = 0;
const shapeTableData = [];
for (let i = 0; i < ro.data.data.length; i++) {
const curr = ro.data.data[i];
const shapeList = curr.shape;
for (let j = 0; j < shapeList.length; j++) {
count++;
const shape = shapeList[j];
shapeTableData.push({
id: curr.id + ',' + shape.id,
idVal: curr.id,
name: curr.name,
shapeName: shape.name,
namePath: curr.namePath,
updateDate: curr.updateDate,
updateUser: curr.updateUser
})
}
}
that.resultCount = count;
that.shapeTableData = shapeTableData;
}
} else if (ro.result == 'warning') {
that.$message({message: ro.msg, type: 'warning'});
} else {
that.$message.error(ro.msg);
}
}).catch(error=>{
console.log(error);
})
},
handleSelectionChange(tableList) {//
this.checkedTableData = {};
for (let i = 0; i < tableList.length; i++) {
this.checkedTableData[tableList[i].id] = tableList[i].idVal;
}
},
removeRowRule(n) {//
this.ruleData.splice(n, 1);
},
addRule() {//
this.ruleData.push({
"propertyName": "",
"propertyKey": "",
"propertyType": "string",
"propertyCondition": "equals",
"propertyValue": ""
})
},
openBpmOrgAddress(n) {// BPM
const that = this;
that.bpmOrgAddress.currRow = n;
const row = this.ruleData[this.bpmOrgAddress.currRow];
const ref = row.ref;
const scope = ref.scope;
that.bpmOrgAddress.addressType = scope.join(',');
that.bpmOrgAddress.multiple = ref.multiple;
that.bpmOrgAddress.title = row.propertyName;
that.bpmOrgAddress.visible = true;
},
saveBpmOrgAddressResult(data) {// BPM
this.bpmOrgAddress.visible = false;
//
const params = {};
const propertyShowValue = [];
for (let i = 0; i < data.length; i++) {
params[data[i].id] = {name: data[i].name, id: data[i].id, type: data[i].type};
propertyShowValue.push(data[i].name);
}
const row = this.ruleData[this.bpmOrgAddress.currRow];
row.propertyValue = JSON.stringify(params);
row.propertyShowValue = propertyShowValue.join(',');
},
openPalRelationAddress(n) {// PAL
const that = this;
that.palRelationAddress.currRow = n;
const row = this.ruleData[this.palRelationAddress.currRow];
const ref = row.ref;
const propertyValue = JSON.parse(row.propertyValue);
const selectFileId = [];
const selectShapeId = [];
for (let j = 0; j < propertyValue.length; j++) {
selectFileId.push(propertyValue[j].relationFileId);
selectShapeId.push(propertyValue[j].relationShapeId);
}
this.palRelationAddress.relationType = ref.type;
this.palRelationAddress.multiple = ref.multiple;
this.palRelationAddress.title = row.propertyName;
this.palRelationAddress.selectFileId = selectFileId.join(',');
this.palRelationAddress.selectShapeId = selectShapeId.join(',');
if (ref.method.indexOf('.') > 0) {
this.palRelationAddress.method = ref.method;
this.palRelationAddress.category = ref.method.split('.')[0];
} else {
this.palRelationAddress.category = ref.method;
}
this.palRelationAddress.visible = true;
},
saveRelationResult(data) {// PAL
this.palRelationAddress.visible = false
const row = this.ruleData[this.palRelationAddress.currRow];
const ref = row.ref;
const propertyValue = [];
if (ref.type == 'file') {
for (let i = 0; i < data.length; i++) {
propertyValue.push({
fileId : "",
shapeId : "",
shapeText : "",
attrId : "",
relationFileId : data[i].versionId,
relationShapeId : '',
relationShapeText : data[i].name
});
}
} else {
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];
propertyValue.push({
fileId : "",
shapeId : "",
shapeText : "",
attrId : "",
relationFileId : currFile.id,
relationShapeId : currShape.shapeId,
relationShapeText : currShape.name
});
}
}
}
const propertyShowValue = [];
row.propertyValue = JSON.stringify(propertyValue);
for (let i = 0; i < propertyValue.length; i++) {
propertyShowValue.push(propertyValue[i].relationShapeText);
}
row.propertyShowValue = propertyShowValue.join(',');
},
openAttrTree(n) {//
const that = this;
//
that.attributeDlg.currRow = n;
that.attributeDlg.methodId = that.conditionData.methodId;
that.attributeDlg.type = that.conditionData.type;
that.attributeDlg.visible = true;
},
saveAttrTreeResult(data) {//
const row = this.ruleData[this.attributeDlg.currRow];
row.propertyName = data.label;
row.propertyKey = data.id;
row.propertyType = 'string';// stringnextTick
row.propertyValue = '';
row.selectTypeOpts = [];
row.propertyShowValue = '';
row.ref = data.ref;
this.$nextTick(function() {
row.propertyType = data.attrType;
if (data.attrType == 'select' || data.attrType == 'select_m' || data.attrType == 'boolean') {
row.selectTypeOpts = [];
const refArr = data.ref.split(',');
for (let i = 0; i < refArr.length; i++) {
row.selectTypeOpts.push({value: refArr[i], label: refArr[i]});
}
} else if (data.attrType == 'relation' || data.attrType == 'awsorg') {
row.propertyShowValue = '';
row.propertyValue = JSON.stringify([]);
}
this.attributeDlg.visible = false;
})
},
getResults() {//
const param = {
wsId : wsId,
teamId : teamId,
uuid : palId,
methodId : this.conditionData.methodId,
type : this.conditionData.type,
conditionData : this.conditionData,
data: {},
isOk: true,
msg: ''
};
const replaceRule = [];
//
for (let i = 0; i < this.ruleData.length; i++) {
const row = this.ruleData[i];
if (row.propertyKey != undefined && row.propertyKey != '') {
var rowObj = {};
rowObj.propertyName = row.propertyName;
rowObj.propertyKey = row.propertyKey;
rowObj.propertyType = row.propertyType;
rowObj.propertyValue = row.propertyValue;
replaceRule.push(rowObj);
}
}
if (replaceRule.length == 0) {
param.isOk = false;
param.msg = '请添加替换规则';
} else {
//
var key = {};
for (let rule in replaceRule) {
if (key[replaceRule[rule].propertyKey] != undefined) {
param.isOk = false;
param.msg = "属性[" + replaceRule[rule].propertyName + "]不允许重复";
break;
}
key[replaceRule[rule].propertyKey] = "";
}
}
param.replaceRule = replaceRule;
//
if (param.isOk) {
param.data = this.checkedTableData;
if (JSON.stringify(param.data) == "{}") {
param.isOk = false;
if (this.conditionData.type == 'file') {
param.msg = "请选择替换的流程文件";
} else {
param.msg = "请选择替换的流程形状";
}
}
}
return param;
}
}
}
</script>
<style scoped>
.opt-category-title {
height: 25px;
line-height: 25px;
vertical-align: center;
margin: 20px 30px 15px 20px;
border-left: 3px solid #4E7FF9;
}
#replaceRule >>> .row:hover .operate-icon-display{
visibility: visible;
}
.cursor-pointer {
cursor: pointer;
color: #4E7FF9;
}
#replaceRule >>> .row .operate-icon-display{
visibility: hidden;
cursor: pointer;
color: red;
}
</style>

View File

@ -0,0 +1,331 @@
<template>
<awsui-layout>
<awsui-header id="header">
<el-steps :active="active" align-center>
<el-step title="筛选条件" icon="el-icon-search"></el-step>
<el-step title="替换规则" icon="el-icon-edit-outline"></el-step>
<el-step title="执行结果" icon="el-icon-success"></el-step>
</el-steps>
</awsui-header>
<awsui-main :style="{height: mainHeight, padding: '0'}">
<!-- 筛选条件 用v-show点击下一步再返回数据不会销毁 -->
<div v-show="this.active == 1" class="step" :style="{height: mainHeight}">
<condition-filter ref="conditionFilter"/>
</div>
<!-- 替换规则 -->
<div v-if="this.active == 2" class="step" :style="{height: mainHeight}">
<replace-rule ref="replaceRule" :condition-data="conditionData"/>
</div>
<!-- 执行结果 -->
<div v-if="this.active == 3" class="step" :style="{height: mainHeight}">
<save ref="save" :param="replaceRuleInfo" :totalHeight="mainHeight"/>
</div>
</awsui-main>
<awsui-footer>
<div style="float: right;">
<awsui-button v-if="this.active == 2" style="margin-top: 12px;" @click="prev">上一步</awsui-button>
<awsui-button v-if="this.active == 1 || this.active == 2" style="margin-top: 12px;" @click="next">下一步</awsui-button>
<template v-if="this.active == 3">
<awsui-button style="margin-top: 12px;" @click="downloadLog">导出报告</awsui-button>
<awsui-button style="margin-top: 12px;" @click="success">完成</awsui-button>
</template>
</div>
</awsui-footer>
</awsui-layout>
</template>
<script>
import awsuiAxios from "../../awsuiAxios";
import ConditionFilter from "./condition-filter";
import ReplaceRule from "./replace-rule";
import save from "./save";
export default {
name: "replace",
components: {ConditionFilter, ReplaceRule, save},
data() {
return {
active: 1,
wsId: wsId,
teamId: teamId,
conditionData: {},//
replaceRuleInfo: {},//
methodCategory: methodCategory,
appId: appId,
repositoryName: repositoryName,
groupValue: groupValue,
processFileValue: processFileValue,
shapeFileValue: shapeFileValue,
mainHeight: (document.documentElement.clientHeight) - 60 - 40 + 'px',
uploadStep: {
activeName: 'processList',
loading: false,
processUpload: {//
status: 0,
fileList: [],//
data: {},//
},
shapeUpload: {//
status: 0,
fileList: [],
data: {},
createTree : {
visible: false,
title: '请选择流程'
}
}
},
checkStep: {
type: ''
},
fileList: [],
saveData: {//
wsId: wsId,
teamId: teamId,
type: '',
fileValue: '',
fileName: '',
data: {
okData: []
}
},
};
},
mounted() {
const that = this;
that.resize();
},
methods: {
prev() {//
if (this.active == 2) {
this.checkStep.type = '';
}
this.active--;
},
next() {//
if (this.active == 1) {//
const conditionFilter = this.$refs.conditionFilter.getResults();
if (conditionFilter.methodId == '') {
this.$message({message: '请选择文件类型', type: 'warning'});
return false;
}
this.conditionData = conditionFilter;
} else if (this.active == 2) {
const replaceRuleInfo = this.$refs.replaceRule.getResults();
if (!replaceRuleInfo.isOk) {
this.$message({message: replaceRuleInfo.msg, type: 'warning'});
return false;
}
this.replaceRuleInfo = replaceRuleInfo;
}
this.active++;
},
success() {//
parent.closeBatchReplaceFn([]);
},
downloadLog() {//
this.$refs.save.downloadLog();
},
checkUploadFile() {//
if (this.uploadStep.activeName == 'processList') {
if (this.uploadStep.processUpload.status == 1) {
return true;
}
} else if (this.uploadStep.activeName == 'shapeList') {
if (this.uploadStep.shapeUpload.status == 1) {
return true;
}
}
return false;
},
uploadFile(type) {//
if (type == 'process') {//
this.$refs.processUpload.clearFiles();
document.getElementById("selectProcessFileButton").click();
} else {//
this.$refs.shapeUpload.clearFiles();
document.getElementById("selectShapeFileButton").click();
}
},
downloadTemplate(type, versionIds) { //
const that = this;
that.uploadStep.loading = true;
const data = {
url:'jd',
data:{
cmd : "com.actionsoft.apps.coe.pal.batch_create_download_template",
wsId : that.wsId,
type : type,
versionIds : versionIds
}
};
awsuiAxios.post(data).then(function (ro) {
that.uploadStep.loading = false;
if (ro.result == 'ok') {
window.open(ro.data.url);
} else if (ro.result == 'warning') {
that.$message({message: ro.msg, type: 'warning'});
} else {
that.$message.error(ro.msg);
}
}).catch(error=>{
console.log(error);
})
},
downLoadUploaded(fileValue, name) {//
const that = this;
that.uploadStep.loading = true;
const data = {
url:'jd',
data:{
cmd : "com.actionsoft.apps.coe.pal.batch_create_uploaded_file_download",
fileValue : fileValue,
fileName : name
}
};
awsuiAxios.post(data).then(function (ro) {
that.uploadStep.loading = false;
if (ro.result == 'ok') {
window.location.href = ro.data.url;
} else if (ro.result == 'warning') {
that.$message({message: ro.msg, type: 'warning'});
} else {
that.$message.error(ro.msg);
}
}).catch(error=>{
console.log(error);
})
},
deleteUploaded(fileValue, name) {//
const that = this;
that.uploadStep.loading = true;
const data = {
url:'jd',
data:{
cmd : "com.actionsoft.apps.coe.pal.batch_create_uploaded_file_delete",
fileValue : fileValue,
fileName : name
}
};
awsuiAxios.post(data).then(function (ro) {
that.uploadStep.loading = false;
if (ro.result == 'ok') {
if (that.uploadStep.activeName == 'processList') {//
that.$refs.processUpload.clearFiles();
that.uploadStep.processUpload.status = 0;
that.uploadStep.processUpload.data = {};
} else {//
that.$refs.shapeUpload.clearFiles();
that.uploadStep.shapeUpload.status = 0;
that.uploadStep.shapeUpload.data = {};
}
} else if (ro.result == 'warning') {
that.$message({message: ro.msg, type: 'warning'});
} else {
that.$message.error(ro.msg);
}
}).catch(error=>{
console.log(error);
})
},
/******模型结构模板下载start*******/
openRepositoryTreeDlg () {//
this.uploadStep.shapeUpload.createTree.visible = true;
},
saveCreateTreeResult(data) {//
if (data.length == 0) {
this.$message({message: '未选择任何模型,下载模板被取消', type: 'warning'});
} else {
this.downloadTemplate('shapeList', data.join(','));
}
},
/******模型结构模板下载end*******/
/******模型清单模板上传start*********/
handleProcessRemove(file, fileList) {
this.uploadStep.processUpload.status = 0;
},
handleProcessPreview(file) {
},
handleProcessExceed(files, fileList) {
},
handleProcessError(err, file, fileList) {
},
beforeProcessUpload(file) {
//
if (file.size / 1024 / 1024 > 10) { //10M
this.$message.warning('文件不允许超过10M');
return false;
}
},
handleProcessSuccess(response, file, fileList) {
const that = this;
that.uploadStep.processUpload.status = 1;
that.uploadStep.processUpload.data = {
name: file.name,
size: file.size
};
},
beforeProcessRemove(file, fileList) {
},
/******模型清单模板上传end*********/
/******模型结构模板上传start*********/
handleShapeRemove(file, fileList) {
this.uploadStep.shapeUpload.status = 0;
},
handleShapePreview(file) {
},
handleShapeExceed(files, fileList) {
},
handleShapeError(err, file, fileList) {
},
beforeShapeUpload(file) {
//
if (file.size / 1024 / 1024 > 10) { //10M
this.$message.warning('文件不允许超过10M');
return false;
}
},
handleShapeSuccess(response, file, fileList) {
const that = this;
that.uploadStep.shapeUpload.status = 1;
that.uploadStep.shapeUpload.data = {
name: file.name,
size: file.size
};
},
beforeShapeRemove(file, fileList) {
},
/******模型结构模板上传end*********/
resize() {// window.resize
const that = this
let resizeTimer = null;
window.onresize = () => {
return (() => {
if (resizeTimer) clearTimeout(resizeTimer);
resizeTimer = setTimeout(function(){
that.mainHeight = (document.documentElement.clientHeight) - 60 - 40 + 'px';
} , 400);
})()
}
},
}
}
</script>
<style scoped>
#header >>> .el-step__title {
font-size: 14px;
}
.step {
overflow: auto;
width: 100%;
}
</style>

View File

@ -0,0 +1,184 @@
<template>
<div v-loading="loading" :style="{height: mainHeight, 'background-color': '#2c2c2c'}">
<codemirror
id="mycode"
ref="mycode"
style="height: auto"
v-model="curCode"
:options="cmOptions"
class="code"
/>
</div>
</template>
<script>
import awsuiAxios from "../../awsuiAxios";
import { codemirror } from 'vue-codemirror'
import "codemirror/theme/ambiance.css"; // theme
require("codemirror/mode/javascript/javascript"); // jsmode
export default {
name: "check-process",
props: {
param: {//
type: Object,
default: function () {
return {}
}
},
totalHeight: {
type: String,
default: '0px'
}
},
components: {codemirror},
data() {
return {
loading: false,
wsId: wsId,
teamId: teamId,
processFileValue: processFileValue,
msgHeight: '20px',
mainHeight: parseInt(this.totalHeight) + 'px',
curCode: '正在导入',
cmOptions: {
value:'',
mode:"text/html",
theme: "ambiance",
lineNumbers: false,
styleActiveLine: true,
tabSize: 4,
autofocus: true,
scrollbarStyle: "null",
readOnly:true,
},
result: {//
path: '',
type: '',
logId: '',
count: 0,
executeDone: false,
interval: null, //
timer:0, //
}
}
},
mounted() {
this.save();
},
methods: {
save() {//
const that = this;
const data = {
url:'jd',
data:{
cmd : "com.actionsoft.apps.coe.pal.batch_replace_data_save",
param : JSON.stringify(that.param)
}
};
awsuiAxios.post(data).then(function (ro) {
if (ro.result == 'ok') {
//
that.result.path = ro.data.path;
that.result.logId = ro.data.logId;
that.result.type = ro.data.type;
that.result.count = 0;
that.getImportInfoEvent();
} else if (ro.result == 'warning') {
that.$message({message: ro.msg, type: 'warning'});
} else {
that.$message.error(ro.msg);
}
}).catch(error=>{
console.log(error);
})
},
getImportInfoEvent() {//
this.result.interval = setInterval(this.queryLog, 1000)
},
queryLog() {
const that = this;
that.result.timer = new Date().getTime();
const data = {
url:'jd',
data:{
cmd : "com.actionsoft.apps.coe.pal.batch_replace_log_query",
type: that.result.type,
logId: that.result.logId,
path: that.result.path,
timer: that.result.timer
}
};
awsuiAxios.post(data).then(function (ro) {
if (ro.result == 'ok') {
if (ro.data.timer == '') {
that.curCode = ro.data.content;
//
that.$nextTick(()=> {
that.$refs.mycode.codemirror.scrollIntoView(that.$refs.mycode.codemirror.lineCount() - 1);
});
that.result.executeDone = true;
that.clearInterval();
} else if (parseInt(ro.data.timer) <= that.result.timer){// axios
that.curCode = ro.data.content;
//
that.$nextTick(()=> {
that.$refs.mycode.codemirror.scrollIntoView(that.$refs.mycode.codemirror.lineCount() - 1);
});
}
} else if (ro.result == 'warning') {
that.$message({message: ro.msg, type: 'warning'});
} else {
that.$message.error(ro.msg);
}
}).catch(error=>{
console.log(error);
})
},
clearInterval() {
clearInterval(this.result.interval);
},
downloadLog() {
const that = this;
if (that.result.path == '') {
that.$message({message: '获取报告失败', type: 'warning'});
return;
}
if (!that.result.executeDone) {
that.$message({message: '正在导入,请稍等', type: 'warning'});
return;
}
const data = {
url:'jd',
data:{
cmd : "com.actionsoft.apps.coe.pal.batch_replace_log_download",
type: that.result.type,
path: that.result.path
}
};
awsuiAxios.post(data).then(function (ro) {
if (ro.result == 'ok') {
window.open(ro.data.url);
parent.closeBatchReplaceFn([]);//
} else if (ro.result == 'warning') {
that.$message({message: ro.msg, type: 'warning'});
} else {
that.$message.error(ro.msg);
}
}).catch(error=>{
console.log(error);
})
}
}
}
</script>
<style scoped>
#mycode >>> .CodeMirror-lines {
background-color: #2c2c2c;
color: #58A0F0;
}
#mycode >>> .CodeMirror {
height: auto !important;
}
</style>

View File

@ -0,0 +1,42 @@
* {
padding: 0;
margin: 0;
}
body {
color: #4a4a4a;
font-family: PingFangSC-Light;
}
ul {
list-style: none;
}
a {
text-decoration: none;
}
div,span,section,i,button {
-webkit-tap-highlight-color: transparent;
outline: none;
}
.radius3 {
-moz-border-radius: 3px 3px 3px 3px;
-webkit-border-radius: 3px 3px 3px 3px;
border-radius: 3px 3px 3px 3px;
}
.tree-content-icon {
font-size: 13px;
}
.tree-content-icon-padding {
padding-right: 2px;
}
.el-input__inner {
border-radius: 0px;
}
.el-textarea__inner {
border-radius: 0px;
}

View File

@ -0,0 +1,244 @@
/*设计颜色规范*/
/*
通用鼠标悬浮色
所有悬浮状态的底色包括下拉列表项表格卡片等
*/
.general-bgcolor-hover:hover {
background-color: #F5F7FA !important;
}
.general-bgcolor-text-hover:hover {
background-color: #F5F7FA !important;
color : #4E7FF9 !important;
}
/*通用分隔线*/
.general-dividing-line {
color: #F2F2F2;
}
/**********************下拉菜单覆盖*************************/
/*下拉菜单定义悬浮颜色和悬浮字体色*/
.el-dropdown-menu__item:not(.is-disabled):hover{
background-color: #F5F7FA !important;
color: #333333 !important;
}
/**********************导航菜单栏颜色设置*************************/
.el-menu-item:hover{
color: #4E7FF9;
background-color: #F5F7FA !important;
}
.el-submenu__title:hover{
background-color: #F5F7FA !important;
}
.el-menu-item.is-active {
color: #4E7FF9;
background-color: #F5F7FA !important;
}
/**********************文字*************************/
/*主要字体颜色,通用字体颜色,系统普遍使用的字体颜色*/
.text-general-color {
color : #606266;
}
.text-general-bgcolor {
background-color : #606266;
}
/*
次要字体颜色
1 次要标注性信息 管理员 于2020年2月23日 19:30 修改
2 非重要按钮 取消按钮文本
3 列表表头 流程清单编号流程名称
*/
.text-second-color {
color : #909399;
}
.text-second-bgcolor {
background-color : #909399;
}
/*链接、可点击文本、icon颜色*/
.text-linker-color {
color : #4E7FF9;
}
.text-linker-bgcolor {
background-color : #4E7FF9;
}
/*重要文本颜色*/
.text-important-color {
color : #D9001B;
}
.text-important-bgcolor {
background-color : #D9001B;
}
/*el-link颜色*/
.el-link.el-link--primary {
color: #4E7FF9;
}
/**********************表格*************************/
/*表头文字颜色*/
.table-head-text-color {
color: #909399;
}
/*表头背景颜色*/
.table-head-bgcolor {
}
/*表头文字颜色*/
.table-body-text-color {
}
/*表格表体背景颜色*/
.table-body-bgcolor {
}
/*表格表体行鼠标悬浮色*/
.table-body-row-bgcolor:hover {
background-color: #F5F7FA !important;
}
/*表格表体行下划线颜色*/
.el-table td {
border-bottom: 1px solid #F2F2F2;
}
/*表格筛选的表头选中颜色*/
.el-table th>.cell.highlight {
color: #4E7FF9;
}
/*表格筛选的表头选项筛选和重置按钮悬浮颜色*/
.el-table-filter__bottom button:hover {
color:#4E7FF9
}
/*表格筛选排序上下箭头*/
.el-table .descending .sort-caret.descending {
border-top-color: #4E7FF9;
}
.el-table .ascending .sort-caret.ascending {
border-bottom-color: #4E7FF9;
}
/**********************按钮*************************/
/*通用按钮1例如窗口确定按钮新建按钮等设计颜色*/
.button-general-color {
background-color: #4E7FF9 !important;
border-color: #4E7FF9 !important;
}
.button-general-color-reverse {
border-color: #4E7FF9 !important;
color: #4E7FF9 !important;
}
/*通用按钮2例如重要操作类按钮*/
.button-general-color2 {
background-color: #D9001B !important;
border-color: #D9001B !important;
}
.button-general-color-reverse2 {
border-color: #D9001B !important;
color: #D9001B !important;
}
/*通用按钮3例如取消等灰色按钮*/
.button-general-color3 {
background-color: #909399 !important;
border-color: #909399 !important;
}
.button-general-color-reverse3 {
border-color: #909399 !important;
color: #909399 !important;
}
/********************多选框***********************/
.el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
background-color: #4E7FF9;
border-color: #4E7FF9;
}
.el-checkbox__input.is-checked+.el-checkbox__label {
color: #4E7FF9;
}
/********************单选框***********************/
.el-radio__input.is-checked .el-radio__inner {
border-color: #4E7FF9;
background: #4E7FF9;
}
.el-radio__input.is-checked+.el-radio__label {
color: #4E7FF9;
}
/********************列表***********************/
.li-general-hover-bgcolor:hover {
background-color: #F5F7FA;
}
.el-table__body tr.current-row>td {
background-color: #F5F7FA;
}
/*******************加载中颜色********************/
.el-loading-spinner .path {
stroke: #4E7FF9;
}
.el-loading-spinner .el-loading-text {
color: #4E7FF9;
}
/******************下拉框文字选中颜色*************/
.el-select-dropdown__item.selected {
color: #4E7FF9 !important;
}
.el-select-dropdown.is-multiple .el-select-dropdown__item.selected {
color: #4E7FF9;
}
/*****************步骤条**********************/
.el-step__title.is-process {
color: #909399;
}
.el-step__title.is-finish {
color: #4E7FF9;
}
.el-step__head.is-process {
color: #909399;
border-color: #909399;
}
.el-step__head.is-finish {
color: #4E7FF9;
border-color: #4E7FF9;
}
/*********************Popover 弹出框***********************/
.el-popover__title {
color : #606266;
font-weight: 600;
}
/*********************树***********************/
.el-tree-node__content {
height: 30px;
}
/*树展开关闭图标大小*/
.el-tree-node__expand-icon {
font-size: 12px;
}
/*树展开关闭图标的padding*/
.el-tree-node__content>.el-tree-node__expand-icon {
padding: 1px;
}
.el-table__empty-text {
font-size: 12px;
}

View File

@ -0,0 +1,123 @@
const HtmlWebpackPlugin = require('html-webpack-plugin')
const AWSDevParams = require('./AWSDevParams');
const AWSReleasePath = AWSDevParams.AWSReleasePath;
const AWSPortalUrl = AWSDevParams.AWSPortalUrl;
//开发时通过用户名及密码获取sessionId
const devUserInfo =AWSDevParams.devUserInfo;
const AWSproxyPath = "/AWSDEVURL/r/"; //防止跨域的地址
const moduleTemplateInAWS = AWSDevParams.moduleTemplateInAWS;//平台的模板路径
const outputDir = AWSDevParams.outputDir;
const publicPath = AWSDevParams.publicPath;//决定生成在平台的js或css的相对路径,与build配置的路径要对应
//判断是否开发
const isproduction = process.env.NODE_ENV === 'production';
//开发时路径和build到平台路径
let AWSJSAndCSSPath = isproduction ? "../" : AWSproxyPath.replace("r/","");
let AWSJSAndCSSImport = AWSDevParams.AWSJSAndCSSImport == null ? [] : AWSDevParams.AWSJSAndCSSImport;
let AWSJSAndCSSImportArray = [];
for(let k of AWSJSAndCSSImport){
if(k.type == "css"){
AWSJSAndCSSImportArray.push("<link type='text/css' rel='stylesheet' href='"+AWSJSAndCSSPath + k.path +"'/>");
}else if(k.type == "js"){
AWSJSAndCSSImportArray.push("<script type='text/javascript' src='"+AWSJSAndCSSPath + k.path + "'></script>");
}
}
const getAWSFileRelativePath = ()=>{
let index = "./";
if(isproduction){
index = publicPath;
}
return index;
}
const getIndexPath = ()=>{
let index = "index.html";
if(isproduction){
index = AWSReleasePath+moduleTemplateInAWS;
}
return index;
}
module.exports = {
// 基本路径 build后文件路径../apps/_bpm.platform/test2 ,开发运行时文件路径./
publicPath: getAWSFileRelativePath(),
//生成入口的html文件位置
indexPath: getIndexPath(),
outputDir : AWSReleasePath+outputDir,
// eslint-loader 是否在保存的时候检查
lintOnSave: true,
productionSourceMap: false, //打包不使用源码false后在平台无法调试
// use the full build with in-browser compiler?
// https://vuejs.org/v2/guide/installation.html#Runtime-Compiler-vs-Runtime-only
// compiler: false,
// webpack配置
// see https://github.com/vuejs/vue-cli/blob/dev/docs/webpack.md
chainWebpack: (config) => {
config.plugin('html')
.tap(args => {
let buildVar = args[0];
buildVar.AWSJSAndCSSImport = AWSJSAndCSSImportArray.join("\n");
debugger
buildVar.AWSJSAndCSSPath = AWSJSAndCSSPath;
buildVar.devUserInfo = devUserInfo;
buildVar.isproduction = isproduction;
buildVar.axiosBaseUrl = isproduction ? "./" : AWSproxyPath;
buildVar.settingParam = isproduction ? "<#settingParam>" : "{}";
return args;
});
},
configureWebpack: config => {
if (isproduction) {
// 为生产环境修改配置...
config.mode = 'production'
} else {
// 为开发环境修改配置...
config.mode = 'development'
}
},
devServer: {
proxy: {
//配置跨域
"/AWSDEVURL": {
target: AWSPortalUrl,
ws: true,
changOrigin: true, //允许跨域
pathRewrite: {
"^/AWSDEVURL": "" //请求的时候使用这个URL就可以
}
}
}
},
// css相关配置
css: {
loaderOptions: {}
},
// 是否启用dll
// See https://github.com/vuejs/vue-cli/blob/dev/docs/cli-service.md#dll-mode
// dll: false,
// PWA 插件相关配置
// see https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-pwa
pwa: {},
// webpack-dev-server 相关配置
// devServer: {
// open: process.platform === 'darwin',
// disableHostCheck: true,
// host: 'www.test.com',//如果是真机测试就使用这个IP
// port: 1234,
// https: false,
// hotOnly: false,
// before: app => {}
// },
// 第三方插件配置
pluginOptions: {
}
}

File diff suppressed because it is too large Load Diff