You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

783 lines
24 KiB
Plaintext

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<el-row class="container-row">
<div v-for="(btn, idx) of toolBtns" :key="idx">
<div v-if="btn.No === 'Send'">
<div v-if="currNode.CondModel == 2" class="flex-center">
<el-button
size="medium"
:key="btn.No"
@click="btnOpen(btn)"
:disabled="btnDisabled"
:loading="sendLoading"
>
<i :class="iconMap.get(btn.No)"></i> {{ btn.Name }}
</el-button>
<el-select
v-model="selectNode.No"
id="DDL_ToNode"
placeholder="请选择下一个处理节点"
v-show="toNodes.length !== 0"
style="margin: 3px 5px 0 10px"
@change="changeToNode"
>
<el-option
v-for="item in toNodes"
:key="item.No"
:label="item.Name"
:value="item.No"
>
</el-option>
</el-select>
</div>
<div v-else-if="currNode.CondModel == 3">
<div v-for="node in toNodes" :key="node.No">
<el-button
size="medium"
@click="btnOpen(btn, node, idx)"
:disabled="btnDisabled"
>
<i :class="iconMap.get(node.No)"></i> {{ node.Name }}
</el-button>
</div>
</div>
<div v-else>
<el-button
size="medium"
:key="btn.No"
@click="btnOpen(btn)"
:disabled="btnDisabled"
:loading="sendLoading"
>
<i :class="iconMap.get(btn.No)"></i> {{ btn.Name }}
</el-button>
</div>
</div>
<div v-else-if="btn.No === 'Save'">
<el-button
size="medium"
:key="btn.No"
@click="btnOpen(btn, null, idx)"
:disabled="btnDisabled"
:loading="saveLoading"
><i :class="iconMap.get(btn.No)"></i> {{ btn.Name }}
</el-button>
</div>
<div v-else>
<el-button
size="medium"
:key="btn.No"
@click="btnOpen(btn, null, idx)"
:disabled="btnDisabled"
>
<i :class="iconMap.get(btn.No)"></i> {{ btn.Name }}
</el-button>
</div>
</div>
<el-dialog
:title="title"
:visible.sync="dialogFormVisible"
:before-close="handleClose"
destroy-on-close
>
<OpenDialog :judgeOperation="judgeOperation" :params="params"></OpenDialog>
</el-dialog>
</el-row>
</template>
<script>
import {
beforeSave,
beforeReturn,
beforeDelete,
} from "@/datauser/jslidata/MyPublic.js";
import OpenDialog from "./OpenDialog.vue";
import {openMyFlow} from "@/wf/api/Dev2Interface.js";
export default {
props: {
pageFrom: { type: String, default: "MyFlow" },
urlParams:{type: Object,default:()=>{}},
Save:{type:Function,default:null}
},
provide: function () {
return {
toolBarInstance: this,
};
},
components: {
OpenDialog,
},
data() {
const iconMap = new Map([
["Return", "el-icon-circle-close"],
["Shift", "el-icon-sort"],
["Track", "el-icon-connection"],
["Search", "el-icon-search"],
["Focus", "el-icon-aim"],
["Send", "el-icon-s-promotion"],
["Save", "el-icon-document-checked"],
]);
return {
params: {}, //传递的参数
webUser: {}, //用户信息
toolBtns: [], //按钮对象的集合
toNodes: [], //跳转到的节点
currNode: {}, //当前节点的信息
btnDisabled: false, //操作按钮禁用
saveLoading: false, //保存加载操作
sendLoading: false, //发送加载操作
selectNode: {}, //按钮旁的下拉框,发送时选择的节点
/***弹出窗页面的定义**/
title: "", //弹出窗的标题
dialogFormVisible: false, //是否显示弹出窗
judgeOperation: "", //弹出窗的类型
componentList: [],
currentView: "ch",
returnData: {}, //返回select数据
iconMap,
};
},
created() {
//初始化按钮
this.params = this.urlParams;
this.webUser = this.$store.getters.getWebUser;
this.initToolBar();
if (this.toNodes != undefined && this.toNodes.length != 0){
this.selectNode = JSON.parse(JSON.stringify(this.toNodes[0]));
this.params.ToNode = this.selectNode.No;
}
else this.toNodes = [];
},
watch: {
},
methods: {
initToolBar: function () {
let handlerName = "";
switch (this.pageFrom) {
case "MyFlow":
handlerName = "BP.WF.HttpHandler.WF_MyFlow";
break;
case "MyView":
handlerName = "BP.WF.HttpHandler.WF_MyView";
break;
case "MyCC":
handlerName = "BP.WF.HttpHandler.WF_MyCC";
break;
default:
handlerName = "BP.WF.HttpHandler.WF_MyView";
}
let handler = new this.HttpHandler(handlerName);
handler.AddJson(this.params);
let data = handler.DoMethodReturnString("InitToolBar");
if (data.indexOf("err@") != -1) {
this.$alert(data.replace("err@", ""), {
dangerouslyUseHTMLString: true,
});
return;
}
data = JSON.parse(data);
this.toolBtns = data.ToolBar==undefined?data:data.ToolBar;
this.toNodes = data['ToNodes'];
if (this.toNodes != undefined)
this.toNodes.forEach((toNode) => {
toNode.text = toNode.Name;
});
this.currNode =data.WF_Node!=undefined? data.WF_Node[0]:null;
},
btnOpen: function (btn, toNode, idx) {
switch (btn.No) {
case "Send": //发送
if (this.currNode['CondModel'] === 3) {
this.selectNode = JSON.parse(JSON.stringify(toNode));
this.params.ToNode = this.selectNode.No;
this.$store.commit("setData", this.params);
}
this.SendFlow();
break;
case "SendHuiQian": //会签确定
this.SendFlow();
break;
case "Save": //保存,需要调用父组件的方法
this.SaveFlow(false);
break;
case "Help": //帮助提示
this.HelpAlert(btn.Role);
break;
case "DeleteFlow": //删除流程
this.DeleteFlow();
break;
case "EndFlow": //结束流程
this.StopFlow();
break;
case "ReSet": //重置数据
this.ReSet();
break;
case "Focus": //关注
this.Focus(btn.Name, idx);
break;
case "Confirm": //确认
this.Confirm(btn.Name, idx);
break;
case "Press": //催办
this.Press();
break;
case "UnSend": //撤销
this.UnSend();
break;
default:
//弹框
if (btn.No == "Return") {
if (
typeof beforeReturn != "undefined" &&
beforeReturn instanceof Function
)
if (beforeReturn() == false) return false;
if(this.Save)
this.Save(false);
}
this.DialogOpen(btn);
break;
}
},
changeToNode(nextNodeNo) {
const selectedNode = this.toNodes.filter(
(node) => node.No === nextNodeNo
);
if (selectedNode.length > 1 || selectedNode.length === 0) {
this.$message.error("下级节点id错误");
return;
}
this.selectNode = JSON.parse(JSON.stringify(selectedNode[0]));
this.params.ToNode = this.selectNode.No;
this.$store.commit("setData", this.params);
},
SendFlow: function () {
//发送
try{
this.Send();
}catch(e){
this.$message({
type: "error",
message: e.toString(),
});
}finally {
this.btnDisabled = false;
this.sendLoading = false;
}
},
SaveFlow: function (isSend) {
//保存
try{
if (typeof beforeSave != "undefined" && beforeSave instanceof Function)
if (beforeSave() == false) return false;
this.saveLoading = true;
if ((this.currNode['FormType'] === 2 || this.currNode['FormType'] === 3) && this.Save) {
this.SendSelfFrom(false);
this.$message.success("保存成功");
return;
}
if(this.Save)
this.Save(isSend);
}catch(e){
this.$message({type:"error",message:e.toString()})
}finally{
this.saveLoading = false;
}
},
//弹出新页面窗体
DialogOpen: function (btn) {
//弹出框
// 如果是轨迹图 先请求接口
this.title = btn.Name;
this.dialogFormVisible = true;
this.judgeOperation = btn.No;
},
//帮助提示
HelpAlert: function (helpRole) {
if (helpRole != 0) {
let count = 0;
let mypk =
this.webUser.No + "_ND" + this.currNode.NodeID + "_HelpAlert";
let userRegedit = new this.Entity("BP.Sys.UserRegedit");
userRegedit.SetPKVal(mypk);
count = userRegedit.RetrieveFromDBSources();
if (helpRole == 2 || (count == 0 && helpRole == 3)) {
let filename =
"/DataUser/CCForm/HelpAlert/" + this.currNode.NodeID + ".htm";
let htmlobj = this.$.ajax({ url: filename, async: false });
if (htmlobj.status == 404) return;
let str = htmlobj.responseText;
if (str != null && str != "" && str != undefined) {
this.$alert(str, "帮助指引", {
dangerouslyUseHTMLString: true,
beforeClose: (action, instance, done) => {
if (count == 0) {
//保存数据
userRegedit.FK_Emp = this.webUser.No;
userRegedit.FK_MapData = "ND" + this.currNode.NodeID;
userRegedit.Insert();
}
done();
},
});
}
}
}
},
//删除流程
DeleteFlow: function () {
if (
typeof beforeDelete != "undefined" &&
beforeDelete instanceof Function
)
if (beforeDelete() == false) return false;
this.$confirm("您确定要删除改流程数据吗, 是否继续?", "", {
confirmButtonText: "确定",
cancelButtonText: "取消",
}).then(() => {
let handler = new this.HttpHandler("BP.WF.HttpHandler.WF_MyFlow");
handler.AddPara("FK_Flow", this.params.FK_Flow);
handler.AddPara("FK_Node", this.params.FK_Node);
handler.AddPara("WorkID", this.params.WorkID);
let str = handler.DoMethodReturnString("DeleteFlow");
if (str.indexOf("err@") != -1) {
this.$message({
type: "error",
message: "删除失败,请查看控制台,或者联系管理员",
});
console.log(str);
} else {
this.$message({
type: "success",
message: str,
});
}
});
},
//结束流程
StopFlow: function () {
this.$confirm("您确定要结束该流程吗 ?", "", {
confirmButtonText: "确定",
cancelButtonText: "取消",
}).then(() => {
let handler = new this.HttpHandler("BP.WF.HttpHandler.WF_MyFlow");
handler.AddPara("FK_Flow", this.params.FK_Flow);
handler.AddPara("WorkID", this.params.WorkID);
let data = handler.DoMethodReturnString("MyFlow_StopFlow");
if (data.indexOf("err@") != -1) {
this.$message({
type: "error",
message: "流程结束失败,请查看控制台,或者联系管理员",
});
console.log(data);
} else {
this.$message({
type: "success",
message: data,
});
}
});
},
//数据重置
ReSet: function () {},
//关注
Focus: function (btnLab, idx) {
if (btnLab == "关注") btnLab = "取消关注";
else btnLab = "关注";
this.toolBtns[idx].Name = btnLab;
let handler = new this.HttpHandler("BP.WF.HttpHandler.WF_MyFlow");
handler.AddPara("WorkID", this.params.WorkID);
handler.DoMethodReturnString("Focus"); //执行保存方法.
},
//确认
ConfirmBtn: function (btnLab, idx) {
if (btnLab == "确认") btnLab = "取消确认";
btnLab = "确认";
this.toolBtns[idx].Name = btnLab;
let handler = new this.HttpHandler("BP.WF.HttpHandler.WF_MyFlow");
handler.AddPara("WorkID", this.params.WorkID);
handler.DoMethodReturnString("Confirm");
},
Press: function(){
this.$prompt('请输入催办信息', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
inputPattern: /\S/,
inputErrorMessage: '催办原因不为空'
}).then(({ value }) => {
let handler = new this.HttpHandler("BP.WF.HttpHandler.WF");
handler.AddJson(this.params);
handler.AddPara("Msg", value);
let data = handler.DoMethodReturnString("Runing_Press");
if (typeof data ==='string' && data.includes("err@")) {
this.$message({
type: "error",
message: data.replace('err@',''),
});
} else {
this.$message({
type: "success",
message: data,
});
}
});
},
UnSend:function(){
this.$confirm("您确定要撤销本次发送吗 ?", "", {
confirmButtonText: "确定",
cancelButtonText: "取消",
}).then(() => {
let handler = new this.HttpHandler("BP.WF.HttpHandler.WF_MyView");
handler.AddJson(this.params);
let data = handler.DoMethodReturnString("MyView_UnSend");
if (typeof data==='string' && data.includes("err@")) {
this.$message({
type: "error",
message: data.replace('err@',''),
});
} else {
//跳转到待办处理页面
let params={};
params.FK_Flow = this.params.FK_Flow;
params.WorkID = this.params.WorkID;
params.FID = this.params.FID;
openMyFlow(params,this);
}
});
},
OpenOffice: function () {},
Send: function () {
this.btnDisabled = true;
this.sendLoading = true;
//如果时嵌入式表单、SDK表单
if (this.currNode['FormType'] === 2 || this.currNode['FormType'] === 3) {
if (this.SendSelfFrom(true) == false) {
this.btnDisabled = false;
this.sendLoading = false;
this.$alert("嵌入式或者SDK表单模式发送时保存数据失败");
return;
}
}
//表单方案:傻瓜表单、自由表单、开发者表单、累加表单、绑定表单库的表单(单表单)
if (
this.currNode['FormType'] === 0 ||
this.currNode['FormType'] === 1 ||
this.currNode['FormType'] === 10 ||
this.currNode['FormType'] === 11 ||
this.currNode['FormType'] === 12
) {
if (this.NodeFormSend() == false) {
this.btnDisabled = false;
this.sendLoading = false;
return;
}
}
//绑定表单库的多表单
if (this.currNode['FormType'] === 5 && this.FromTreeSend() == false) {
this.btnDisabled = false;
this.sendLoading = false;
return;
}
//流转自定义的设置
let btns = this.toolBtns.filter((item) => {
return item.No == "TransferCustom";
});
if (btns.length > 0) {
let ens = new this.Entities("BP.WF.TransferCustoms");
ens.Retrieve("WorkID", this.params.WorkID, "IsEnable", 1);
if (ens.length == 0) {
this.$alert(
"该节点启用了流程流转自定义,但是没有设置流程流转的方向,请点击流转自定义按钮进行设置"
);
return false;
}
}
let isReturnNode = false;
//选择节点
if (this.toNodes.length > 0) {
let gwf = new this.Entity("BP.WF.GenerWorkFlow", this.params.WorkID);
let isLastHuiQian = true;
//待办人数
let todoEmps = gwf.TodoEmps;
if (todoEmps != null && todoEmps != undefined) {
let huiqianSta = gwf.GetPara("HuiQianTaskSta") == 1 ? true : false;
if (
this.currNode['TodolistModel'] === 1 &&
huiqianSta == true &&
todoEmps.split(";").length > 1
)
isLastHuiQian = false;
}
if (this.selectNode['IsSelected'] === 2) isReturnNode = true;
if (this.selectNode['IsSelectEmps'] == "1" && isLastHuiQian == true) {
//跳到选择接收人窗口
this.SaveFlow(true);
this.dialogFormVisible = true;
this.judgeOperation = "sendAccepter";
this.title = "选择接收人";
this.btnDisabled = false;
this.sendLoading = false;
return false;
}
if (this.selectNode['IsSelectEmps'] === "2") {
this.SaveFlow(true);
//let url = this.selectNode.DeliveryParas;
this.dialogFormVisible = true;
this.judgeOperation = "BySelfUrl";
this.title = "选择接收人";
this.btnDisabled = false;
this.sendLoading = false;
return false;
}
if (this.selectNode['IsSelectEmps'] === "3") {
this.SaveFlow(true);
this.dialogFormVisible = true;
this.judgeOperation = "sendAccepterOfOrg";
this.title = "选择接收人";
this.btnDisabled = false;
this.sendLoading = false;
return false;
}
if (this.selectNode['IsSelectEmps'] === "4") {
this.SaveFlow(true);
this.dialogFormVisible = true;
this.judgeOperation = "AccepterOfDept";
this.title = "选择接收人";
this.btnDisabled = false;
this.sendLoading = false;
return false;
}
}
this.execSend(isReturnNode);
},
execSend(isRetunNode) {
let handler = new this.HttpHandler("BP.WF.HttpHandler.WF_MyFlow");
if (this.currNode['FormType'] != 3 && this.currNode['FormType'] != 2) {
let mainData = this.$parent.$parent.$parent.mainData;
for (let key in mainData) {
let val = mainData[key];
if (val instanceof Array) {
handler.AddPara(key, val.join(","));
} else handler.AddPara(key, val);
}
}
handler.AddJson(this.params);
handler.AddPara("IsReturnNode", isRetunNode);
let data = handler.DoMethodReturnString("Send"); //执行保存方法.
this.sendLoading = false;
if (data.indexOf("err@") == 0) {
//发送时发生错误
let reg = new RegExp("err@", "g");
data = data.replace(reg, "");
this.$alert(data);
this.btnDisabled = false;
return false;
}
if (data.indexOf("TurnUrl@") == 0) {
//发送成功时转到指定的URL
let url = data;
url = url.replace("TurnUrl@", "");
this.$router.push({ name: url });
return false;
}
if (data.indexOf("SelectNodeUrl@") == 0) {
this.dialogFormVisible = true;
this.judgeOperation = "SelectNodeUrl";
this.title = "选择接收人";
this.btnDisabled = false;
this.sendLoading = false;
return false;
}
if (data.indexOf("BySelfUrl@") == 0) {
//发送成功时转到自定义的URL
let url = data;
url = url.replace("BySelfUrl@", "");
this.$router.push({ name: url });
return false;
}
if (data.indexOf("url@") == 0) {
//发送成功时转到指定的URL
let params = data.split("&");
params.forEach((param) => {
if (param.indexOf("ToNode") != -1) {
let toNodeID = param.split("=")[1];
let params = this.params;
params.ToNode = toNodeID;
this.$store.commit("setData", params);
}
});
if (data.indexOf("AccepterOfOrg") != -1) {
this.dialogFormVisible = true;
this.judgeOperation = "sendAccepterOfOrg";
this.title = "选择接收人";
this.btnDisabled = false;
return false;
}
if (data.indexOf("AccepterOfDept") != -1) {
this.dialogFormVisible = true;
this.judgeOperation = "AccepterOfDept";
this.title = "选择接收人";
this.btnDisabled = false;
return false;
}
if (
data.indexOf("Accepter") != 0 &&
data.indexOf("AccepterGener") == -1
) {
this.dialogFormVisible = true;
this.judgeOperation = "sendAccepter";
this.title = "选择接收人";
this.btnDisabled = false;
return false;
}
return false;
}
this.OptSuc(data);
},
//发送 退回 移交等执行成功后转到 指定页面
OptSuc(msg) {
this.dialogFormVisible = false;
msg = msg.replace("@查看<img src='/WF/Img/Btn/PrintWorkRpt.gif' >", "");
msg = msg.replace(/@/g, "<br/>").replace(/null/g, "");
this.$alert(msg, "发送成功", {
dangerouslyUseHTMLString: true,
});
this.$router.push({
name: "todolist",
});
return;
},
/**
* 嵌入式SDK模式执行组件中的保存方法
* @constructor
*/
SendSelfFrom(isSend) {
let val = false;
if(this.Save){
const gwf = new this.Entity("BP.WF.GenerWorkFlow",this.params.WorkID);
let params = {};
for(let key in gwf){
if(['WorkID','WFState','TodoEmps','FlowEmps','FK_Node','NodeName','Starter','StarterName','FK_Dept','DeptName'].includes(key))
params[key] = gwf[key];
continue;
}
val = this.Save(params);
}else{
return true;
}
if (typeof val == "boolean" && val === false)
return val;
if(typeof val ==="string" && val !== ""){
//就说明是传来的参数这些参数需要存储到WF_GenerWorkFlow里面去用于方向条件的判断。
let handler = new this.HttpHandler("BP.WF.HttpHandler.WF_MyFlow");
handler.AddPara("WorkID", this.params.WorkID);
handler.AddPara("Paras", val);
const data = handler.DoMethodReturnString("SaveParas");
if(typeof data === 'string' && data.includes('err@')){
this.$message.error(data);
}
}
//保存审核组件
let workCheckRef = null;
let refs = this.$parent.$refs;
if(refs.toolbar == undefined)
refs = this.$parent.$parent.$refs;
if(refs.toolbar == undefined)
refs = this.$parent.$parent.$parent.$refs;
if(refs.toolbar != undefined)
workCheckRef = refs.WorkCheckRef;
if(workCheckRef!=null){
const filedFlag = workCheckRef.WorkCheck_Save();
if(filedFlag==false && isSend==true)
return false;
}
if(typeof val ==="object"){
let handler = new this.HttpHandler("BP.WF.HttpHandler.WF_MyFlow");
handler.AddJson(this.params);
handler.AddJson(val);
const data = handler.DoMethodReturnString("Save");
if(typeof data === 'string' && data.includes('err@')){
this.$message.error(data);
return false;
}
}
return true;
},
/**
* 表单的保存
* @constructor
*/
NodeFormSend() {
//审核组件,附件,校验
let flag = this.$parent.$parent.$parent.validateForm();
if (flag == false) {
this.$alert("表单数据填写不完整或者");
return false;
}
return true;
},
FromTreeSend() {
return true;
},
//关闭
handleClose() {
this.dialogFormVisible = false;
this.judgeOperation = "";
},
},
mounted() {
this.$Bus.$off("closeMsg");
this.$Bus.$on("closeMsg", (item) => {
this.dialogFormVisible = false;
if (item == "退回") {
this.$router.push({ name: "todolist" });
}
});
},
};
</script>
<style lang="less" scoped>
/deep/ .el-dialog__body {
padding: 10px 20px;
}
/deep/ .el-input__inner {
height: 36.5px;
line-height: 36.5px;
}
.container-row {
display: flex;
align-items: center;
}
/deep/ .el-button {
margin-left: 10px;
}
.flex-center {
display: flex;
align-items: center;
box-sizing: border-box;
}
</style>