package com.engine.custom.archives.action;

import com.alibaba.fastjson.JSON;
import com.api.doc.detail.service.DocSaveService;
import com.api.doc.detail.util.SendMsgForNewDocThread;
import com.api.workflow.util.ServiceUtil;
import com.engine.custom.archives.workflow.biz.requestForm.RequestDocPropManagerCus;
import com.engine.custom.archives.workflow.biz.requestForm.SaveDocDetailBizCus;
import com.engine.custom.archives.workflow.biz.requestForm.WfToDocBizCus;


import com.engine.workflow.biz.requestForm.WfWaterMark4WfToDocBiz;
import com.engine.workflow.entity.WorkflowToDocSettingInfoEntity;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
import weaver.alioss.AliOSSObjectManager;
import weaver.conn.RecordSet;
import weaver.docs.category.SecCategoryComInfo;
import weaver.docs.docs.*;
import weaver.file.FileUpload;
import weaver.file.ImageFileManager;
import weaver.general.*;
import weaver.hrm.User;
import weaver.hrm.resource.ResourceComInfo;
import weaver.integration.logging.Logger;
import weaver.integration.logging.LoggerFactory;
import weaver.interfaces.workflow.action.Action;
import weaver.soa.workflow.request.RequestInfo;
import weaver.system.SystemComInfo;
import weaver.weaversso.CreateTokenUtil;
import weaver.workflow.msg.PoppupRemindInfoUtil;
import weaver.workflow.request.RequestManager;
import weaver.workflow.workflow.WorkflowConfigComInfo;

import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
 *
 * 用来将流程存为文档，步骤为先将流程保存为html文件， 然后新建一个html文档，保存的html文件作为html文档的附件
 *
 * Date: 2008-12-18
 * @author cwj
 * @version 1.0
 */

@Slf4j
public class WorkflowToDocCus {
    String SUCCESS = "1";
    String FAILURE_AND_CONTINUE = "0";

    // private static final Logger log = LoggerFactory.getLogger(WorkflowToDocCus.class);

    private final static int THREAD_NUM = 10;//10个固定线程池
    private final static ExecutorService expPool = Executors.newFixedThreadPool(THREAD_NUM);//使用线程池进行线程管理

    private static ImageFileIdUpdate imageFileIdUpdate = new ImageFileIdUpdate();

    private static VersionIdUpdate versionIdUpdate = new VersionIdUpdate();

    private static Pattern port_pattern = Pattern.compile("^\\w*[\\s\\S]+(:\\d+)", Pattern.CASE_INSENSITIVE);

    private String isaesencrypt="";
    private String aescode="";

    //底部签字意见列表显示数量
    private int pageSize =99999;

    public static Class<?> class_MultiLangFilter;
    static {
        try {
            class_MultiLangFilter = Class.forName("weaver.filter.MultiLangFilter");
        } catch (ClassNotFoundException e) {
            new BaseBean().writeLog("class MultiLangFilter doesn't exist");
        }
    }

    /**
     *
     * @param request
     * @param reqType 流程类型 0-主流程  1-子流程
     * @return
     */
    public List<String> execute(RequestInfo request ,int reqType ) {
        log.info("流程转文档开始……workflowToDoc start");
        String cookie = null;
        if (class_MultiLangFilter!=null) {
            try {
                cookie = (String)class_MultiLangFilter.getMethod("getThreadlocalCookies").invoke(class_MultiLangFilter);
            } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
                e.printStackTrace();
            }
        }

