jhprjv2/ruoyi-ui-app/miniprogram/pages/project_flowable/editTask/index.js

878 lines
26 KiB
JavaScript
Raw Normal View History

2024-09-08 15:55:07 +08:00
import config from '../../../config'
import {
getDictCache
} from '../../../api/publics'
const app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
maxDate: new Date(2088, 1, 1).getTime(),
deptName: "",
userId: "",
nickName: "",
loginName: "",
projectId: "",
projectName: "",
procInsId: "",
infoData: {},
procDefName: "",
deployId: "",
activeName: "",
flowNodeList: [],
flowNodes: [],
comment: "",
taskId: "",
procInsId: "",
procDefKey: "",
backShow: false,
targetKey: "",
targetKeyList: [],
taskName: "",
passState: true,
backName: "",
ret: "",
remark: "",
filesData: [],
limit: 30,
fileType: ["pdf"],
imageType: ["png", "jpg", "jpeg"],
imageInfoData: [],
isFiles: null,
active: 100,
rejectNode: false,
fbAptitude: false,
subDeptTypes: [],
subDeptScopes: [],
persChange1: false,
persChange2: false,
gwmxChange0: false,
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
let {
deployId,
procInsId,
procDefName,
deptName,
nickName,
taskId,
taskName,
projectName,
ret,
procDefKey
} = options
if (procDefKey == "flow_fbzzsp_fbszzsp") {
this.getDicts();
this.setData({
fbAptitude: true
})
}
if(procDefKey == "flow_zxys_gzmjtys"){
this.setData({
gwmxChange0: true
})
}
if (procDefKey == "flow_xmglzdl_xmzbdwrybg" || procDefKey == "flow_xmglzdl_xmjldwrybg") {
this.setData({
persChange1: true
})
}
if (procDefKey == "flow_xmglzdl_xmjlzjrybg" || procDefKey == "flow_xmglzdl_xmzbjlrybg") {
this.setData({
persChange2: true
})
}
//获取缓存数据
wx.getStorage({
key: 'userinfo',
success: res => {
this.setData({
projectId: app.globalData.projectId,
projectName,
procInsId,
procDefKey,
procDefName,
deployId,
deptName,
nickName,
taskId,
taskName,
ret,
userId: res.data.userId,
loginName: res.data.loginName,
})
this.getFlowRecordList();
this.getFlowNodes();
this.getFormDatasList();
//this.initTargetKeyList();
}
})
},
//获取字典信息
getDicts() {
let that = this;
/*关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面*/
getDictCache('flow_sub_dept_type').then(res => {
if (res.code == 200) {
let typeList = [];
res.data.forEach(item => {
typeList.push({
"id": item.dictValue,
"text": item.dictLabel
});
})
that.setData({
subDeptTypes: typeList
})
}
});
getDictCache('flow_sub_dept_scope').then(res => {
if (res.code == 200) {
let scopeList = [];
res.data.forEach(item => {
scopeList.push({
"id": item.dictValue,
"text": item.dictLabel,
"type": false
});
})
that.setData({
subDeptScopes: scopeList
})
}
});
},
//选择分包类型
onSelectSubDeptTypes(e) {
this.setData({
"infoData.subDeptType": e.detail.id
})
},
//选择分包范围
onSelectSubDeptScopes(e) {
let list = [];
e.detail.forEach(it =>{
if(it.id){
list.push(it.id)
}
})
this.setData({
"infoData.subDeptScope": list.toString()
})
},
//输入分包单位名称
inputSubDeptName(e) {
this.setData({
"infoData.subDeptName": e.detail.value
})
},
//输入分包单位资质
inputSubDeptAptitude(e) {
this.setData({
"infoData.subDeptAptitude": e.detail.value
})
},
//输入分包单位法人代表
inputSubDeptChairman(e) {
this.setData({
"infoData.subDeptChairman": e.detail.value
})
},
//输入分包单位安全证书
inputSubDeptSafetyCertificate(e) {
this.setData({
"infoData.subDeptSafetyCertificate": e.detail.value
})
},
//输入分包单位项目经理
inputSubDeptCustodian(e) {
this.setData({
"infoData.subDeptCustodian": e.detail.value
})
},
//输入分包单位名称
inputSubDeptCustodianCardId(e) {
this.setData({
"infoData.subDeptCustodianCardId": e.detail.value
})
},
//选择分包进场时间
inputSubDeptApproachDate(e) {
this.setData({
"infoData.subDeptApproachDate": e.detail
})
},
getFlowNode(val) {
let flowNodeList = this.data.flowNodeList;
for (let i = 0; i < flowNodeList.length; i++) {
if (flowNodeList[i].id == val) {
let list = this.data.flowNodes;
let actNv = this.data.active;
if (flowNodeList[i].name == this.data.taskName) {
actNv = list.length;
}
list.push({
id: flowNodeList[i].id,
name: flowNodeList[i].name,
text: flowNodeList[i].name.length > 4 ? flowNodeList[i].name.substring(0, 4) : flowNodeList[i].name
});
this.setData({
active: actNv,
flowNodes: list
})
if (flowNodeList[i].outgoingFlows && flowNodeList[i].outgoingFlows.length > 0) {
return this.getFlowNode(flowNodeList[i].outgoingFlows[0].targetRef);
}
}
}
},
//查询工作流节点
getFlowNodes() {
let that = this;
wx.request({
url: app.globalData.reqUrl + '/wechat/flowTask/readNotes/' + that.data.deployId,
method: "get",
data: {},
header: {
"Content-Type": "application/json"
},
success(res) {
res = res.data
if (res.code == 200) {
that.setData({
flowNodeList: res.data
})
if (res.data.length > 0) {
let list = that.data.flowNodes;
list.push({
id: res.data[0].id,
name: res.data[0].name,
text: res.data[0].name
});
that.setData({
flowNodes: list
})
return that.getFlowNode(res.data[0].outgoingFlows[0].targetRef);
}
} else {
app.toast(res.msg);
}
}
})
},
//查询审批日志
getFlowRecordList() {
let that = this;
wx.request({
url: app.globalData.reqUrl + '/wechat/flowTask/findCommentByProcInsId',
method: "get",
data: {
procInsId: this.data.procInsId
},
header: {
"Content-Type": "application/json"
},
success(res) {
res = res.data
if (res.code == 200) {
that.setData({
flowRecordList: res.data
})
let list = [];
res.data.forEach((item, idx) => {
if (idx == 1 && (item.commentType == "3" || item.commentType == "2")) {
that.setData({
rejectNode: true
})
}
if (item.deleteReason) {
item.deleteReason = that.getDeleteReason(item.deleteReason);
}
if (item.duration) {
item.duration = that.getDurationDate(item.duration);
}
list.push(item);
})
that.setData({
flowRecordList: list
})
} else {
app.toast(res.msg);
}
}
})
},
//查询审批表单参数
getFormDatasList() {
let that = this;
wx.request({
url: app.globalData.reqUrl + '/wechat/flowTask/findFormDatasByProcInsId',
method: "get",
data: {
procInsId: this.data.procInsId
},
header: {
"Content-Type": "application/json"
},
success(res) {
res = res.data
if (res.code == 200) {
that.setData({
infoData: res.data,
})
let filesData = [];
let imageList = [];
/**
* 分包范围
*/
if(res.data.subDeptScope){
let list = that.data.subDeptScopes;
list.forEach(it =>{
if(res.data.subDeptScope.split(',').indexOf(it.id)>-1){
it.type = true;
}
});
that.setData({
subDeptScopes: list,
})
}
//判断附件
if (res.data.files) {
res.data.files.split(',').forEach(element => {
let ft = element.split('.');
if (that.data.imageType.indexOf(ft[ft.length - 1].toLowerCase()) > -1) {
imageList.push(config.baseUrl + element);
} else {
let it = element.split('/');
filesData.push({
name: it[it.length - 1],
path: element
});
}
});
}
that.setData({
filesData,
imageInfoData: imageList,
isFiles: filesData.length > 0 ? true : false,
remark: res.data.remark
})
} else {
app.toast(res.msg);
}
}
})
},
//初始化退回节点
initTargetKeyList() {
let that = this;
wx.request({
url: app.globalData.reqUrl + '/wechat/flowTask/returnList',
method: "post",
data: {
taskId: that.data.taskId
},
header: {
"Content-Type": "application/json"
},
success(res) {
res = res.data
if (res.code == 200) {
let list = [{
id: '',
text: ''
}];
res.data.forEach(item => {
list.push({
id: item.id,
text: item.name
})
})
that.setData({
targetKeyList: list
})
} else {
app.toast(res.msg);
}
}
})
},
//保存
onSave() {
this.setData({
loadShow: true
})
let {
procDefId,
projectId,
userId,
loginName,
remark,
filesData,
fbAptitude,
infoData
} = this.data;
//数据效验
if (projectId == "" || loginName == "" || userId == "" || procDefId == "") {
app.toast("数据异常,请刷新页面重试!")
this.setData({
loadShow: false
})
return;
}
//分包资质审批数据效验
if (fbAptitude) {
if (infoData.subDeptType == "") {
app.toast("请选择分包类型!")
this.setData({
loadShow: false
})
return;
}
if (infoData.subDeptScope == "") {
app.toast("请选择分包范围!")
this.setData({
loadShow: false
})
return;
}
if (infoData.subDeptName == "") {
app.toast("请填写分包单位名称!")
this.setData({
loadShow: false
})
return;
}
if (infoData.subDeptAptitude == "") {
app.toast("请填写分包单位资质!")
this.setData({
loadShow: false
})
return;
}
if (infoData.subDeptChairman == "") {
app.toast("请填写分包单位法人代表!")
this.setData({
loadShow: false
})
return;
}
if (infoData.subDeptSafetyCertificate == "") {
app.toast("请填写分包单位安全生产许可证!")
this.setData({
loadShow: false
})
return;
}
if (infoData.subDeptCustodian == "") {
app.toast("请填写分包单位项目经理!")
this.setData({
loadShow: false
})
return;
}
if (infoData.subDeptCustodianCardId == "") {
app.toast("请填写分包单位项目经理身份证号!")
this.setData({
loadShow: false
})
return;
}
if (infoData.subDeptApproachDate == "") {
app.toast("请选择分包单位进场时间!")
this.setData({
loadShow: false
})
return;
}
}
if (filesData.length == 0 && this.data.imageInfoData.length == 0) {
app.toast("请上传审批内容!")
this.setData({
loadShow: false
});
return;
}
if (remark == "") {
app.toast("请填写申请说明!")
this.setData({
loadShow: false
})
return;
}
for (let i = 0; i < filesData.length; i++) {
let _fileType = filesData[0].path.split('.');
_fileType = _fileType[_fileType.length - 1].toLowerCase();
//判断附件类型,如果是图片直接展示,非图片则显示附件
if (this.data.fileType.indexOf(_fileType) == -1) {
app.toast("申批内容不支持 [ " + _fileType + " ] 格式请上传PDF文件。")
this.setData({
loadShow: false
});
return;
}
}
let that = this;
wx.showModal({
title: '提示',
content: '是否确定提交' + this.data.procDefName + '',
success: function (sm) {
if (sm.confirm) {
// 用户点击了确定 可以调用了
that.submit()
} else if (sm.cancel) {
that.setData({
loadShow: false
});
console.log('用户点击取消');
}
}
})
},
submit() {
let that = this
let {
taskId,
procInsId,
projectId,
projectName,
userId,
loginName,
nickName,
remark,
filesData,
imageInfoData,
fbAptitude,
infoData
} = that.data;
let fileUrls = [];
filesData.forEach(f => {
imageInfoData.push(f.path);
});
imageInfoData.forEach(async (item) => {
let uploadUrl = app.globalData.uploadUrl + '/common/upload'
let name = "file"
//这里复杂的图片上传,改为同步上传,因为小程序只能上传一张图片
if (item.indexOf(config.baseUrl) > -1) {
fileUrls.push(item.replace(config.baseUrl, ''));
} else if (item.indexOf("/profile/") > -1) {
fileUrls.push(item);
} else {
let obj = await that.syncUploadImage(uploadUrl, item, name);
fileUrls.push(obj.data.fileName);
}
//验证图片上传完毕
if (fileUrls.length == imageInfoData.length) {
//分包单位资质审批参数
let fbAptitudeParams = {};
if (fbAptitude) {
fbAptitudeParams = {
subDeptType:infoData.subDeptType,
subDeptScope:infoData.subDeptScope,
subDeptName:infoData.subDeptName,
subDeptAptitude:infoData.subDeptAptitude,
subDeptChairman:infoData.subDeptChairman,
subDeptSafetyCertificate:infoData.subDeptSafetyCertificate,
subDeptCustodian:infoData.subDeptCustodian,
subDeptCustodianCardId:infoData.subDeptCustodianCardId,
subDeptApproachDate:infoData.subDeptApproachDate
}
}
let params = {
taskId,
instanceId: procInsId,
userId,
assignee: nickName,
variables: {
businessKey: projectId,
projectName,
files: fileUrls.toString(),
remark,
INITIATOR: that.data.infoData.INITIATOR,
...fbAptitudeParams
}
}
wx.request({
url: app.globalData.reqUrl + '/wechat/flowTask/complete',
method: "POST",
data: params,
header: {
"Username": loginName,
"Content-Type": "application/json"
},
success(res) {
that.setData({
loadShow: false
})
res = res.data
if (res.code == 200) {
app.toast("提交申请成功!")
if (that.data.ret == "await") {
setTimeout(() => {
wx.redirectTo({
url: '../await/index',
})
}, 200)
} else {
setTimeout(() => {
wx.redirectTo({
url: '../myFlowDefinition/index',
})
}, 200)
}
} else {
app.toast(res.msg);
}
}
})
}
})
},
/**
* 这里考虑上传图片异步问题封装为同步
*/
syncUploadImage(url, uploadFile, name) {
return new Promise((resolve, reject) => {
wx.uploadFile({
url, // 上传的服务器接口地址
filePath: uploadFile,
header: {
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"
},
name, //上传的所需字段,后端提供
formData: {
user: 'test'
},
success: (res) => {
// 上传完成操作
const data = JSON.parse(res.data)
resolve({
data: data
})
},
fail: (err) => {
//上传失败修改pedding为reject
console.log("访问接口失败", err);
wx.showToast({
title: "网络出错,上传失败",
icon: 'none',
duration: 1000
});
reject(err)
}
});
})
},
//申请说明
remarkblur: function (options) {
this.data.remark = options.detail.value;
},
// list 上传图片
onImagesArr(e) {
var data = this.data.imageInfoData
data = e.detail
this.setData({
imageInfoData: data
})
},
/**
* 上传文件
* @param {*} options
*/
fileUpload(options) {
let file = options.detail;
this.setData({
filesData: file
});
},
// 手风琴
onChange(event) {
this.setData({
activeName: event.detail,
});
},
/**
* 计算驳回节点
* @param {*} val
*/
getDeleteReason(val) {
val = val.replace("Change activity to ", "");
let flowRecordList = this.data.flowRecordList;
for (let i = 0; i < flowRecordList.length; i++) {
if (flowRecordList[i].taskDefKey == val) {
return "驳回至" + flowRecordList[i].taskName;
}
}
},
getDurationDate(val) {
// 计算出相差天数
let days = Math.floor(val / (24 * 3600 * 1000))
// 计算出小时数
let leave1 = val % (24 * 3600 * 1000) // 计算天数后剩余的毫秒数
let hours = Math.floor(leave1 / (3600 * 1000))
// 计算相差分钟数
let leave2 = leave1 % (3600 * 1000) // 计算小时数后剩余的毫秒数
let minutes = Math.floor(leave2 / (60 * 1000))
// 计算相差秒数
let leave3 = leave2 % (60 * 1000) // 计算分钟数后剩余的毫秒数
let seconds = Math.round(leave3 / 1000)
if (days > 0) {
if (days < 10) days = "0" + days;
if (hours < 10) hours = "0" + hours;
if (minutes < 10) minutes = "0" + minutes;
if (seconds < 10) seconds = "0" + seconds;
return days + '天' + hours + '小时' + minutes + '分钟' + seconds + '秒';
}
if (hours > 0) {
if (hours < 10) hours = "0" + hours;
if (minutes < 10) minutes = "0" + minutes;
if (seconds < 10) seconds = "0" + seconds;
return hours + '小时' + minutes + '分钟' + seconds + '秒';
}
if (minutes > 0) {
if (minutes < 10) minutes = "0" + minutes;
if (seconds < 10) seconds = "0" + seconds;
return minutes + '分钟' + seconds + '秒';
}
if (seconds > 0) {
if (seconds < 10) seconds = "0" + seconds;
return seconds + '秒';
}
},
//选择退回节点
onSelectTargetKey(e) {
this.setData({
targetKey: e.detail.id,
backName: e.detail.name
})
},
returnToPage: function () {
/*关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面*/
if (this.data.ret == "await") {
wx.redirectTo({
url: '../await/index',
})
} else {
wx.redirectTo({
url: '../myProcessIns/index'
})
}
},
/**
* 切换上传文件类型
* @param {*} e
*/
switchFiles(e) {
this.setData({
isFiles: !this.data.isFiles,
});
if (this.data.isFiles) {
if (this.data.filesData.length == 0) {
let myImages = this.selectComponent("#myImage");
myImages.upload();
}
} else {
if (this.data.imageInfoData.length == 0) {
let myFiles = this.selectComponent("#myFiles");
myFiles.upload();
}
}
},
//取消页面
cancelSaveView() {
/*关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面*/
if (this.data.ret == "await") {
wx.redirectTo({
url: '../await/index',
})
} else {
wx.redirectTo({
url: '../myFlowDefinition/index'
})
}
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})