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.

1176 lines
51 KiB
Java

package weaver.workflow.request;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONArray;
import com.api.doc.search.service.OperateService;
import com.api.workflow.util.ServiceUtil;
import com.cloudstore.dev.api.util.Util_TableMap;
import com.engine.kq.biz.KQFlowActiontBiz;
import com.engine.workflow.biz.requestForm.RequestFlowRemindBiz;
import com.engine.workflow.biz.requestList.RequestAttentionBiz;
import com.engine.workflow.biz.workflowCore.WorkflowBaseBiz;
import com.engine.workflow.entity.core.NodeInfoEntity;
import net.freeutils.tnef.msg.Msg;
import weaver.common.StringUtil;
import weaver.conn.RecordSet;
import weaver.conn.RecordSetTrans;
import weaver.conn.constant.DBConstant;
import weaver.cpt.util.CptWfUtil;
import weaver.docs.docs.util.DocumentDeleteSecurityUtil;
import weaver.docs.docs.util.DocumentDeleteStatusMould;
import weaver.docs.docs.util.MouldStatus;
import weaver.fna.general.FnaCommon;
import weaver.general.BaseBean;
import weaver.general.DBColumnTypeUtils;
import weaver.general.Util;
import weaver.hrm.User;
import weaver.hrm.attendance.manager.HrmAttVacationManager;
import weaver.hrm.attendance.manager.HrmPaidLeaveManager;
import weaver.systeminfo.SysMaintenanceLog;
import weaver.workflow.monitor.Monitor;
import weaver.workflow.monitor.MonitorDTO;
import weaver.workflow.msg.MsgPushUtil;
import weaver.workflow.msg.PoppupRemindInfoUtil;
import weaver.workflow.msg.entity.MsgEntity;
import weaver.workflow.report.RequestDeleteLog;
import weaver.workflow.workflow.WfFunctionManageUtil;
import weaver.workflow.workflow.WorkflowConfigComInfo;
import java.util.*;
/**
* 流程删除
* @ClassName:RequestDeleteUtils
* @Description:TODO
* @author wuser0326
* @date Nov 15, 2016 5:44:09 PM
*
*/
public class RequestDeleteUtils extends BaseBean {
private Map<String, RequestDeleteInfo> deleteTableMap;
private int requestid;
private RecordSetTrans rst;
private RequestDeleteLog log;
private JSONObject delDataInfo;
private int isbill;
private int formid;
private int workflowid;
private User user;
private DocumentDeleteSecurityUtil docDeleteUtil = new DocumentDeleteSecurityUtil();
private String message;
private String messageContent;
private void init() {
RecordSet rs = new RecordSet();
delDataInfo = new JSONObject();
boolean isoracle = rs.getDBType().equals("oracle");
// 需要复制数据的相关表
deleteTableMap = new HashMap<String, RequestDeleteInfo>();
RequestDeleteInfo rdi = new RequestDeleteInfo();
List<String> clobColumns = new ArrayList<String>();
// workflow_requestbase
String queryWhere = " where requestid = " + requestid;
if (isoracle) {
clobColumns.add("HRMIDS");
rdi.setClobColumn(clobColumns);
}
rdi.setCopytablename("workflow_requestbase_dellog");
rdi.setPrimarykey("requestid");
rdi.setQueryWhere(queryWhere);
deleteTableMap.put("workflow_requestbase", rdi);
// workflow_currentoperator
rdi = new RequestDeleteInfo();
rdi.setCopytablename("workflow_curroperator_dellog");
rdi.setQueryWhere(queryWhere);
deleteTableMap.put("workflow_currentoperator", rdi);
// workflow_requestLog
rdi = new RequestDeleteInfo();
if (isoracle) {
clobColumns = new ArrayList<String>();
clobColumns.add("REMARK");
clobColumns.add("RECEIVEDPERSONS");
clobColumns.add("RECEIVEDPERSONIDS");
rdi.setClobColumn(clobColumns);
}
rdi.setCopytablename("workflow_requestLog_dellog");
rdi.setPrimarykey("logid");
rdi.setQueryWhere(queryWhere);
deleteTableMap.put("workflow_requestLog", rdi);
// workflow_nownode
rdi = new RequestDeleteInfo();
rdi.setCopytablename("workflow_nownode_dellog");
rdi.setQueryWhere(queryWhere);
deleteTableMap.put("workflow_nownode", rdi);
//删除数据的相关表
queryWhere = " where exists (select 1 from workflow_requestLog where workflow_requestLog.requestid = " + requestid + " and workflow_requestLog.logid = workflow_logviewusers.logid)";
rdi = new RequestDeleteInfo();
rdi.setQueryWhere(queryWhere);
deleteTableMap.put("workflow_logviewusers", rdi);
queryWhere = " where id = " + requestid;
rdi = new RequestDeleteInfo();
rdi.setQueryWhere(queryWhere);
deleteTableMap.put("workflow_requestViewLog", rdi);
queryWhere = " where requestid = " + requestid;
rdi = new RequestDeleteInfo();
rdi.setQueryWhere(queryWhere);
deleteTableMap.put("Workflow_SharedScope", rdi);
queryWhere = "where id in (select a.id from (select wgt.id from workflow_groupdetail wgt, workflow_nodegroup wng , workflow_nodebase wnb where wgt.groupid = wng.id and wng.nodeid = wnb.id and wnb.IsFreeNode = '1' and wnb.requestid = " + requestid + ") a)";
rdi = new RequestDeleteInfo();
rdi.setQueryWhere(queryWhere);
deleteTableMap.put("workflow_groupdetail", rdi);
queryWhere = " where EXISTS(select 1 from workflow_nodebase b where workflow_nodegroup.nodeid=b.id and b.IsFreeNode='1' and b.requestid=" + requestid + ")";
rdi = new RequestDeleteInfo();
rdi.setQueryWhere(queryWhere);
deleteTableMap.put("workflow_nodegroup", rdi);
queryWhere = " where EXISTS(select 1 from workflow_nodebase b where workflow_nodemode.nodeid=b.id and b.IsFreeNode='1' and b.requestid= " + requestid + ")";
rdi = new RequestDeleteInfo();
rdi.setQueryWhere(queryWhere);
deleteTableMap.put("workflow_nodemode", rdi);
//queryWhere = " where EXISTS(select 1 from workflow_nodebase b where workflow_nodeform.nodeid=b.id and b.IsFreeNode='1' and b.requestid= " + requestid + ")";
queryWhere = " join workflow_nodebase b on a.nodeid=b.id where b.IsFreeNode='1' and b.requestid= " + requestid ;
rdi = new RequestDeleteInfo();
rdi.setQueryWhere(queryWhere);
deleteTableMap.put("workflow_nodeform", rdi);
queryWhere = " where EXISTS(select 1 from workflow_nodebase b where workflow_flownode.nodeid=b.id and b.IsFreeNode='1' and b.requestid=" + requestid + ")";
rdi = new RequestDeleteInfo();
rdi.setQueryWhere(queryWhere);
deleteTableMap.put("workflow_flownode", rdi);
queryWhere = " where EXISTS(select 1 from workflow_nodebase b where workflow_nodelink.nodeid=b.id and b.IsFreeNode='1' and b.requestid=" + requestid + ") or EXISTS(select 1 from workflow_nodebase b where workflow_nodelink.destnodeid=b.id and b.IsFreeNode='1' and b.requestid=" + requestid
+ ") or wfrequestid=" + requestid;
rdi = new RequestDeleteInfo();
rdi.setQueryWhere(queryWhere);
deleteTableMap.put("workflow_nodelink", rdi);
queryWhere = " where IsFreeNode='1' and requestid=" + requestid;
rdi = new RequestDeleteInfo();
rdi.setQueryWhere(queryWhere);
deleteTableMap.put("workflow_nodebase", rdi);
//获取路径id
rs.executeQuery("select workflowid from workflow_requestbase where requestid = ? ", requestid);
if(rs.next()){
workflowid = rs.getInt(1);
log.setWorkflowId(String.valueOf(workflowid));
}
//初始化表单信息
rs.executeQuery("select isbill,formid from workflow_base where id = ? ", workflowid);
if(rs.next()){
isbill = rs.getInt(1);
formid = rs.getInt(2);
}
}
public RequestDeleteUtils() {}
public RequestDeleteUtils(int requestid, RecordSetTrans rst,RequestDeleteLog log) {
this.requestid = requestid;
this.rst = rst;
this.log = log;
}
public RequestDeleteUtils(int requestid, RecordSetTrans rst,RequestDeleteLog log, User user) {
this.requestid = requestid;
this.rst = rst;
this.log = log;
this.user = user;
}
public void executeDeleteRequest() throws Exception{
RequestOperationMsgManager romm = new RequestOperationMsgManager();
List<MsgEntity> deleteMsg = romm.requestDeletMsg(String.valueOf(requestid));
init();
new RequestFlowRemindBiz().deleteFlowMsgByRequestid(requestid +"");
executeDeleteAddinOperate();
updateCodeseqReserved();
checkAndDeleteAcc();
deleteBaseTableInfo();
deleteFormData();
deletePoppupRemindInfo();
deleteSubWFRequestInfo();
//删除表单数据
log.save(rst);
String updatesql = "update workflow_requestdeletelog set deletetabledata = ?,isold='0' where request_id = ?";
rst.executeUpdate(updatesql, delDataInfo.toString(),requestid);
this.deleteSuperviseByRequestId();//删除督办数据
new RequestAttentionBiz().cancelAttention(requestid,"delete",this.rst);
new MsgPushUtil().pushMsg(deleteMsg);
executeDeleteOdocLogs(requestid);
}
public List<MsgEntity> executeDeleteRequestAndMsg() throws Exception{
RequestOperationMsgManager romm = new RequestOperationMsgManager();
List<MsgEntity> deleteMsg = romm.requestDeletMsg(String.valueOf(requestid));
init();
new RequestFlowRemindBiz().deleteFlowMsgByRequestid(requestid +"");
executeDeleteAddinOperate();
updateCodeseqReserved();
checkAndDeleteAcc();
deleteBaseTableInfo();
deleteFormData();
deletePoppupRemindInfo();
deleteSubWFRequestInfo();
//删除表单数据
log.save(rst);
String updatesql = "update workflow_requestdeletelog set deletetabledata = ?,isold='0' where request_id = ?";
rst.executeUpdate(updatesql, delDataInfo.toString(),requestid);
this.deleteSuperviseByRequestId();//删除督办数据
new RequestAttentionBiz().cancelAttention(requestid,"delete",this.rst);
executeDeleteOdocLogs(requestid);
return deleteMsg;
}
public void executeDeleteOdocLogs(int requestid) throws Exception{
RecordSet rs = new RecordSet();
rs.executeQuery("select 1 from odoc_requestdoc where requestid = ?",requestid);
if (rs.next()){
rs.executeUpdate("delete from odoc_requestdoc where requestid = ?",requestid);
}
}
//执行流程删除附加操作
private void executeDeleteAddinOperate() throws Exception{
RequestCheckAddinRules requestCheckAddinRules = new RequestCheckAddinRules();
try {
requestCheckAddinRules.setTrack(false);
requestCheckAddinRules.setStart(false);
requestCheckAddinRules.setNodeid(-3);
requestCheckAddinRules.setRequestid(requestid);
requestCheckAddinRules.setWorkflowid(workflowid);
requestCheckAddinRules.setObjid(-3);
requestCheckAddinRules.setObjtype(1);
requestCheckAddinRules.setIsbill(isbill);
requestCheckAddinRules.setFormid(formid);
requestCheckAddinRules.setIspreadd("0");
requestCheckAddinRules.setUser(this.user);
requestCheckAddinRules.setSpecialOperate(true);
requestCheckAddinRules.checkAddinRules();
} catch (Exception e) {
this.message = requestCheckAddinRules.getRequestManager().getMessage();
this.messageContent = requestCheckAddinRules.getRequestManager().getMessagecontent();
e.printStackTrace();
throw new Exception("workflow interface action error:"+e.getMessage());
}
}
/**
* 删除主流程中的子流程流转意见信息
*/
public void deleteSubWFRequestInfo(){
List<List> params = new ArrayList<>();
RecordSet rs = new RecordSet();
rs.executeQuery("select * from workflow_subwfrequest where subrequestid = ?", requestid);
while (rs.next()) {
List param = new ArrayList();
param.add(rs.getInt(1));
param.add(rs.getInt(2));
param.add(rs.getInt(3));
param.add(rs.getString(4));
param.add(rs.getInt(5));
param.add(rs.getInt(6));
param.add(rs.getString(7));
params.add(param);
}
rs.executeBatchSql("insert into Workflow_SubwfRequest_dellog values (?,?,?,?,?,?,?)", params);
rs.executeUpdate("delete from workflow_subwfrequest where subrequestid = ?", requestid);
}
/**
* 督办数据删除
* @throws Exception
*/
private void deleteSuperviseByRequestId() throws Exception{
rst.executeUpdate("delete from WORKFLOW_SUPERVISEOPERATOR where requestid = ?",requestid);
}
/**
* 根据是否开启删除流程时同时删除附件,来删除附件
*/
public void checkAndDeleteAcc() {
ArrayList checkids = new ArrayList();
RecordSet checkrs = new RecordSet();
checkrs.execute("select isneeddelacc from workflow_base where id in (select workflowid from workflow_requestbase where requestid ="+requestid+")");
if(checkrs.next()){
String isneeddelacc = checkrs.getString("isneeddelacc");
if("1".equals(isneeddelacc)){
this.delWfFormAcc(requestid, checkids);
this.delWfSignAcc(requestid, checkids);
}
}
}
/**
* 删除流程表单中所带的附件
* @param requestid 流程ID
* @param checkids 不需要删除的文档ID
*/
private void delWfFormAcc(int requestid,ArrayList checkids){
RecordSet rs=new RecordSet();
RecordSet rs1=new RecordSet();
RecordSet rsDelRq=new RecordSet();
RecordSet rsDelDoc=new RecordSet();
OperateService docExtUtil = new OperateService();
String sql = "";
String delDocid = "";
String delRqid = "";
String uploadfieldname ;
String[] deleteDocIds;
rs.executeSql("select b.formid, b.isbill from workflow_requestbase a, workflow_base b where requestid = "+requestid+" and a.workflowid = b.id");
if(rs.next()){
int formid_tmp = Util.getIntValue(rs.getString("formid"));
int isbill_tmp = Util.getIntValue(rs.getString("isbill"));
if(isbill_tmp == 1){
String tablename_tmp="";
String detailtablename="";
String detailkeyfield="";
rs.execute("select tablename,detailtablename,detailkeyfield from workflow_bill where id="+formid_tmp);
if(rs.next()){
tablename_tmp=Util.null2String(rs.getString(1));
detailtablename=Util.null2String(rs.getString(2)).trim();
detailkeyfield=Util.null2String(rs.getString(3));
String tempdetail="";
boolean temphasreqeustid=false;
if(!"".equals(tablename_tmp)){
rsDelRq.executeSql("select fieldname,viewtype,detailtable from workflow_billfield where billid= "+formid_tmp+" and fieldhtmltype = '6'");
while(rsDelRq.next()){
uploadfieldname=Util.null2String(rsDelRq.getString(1));
int tviewtype=Util.getIntValue(rsDelRq.getString(2),0);
String tdetailtable=Util.null2String(rsDelRq.getString(3));
if(!uploadfieldname.trim().equals("")){
if(tviewtype==0){
sql="select "+uploadfieldname+" from "+tablename_tmp+" where requestid="+requestid;
}else{
if(tdetailtable.trim().equals("")) tdetailtable=detailtablename;
boolean hasrequestid=false;
if(tempdetail.equals(tdetailtable)){
hasrequestid=temphasreqeustid;
}else{
if(rs.getDBType().toUpperCase().equals("ORACLE")){
sql="select * from "+tdetailtable+" where rownum<2";
}else{
sql="select top 1 * from "+tdetailtable;
}
if(rs1.executeSql(sql)){
String[] colnames=rs1.getColumnName();
if(colnames!=null){
for (int m=0;m<colnames.length;m++){
if(colnames[m].toUpperCase().equals("REQUESTID")){
hasrequestid=true;
break;
}
}
}
}
temphasreqeustid=hasrequestid;
tempdetail=tdetailtable;
}
if(hasrequestid)
sql="select "+uploadfieldname+" from "+tdetailtable+" where requestid="+requestid;
else
sql="select a."+uploadfieldname+" from "+tdetailtable+" a,"+tablename_tmp+" b where a."+detailkeyfield+"=b.id and b.requestid="+requestid;
}
//System.out.println(sql);
rsDelDoc.executeSql(sql);
while(rsDelDoc.next()){
delDocid = rsDelDoc.getString(uploadfieldname);
if(delDocid!=null && !"".equals(delDocid)){
deleteDocIds = Util.TokenizerString2(delDocid, ",");
for(int d=0; d <deleteDocIds.length; d++){
if(isCanDel(Util.getIntValue(deleteDocIds[d],0))){
try{
securityDeleteDoc(deleteDocIds[d]);
} catch (Exception e){
e.printStackTrace();
}
}
}
}
}
}
}
}
}
}else{
rsDelRq.executeSql("select fieldname from workflow_formfield a,workflow_formdict b where a.formid = "+formid_tmp+" and a.fieldid = b.id and b.fieldhtmltype = '6' and (a.isdetail is null or a.isdetail<>'1')");
while(rsDelRq.next()){
uploadfieldname = rsDelRq.getString("fieldname");
rsDelDoc.executeSql("select "+uploadfieldname+" from workflow_form where requestid = " + requestid);
if(rsDelDoc.next()){
delDocid = rsDelDoc.getString(uploadfieldname);
if(delDocid!=null && !"".equals(delDocid)){
deleteDocIds = Util.TokenizerString2(delDocid, ",");
for(int d=0; d <deleteDocIds.length; d++){
if(isCanDel(Util.getIntValue(deleteDocIds[d],0))){
//删除表中该文档的相关记录及物理删除
try{
securityDeleteDoc(deleteDocIds[d]);
} catch (Exception e){
e.printStackTrace();
}
}
}
}
}
}
sql="select a.fieldname from workflow_formdictdetail a,workflow_formfield b where a.id=b.fieldid and a.fieldhtmltype='6' and b.isdetail='1' and b.formid="+formid_tmp;
rsDelRq.executeSql(sql);
while(rsDelRq.next()){
uploadfieldname = rsDelRq.getString("fieldname");
rsDelDoc.executeSql("select "+uploadfieldname+" from workflow_formdetail where requestid = " + requestid);
while(rsDelDoc.next()){
delDocid = rsDelDoc.getString(uploadfieldname);
if(delDocid!=null && !"".equals(delDocid)){
deleteDocIds = Util.TokenizerString2(delDocid, ",");
for(int d=0; d <deleteDocIds.length; d++){
if(isCanDel(Util.getIntValue(deleteDocIds[d],0))){
//删除表中该文档的相关记录及物理删除
try{
securityDeleteDoc(deleteDocIds[d]);
} catch (Exception e){
e.printStackTrace();
}
}
}
}
}
}
}
}
}
/**
* * 删除流程签字意见中所带的附件
* @param requestid 流程ID
* @param checkids 不需要删除的文档ID
*/
private void delWfSignAcc(int requestid,ArrayList checkids){
OperateService docExtUtil = new OperateService();
String sql="select annexdocids from workflow_requestLog where requestid="+requestid;
RecordSet rs=new RecordSet();
rs.executeSql(sql);
while(rs.next()){
String annexdocids = Util.null2String(rs.getString("annexdocids"));
String[] docIdstr = Util.TokenizerString2(annexdocids, ",");
for(int b=0; b <docIdstr.length; b++){
if(isCanDel(Util.getIntValue(docIdstr[b],0))){
try{
securityDeleteDoc(docIdstr[b]);
} catch (Exception e){
e.printStackTrace();
}
}
}
}
}
//文档是否能删除
private boolean isCanDel(int docid){
RecordSet noDelRs = new RecordSet();
String noDelSql = "";
if("mysql".equals(noDelRs.getDBType())){
noDelSql = "SELECT 1 FROM workflow_requestbase WHERE FIND_IN_SET("+docid+",docids) AND (deleted = 0 OR deleted IS NULL)";
}else if("oracle".equals(noDelRs.getDBType())){
noDelSql = "select 1 from workflow_requestbase where ','||docids||',' like '%,"+docid+",%' and (deleted = 0 or deleted is null)";
}
else if("postgresql".equals(noDelRs.getDBType())){
noDelSql = "select 1 from workflow_requestbase where ','||docids||',' like '%,"+docid+",%' and (deleted = 0 or deleted is null)";
}
else{
noDelSql = "select 1 from workflow_requestbase where ','+cast(docids AS varchar(4000))+',' like '%,"+docid+",%' and (deleted = 0 or deleted is null)";
}
noDelRs.executeSql(noDelSql);
if(noDelRs.next()){
return false;
}else{
return true;
}
}
private void securityDeleteDoc(String docids){
docDeleteUtil.deleteDocids(docids, DocumentDeleteStatusMould.WORKFLOW.getMouldCode(), this.user, requestid+"", MouldStatus.WF_DELETE_REQUEST.getItemCode());
}
/**
* 流程监控删除流程
* @param deleteRequestIds
* @param user
* @param clientIp
*/
public String executeMonitorDelete(String deleteRequestIds,User user,String clientIp){
RecordSetTrans mrst = new RecordSetTrans();
List<MsgEntity> delMsg = null;
try{
if(deleteRequestIds == null || "".equals(deleteRequestIds)) return "fail";
if(deleteRequestIds.endsWith(",")) deleteRequestIds = deleteRequestIds.substring(0,deleteRequestIds.length() - 1);
RecordSet temprs = new RecordSet();
mrst.setAutoCommit(false);
Monitor monitor = new Monitor();
String[] deleteRequestIdAarray = Util.TokenizerString2(deleteRequestIds, ",");
String tempDeleteRequestIds = "";
SysMaintenanceLog SysMaintenanceLog = new SysMaintenanceLog();
RecordSet rscpt = new RecordSet();
boolean isRefCpt = false;
List<String> deleteIngRequestList;
for (String deleteRequestId : deleteRequestIdAarray) {
synchronized (RequestDeleteUtils.class) {
Object obj = Util_TableMap.getObjVal("deleteIngRequestList");
if (obj == null) {
obj = new LinkedList<String>();
Util_TableMap.setObjVal("deleteIngRequestList", obj);
}
deleteIngRequestList = (List<String>) obj;
temprs.writeLog("lyy=====>deleteIngRequestList: " + deleteIngRequestList);
if (deleteIngRequestList.contains(deleteRequestId)) {
continue;
} else {
deleteIngRequestList.add(deleteRequestId);
temprs.writeLog("lyy=====>deleteIngRequestList1: " + deleteIngRequestList);
}
}
String workflowid_kq = "";
temprs.execute("select creater,workflowid from workflow_requestbase where requestid = " + deleteRequestId);
if(temprs.next()){
String creater = temprs.getString(1);
String workflowid = temprs.getString(2);
workflowid_kq = workflowid;
MonitorDTO dto = monitor.getMonitorInfo(String.valueOf(user.getUID()),creater,workflowid);
//判断流程是否关联了资产模块
rscpt.executeSql("select wfid from cpt_cptwfconf where wfid="+workflowid);
if(rscpt.next()){
isRefCpt = true;
}
rscpt.executeSql("select formid from workflow_base where id="+workflowid);
if(rscpt.next()){
int formid = rscpt.getInt(1);
if(formid==18||formid==19||formid==201||formid==220||formid==221||formid==222||formid==224){
isRefCpt = true;
}
}
boolean isdelete = dto.getIsdelete();
if(isdelete){
tempDeleteRequestIds += deleteRequestId+",";
}else{
continue;
}
}
try {
FnaCommon fnaCommon = new FnaCommon();
fnaCommon.doWfForceOver(Util.getIntValue(deleteRequestId, 0), 0, true);
}catch(Exception easi) {
new BaseBean().writeLog(easi);
}
//E9 新考勤,删除流程后删除流程数据
try {
new KQFlowActiontBiz().delTest(Util.getIntValue(deleteRequestId, 0),workflowid_kq,"RequestDeleteUtils");
}catch(Exception e) {
new BaseBean().writeLog(e);
}
temprs.executeSql("select requestname,workflowid from workflow_requestbase where requestid="+deleteRequestId);
temprs.next();
String temprequestname = temprs.getString("requestname");
String tempworkflowid = temprs.getString("workflowid");
SysMaintenanceLog.resetParameter();
SysMaintenanceLog.setRelatedId(Util.getIntValue(deleteRequestId));
SysMaintenanceLog.setRelatedName(temprequestname);
SysMaintenanceLog.setOperateType("3");
SysMaintenanceLog.setOperateDesc("delete workflow_currentoperator where requestid="+deleteRequestId+
";delete workflow_form where requestid="+deleteRequestId+
";delete workflow_formdetail where requestid="+deleteRequestId+
";delete workflow_requestLog where requestid="+deleteRequestId+
";delete workflow_requestViewLog where id="+deleteRequestId+
";delete workflow_requestbase where requestid="+deleteRequestId);
SysMaintenanceLog.setOperateItem("85");
SysMaintenanceLog.setOperateUserid(user.getUID());
SysMaintenanceLog.setClientAddress(clientIp);
SysMaintenanceLog.setOperatesmalltype(1);
SysMaintenanceLog.setSysLogInfo();
//1:请求
try{
RequestDeleteLog log = initRequestDeleteLog(user, clientIp, deleteRequestId);
this.requestid =Util.getIntValue(deleteRequestId);
this.rst = mrst;
this.log = log;
this.user = user;
delMsg = this.executeDeleteRequestAndMsg();
}catch (Exception exception){
exception.printStackTrace();
writeLog(exception);
if(exception.getMessage().indexOf("workflow interface action error")>-1){
return "actionfail";
}
} finally {
deleteIngRequestList.remove(deleteRequestId);
}
}
if(tempDeleteRequestIds.length() > 0){
tempDeleteRequestIds = tempDeleteRequestIds.substring(0,tempDeleteRequestIds.length() - 1);
String[] tempDeleteRequestIdArray = Util.TokenizerString2(tempDeleteRequestIds, ",");
if(isRefCpt){
temprs.executeSql("update cptcapital set frozennum=0 where isdata='2' and frozennum > 0");
CptWfUtil cwu = new CptWfUtil();
cwu.DoFrozenCpt_new();
}
//删除费用信息表中的相应数据-----begin
// for(int i=0;i<tempDeleteRequestIdArray.length;i++){
// String temprequestid = tempDeleteRequestIdArray[i];
// try {
// FnaCommon fnaCommon = new FnaCommon();
// fnaCommon.doWfForceOver(Util.getIntValue(temprequestid, 0), 0, true);
// }catch(Exception easi) {
// new BaseBean().writeLog(easi);
// }
// }
/*删除流程,如果是请假申请单,则在删除流程后解冻请假信息*/
temprs.executeSql(" select r.requestid,r.workflowid,r.currentnodetype from workflow_requestbase r,workflow_base b where requestid in ( " + tempDeleteRequestIds + " ) and r.workflowid=b.id and b.isbill=1" ) ;
while(temprs.next()){
String workflowid=temprs.getString("workflowid"); //流程id
String requestid=temprs.getString("requestid"); //流程请求id
String currentnodetype=temprs.getString("currentnodetype"); //当前节点状态
//申请流程 不为 3归档节点 0 创建节点
if(!"0".equals(currentnodetype)&&!"3".equals(currentnodetype)){
HrmAttVacationManager vacationManager = new HrmAttVacationManager();
vacationManager.handle(Util.getIntValue(requestid,0),Util.getIntValue(workflowid,0),3);
//加班强制归档要生成调休
new HrmPaidLeaveManager().handle(StringUtil.parseToLong(requestid), Util.getIntValue(workflowid,0), 3);
}
//
}
mrst.commit();
new MsgPushUtil().pushMsg(delMsg);
if (!"".equals(tempDeleteRequestIds) && isRefCpt) {
new Thread(new CptWfUtil(tempDeleteRequestIds,"releaseFrozenCptnum")).start();
}
}
}catch (Exception e) {
mrst.rollback();
writeLog(e);
return "fail";
}
return "success";
}
/**
* 外部接口调用流程删除通用方法
* @param user
* @param clientipOrFrom
* @param requestid
* @return
*/
public boolean requestDelete(User user,String clientipOrFrom,int requestid){
WorkflowConfigComInfo configComInfo = new WorkflowConfigComInfo();
boolean verifyRight = "1".equals(Util.null2String(configComInfo.getValue("wbservice_delreq_verify_right")));
if(verifyRight && !(verifyDelRight(requestid,user,false) || verifyDelRight(requestid,user,true))) {
writeLog("用户" + user.getUID()+"无" + requestid + "删除权限!");
return false;
}
RecordSetTrans trst = new RecordSetTrans();
trst.setAutoCommit(false);
RequestDeleteLog log = initRequestDeleteLog(user, clientipOrFrom, String.valueOf(requestid));
this.log = log;
this.rst = trst;
this.requestid = requestid;
this.user = user;
try {
List<MsgEntity> delMsg = executeDeleteRequestAndMsg();
trst.commit();
new MsgPushUtil().pushMsg(delMsg);
} catch (Exception e) {
writeLog(e);
trst.rollback();
return false;
}
return true;
}
/**
* 公文内部交换删除流程方法
* @param user
* @param clientipOrFrom
* @param requestid
* @return
*/
public boolean requestDeleteForOdoc(User user,String clientipOrFrom,int requestid){
RecordSetTrans trst = new RecordSetTrans();
trst.setAutoCommit(false);
RequestDeleteLog log = initRequestDeleteLog(user, clientipOrFrom, String.valueOf(requestid));
this.log = log;
this.rst = trst;
this.requestid = requestid;
this.user = user;
try {
List<MsgEntity> delMsg = executeDeleteRequestAndMsg();
trst.commit();
new MsgPushUtil().pushMsg(delMsg);
} catch (Exception e) {
writeLog(e);
trst.rollback();
return false;
}
return true;
}
/**
* 创建log对象
* @param user
* @param clientIp
* @param deleteRequestId
* @return
*/
public RequestDeleteLog initRequestDeleteLog(User user, String clientIp, String deleteRequestId) {
Calendar today = Calendar.getInstance();
String formatdate = Util.add0(today.get(Calendar.YEAR), 4) + "-" + Util.add0(today.get(Calendar.MONTH)+1,2) + "-" + Util.add0(today.get(Calendar.DAY_OF_MONTH), 2);
String formattime = Util.add0(today.get(Calendar.HOUR_OF_DAY), 2) + ":" + Util.add0(today.get(Calendar.MINUTE), 2) + ":" +Util.add0(today.get(Calendar.SECOND), 2);
RecordSet rs1 = new RecordSet();
RequestDeleteLog log = new RequestDeleteLog();
rs1.executeQuery("select requestname,workflowid from workflow_requestbase where requestid = ?", deleteRequestId);
if(rs1.next()){
log.setRequestName(Util.fromScreen2(rs1.getString(1), user.getLanguage()));
log.setWorkflowId(rs1.getString(2));
}
log.setRequestId(String.valueOf(deleteRequestId));
log.setOperateUserId(String.valueOf(user.getUID()));
log.setOperateUserType("2".equals(user.getLogintype())?"1":"0");
log.setOperateDate(formatdate);
log.setOperateTime(formattime);
log.setClientAddress(Util.null2String(clientIp));
return log;
}
/**
* 复制流程基础表数据
* @throws Exception
*/
private void deleteBaseTableInfo() throws Exception {
Iterator<String> it = deleteTableMap.keySet().iterator();
while (it.hasNext()) {
String tablename = it.next();
RequestDeleteInfo rdi = deleteTableMap.get(tablename);
String copytablename = Util.null2String(rdi.getCopytablename());
if("".equals(copytablename)){
deleteTableData(tablename,rdi.getQueryWhere(),null);
}else{
String columnStr="";
if(rdi.getClobColumn()!=null){
columnStr = getTableColumn(tablename, rdi.getClobColumn());
}else{
columnStr = getTableColumn(tablename, null);
}
//先查一下
if("st".equalsIgnoreCase(rst.getOrgindbtype())||"postgresql".equalsIgnoreCase(rst.getDBType())){
DBColumnTypeUtils.syncLogTableField(tablename, copytablename,rst);
}
String dellogsql = "insert into " + copytablename + "(" + columnStr + ") select " + columnStr + " from " + tablename + rdi.getQueryWhere();
try{
rst.executeSql(dellogsql);
}catch (Exception e) {
boolean flag = DBColumnTypeUtils.syncLogTableField(tablename, copytablename,rst);
if(flag){
rst.executeSql(dellogsql);
}else{
throw e;
}
}
//更新clob字段
updateClobColumn(tablename,rdi);
rst.executeSql("delete from " + tablename + rdi.getQueryWhere());
}
}
}
/**
* 删除消息
*/
private void deletePoppupRemindInfo(){
PoppupRemindInfoUtil poppupRemindInfoUtil = new PoppupRemindInfoUtil();
poppupRemindInfoUtil.deletePoppupRemindInfo(requestid,0);
poppupRemindInfoUtil.deletePoppupRemindInfo(requestid,1);
poppupRemindInfoUtil.deletePoppupRemindInfo(requestid,10);
}
/**
* 更新clob字段
* @param tablename
* @param rdi
* @throws Exception
*/
private void updateClobColumn(String tablename,RequestDeleteInfo rdi) throws Exception{
String clobcolumns = rdi.toClobColumString();
RecordSet rs = new RecordSet();
if(clobcolumns == null) return;
String querysqlString = "select " + clobcolumns + ","+rdi.getPrimarykey()+" from " + tablename + rdi.getQueryWhere();
rs.executeSql(querysqlString);
while(rs.next()){
for(String column:rdi.getClobColumn()){
String updatesqlString = "update " + rdi.getCopytablename() + " set "+column+" = ? where " + rdi.getPrimarykey() + " = ? ";
rst.executeUpdate(updatesqlString, rs.getString(column),rs.getString(rdi.getPrimarykey()));
}
}
}
/**
* 记录请求相关表数据,并记录数据
* @param tablename
* @param querywhere
* @param columnStr
*/
private void deleteTableData(String tablename,String querywhere,String columnStr) {
JSONObject colunInfo;
RecordSet rs = new RecordSet();
if("".equals(Util.null2String(columnStr))){
columnStr = getTableColumn(tablename, null);
}
String[] columnArray = columnStr.split(",");
String querysql = "";
if(tablename.equals("workflow_nodeform")){
querysql = "select " + columnStr + " from " + tablename +" a "+ querywhere;
}else {
querysql = "select " + columnStr + " from " + tablename + " " + querywhere;
}
rs.executeSql(querysql);
rs.isReturnDecryptData(true);
JSONArray array = new JSONArray();
while (rs.next()) {
colunInfo = new JSONObject();
for (int i = 0; i < columnArray.length; i++) {
colunInfo.put(columnArray[i], rs.getString(columnArray[i]));
}
array.add(colunInfo);
}
String deleteSql = "delete from " + tablename + " " + querywhere;
if(DBConstant.DB_TYPE_MYSQL.equals(rs.getDBType())) {
switch (tablename){
case "workflow_logviewusers":
deleteSql = "delete t1 from workflow_logviewusers t1,workflow_requestlog t2 where t1.logid=t2.logid and t2.requestid= " + requestid;
break;
case "workflow_nodeform":
deleteSql = "delete t1 from workflow_nodeform t1,workflow_nodebase t2 where t1.nodeid=t2.id and t2.isfreenode='1' and t2.requestid= " + requestid;
break;
default:
break;
}
}
rs.executeUpdate(deleteSql);
delDataInfo.put(tablename, array);
}
/**
* 删除请求表单数据(自定义、系统表单、老表单)
*/
private void deleteFormData(){
RecordSet temprs = new RecordSet();
if(isbill == 1){
temprs.executeQuery("select tablename,detailkeyfield from workflow_bill where id = ?", formid);
String maintablename = "";
String detailkeyfield="";
String querywhere = "where requestid= " + requestid;
if(temprs.next()){
maintablename = temprs.getString("tablename");
detailkeyfield = temprs.getString("detailkeyfield");
//deleteTableData(maintablename,"where requestid = " + requestid,null);
}
if("".equals(detailkeyfield)){//如果为空时默认赋值【特殊表单不一定是按照mainid进行关联】
detailkeyfield="mainid";
}
temprs.executeQuery("select tablename from workflow_billdetailtable where billid = ?",formid);
while(temprs.next()){
String detailtablename = temprs.getString(1);
querywhere = "where exists (select 1 from "+maintablename+" b where b.id = "+detailtablename+"."+detailkeyfield+" and b.requestid = "+requestid+")";
deleteTableData(detailtablename,querywhere,null);
}
//先删除明细而后删除主表QC250286,增加判断在maintablename不为空时执行。
if (!"".equals(maintablename)) {
deleteTableData(maintablename,"where requestid = " + requestid,null);
}
querywhere = "where requestid= " + requestid;
String column = "REQUESTID,BILLFORMID,BILLID";
deleteTableData("workflow_form",querywhere,column);
}else{
deleteOldFormData(temprs);
}
}
/**
* 删除老表单数据
* @param temprs
*/
private void deleteOldFormData(RecordSet temprs){
//老表单主表
String maintablefieldquerysql = "select b.fieldname from workflow_formfield a left join workflow_formdict b on a.fieldid = b.id where (a.isdetail<>'1' or a.isdetail is null) and a.formid = ?";
temprs.executeQuery(maintablefieldquerysql, formid);
String column = "";
while(temprs.next()){
String columnname = Util.null2String(temprs.getString(1));
if("".equals(columnname)){
continue;
}
column += columnname+",";
}
if(column.length() > 0) {
column += "requestid,billformid,billid";
}
String querywhere = "where requestid = " +requestid;
deleteTableData("workflow_form",querywhere,column);
//老表单明细表
String detailtablefieldquerysql ="select b.fieldname from workflow_formfield a left join workflow_formdictdetail b on a.fieldid = b.id and a.isdetail = '1' and a.formid = ?";
temprs.executeQuery(detailtablefieldquerysql, formid);
column = "";
while(temprs.next()){
String columnname = Util.null2String(temprs.getString(1));
if("".equals(columnname)){
continue;
}
column += columnname+",";
}
if(column.length() > 0) {
column += "id,requestid,groupid";
}
deleteTableData("workflow_formdetail",querywhere,column);
}
/**
*
* 删除流程的时候,将流程编号预留号表中的是否已使用/是否已删除置为0
*/
private void updateCodeseqReserved(){
if(requestid <= 0){
return;
}
//1.用requestid 去workflow_codeseqrecord表中查出codeSeqId和codeSeqReservedId
RecordSet rs = new RecordSet();
RecordSet rs1 = new RecordSet();
String sql = "select codeSeqId,sequenceId,workflowcode from workflow_codeseqrecord where requestId = " + requestid;
rs.executeSql(sql);
RecordSet rsz=new RecordSet();
while (rs.next()) {
String codeSeqId = rs.getString(1);
String sequenceId = rs.getString(2);
String RESERVEDCODE = rs.getString(3);
//更新workflow_codeseqreserved流程编号预留号表的hasUsed=0,hasDeleted=0
rs1.executeSql("update workflow_codeseqreserved set hasUsed=0,hasDeleted=0 where codeSeqId=" + codeSeqId + " and reservedId=" + sequenceId);
rsz.executeQuery("select count(1) from workflow_codeseqreserved where codeSeqId=? and reservedId=? and RESERVEDCODE=? ",codeSeqId,sequenceId,RESERVEDCODE);
rsz.next();
int count = rsz.getInt(1);
if(count==0){
//没有预留号 所以需要
String sql2 = "insert into workflow_codeSeqReserved(codeSeqId,reservedId,reservedCode,reservedDesc,hasUsed,hasDeleted) values(?,?,?,?,?,?)";
new RecordSet().executeUpdate(sql2, codeSeqId,sequenceId,RESERVEDCODE,"","0","0");
}
//删除记录表里的数据
rsz.executeUpdate("delete workflow_codeseqrecord where requestid = ? " , requestid );
}
}
/**
* 查询表字段
* @param tablename
* @param clobcolumns
* @return
*/
public static String getTableColumn(String tablename, List<String> clobcolumns) {
RecordSet rs = new RecordSet();
String sqltemp = "select column_name from user_tab_columns where table_name = upper(?)";
if ("sqlserver".equalsIgnoreCase(rs.getDBType())) {
sqltemp = "select name from syscolumns b where id = OBJECT_ID(?)";
}else if(rs.getDBType().equals("mysql")){
String currentDB = DBColumnTypeUtils.getMysqlCurrentDBName();
sqltemp = "select DISTINCT column_name from Information_schema.columns where table_schema = database() and table_name = upper(?)";
if(!"".equalsIgnoreCase(currentDB)) sqltemp += " and table_schema = '" + currentDB + "' ";
}else if(rs.getDBType().equals("postgresql")){
sqltemp = "select DISTINCT column_name from Information_schema.columns where table_schema = 'public' and lower(table_name) = lower(?)";
}
rs.executeQuery(sqltemp, tablename);
StringBuffer column = new StringBuffer();
while (rs.next()) {
String columnname ="";
if(tablename.equals("workflow_nodeform")){
columnname = "a." + rs.getString(1).toUpperCase();
}else {
columnname = rs.getString(1).toUpperCase();
}
// clob字段特殊处理
if (clobcolumns != null && clobcolumns.size() > 0 && clobcolumns.contains(columnname)) {
continue;
}
if(rs.getDBType().equals("mysql") && "CONDITION".equals(columnname)){
columnname = "`CONDITION`";
}
column.append(columnname).append(",");
}
String coumntemp = "";
if (column.length() > 0) {
coumntemp = column.substring(0, column.length() - 1);
}
column = null;
return coumntemp;
}
/**
* 校验流程删除权限
* @param requestid
* @param user
* @param isMonitor
* @return
*/
public static boolean verifyDelRight(int requestid,User user,boolean isMonitor) {
int userType = "2".equals(user.getLogintype()) ? 1 : 0;
RecordSet rs = new RecordSet();
if(isMonitor) {
rs.executeQuery("select creater,workflowId from workflow_requestbase where requestid = ?",requestid);
if(rs.next()) {
String workflowId = rs.getString("workflowId");
String creater = rs.getString("creater");
Monitor monitor = new Monitor();
MonitorDTO monitorInfo = monitor.getMonitorInfo(String.valueOf(user.getUID()),creater,workflowId);
return monitorInfo.getIsdelete();
}
} else {
String querySql = ServiceUtil.calculateCurrentNodeSql(String.valueOf(requestid),user.getUID(),userType);
rs.executeQuery(querySql);
if(rs.next()) {
int nodeid = rs.getInt("nodeid");
int isremark = rs.getInt("isremark");
int workflowid = rs.getInt("workflowid");
NodeInfoEntity nodeInfoEntity = WorkflowBaseBiz.getNodeInfo(nodeid);
if(nodeInfoEntity == null) return false;
WfFunctionManageUtil wfFunctionManageUtil = new WfFunctionManageUtil();
return (nodeInfoEntity.getNodetype() == 0 && isremark == 0 && wfFunctionManageUtil.IsShowDelButtonByReject(requestid, workflowid));
}
}
return false;
}
public void setRequestid(int requestid) {
this.requestid = requestid;
}
public String getMessage() {
return this.message;
}
public String getMessagecontent() {
return this.messageContent;
}
public void setMessageContent(String messageContent) {
this.messageContent = messageContent;
}
public void setMessage(String message) {
this.message = message;
}
private class RequestDeleteInfo{
private String queryWhere;
private String copytablename;
private String primarykey;
private List<String> clobColumn;
public String getQueryWhere() {
return queryWhere;
}
public void setQueryWhere(String queryWhere) {
this.queryWhere = queryWhere;
}
public String getCopytablename() {
return copytablename;
}
public void setCopytablename(String copytablename) {
this.copytablename = copytablename;
}
public String getPrimarykey() {
return primarykey;
}
public void setPrimarykey(String primarykey) {
this.primarykey = primarykey;
}
public List<String> getClobColumn() {
return clobColumn;
}
public void setClobColumn(List<String> clobColumn) {
this.clobColumn = clobColumn;
}
public String toClobColumString(){
if(clobColumn == null) return null;
String columnString = "";
for(String column:clobColumn){
columnString += column+",";
}
return ((columnString.length() > 0)?(columnString.substring(0, columnString.length() - 1)):null);
}
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}