        RequestManager requestManager = request.getRequestManager();
        String requestid = Util.null2String(request.getRequestid());
        String userid = Util.null2String(request.getLastoperator());
        String requestname = Util.null2String(request.getDescription());
        String workflowid = Util.null2String(request.getWorkflowid());
        List<String> docids = Start(requestid, userid, requestname, workflowid, cookie, requestManager, reqType);
        log.info("流程转文档结束……workflowToDoc end");
        return docids;
    }

    //接口存文档
    public List<String> Start(String requestid, String userid, String requestname, String workflowid, String cookie,RequestManager requestManager,int reqType) {
        return Start(requestid, userid, requestname, workflowid, cookie,requestManager,true ,reqType);
    }

    //批量存文档用
    public List<String> Start(String requestid, String userid, String requestname, String workflowid, String cookie ,int reqType) {
        RequestManager requestManager = null;
        requestManager = getRequestManager(requestManager,requestid);
        return Start(requestid, userid, requestname, workflowid, cookie,requestManager,false,reqType);
    }
    /**
     * start
     *  @param requestid
     *            流程id
     * @param userid
     *            用户id
     * @param requestname
 *            流程名 流程名作为文档的文档名
     * @param workflowid
     * @return
     */
    public List<String> Start(String requestid, String userid, String requestname, String workflowid, String cookie, RequestManager requestManager, boolean isfromaction , int reqType) {
        String src = requestManager.getSrc(); //用于判断是否流程监控干预
        User user = new User(Util.getIntValue(userid));
        //String wfdocpath = Util.null2String(getWfDocPath(workflowid));
        WfToDocBizCus wfbiz = new WfToDocBizCus();
        String wfdocpath = Util.null2String(wfbiz.getWfDocPath(workflowid,requestid));


        if (wfdocpath.equals("")) {
            log.error("流程保存为文档失败，因为未设置流程保存文档的目录");
            return null;
        }
        String docfiles = getDocFiles(workflowid);
        if ("".equals(docfiles)){
            log.error("流程保存为文档失败，因为未勾选文档附件复选框");
            return null;
        }
        //在这里先获取到modeid 线程中获取时流程可能已经到了下个节点导致模板获取的不对
        int nodeid = requestManager.getNodeid();
        com.api.workflow.util.ServiceUtil serviceUtil = new ServiceUtil();
        if (!isfromaction)
            nodeid = serviceUtil.getCurrentNode(requestid,user);
        RecordSet rs = new RecordSet();
        rs.executeQuery("select * from workflowactionset where workflowid = ? and INTERFACEID = 'WorkflowToDoc'",workflowid);
        log.error("oldnodeid:"+nodeid);
        if (rs.next()){
            nodeid = Util.getIntValue(rs.getString("nodeid"));
        }
        log.error("newnodeid:"+nodeid);
        String modeid = wfbiz.getModeid(Util.getIntValue(workflowid),Util.getIntValue(requestid),nodeid);

        int keepsign =  getKeepSign(workflowid);
        //增加配置文件 是否异步生成
        // String isSync = Util.null2String(new WorkflowConfigComInfo().getValue("workflowtodoc_issync"));
        String isSync = "1";
        if (isSync.equals("1")){
            String filename = UUID.randomUUID().toString();  //防止高并发文件名重复
            String temppath = getFileSavePath();
            LinkedHashMap<String, String> fileids = new LinkedHashMap<String, String> ();
            //是否开启水印
            boolean isOpenWaterMark = WfWaterMark4WfToDocBiz.isOpenWaterMark(Util.getIntValue(workflowid));
            String onlineHtmlMethod = Util.null2String(new WorkflowConfigComInfo().getValue("onlineHtmlMethod"));

            if (docfiles.contains("1")) {  //在线html
                if (!onlineHtmlMethod.equals("1")){   //走离线的方法
                    generateOnLineHtml(requestid,userid, requestname, workflowid,wfdocpath, cookie,fileids,isOpenWaterMark);
                }
            }
            //离线html/pdf
            WfToDocBizCus wfToDocBiz = new WfToDocBizCus(user,pageSize,keepsign,docfiles,modeid,isOpenWaterMark);
            wfToDocBiz.setOnlineHtmlMethod(onlineHtmlMethod);
            wfToDocBiz.generatepdfandhtml(requestid,filename,temppath,src,reqType,workflowid);
            fileids.putAll(wfToDocBiz.getfileids(requestname,filename,temppath));
            //保存
            List<String> docids = saveDocDetail(requestname, workflowid, requestid, wfdocpath, userid, fileids, requestManager, wfbiz);
            return docids;
        }else {
            //线程池执行
            expPool.execute(new Runnable() {
                @Override
                public void run() {

                    String filename = UUID.randomUUID().toString();  //防止高并发文件名重复
                    String temppath = getFileSavePath();
                    LinkedHashMap<String, String> fileids = new LinkedHashMap<String, String> ();
                    //是否开启水印
                    boolean isOpenWaterMark = WfWaterMark4WfToDocBiz.isOpenWaterMark(Util.getIntValue(workflowid));
                    String onlineHtmlMethod = Util.null2String(new WorkflowConfigComInfo().getValue("onlineHtmlMethod"));

                    if (docfiles.contains("1")) {  //在线html
                        if (!onlineHtmlMethod.equals("1")){   //走离线的方法
                            generateOnLineHtml(requestid,userid, requestname, workflowid,wfdocpath, cookie,fileids,isOpenWaterMark);
                        }
                    }
                    //离线html/pdf
                    WfToDocBizCus wfToDocBiz = new WfToDocBizCus(user,pageSize,keepsign,docfiles,modeid,isOpenWaterMark);
                    wfToDocBiz.setOnlineHtmlMethod(onlineHtmlMethod);
                    wfToDocBiz.generatepdfandhtml(requestid,filename,temppath,src, reqType,workflowid);
                    fileids.putAll(wfToDocBiz.getfileids(requestname,filename,temppath));
                    //保存
                    saveDocDetail(requestname, workflowid,requestid, wfdocpath,userid,fileids,requestManager,wfbiz);
                }
            });
        }
        return new ArrayList<>();
    }


    private void generateOnLineHtml(String requestid, String userid, String requestname, String workflowid,String wfdocpath, String cookie,LinkedHashMap<String, String> fileids,boolean isOpenWaterMark){
        String url[] = getUrl(requestid, userid);

        if(url!=null && url.length==5){//避免url为空时，出现异常
            boolean hasNull = false;//检查5个值是不是有空，如果有，就不导为文档了
            /*
             * QC271940解决AD域用户使用流程存为文档功能
             */
			/*for(int cx=0; cx<url.length; cx++){
				if(url[cx]==null || "".equals(url[cx])){
					hasNull = true;
				}
			}*/
            if(hasNull == false){
                log.info("生成HTML……");
                getWorkflowHtml(url, requestid, requestname, workflowid, wfdocpath,userid, cookie,fileids);
            }
        }else{
            log.info("URL数据错误："+ JSON.toJSONString(url));
        }
    }

    /**
     * 获取流程的url
     *
     * @param requestid
     *            流程id
     * @param userid
     *            当前用户
     * @return
     */
    public String[] getUrl(String requestid, String userid) {
        String sql = "";
        String tempurl = "";
        String loginid = "";
        String password = "";
        int accounttype = 0;  //账号类型,0:主账号，1：次账号
        int belongto = 0;
        String isADaccount="";
        String para = "";
        String oaaddress = "";
        String params[] = new String[5];

        RecordSet rs = new RecordSet();
        sql = "select * from SystemSet";
        rs.executeSql(sql);
        rs.next();
        oaaddress = Util.null2String(rs.getString("oaaddress"));
        if (oaaddress.equals("")) {
            log.error("流程保存为文档失败，因为系统未设置OA访问地址,requestid=" + requestid);
            return params;
        }

        sql = "select * from hrmresource where id = " + userid;
        rs.executeSql(sql);
        while (rs.next()) {
            loginid = rs.getString("loginid");
            password = rs.getString("password");
            isADaccount = rs.getString("isadaccount");
            accounttype = Util.getIntValue(Util.null2String(rs.getString("accounttype")),0);
            belongto = Util.getIntValue(Util.null2String(rs.getString("belongto")));
        }

        sql = "select * from HrmResourceManager where id = " + userid;
        rs.executeSql(sql);
        while (rs.next()) {
            loginid = rs.getString("loginid");
            password = rs.getString("password");
        }

        String f_weaver_belongto_userid = "";
        String f_weaver_belongto_usertype = "0";
        if(accounttype == 1 && belongto > 0){   //次账号，查询主账号，用主账号登录
            f_weaver_belongto_userid = userid;
            sql = "select * from hrmresource where id = " + belongto;
            rs.executeSql(sql);
            if(rs.next()){
                isADaccount = rs.getString("isadaccount");
                loginid = rs.getString("loginid");
                password = rs.getString("password");
            }
        }

        if ((!loginid.equals("") && !password.equals(""))||(!loginid.equals("")&&isADaccount.equals("1"))) {//QC271940[80][90]Ldap集成-解决AD用户无法使用流程存为文档功能
            para = "/workflow/request/ViewRequest.jsp?haveVerifyForward=true&requestid=" + requestid
                    + "&para2=" + loginid + "&para3=" + password;
        } else {
            log.error("流程保存为文档失败，因为用户名和密码为空,requestid=" + requestid);
            return params;
        }

        tempurl = oaaddress
                + "/login/VerifyRtxLogin.jsp?urlfrom=workflowtodoc&para1="
                + para;

        Map<String, String> result = CreateTokenUtil.createToken("ecology", loginid);
        String token = "";
        if ("success".equals(result.get("state"))){
            token = result.get("data");             //tokenֵ
        } else {
            String msg = result.get("data");
        }

//		params[0] = oaaddress+"/login/VerifyRtxLogin.jsp";
        params[0] = oaaddress+"/wui/index.html?ssoToken="+token+"#/main";
        params[1] = "workflowtodoc";
        String pageurl = "/workflow/request/ViewRequest.jsp?haveVerifyForward=true&isworkflowhtmldoc=1&requestid=" + requestid;
        if(accounttype > 0 && belongto > 0){
            pageurl += "&f_weaver_belongto_userid=" + f_weaver_belongto_userid + "&f_weaver_belongto_usertype=" + f_weaver_belongto_usertype;
        }
        params[2] = pageurl;
		/*try {
			params[3] = new String(loginid.getBytes(), "8859_1");
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}*/
        params[3] = PoppupRemindInfoUtil.encrypt(loginid);//解决中文账号问题
        params[4] = password;


        return params;
    }

    /**
     * 根据url读取html文件，并生成文档，放到指定的目录下
     *
     * @param url
     *            流程页面的url
     *
     * @param requestid
     *            流程id
     * @param requestname
     *            流程名称
     * @param workflowid
     *            流程类型id
     * @param wfdocpath
     *            文档存放的目录
     */
    public void getWorkflowHtml(String url[], String requestid,
                                String requestname, String workflowid, String wfdocpath,String userid, String cookie,LinkedHashMap<String, String> fileids) {

        HttpClient client =  FWHttpConnectionManager.getHttpClient();

        PostMethod method = new PostMethod(url[0]);//oa地址
        method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
                new DefaultHttpMethodRetryHandler(3, false));
        try {
            NameValuePair[] params = {
                    new NameValuePair("urlfrom", url[1]),//urlfrom
                    new NameValuePair("para1",url[2]),//requesturl
                    new NameValuePair("para2",url[3] ),//loginid
                    new NameValuePair("para3",url[4])};//url4密码
            method.setRequestBody(params);
            //log.info("----workflowtodoc----"+url[0] + "?urlfrom="+url[1]+"&para1="+url[2]+"&para2="+url[3]+"&para3="+url[4]);


            int statusCode = client.executeMethod(method);
            new BaseBean().writeLog("WorkflowToDoc statusCode :"+statusCode);
            String temppath = getFileSavePath();
            String filename = System.currentTimeMillis() + "";
            String htmlname = temppath + filename;
            File _temppath = new File(temppath);
            if(!_temppath.exists()){
                _temppath.mkdirs();
            }

            if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY
                    || statusCode == HttpStatus.SC_MOVED_TEMPORARILY || statusCode == HttpStatus.SC_OK) {
                Header locationHeader = method.getResponseHeader("location");
                if (locationHeader != null) {
                    String tempurl = locationHeader.getValue();
                    if(!tempurl.startsWith("http://") && !tempurl.startsWith("https://")) {
                        //GET PORT
                        String port_string = "";
                        Matcher matcher = port_pattern.matcher(url[0]);
                        if (matcher.find()) {
                            port_string = matcher.group(1);
                        }
                        tempurl = "http://"
//								+ (port_string.isEmpty()? "" : "localhost"+port_string)
                                + (port_string.isEmpty()? "" : "127.0.0.1"+port_string)
                                + tempurl;

                    }
                    new BaseBean().writeLog("WorkflowToDoc cookie :"+cookie);
                    tempurl = getFinallyUrl(client, tempurl,cookie);
                    tempurl = tempurl.replaceFirst(".jsp", "Iframe.jsp");
                    tempurl = tempurl+"&urlfrom=workflowtodoc";

                    new BaseBean().writeLog("WorkflowToDoc client.executeMethod(g) start :"+System.currentTimeMillis());
                    new BaseBean().writeLog("WorkflowToDoc tempurl :"+tempurl);
                    GetMethod g = new GetMethod(tempurl);
                    g.setRequestHeader("cookie", cookie);
                    client.executeMethod(g);
                    OutputStream os=new FileOutputStream(htmlname);

                    new BaseBean().writeLog("WorkflowToDoc client.executeMethod(g) end :"+System.currentTimeMillis());
//					SystemComInfo syscominfo=new SystemComInfo() ;
//					this.isaesencrypt = syscominfo.getIsaesencrypt();
//					this.aescode = Util.getRandomString(13);
//					if("1".equals(this.isaesencrypt)){
//						try{
//							os=AESCoder.encrypt(os, this.aescode);
//						} catch(Exception e){
//
//						}
//					}
                    OutputStreamWriter output = new OutputStreamWriter(os, "UTF-8");
                    BufferedWriter bw = new BufferedWriter(output);

                    BufferedReader in = new BufferedReader(new InputStreamReader(g.getResponseBodyAsStream(), "UTF-8"));
                    StringBuffer sb=new StringBuffer();
                    String line = in.readLine();
                    while (line != null) {
                        line = line.trim();
                        if(line.indexOf("</a>")>=0&&line.indexOf("openSignPrint()")>=0&&line.indexOf("onclick")>=0){
                            //去掉转发按钮
                        }else if(line.indexOf("<img")>=0&&line.indexOf("class=\"transto\"")>=0&&line.indexOf("onclick")>=0&&line.indexOf("transtoClick(this)")>=0){

                        }else if(line.indexOf("var")>=0&&line.indexOf("bar")>=0&&line.indexOf("eval")>=0&&line.indexOf("handler")>=0&&line.indexOf("text")>=0){
                            sb.append("var bar=eval(\"[]\");\n");
                        }else{
                            sb.append(line + "\n");
                        }
                        line = in.readLine();
                    }

                    //添加水印
                    if(WfWaterMark4WfToDocBiz.isOpenWaterMark(Util.getIntValue(workflowid))){
                        WfWaterMark4WfToDocBiz wfWaterMark4WfToDocBizCus = new WfWaterMark4WfToDocBiz(new User(Util.getIntValue(userid)));
                        wfWaterMark4WfToDocBizCus.generateFormData(requestid);
                        String watetmarkhtml = wfWaterMark4WfToDocBizCus.getWaterMarkHtml(false,Util.getIntValue(workflowid),Util.getIntValue(requestid),true);
                        int begIndex = sb.lastIndexOf("</body>");
                        String frontcontent = sb.substring(0, begIndex);
                        String behindcontent = sb.substring(begIndex);
                        sb.setLength(0);
                        sb.append(frontcontent)
                                .append("\n").append(watetmarkhtml)
                                .append(behindcontent);
                    }

                    //去掉ext的button,<script type="text/javascript" src="/js/wf_wev8.js">var bar=eval("[]");</script>
                    sb.append("<script type=\"text/javascript\">\n");
                    sb.append("function drm4request2doc(){\n");
                    sb.append("\tbar=eval(\"[]\");\n");
                    sb.append("\tdocument.getElementById(\"rightMenu\").style.display=\"none\";\n");
                    sb.append("}\n");
                    sb.append("window.attachEvent(\"onload\", drm4request2doc);\n");
                    sb.append("</script>");

                    String sdata=sb.toString();
                    bw.write(sdata,0,sdata.length());

//					long size = 0l;
//					File f = new File(htmlname);
//					if (f.exists()) {
//						size = f.length();
//					}

                    bw.flush();
                    bw.close();
                    in.close();

                    InputStream inputStream = null;
                    byte[] buffer = null;
                    File file = new File(htmlname);
                    if (file.exists()){
                        try {
                            inputStream = new FileInputStream(file);
                            buffer = new byte[(int) file.length()];
                            inputStream.read(buffer);
                            inputStream.close();
                        }catch (Exception e){
                            e.printStackTrace();
                        }
                    }

//
//					if("1".equals(this.isaesencrypt)){
//						String sm4 = Util.null2String(new weaver.general.BaseBean().getPropValue("weaver_security_type","reversible_enc_type"));
//						if("sm4".equalsIgnoreCase(sm4)&&aescode.startsWith("sm4start")&&aescode.endsWith("sm4end")){
//							InputStream is = null;
//							String _htmlname = temppath + java.util.UUID.randomUUID();
//							try{
//								is = new FileInputStream(f);
//								is = AESCoder.encrypt(is, aescode);
//
//								OutputStream ops = new FileOutputStream(_htmlname);
//								int n = 0;
//								byte []b = new byte[2048];
//								while((n=is.read(b)) != -1){
//									ops.write(b,0,n);
//								}
//								ops.flush();
//								ops.close();
//								is.close();
//								//f.delete();
//								FileSecurityUtil.deleteFile(f);
//								htmlname = _htmlname;
//							}catch(Exception e){
//								new weaver.general.BaseBean().writeLog(e);
//							}
//						}
//					}
                    ImageFileManager imageFileManager = new ImageFileManager();
                    imageFileManager.setComefrom("WorkflowToDoc");
                    imageFileManager.setData(buffer);
                    imageFileManager.setImagFileName(requestname+".html");
                    int imagefileid = imageFileManager.saveImageFile();
//					System.out.println("-在线-imagefileid----"+imagefileid);
                    // 保存imagefile
                    //int imagefileid = saveImageFile(requestname, htmlname, size,false);
                    if (imagefileid <= 0) {
                        log.error("保存在线HTML文件失败");
                        return ;
                    }
                    //把fileid存入fileidsmap中最后一起保存文档-附件关联关系
                    fileids.put("online_html",imagefileid+"");
                    //saveDocDetail(requestname, htmlname, size, workflowid,requestid, wfdocpath,userid);

                    if(g!=null){
                        g.releaseConnection();
                    }
                    if(method!=null){
                        method.releaseConnection();
                    }
                }
            }

        } catch (HttpException e) {
            log.error("Fatal protocol violation: " + e.getMessage());
            e.printStackTrace();
        } catch (IOException e) {
            log.error("Fatal transport error: " + e.getMessage());
            e.printStackTrace();
        }catch (Exception e) {
            e.printStackTrace();
            new BaseBean().writeLog(e);
        }finally {
            method.releaseConnection();
        }

    }

    /**
     * 获得最后的url，因为response之后的值，post方法不能直接获取
     * @param client
     * @param url
     * @return
     */
    public String getFinallyUrl(HttpClient client, String url,String cookie) {
        PostMethod g = new PostMethod(url);
        try {
            if(!"".equals(cookie) && cookie != null){
                g.setRequestHeader("cookie", cookie);
            }
            client.executeMethod(g);
        } catch (Exception e) {
            e.printStackTrace();
            return url;
        }
        Header locationHeader = g.getResponseHeader("location");
        if (locationHeader != null) {
            url = locationHeader.getValue();
            url = getFinallyUrl(client, url);
        }
        if (g != null) {
            g.releaseConnection();
        }
        return url;
    }

    public String getFinallyUrl(HttpClient client, String url) {
        return getFinallyUrl(client,url,null);
    }

    //重载下 以防有其他地方调用
    public Object saveDocDetail(String imagefilename, String workflowid, String requestid, String allwfdocpath, String userid, LinkedHashMap<String,String> fileids, RequestManager requestManager) {
        WfToDocBizCus wfbiz = new WfToDocBizCus();
        wfbiz.getWfDocPath( workflowid, requestid);
        return this.saveDocDetail(imagefilename,workflowid,requestid,allwfdocpath,userid,fileids,requestManager,wfbiz);
    }
    /**
     * 保存文档信息
     *
     * @param imagefilename
     *            文档名称
     * @param workflowid
     *            流程类型id
     * @param allwfdocpath
     *            文档目录
     * @return 保存是否成功
     */
    public List<String> saveDocDetail(String imagefilename, String workflowid, String requestid, String allwfdocpath, String userid, LinkedHashMap<String,String> fileids, RequestManager requestManager, WfToDocBizCus wfbiz) {
        RecordSet rs = new RecordSet();
        if (allwfdocpath.equals("")) {
            log.error("流程保存为文档失败，因为未设置流程保存文档的目录");
            return new ArrayList<>();
        }
        String wfdocpath[] = Util.TokenizerString2(allwfdocpath, ",");
        int maincategory = 0;
        int subcategory = 0;
        int seccategory = 0;

        if(wfdocpath.length==1){//如果目录就传了一层,默认只给到seccategory
            seccategory = Util.getIntValue(wfdocpath[0],0);
        }else{
            if(wfdocpath.length > 0 ) maincategory = Util.getIntValue(wfdocpath[0],0);
            if(wfdocpath.length > 1 ) subcategory = Util.getIntValue(wfdocpath[1],0);
            if(wfdocpath.length > 2 ) seccategory = Util.getIntValue(wfdocpath[2],0);
        }

        // 保存docdetail
        ResourceComInfo ResourceComInfo = null;
        try {
            ResourceComInfo = new ResourceComInfo();
        } catch (Exception e) {
            log.error("异常:",e);
        }
        String sql = "";
        int doclangurage = 7;
        int docowner = Util.getIntValue(getWfDocOwner(workflowid,requestid), 0);
        int docdepartmentid = Util.getIntValue(ResourceComInfo
                .getDepartmentID("" + docowner), 0);
        String docsubject = imagefilename;

        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);
        String doccreatedate = formatdate;
        String doccreatetime = formattime;
        String doclastmoddate = formatdate;
        String doclastmodtime = formattime;
        String docValidDate = formatdate;
        String docValidTime = formattime;
        String parentids =  "";
        String docCreaterType = "1";
        String docextendname = "html";
        String docCode = "";
        String doccontent = "";
        String clientIp = "";

        rs.executeSql("select clientAddress from SysMaintenanceLog, SystemLogItem where operateitem='60' AND SysMaintenanceLog.operateItem = SystemLogItem.itemId and operateuserid = '" + userid + "' order by id desc");
        rs.next();
        clientIp = rs.getString("clientAddress");

        if("0:0:0:0:0:0:0:1".equals(clientIp)){
            clientIp = "127.0.0.1";
        }

        rs.executeProc("Doc_SecCategory_SelectByID",seccategory+"");
        rs.next();

        String docapprovable = "";
        String docreplyable = rs.getString("replyable");
        String isreply = "";
        int replydocid = 0;
        String docpublishtype = "";

        int itemid = 0;
        int itemmaincategoryid = 0;
        int hrmresid = 0;
        int crmid = 0;
        int projectid = 0;
        int financeid = 0;

        int doccreaterid = docowner;
        int doclastmoduserid = docowner;
        int docapproveuserid = 0;
        String docapprovedate = "";
        String docapprovetime = "";

        int docarchiveuserid = 0;
        String docarchivedate = "";
        String docarchivetime = "";

        String docstatus = "1";
        int assetid = 0;
        int ownerid = docowner;

        String keyword = "";
        int accessorycount = 0;
        String docfiles = getDocFiles(workflowid);
        if (docfiles.contains("1")) {
            accessorycount++;
        }
        if (docfiles.contains("2")) {
            accessorycount++;
        }
        if (docfiles.contains("3")){
            accessorycount++;
        }

        int replaydoccount = 0;
        int docType = 1;//html
        String canCopy = "1";
        String canRemind = "1";
        String orderable = rs.getString("orderable");

        int docEdition = -1;
        int docSmallEdition = -1;
        int docEditionId = -1;
        SecCategoryComInfo scc =null;

        try {
            scc = new SecCategoryComInfo();
            if(scc.isEditionOpen(seccategory)) {//如果版本管理开启

                docEdition=1;
                docEditionId=this.getNextEditionId();
                if(scc.isOpenSizeVersion(seccategory)){
                    docSmallEdition = 1;
                }

            }
        } catch (Exception e) {
            log.error("异常",e);
        }
        int isHistory = 0;
        int approveType = 0;
        int mainDoc = 0;
        int readOpterCanPrint = rs.getInt("readoptercanprint");


        int docValidUserId = docowner;
        String invalidationDate = "";
        String docLastModUserType = docCreaterType;
        String docApproveUserType = "";
        String docValidUserType = docCreaterType;
        String docInvalUserType = "";
        String docArchiveUserType = "";
        String docCancelUserType = "";
        String docPubUserType = "";
        String docReopenUserType = "";
        String ownerType = docCreaterType;
        int canPrintedNum = 0;

        int docid = 0;
        List<String> docids = new ArrayList<String> ();
        WorkflowToDocSettingInfoEntity workflowToDocSettingInfoEntity = this.getSettingInfo(workflowid);
        if (isAnnex(workflowToDocSettingInfoEntity)&&fileids.size()>1){  //勾选了关联到表单且为附件字段并且选择的附件种类大于1 则每个附件生成一个文档
            for(Map.Entry<String, String> entry: fileids.entrySet()) {
                try {
                    docid = new DocManager().getNextDocId(rs);
                } catch (Exception e) {
                    log.error("读取文档id号异常：" + e);
                }
                parentids = docid+"";
                mainDoc = docid;
                if ("offline_pdf".equals(entry.getKey())){
                    docsubject = imagefilename+"(PDF)";
                    accessorycount = 1;
                }else if ("offline_html".equals(entry.getKey())){
                    docsubject = imagefilename+"(OfflineHTML)";
                    accessorycount = 1;
                }else if ("online_html".equals(entry.getKey())){
                    docsubject = imagefilename+"(OnlineHTML)";
                    accessorycount = 1;
                }
                SaveDocDetailBizCus saveDocDetailBiz = new SaveDocDetailBizCus();
                saveDocDetailBiz.setDocid( docid);
                saveDocDetailBiz.setMaincategory( maincategory);
                saveDocDetailBiz.setSubcategory( subcategory);
                saveDocDetailBiz.setSeccategory( seccategory);
                saveDocDetailBiz.setDoclangurage( doclangurage);
                saveDocDetailBiz.setDocapprovable( docapprovable);
                saveDocDetailBiz.setDocreplyable( docreplyable);
                saveDocDetailBiz.setIsreply( isreply);
                saveDocDetailBiz.setReplydocid( replydocid);
                saveDocDetailBiz.setDocsubject( docsubject);
                saveDocDetailBiz.setDocpublishtype( docpublishtype);
                saveDocDetailBiz.setItemid( itemid);
                saveDocDetailBiz.setItemmaincategoryid( itemmaincategoryid);
                saveDocDetailBiz.setHrmresid( hrmresid);
                saveDocDetailBiz.setCrmid( crmid);
                saveDocDetailBiz.setProjectid( projectid);
                saveDocDetailBiz.setFinanceid( financeid);
                saveDocDetailBiz.setDoccreaterid( doccreaterid);
                saveDocDetailBiz.setDocdepartmentid( docdepartmentid);
                saveDocDetailBiz.setDoccreatedate( doccreatedate);
                saveDocDetailBiz.setDoccreatetime( doccreatetime);
                saveDocDetailBiz.setDoclastmoduserid( doclastmoduserid);
                saveDocDetailBiz.setDoclastmoddate( doclastmoddate);
                saveDocDetailBiz.setDoclastmodtime( doclastmodtime);
                saveDocDetailBiz.setDocapproveuserid( docapproveuserid);
                saveDocDetailBiz.setDocapprovedate( docapprovedate);
                saveDocDetailBiz.setDocapprovetime( docapprovetime);
                saveDocDetailBiz.setDocarchiveuserid( docarchiveuserid);
                saveDocDetailBiz.setDocarchivedate( docarchivedate);
                saveDocDetailBiz.setDocarchivetime( docarchivetime);
                saveDocDetailBiz.setDocstatus( docstatus);
                saveDocDetailBiz.setParentids( parentids);
                saveDocDetailBiz.setAssetid( assetid);
                saveDocDetailBiz.setOwnerid( ownerid);
                saveDocDetailBiz.setKeyword( keyword);
                saveDocDetailBiz.setAccessorycount( accessorycount);
                saveDocDetailBiz.setReplaydoccount( replaydoccount);
                saveDocDetailBiz.setUsertype( docCreaterType);
                saveDocDetailBiz.setDoctype(docType);
                saveDocDetailBiz.setCancopy( canCopy);
                saveDocDetailBiz.setCanremind( canRemind);
                saveDocDetailBiz.setOrderable( orderable);
                saveDocDetailBiz.setDocextendname( docextendname);
                saveDocDetailBiz.setDoccode( docCode);
                saveDocDetailBiz.setDocedition( docEdition);
                saveDocDetailBiz.setDocsmalledition( docSmallEdition);
                saveDocDetailBiz.setDoceditionid( docEditionId);
                saveDocDetailBiz.setIshistory( isHistory);
                saveDocDetailBiz.setApproveType( approveType);
                saveDocDetailBiz.setMaindoc( mainDoc);
                saveDocDetailBiz.setReadoptercanprint( readOpterCanPrint);
                saveDocDetailBiz.setDocvaliduserid( docValidUserId);
                saveDocDetailBiz.setDocvaliddate( docValidDate);
                saveDocDetailBiz.setDocvalidtime( docValidTime);
                saveDocDetailBiz.setInvalidationdate( invalidationDate);
                saveDocDetailBiz.setDocCreaterType( docCreaterType);
                saveDocDetailBiz.setDocLastModUserType( docLastModUserType);
                saveDocDetailBiz.setDocApproveUserType( docApproveUserType);
                saveDocDetailBiz.setDocValidUserType( docValidUserType);
                saveDocDetailBiz.setDocInvalUserType( docInvalUserType);
                saveDocDetailBiz.setDocArchiveUserType( docArchiveUserType);
                saveDocDetailBiz.setDocCancelUserType( docCancelUserType);
                saveDocDetailBiz.setDocPubUserType( docPubUserType);
                saveDocDetailBiz.setDocReopenUserType( docReopenUserType);
                saveDocDetailBiz.setOwnerType( ownerType);
                saveDocDetailBiz.setCanPrintedNum( canPrintedNum);
                saveDocDetailBiz.setFromworkflow( requestid);
                saveDocDetailBiz.setDoccontent( doccontent);
                saveDocDetailBiz.setDocowner( docowner);
                saveDocDetailBiz.setClientIp( clientIp);
                saveDocDetailBiz.saveDoc(requestid,requestManager,wfbiz,userid);

                // 最后保存 docimagefile
                if ("offline_pdf".equals(entry.getKey())){
                    saveDocImageFile(docid, Util.getIntValue(entry.getValue()), imagefilename,3);
                }else if ("offline_html".equals(entry.getKey())){
                    saveDocImageFile(docid, Util.getIntValue(entry.getValue()), imagefilename,2);
                }else if ("online_html".equals(entry.getKey())){
                    saveDocImageFile(docid, Util.getIntValue(entry.getValue()), imagefilename,1);
                }
                DocSaveService.copyDocFile(seccategory,docid);

                //解决流程存文档不推动文档消息
                SendMsgForNewDocThread sendThread = new SendMsgForNewDocThread(new User(Util.getIntValue(userid)),docid,null);sendThread.start();
                docids.add(docid+"");
            }
        }else{    //只生成一篇文档
            try {
                docid = new DocManager().getNextDocId(rs);
            } catch (Exception e) {
                log.error("读取文档id号异常：" + e);
                return null;
            }
            parentids = docid+"";
            mainDoc = docid;
            SaveDocDetailBizCus saveDocDetailBiz = new SaveDocDetailBizCus();
            saveDocDetailBiz.setDocid( docid);
            saveDocDetailBiz.setMaincategory( maincategory);
            saveDocDetailBiz.setSubcategory( subcategory);
            saveDocDetailBiz.setSeccategory( seccategory);
            saveDocDetailBiz.setDoclangurage( doclangurage);
            saveDocDetailBiz.setDocapprovable( docapprovable);
            saveDocDetailBiz.setDocreplyable( docreplyable);
            saveDocDetailBiz.setIsreply( isreply);
            saveDocDetailBiz.setReplydocid( replydocid);
            saveDocDetailBiz.setDocsubject( docsubject);
            saveDocDetailBiz.setDocpublishtype( docpublishtype);
            saveDocDetailBiz.setItemid( itemid);
            saveDocDetailBiz.setItemmaincategoryid( itemmaincategoryid);
            saveDocDetailBiz.setHrmresid( hrmresid);
            saveDocDetailBiz.setCrmid( crmid);
            saveDocDetailBiz.setProjectid( projectid);
            saveDocDetailBiz.setFinanceid( financeid);
            saveDocDetailBiz.setDoccreaterid( doccreaterid);
            saveDocDetailBiz.setDocdepartmentid( docdepartmentid);
            saveDocDetailBiz.setDoccreatedate( doccreatedate);
            saveDocDetailBiz.setDoccreatetime( doccreatetime);
            saveDocDetailBiz.setDoclastmoduserid( doclastmoduserid);
            saveDocDetailBiz.setDoclastmoddate( doclastmoddate);
            saveDocDetailBiz.setDoclastmodtime( doclastmodtime);
            saveDocDetailBiz.setDocapproveuserid( docapproveuserid);
            saveDocDetailBiz.setDocapprovedate( docapprovedate);
            saveDocDetailBiz.setDocapprovetime( docapprovetime);
            saveDocDetailBiz.setDocarchiveuserid( docarchiveuserid);
            saveDocDetailBiz.setDocarchivedate( docarchivedate);
            saveDocDetailBiz.setDocarchivetime( docarchivetime);
            saveDocDetailBiz.setDocstatus( docstatus);
            saveDocDetailBiz.setParentids( parentids);
            saveDocDetailBiz.setAssetid( assetid);
            saveDocDetailBiz.setOwnerid( ownerid);
            saveDocDetailBiz.setKeyword( keyword);
            saveDocDetailBiz.setAccessorycount( accessorycount);
            saveDocDetailBiz.setReplaydoccount( replaydoccount);
            saveDocDetailBiz.setUsertype( docCreaterType);
            saveDocDetailBiz.setDoctype(docType);
            saveDocDetailBiz.setCancopy( canCopy);
            saveDocDetailBiz.setCanremind( canRemind);
            saveDocDetailBiz.setOrderable( orderable);
            saveDocDetailBiz.setDocextendname( docextendname);
            saveDocDetailBiz.setDoccode( docCode);
            saveDocDetailBiz.setDocedition( docEdition);
            saveDocDetailBiz.setDocsmalledition( docSmallEdition);
            saveDocDetailBiz.setDoceditionid( docEditionId);
            saveDocDetailBiz.setIshistory( isHistory);
            saveDocDetailBiz.setApproveType( approveType);
            saveDocDetailBiz.setMaindoc( mainDoc);
            saveDocDetailBiz.setReadoptercanprint( readOpterCanPrint);
            saveDocDetailBiz.setDocvaliduserid( docValidUserId);
            saveDocDetailBiz.setDocvaliddate( docValidDate);
            saveDocDetailBiz.setDocvalidtime( docValidTime);
            saveDocDetailBiz.setInvalidationdate( invalidationDate);
            saveDocDetailBiz.setDocCreaterType( docCreaterType);
            saveDocDetailBiz.setDocLastModUserType( docLastModUserType);
            saveDocDetailBiz.setDocApproveUserType( docApproveUserType);
            saveDocDetailBiz.setDocValidUserType( docValidUserType);
            saveDocDetailBiz.setDocInvalUserType( docInvalUserType);
            saveDocDetailBiz.setDocArchiveUserType( docArchiveUserType);
            saveDocDetailBiz.setDocCancelUserType( docCancelUserType);
            saveDocDetailBiz.setDocPubUserType( docPubUserType);
            saveDocDetailBiz.setDocReopenUserType( docReopenUserType);
            saveDocDetailBiz.setOwnerType( ownerType);
            saveDocDetailBiz.setCanPrintedNum( canPrintedNum);
            saveDocDetailBiz.setFromworkflow( requestid);
            saveDocDetailBiz.setDoccontent( doccontent);
            saveDocDetailBiz.setDocowner( docowner);
            saveDocDetailBiz.setClientIp( clientIp);
            saveDocDetailBiz.saveDoc(requestid,requestManager,wfbiz,userid);

            // 最后保存 docimagefile
            for(Map.Entry<String, String> entry: fileids.entrySet()) {
                if ("offline_pdf".equals(entry.getKey())){
                    saveDocImageFile(docid, Util.getIntValue(entry.getValue()), imagefilename,3);
                }else if ("offline_html".equals(entry.getKey())){
                    saveDocImageFile(docid, Util.getIntValue(entry.getValue()), imagefilename,2);
                }else if ("online_html".equals(entry.getKey())){
                    saveDocImageFile(docid, Util.getIntValue(entry.getValue()), imagefilename,1);
                }
            }
            DocSaveService.copyDocFile(seccategory,docid);
            //解决流程存文档不推动文档消息
            SendMsgForNewDocThread sendThread = new SendMsgForNewDocThread(new User(Util.getIntValue(userid)),docid,null);sendThread.start();
            docids.add(docid+"");
        }

        //文档保存到表单字段
        saveDocToForm(rs,String.join(",",docids),docowner,requestid,workflowid);
        return docids;
    }

    /*
     * 文档关联到表单字段   支持多个文档更新到表单字段
     */
    public boolean saveDocToForm(RecordSet rs,String docids,int docowner,String requestid,String workflowid){
        String sql = "";
        String[] docidarr = docids.split(",");

        String tablename = " workflow_form ";
        String fieldname = "";
        String fieldhtmltype ="";
        String type ="";
        rs.executeQuery("select formid,isbill,wfdocrelatedformdisplay,wfdocrelatefieldid from workflow_base where id = ?",workflowid);
        RecordSet rs1 = new RecordSet();
        if (rs.next()){
            String wfdocrelatedformdisplay = Util.null2String(rs.getString("wfdocrelatedformdisplay"));
            String wfdocrelatefieldid = Util.null2String(rs.getString("wfdocrelatefieldid"));
            int isbill = Util.getIntValue(rs.getString("isbill"), 0);
            int formid = Util.getIntValue(rs.getString("formid"), 0);
            if(wfdocrelatedformdisplay.equals("1")&&!wfdocrelatefieldid.equals("")){
                if(isbill == 1){
                    sql = "select tablename from workflow_bill where id="+formid;
                    rs1.executeQuery(sql);
                    if(rs1.next()){
                        tablename = Util.null2String(rs1.getString(1));
                    }
                    sql = "select fieldname,fieldhtmltype,type from workflow_billfield where billid="+formid+" and id="+wfdocrelatefieldid;
                }else{
                    sql = "select fieldname,fieldhtmltype,type from workflow_formdictdetail where id="+wfdocrelatefieldid;
                }
                rs1.executeQuery(sql);
                if(rs1.next()){
                    fieldname = Util.null2String(rs1.getString(1));
                    fieldhtmltype =Util.null2String(rs1.getString(2));
                    type =Util.null2String(rs1.getString(3));
                }
                if(!"".equals(tablename) && !"".equals(fieldname)){
                    String fieldvalue ="";  //先获取数据库原有值
                    sql = "select "+fieldname+" from "+tablename+" where requestid="+requestid;
                    rs1.executeQuery(sql);
                    if(rs1.next()){
                        fieldvalue = Util.null2String(rs1.getString(1));
                    }
                    if (!fieldvalue.equals("")){
                        if ((fieldhtmltype.equals("6")&&type.equals("1"))||(fieldhtmltype.equals("3")&&type.equals("37"))){    //附件和多文档字段 追加
                            String updateDocids = fieldvalue+","+docids;
                            rs1.executeUpdate(" update "+tablename+" set "+fieldname+" = '"+updateDocids+"' where  requestid = ?",requestid);
                        }else if (fieldhtmltype.equals("3")&&type.equals("9")){  //单文档  会清除原文档再添加
                            rs1.executeUpdate(" update "+tablename+" set "+fieldname+" = '"+docids+"' where  requestid = ?",requestid);
                            new BaseBean().writeLog("流程存文档关联到表单字段，单文档字段原先值==>"+fieldvalue+",更新后docid ==>"+docids);
                        }
                    }else {
                        rs1.executeUpdate(" update "+tablename+" set "+fieldname+" = '"+docids+"' where  requestid = ?",requestid);
                    }
                }
            }

            /*  更新完成后给流程所有操作者赋权*****/
            WfToDocBizCus.docShare(docids,requestid,docowner);

        }
        return true;
    }


    /**
     * 判断requestmanager是否为空
     * @param rmanager
     */
    public RequestManager getRequestManager(RequestManager rmanager,String requestid){
        if(rmanager==null){
            rmanager = new RequestManager();
            RecordSet rs = new RecordSet();
            String sql = "select * from workflow_requestbase where requestid = " + requestid;
            rs.executeSql(sql);
            while(rs.next()){
                int _requestId=rs.getInt("requestid");
                int workflowId=rs.getInt("workflowid");
                int creater=rs.getInt("creater");
                String requestname = rs.getString("requestname");
                String requestlevel = rs.getString("requestlevel");
                String messagetype = rs.getString("messagetype");
                rmanager.setRequestid(_requestId);
                rmanager.setWorkflowid(workflowId);
                rmanager.setCreater(creater);
                rmanager.setRequestname(requestname);
                rmanager.setRequestlevel(requestlevel);
                rmanager.setMessageType(messagetype);
                rmanager.setNodeid(Util.getIntValue(rs.getString("currentNodeID")));
            }
        }

        return rmanager;
    }

    //重载下 以防方法在其他地方有调用
    public boolean saveDocProp(int docid,String requestid,RequestManager requestManager){
        return saveDocProp( docid, requestid, requestManager,new WfToDocBizCus());
    }
    /**
     * 保存文档属性
     * @param docid
     * @return
     */
    public boolean saveDocProp(int docid,String requestid,RequestManager requestManager,WfToDocBizCus wfbiz){
        boolean success = true;
        String docids = docid+"";
        requestManager = getRequestManager(requestManager,requestid);
        try{
            log.error("saveDocProp:" + docid +" "+requestid);
            RequestDocPropManagerCus requestDocPropManager=new RequestDocPropManagerCus(wfbiz);
            requestDocPropManager.changeDocProp(requestManager,docids);
        }catch (Exception e) {
            success = false;
            log.error("RequestDocPropManagerCus Error:requestid="+requestid+"###docids="+docids);
            log.error("异常"+e);
        }
        log.error("success:"+success);
        return success;

    }

    /**
     * 保存docimagefile
     *
     * @param docid
     *            文档id
     * @param imagefileid
     *            imagefileid
     * @param filename
     *            文件名
     */
    public boolean saveDocImageFile(int docid, int imagefileid, String filename,int filetype) {
        RecordSet rs = new RecordSet();

        int id = 0;
        int versionId = 0;
        String imagefilename = "";
        if (filetype==1){
            imagefilename = filename + ".html";
        }else if (filetype ==2){
            imagefilename = filename + ".zip";
        }else if (filetype==3){
            imagefilename = filename+".pdf";
        }
        String imagefiledesc = "";
        String imagefilewidth = "0";
        String imagefileheight = "0";
        String imagefielsize = "0";
        String docfiletype = "2";
        String versionDetail = "";

        try {
            id = new DocImageManager().getNextDocImageFileId();
        } catch (Exception e) {
            log.error("读取docimagefileid异常：" + e);
            return false;
        }

//		rs.executeProc("SequenceIndex_SelectVersionId", "");
//		if (rs.next()) {
//			versionId = Util.getIntValue(rs.getString(1));
//		}
        versionId=versionIdUpdate.getVersionNewId();

        String tmpsqlstr = "INSERT INTO DocImageFile(docid, imagefileid, imagefilename, imagefiledesc, imagefilewidth, imagefileheight, imagefielsize, docfiletype,versionId,versionDetail,id)"
                + "VALUES ("
                + ""
                + docid
                + ""
                + ","
                + ""
                + imagefileid
                + ""
                + ","
                + "'"
                + imagefilename
                + "'"
                + ","
                + "'"
                + imagefiledesc
                + "'"
                + ","
                + "'"
                + imagefilewidth
                + "'"
                + ","
                + "'"
                + imagefileheight
                + "'"
                + ","
                + ""
                + imagefielsize
                + ""
                + ","
                + "'"
                + docfiletype
                + "'"
                + ","
                + ""
                + versionId
                + ""
                + ","
                + "'" + versionDetail + "'" + "," + id + ")";
        rs.executeSql(tmpsqlstr);
        //log.error("保存到docimagefile: " + tmpsqlstr);
        return true;
    }

    /**
     * 保存imagefile 返回文件的id
     *
     * @param filename
     *            文件名
     * @param filerealpath
     *            文件绝对路径
     * @param filesize
     *            文件大小
     * @return imagefileid 文件id
     */
    public int saveImageFile(String filename, String filerealpath, long filesize,boolean ispdf) {
        int imageid = 0;
        String originalfilename = filename + ".html";
        if(ispdf) originalfilename = filename+".pdf";
        String contenttype = "";

        String imagefileused = "1";
        String iszip = "0";
        String isencrypt = "0";

        RecordSet rs = new RecordSet();
        char separator = Util.getSeparator();

        //rs.executeProc("SequenceIndex_SelectFileid", "");
        //if (rs.next())
        //	imageid = Util.getIntValue(rs.getString(1));
        imageid=imageFileIdUpdate.getImageFileNewId();

        String para = "" + imageid + separator + originalfilename + separator
                + contenttype + separator + imagefileused + separator
                + filerealpath + separator + iszip + separator + isencrypt
                + separator + filesize;

        rs.executeProc("ImageFile_Insert", para);

        AliOSSObjectManager aliOSSObjectManager=new AliOSSObjectManager();
        String tokenKey=aliOSSObjectManager.getTokenKeyByFileRealPath(filerealpath);

        //log.error("保存到imagefile: " + para);

        //comefrom='WorkflowToDoc'  表示该条附件数据来自于流程存为文档
        rs.executeSql("update imagefile set isaesencrypt='"+this.isaesencrypt+"', aescode='"+this.aescode+"',TokenKey='"+tokenKey+"',comefrom='WorkflowToDoc' where imagefileid="+imageid);

        aliOSSObjectManager.uploadFile(filerealpath,originalfilename, iszip,isaesencrypt,aescode);

        return imageid;
    }

    /**
     * 获取系统的路径
     *
     * @return
     */
    public String getSystemPath() {
        String path = GCONST.getPropertyPath();
        path = path.substring(0, path.indexOf("WEB-INF"));
        path = Util.StringReplace(path, "\\", "/");
        return path;
    }

    //判断是否开启了文档关联到表单并选择了附件字段
    public boolean isAnnex(WorkflowToDocSettingInfoEntity workflowToDocSettingInfoEntity) {
        RecordSet rs =  new RecordSet();
        if (workflowToDocSettingInfoEntity.getWfdocrelatedformdisplay().equals("1")){
            String sql = "";
            if(workflowToDocSettingInfoEntity.getIsbill()==0)
                sql = "select fieldhtmltype from workflow_formdict where id = ? ";
            else
                sql = "select fieldhtmltype as name from workflow_billfield where  id =? ";
            rs.executeQuery(sql,workflowToDocSettingInfoEntity.getWfdocrelatefieldid());
            if (rs.next()&&Util.null2String(rs.getString(1)).equals("6")){
                return true;
            }
        }
        return false;
    }

    /**
     * 获取设置信息
     * @return
     */
    private WorkflowToDocSettingInfoEntity getSettingInfo(String workflowId){
        int isbill = 1;
        String wfdocpath = "";
        String wfdocownertype = "";
        String wfdocownerfieldid = "";
        String wfdocowner="";
        int keepsign = 0;
        String docfiles = "";
        String wfdocpathtype = "";   //文档存储路径类型 固定目录1  选择目录2
        String wfdocpathfieldid = "";  //文档存储路径字段
        String wfdocsource = "";  //附件来源
        String wfdocrelatedformdisplay = "";  //文档关联到表单显示
        String wfdocrelatefieldid = "";  //关联字段
        String wfdocdiaplaywatermark = ""; //展示流程水印
        RecordSet rs = new RecordSet();
        rs.executeQuery("select isbill,wfdocowner,wfdocownertype,wfdocownerfieldid,keepsign,wfdocpath,docfiles,wfdocpathtype,wfdocpathfieldid,wfdocsource,wfdocrelatedformdisplay,wfdocrelatefieldid,wfdocdiaplaywatermark from workflow_base where id = ?" , workflowId);
        if(rs.next()) {
            wfdocowner = rs.getString("wfdocowner");
            wfdocownertype = rs.getString("wfdocownertype");
            wfdocownerfieldid = rs.getString("wfdocownerfieldid");
            keepsign = rs.getInt("keepsign");
            wfdocpath = rs.getString("wfdocpath");
            docfiles = rs.getString("docfiles");
            wfdocpathtype = rs.getString("wfdocpathtype");
            wfdocpathfieldid = rs.getString("wfdocpathfieldid");
            wfdocsource = rs.getString("wfdocsource");
            wfdocrelatedformdisplay = rs.getString("wfdocrelatedformdisplay");
            wfdocrelatefieldid = rs.getString("wfdocrelatefieldid");
            wfdocdiaplaywatermark = rs.getString("wfdocdiaplaywatermark");
            isbill = Util.getIntValue(rs.getString("isbill"));
        }

        return new WorkflowToDocSettingInfoEntity(wfdocpath,wfdocownertype,wfdocownerfieldid,wfdocowner,keepsign,docfiles,wfdocpathtype,wfdocpathfieldid,wfdocsource,wfdocrelatedformdisplay,wfdocrelatefieldid,wfdocdiaplaywatermark,isbill);
    }
    /*
     *得到keepsign 是否保留签字意见
     */
    public int getKeepSign(String workflowid){
        RecordSet rs = new RecordSet();
        int keepsign = 0;
        rs.executeQuery("select keepsign from workflow_base where id = ?",workflowid);
        if (rs.next()){
            keepsign = rs.getInt("keepsign");
        }
        return keepsign;
    }
    /*
     * 得到docfiles  文档附件 在线表单/离线表单(HTML)/离线表单(PDF)
     */
    public String getDocFiles(String workflowid){
        RecordSet rs = new RecordSet();
        String docfiles = "";
        String wfdocpath = "";
        rs.executeQuery("select docfiles,wfdocpath from workflow_base where id = ?",workflowid);
        if (rs.next()){
            docfiles = Util.null2String(rs.getString("docfiles"));
            wfdocpath = Util.null2String(rs.getString("wfdocpath"));
        }
        if ("".equals(docfiles)&&!"".equals(wfdocpath)){
            docfiles="1";
            rs.executeUpdate("update workflow_base set docfiles ='1' where id = ?",workflowid);
        }
        return docfiles;
    }
    /**
     * 获得文档存放的目录
     *
     * @param workflowid
     * @return 主目录,分目录,子目录
     */
    public String getWfDocPath(String workflowid) {
        String wfdocpath = "";
        RecordSet rs = new RecordSet();
        String sql = "select * from workflow_base where id = '" + workflowid
                + "'";
        rs.executeSql(sql);
        rs.next();
        wfdocpath = Util.null2String(rs.getString("wfdocpath"));
        return wfdocpath;
    }

    /**
     * 获得文档的所有者
     *
     * @param workflowid
     * @return resourceid
     */
    public String getWfDocOwner(String workflowid,String requestid) {
        int wfdocowner = 0;
        try{
            String sql = "";
            int wfid = Util.getIntValue(workflowid, 0);
            int rid = Util.getIntValue(requestid, 0);
            if(wfid<=0 || rid<=0){
                return "0";
            }
            RecordSet rs = new RecordSet();
            sql = "select * from workflow_base where id="+wfid;
            rs.executeSql(sql);
            if(rs.next()){
                int wfdocowner_tmp = Util.getIntValue(rs.getString("wfdocowner"), 0);
                int wfdocownertype_tmp = Util.getIntValue(rs.getString("wfdocownertype"), 0);
                int wfdocownerfieldid_tmp = Util.getIntValue(rs.getString("wfdocownerfieldid"), 0);
                int isbill = Util.getIntValue(rs.getString("isbill"), 0);
                int formid = Util.getIntValue(rs.getString("formid"), 0);
                if(wfdocownertype_tmp == 1){
                    wfdocowner = wfdocowner_tmp;
                }else if(wfdocownertype_tmp == 2){
                    String tablename = " workflow_form ";
                    String fieldname = "";
                    if(isbill == 1){
                        sql = "select tablename from workflow_bill where id="+formid;
                        rs.execute(sql);
                        if(rs.next()){
                            tablename = Util.null2String(rs.getString(1));
                        }
                        sql = "select fieldname from workflow_billfield where billid="+formid+" and id="+wfdocownerfieldid_tmp;
                    }else{
                        sql = "select fieldname from workflow_formdict where id="+wfdocownerfieldid_tmp;
                    }
                    rs.execute(sql);
                    if(rs.next()){
                        fieldname = Util.null2String(rs.getString(1));
                        if(!"".equals(tablename) && !"".equals(fieldname)){
                            sql = "select "+fieldname+" from "+tablename+" where requestid="+rid;
                            rs.execute(sql);
                            if(rs.next()){
                                String fieldvalue = Util.null2String(rs.getString(1));
                                if(!"".equals(fieldvalue)){
                                    int index = fieldvalue.indexOf(",");
                                    if(index > -1){
                                        fieldvalue = fieldvalue.substring(0, index);
                                    }
                                    wfdocowner = Util.getIntValue(fieldvalue);
                                }
                            }
                        }
                    }
                }
                String status = Util.null2String(new ResourceComInfo().getStatus(""+wfdocowner));
                if(status.equals("0") || status.equals("1") || status.equals("2") || status.equals("3")){
                    //do nothing
                }else{
                    wfdocowner = 0;
                }
            }
        }catch(Exception e){

        }
        if(wfdocowner <= 0){
            wfdocowner = 1;
        }
        return ""+wfdocowner;
    }

    /**
     * 获得文件保存目录
     *
     * @return
     */
    public String getFileSavePath() {
        SystemComInfo syscominfo = new SystemComInfo();
        String createdir = FileUpload.getCreateDir(syscominfo.getFilesystem());
        return createdir;
    }

    public synchronized int getNextEditionId() throws Exception {
        int docindex = 0;
        RecordSet rs = new RecordSet();
        rs.executeProc("SequenceIndex_SelectNextID", "doceditionid");
        if (rs.next())
            docindex = rs.getInt(1);
        return docindex;
    }

}
