package weaver; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; import foundation.action.ActionProvider; import foundation.capacity.ActorTarget; import foundation.dao.preload.Bucket; import foundation.data.entity.Entity; import foundation.data.object.DataObject; import foundation.data.object.EntitySaver; import foundation.handler.envelop.ILetterWriter; import foundation.icall.callout.HttpServerMeta; import foundation.icall.callout.RemoteSourceBucket; import foundation.io.FileCenter; import foundation.io.object.FileRecord; import foundation.user.OnlineUser; import foundation.util.MD5Utils; import foundation.util.Util; import foundation.variant.expression.VariantExpression; import net.qiyuesuo.v3sdk.SdkClient; import net.qiyuesuo.v3sdk.http.StreamFile; import net.qiyuesuo.v3sdk.model.common.Action; import net.qiyuesuo.v3sdk.model.common.DocumentFormDto; import net.qiyuesuo.v3sdk.model.common.SignAuthConfigBean; import net.qiyuesuo.v3sdk.model.common.Signatory; import net.qiyuesuo.v3sdk.model.common.SignatoryRect; import net.qiyuesuo.v3sdk.model.common.SignurlActions; import net.qiyuesuo.v3sdk.model.contract.request.ContractCreatebycategoryRequest; import net.qiyuesuo.v3sdk.model.contract.request.ContractDownloadRequest; import net.qiyuesuo.v3sdk.model.contract.request.ContractInitiateCancelRequest; import net.qiyuesuo.v3sdk.model.contract.request.ContractRecallRequest; import net.qiyuesuo.v3sdk.model.contract.request.ContractSignurlV3Request; import net.qiyuesuo.v3sdk.model.contract.request.ContractViewurlRequest; import net.qiyuesuo.v3sdk.model.contract.response.ContractSignurlV3Response; import net.qiyuesuo.v3sdk.model.contract.response.ContractViewurlResponse; import net.qiyuesuo.v3sdk.model.v2document.request.V2DocumentCreatebyfileRequest; import net.qiyuesuo.v3sdk.model.v2document.response.V2DocumentCreatebyfileResponse; import net.qiyuesuo.v3sdk.utils.SdkResponse; import weaver.dao.BusinessData; import weaver.dao.CallbackType; import weaver.dao.ISignLetter; import weaver.dao.SignState; import weaver.dao.Signer; import weaver.util.QiyuesuoCallbackUtils; public class WeaverHandler extends ActionProvider{ //泛微 private static SdkClient sdkClient = null; private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH_mm_ss"); private static HttpServerMeta callBackSourceMeta; @Override protected void publishMethod() { //13. 泛微上传本地文件创建签署文档 addMethod("weaverCreatebyFile"); //14. 泛微创建或发起电子签约 addMethod("weaverCreatebyCategory"); //15.文件签署页面v3 addMethod("weaverSignUrl"); //16.文件浏览页面 addMethod("weaverViewUrl"); //17.文件download addMethod("weaverDownLoad"); //18.撤回文件 addMethod("weaverRecall"); //19.发起作废 addMethod("weaverCancel"); //20.签章状态同步 addMethod("signStateSync"); } //发起作废 public void weaverCancel() throws Exception { HttpServerMeta eSignSourceMeta = (HttpServerMeta) RemoteSourceBucket.getInstance().get(ISignLetter.WAEVER_SIGN); String accessKey = eSignSourceMeta.getString(ISignLetter.AppToken); String accessSecret = eSignSourceMeta.getString(ISignLetter.AppSecret); DataObject dataNameObject = null; Entity dataNameEntity = null; String contractId = "", result = ""; String id = dataReader.getString("id"); String reason = dataReader.getString(ISignLetter.Reason); String dataName = dataReader.getString("dataName"); String signer = dataReader.getString(ISignLetter.Signer); //1.记录文档信息 dataNameObject = DataObject.getInstance(dataName); dataNameEntity = dataNameObject.getTableEntity(id); EntitySaver saver = dataNameObject.createEntitySaver(id); if (dataNameEntity == null || dataNameEntity.isEmpty()) { dataWriter.setSuccess(false); dataWriter.addValue("weaver", "获取不到文档信息"); return; } //电子签约文件ID contractId = dataNameEntity.getString(ISignLetter.ContractId, ""); String serverUrl = "https://partneropen.qiyuesuo.cn/contract/initiate/cancel?_="+ System.currentTimeMillis(); sdkClient = new SdkClient(serverUrl, accessKey, accessSecret); ContractInitiateCancelRequest request = new ContractInitiateCancelRequest(); request.setContractId(Long.parseLong(contractId)); request.setReason(reason); try { SdkResponse response = sdkClient.service(request); if (response.getCode() == 0) { dataWriter.setSuccess(true); if (!Util.isEmpty(signer)) { saver.set(signer, "F"); } else { saver.set(ISignLetter.IsSignature, "F"); } if("F".equalsIgnoreCase(dataNameEntity.getString(ISignLetter.PartyB, "F")) || "F".equalsIgnoreCase(dataNameEntity.getString(ISignLetter.IsSignature, "F"))) { saver.set(ISignLetter.SignStateCode, SignState.DRAFT); saver.set(ISignLetter.SignStateName, SignState.DRAFT.getName()); } saver.update(); } else { dataWriter.setSuccess(false); result = response.getMessage(); } if (Util.isEmpty(result)) { dataWriter.addValue("weaver", response.getResult()); } else { dataWriter.addValue("weaver", result); } } catch(Exception e) { e.printStackTrace(); } } //撤回文件 public void weaverRecall() throws Exception { DataObject dataNameObject = null; Entity dataNameEntity = null; String contractId = "", result = ""; String id = dataReader.getString("id"); String dataName = dataReader.getString("dataName"); String reason = dataReader.getString(ISignLetter.Reason); String signer = dataReader.getString(ISignLetter.Signer); HttpServerMeta eSignSourceMeta = (HttpServerMeta) RemoteSourceBucket.getInstance().get(ISignLetter.WAEVER_SIGN); String accessKey = eSignSourceMeta.getString(ISignLetter.AppToken); String accessSecret = eSignSourceMeta.getString(ISignLetter.AppSecret); //1.记录文档信息 dataNameObject = DataObject.getInstance(dataName); dataNameEntity = dataNameObject.getTableEntity(id); EntitySaver saver = dataNameObject.createEntitySaver(id); if (dataNameEntity == null || dataNameEntity.isEmpty()) { dataWriter.setSuccess(false); dataWriter.addValue("weaver", "获取不到文档信息"); return; } //电子签约文件ID contractId = dataNameEntity.getString(ISignLetter.ContractId); String serverUrl = "https://partneropen.qiyuesuo.cn/contract/recall?_="+ System.currentTimeMillis(); sdkClient = new SdkClient(serverUrl, accessKey, accessSecret); ContractRecallRequest request = new ContractRecallRequest(); request.setContractId(Long.parseLong(contractId)); request.setReason(reason); try { SdkResponse response = sdkClient.service(request); if (response.getCode() == 0) { dataWriter.setSuccess(true); if (!Util.isEmpty(signer)) { saver.set(signer, "F"); } else { saver.set(ISignLetter.IsSignature, "F"); } if("F".equalsIgnoreCase(dataNameEntity.getString(ISignLetter.PartyB, "F")) || "F".equalsIgnoreCase(dataNameEntity.getString(ISignLetter.IsSignature, "F"))) { saver.set(ISignLetter.SignStateCode, SignState.TERMINATED); saver.set(ISignLetter.SignStateName, SignState.TERMINATED.getName()); } saver.update(); } else { dataWriter.setSuccess(false); result = response.getMessage(); } if (Util.isEmpty(result)) { dataWriter.addValue("weaver", response.getResult()); } else { dataWriter.addValue("weaver", result); } } catch(Exception e) { e.printStackTrace(); } } //文件下载 public void weaverDownLoad() throws Exception { HttpServerMeta eSignSourceMeta = (HttpServerMeta) RemoteSourceBucket.getInstance().get(ISignLetter.WAEVER_SIGN); String accessKey = eSignSourceMeta.getString(ISignLetter.AppToken); String accessSecret = eSignSourceMeta.getString(ISignLetter.AppSecret); //电子签约文件ID String contractId = dataReader.getString("contractId"); String needCompressForOneFile = dataReader.getString("needCompressForOneFile"); String fileName = contractId + "_" + sdf.format(new Date()) + ".zip"; String serverUrl = "https://partneropen.qiyuesuo.cn/contract/download?_="+ System.currentTimeMillis(); sdkClient = new SdkClient(serverUrl, accessKey, accessSecret); ContractDownloadRequest request = new ContractDownloadRequest(); request.setContractId(Long.parseLong(contractId)); request.setNeedCompressForOneFile(needCompressForOneFile); try { File file = new File("D:\\repository\\weaver\\" + fileName); if (!file.exists()) { file.createNewFile(); } OutputStream outputStream = new FileOutputStream(file); sdkClient.download(request, outputStream); outputStream.close(); } catch(Exception e) { e.printStackTrace(); } } //文件浏览页面 public void weaverViewUrl() throws Exception { DataObject dataNameObject = null; Entity dataNameEntity = null; String contractId = "", documentId = ""; String id = dataReader.getString("id"); String dataName = dataReader.getString("dataName"); //1.记录文档信息 dataNameObject = DataObject.getInstance(dataName); dataNameEntity = dataNameObject.getTableEntity(id); if (dataNameEntity == null || dataNameEntity.isEmpty()) { dataWriter.setSuccess(false); dataWriter.addValue("weaver", "获取不到文档信息"); return; } HttpServerMeta eSignSourceMeta = (HttpServerMeta) RemoteSourceBucket.getInstance().get(ISignLetter.WAEVER_SIGN); String accessKey = eSignSourceMeta.getString(ISignLetter.AppToken); String accessSecret = eSignSourceMeta.getString(ISignLetter.AppSecret); //电子签约文件ID contractId = dataNameEntity.getString(ISignLetter.ContractId, ""); documentId = dataNameEntity.getString(ISignLetter.DocumentId, ""); String serverUrl = "https://partneropen.qiyuesuo.cn/contract/viewurl?_="+ System.currentTimeMillis(); sdkClient = new SdkClient(serverUrl, accessKey, accessSecret); ContractViewurlRequest request = new ContractViewurlRequest(); request.setContractId(Long.parseLong(contractId)); request.setAllowDownload("true"); try { SdkResponse response = sdkClient.service(request, ContractViewurlResponse.class); if (response.getCode() == 0) { dataWriter.setSuccess(true); } else { dataWriter.setSuccess(false); } Gson gson = new Gson(); String resultStr = gson.toJson(response.getResult()); resultStr = resultStr.replace("\\u003d", "="); resultStr = resultStr.replace("\\u0026", "&"); dataWriter.addValue("weaver", resultStr); } catch(Exception e) { e.printStackTrace(); } } //文件签署页面v3 public void weaverSignUrl() throws Exception { DataObject dataNameObject = null; Entity dataNameEntity = null; String documentId = "", contractId = ""; String result = ""; String id = dataReader.getString("id"); if (Util.isEmpty(id)) { id = dataReader.getString("id"); } String dataName = dataReader.getString("dataName"); if (Util.isEmpty(dataName)) { dataName = dataReader.getString("dataName"); } HttpServerMeta eSignSourceMeta = (HttpServerMeta) RemoteSourceBucket.getInstance().get(ISignLetter.WAEVER_SIGN); String accessKey = eSignSourceMeta.getString(ISignLetter.AppToken); String accessSecret = eSignSourceMeta.getString(ISignLetter.AppSecret); String signerCode = dataReader.getString(ISignLetter.Signer); SignBucket signBucket = SignBucket.getInstance(); SignConfig signConfig = signBucket.get(dataName); //1.记录文档信息 dataNameObject = DataObject.getInstance(dataName); dataNameEntity = dataNameObject.getTableEntity(id); if (dataNameEntity == null || dataNameEntity.isEmpty()) { dataWriter.setSuccess(false); dataWriter.addValue("weaver", "获取不到文档信息"); return; } documentId = dataNameEntity.getString(ISignLetter.DocumentId, ""); contractId = dataNameEntity.getString(ISignLetter.ContractId, ""); String companyId = dataNameEntity.getString("company_id"); Signer signer = getSigner(companyId); String serverUrl = "https://partneropen.qiyuesuo.cn/contract/signurl/v3?_"+ System.currentTimeMillis(); sdkClient = new SdkClient(serverUrl, accessKey, accessSecret); ContractSignurlV3Request request = new ContractSignurlV3Request(); //电子签约文件ID request.setContractId(Long.parseLong(contractId)); //签署方名称 request.setTenantName(signer.getTenantName()); request.setSignatoryNo(signer.getSignatoryNo()); //签署方类型 request.setTenantType("COMPANY"); //接收人名称 request.setReceiverName(signer.getReceiverName()); //签署方的联系方式 request.setContact(signer.getContactPhone()); try { SdkResponse response = sdkClient.service(request, ContractSignurlV3Response.class); if (response.getCode() == 0) { dataWriter.setSuccess(true); } else { dataWriter.setSuccess(false); result = response.getMessage(); } Gson gson = new Gson(); String resultStr = gson.toJson(response.getResult()); resultStr = resultStr.replace("\\u003d", "="); resultStr = resultStr.replace("\\u0026", "&"); if (Util.isEmpty(result)) { dataWriter.addValue("weaver", resultStr); } else { dataWriter.addValue("weaver", result); } } catch(Exception e) { e.printStackTrace(); } } //泛微创建或发起电子签约 public void weaverCreatebyCategory() throws Exception { HttpServerMeta eSignSourceMeta = (HttpServerMeta) RemoteSourceBucket.getInstance().get(ISignLetter.WAEVER_SIGN); String accessKey = eSignSourceMeta.getString(ISignLetter.AppToken); String accessSecret = eSignSourceMeta.getString(ISignLetter.AppSecret); DataObject dataNameObject = null; Entity dataNameEntity = null; String subject = "", description = "", tenantName = "", documentId = ""; String customerCode = "", customerName = "", companyId = ""; ISignService signService = null; ContractCreatebycategoryRequest request = new ContractCreatebycategoryRequest(); SignBucket signBucket = SignBucket.getInstance(); String id = dataReader.getString("id"); String dataName = dataReader.getString("dataName"); SignConfig signConfig = signBucket.get(dataName); List actions = new ArrayList(); Action action = new Action(); action.setType("CORPORATE"); action.setName(signConfig.getName()); action.setSerialNo(1L); actions.add(action); SignAuthConfigBean signAuthConfig = new SignAuthConfigBean(); signAuthConfig.setSignAuth("DEFAULT"); signAuthConfig.setQuestion("您好,为确保您本人操作"); signAuthConfig.setAnswer("我确认"); List signatories = new ArrayList(); Signatory signatory = new Signatory(); //1.记录文档信息 dataNameObject = DataObject.getInstance(dataName); dataNameEntity = dataNameObject.getTableEntity(id); EntitySaver saver = dataNameObject.createEntitySaver(id); if (dataNameEntity == null || dataNameEntity.isEmpty()) { dataWriter.setSuccess(false); dataWriter.addValue("weaver", "获取不到文档信息"); return; } if (SignType.Both == signConfig.getSignType()) { signService = new BothSignService(); } else if (SignType.PartyB == signConfig.getSignType()) { signService = new PartyBSignService(); } else if (SignType.PartyA == signConfig.getSignType()) { signService = new PartyASignService(); } List signers = signService.getSigners(dataNameEntity); for (int serialNo = 1; serialNo <= signers.size(); serialNo++) { Signer signer = signers.get(serialNo - 1); signatory = new Signatory(); signatory.setTenantType("COMPANY"); signatory.setTenantName(signer.getTenantName()); signatory.setSerialNo(String.valueOf(serialNo)); signatory.setActions(actions); signatory.setSignAuthConfig(signAuthConfig); signatory.setSignatoryNo(signer.getSignatoryNo()); signatories.add(signatory); } documentId = dataNameEntity.getString(ISignLetter.DocumentId, ""); description = dataNameEntity.getString(ISignLetter.CategoryName, ""); subject = signConfig.getSubjectContent(dataNameEntity); companyId = dataNameEntity.getString("company_id"); Signer initiator = getSigner(companyId); tenantName = initiator.getTenantName(); String serverUrl = "https://partneropen.qiyuesuo.cn/contract/createbycategory?_"+ System.currentTimeMillis(); sdkClient = new SdkClient(serverUrl, accessKey, accessSecret); BusinessData businessData = new BusinessData(dataName, dataNameEntity); request.setSubject(subject); request.setDescription(description); request.setTenantName(tenantName); List documents = new ArrayList(); documents.add(Long.parseLong(documentId)); request.setDocuments(documents); request.setSignatories(signatories); request.setBusinessData(businessData.toString()); request.setCategoryId(signConfig.getFlowId()); try { SdkResponse response = sdkClient.service(request, String.class); Map msgMap = new HashMap(); if (response.getCode() == 0) { dataWriter.setSuccess(true); saver.set(ISignLetter.ContractId, response.getResult()); saver.set(ISignLetter.SignStateCode, SignState.SIGNING); saver.set(ISignLetter.SignStateName, SignState.SIGNING.getName()); saver.update(); } else { dataWriter.setSuccess(false); } msgMap.put("code", String.valueOf(response.getCode())); msgMap.put("message", response.getMessage()); msgMap.put("result", response.getResult()); dataWriter.addValue("weaver", msgMap); } catch(Exception e) { e.printStackTrace(); } } //泛微上传本地文件创建签署文档 public void weaverCreatebyFile() throws Exception { HttpServerMeta eSignSourceMeta = (HttpServerMeta) RemoteSourceBucket.getInstance().get(ISignLetter.WAEVER_SIGN); String accessKey = eSignSourceMeta.getString(ISignLetter.AppToken); String accessSecret = eSignSourceMeta.getString(ISignLetter.AppSecret); //1.解析上传文件 DataObject dataNameObject = null, dataObject = null; Entity dataNameEntity = null, entity = null; String fileId = ""; String id = dataReader.getString("id"); if (Util.isEmpty(id)) { id = dataReader.getString("id"); } String dataName = dataReader.getString("dataName"); if (Util.isEmpty(dataName)) { dataName = dataReader.getString("dataName"); } SignBucket signBucket = SignBucket.getInstance(); SignConfig signConfig = signBucket.get(dataName); //1.记录文档信息 dataNameObject = DataObject.getInstance(dataName); dataNameEntity = dataNameObject.getTableEntity(id); if (dataNameEntity == null || dataNameEntity.isEmpty()) { dataWriter.setSuccess(false); dataWriter.addValue("weaver", "获取不到文档信息"); return; } fileId = dataNameEntity.getString(signConfig.getFileField(), ""); if (Util.isEmpty(fileId)) { dataWriter.setSuccess(false); dataWriter.addValue("weaver", "获取不到文档"); return; } //2. 获取文档文件 dataObject = DataObject.getInstance(dataName); entity = dataObject.getBrowseEntity(fileId); FileRecord fileRecord = FileCenter.getFile(dataName, fileId); File file = fileRecord.getFile(); String serverUrl = "https://partneropen.qiyuesuo.cn/v2/document/createbyfile?_="+ System.currentTimeMillis(); sdkClient = new SdkClient(serverUrl, accessKey, accessSecret); DocumentFormDto form = new DocumentFormDto(); V2DocumentCreatebyfileRequest request = new V2DocumentCreatebyfileRequest(); InputStream inputStream = new FileInputStream(file); StreamFile streamFile = new StreamFile(file.getName(), inputStream); request.setFile(streamFile); request.setTitle(file.getName()); request.setFileType(file.getName().substring(file.getName().lastIndexOf(".") + 1, file.getName().length()).trim()); request.setFormObject(form); try { SdkResponse response = sdkClient.service(request, V2DocumentCreatebyfileResponse.class); if (response.getCode() == 0) { dataWriter.setSuccess(true); //保存documentId EntitySaver saver = dataObject.createEntitySaver(id); saver.set(ISignLetter.DocumentId, response.getResult().getDocumentId()); saver.set(ISignLetter.SignStateCode, SignState.DRAFT); saver.set(ISignLetter.SignStateName, SignState.DRAFT.getName()); saver.update(); } else { dataWriter.setSuccess(false); } Gson gson = new Gson(); String resultStr = gson.toJson(response.getResult()); dataWriter.addValue("weaver", resultStr); } catch(Exception e) { e.printStackTrace(); } } //签章状态同步 public void signStateSync() throws Exception{ String encryptedResult = dataReader.getRawString("encrypted"); // token check RemoteSourceBucket remoteSourceBucket = RemoteSourceBucket.getInstance(); callBackSourceMeta = (HttpServerMeta) remoteSourceBucket.get(ISignLetter.WAEVER_SIGN_CALL); String aesKey = callBackSourceMeta.getString(ISignLetter.AesKey); String token = dataReader.getString("token"); if (!tokenValid(token)) { dataWriter.setSuccess(false); dataWriter.addValue("用户身份认证失败"); return ; } QiyuesuoCallbackUtils callUtils = new QiyuesuoCallbackUtils(aesKey, token); String decryptedResult = callUtils.decrypt(encryptedResult); String nonce = dataReader.getString("nonce"); String signature = dataReader.getString("signature"); Long timestamp = Long.valueOf(dataReader.getString("timestamp")); String compSignature = MD5Utils.MD5Encode(decryptedResult + timestamp + nonce + token, "UTF-8"); if (!compSignature.equals(signature)) { dataWriter.setSuccess(false); dataWriter.addValue("signStateSync", "签名校验失败"); return ; } JSONObject resultJson = JSONObject.parseObject(decryptedResult); CallbackType callBackType = CallbackType.parse(resultJson.getString("callbackType")); BusinessData businessData = new BusinessData(resultJson.getJSONObject("businessData")); if(Util.isEmpty(businessData.getDataname()) ) { dataWriter.setSuccess(false); dataWriter.addValue("业务数据缺失"); return ; } DataObject dataObject = DataObject.getInstance(businessData.getDataname()); EntitySaver saver = dataObject.createEntitySaver(businessData.getId()); SignState signState = callBackType.getSignState(); saver.set(ISignLetter.SignStateCode, signState); saver.set(ISignLetter.SignStateName, signState.getName()); saver.update(); dataWriter.setSuccess(true); dataWriter.addValue("合同已"+ signState.getName()); } private Signer getSigner(String companyId) throws Exception { Signer signer = new Signer(); OnlineUser user = OnlineUser.getInstance(); ActorTarget actor = user.getCurrentActor(); String actorId = user.getActorId(); String accountId = actor.getTargetId(); if(!Util.isEmpty(user.getCompanyId())) { companyId = user.getCompanyId(); } if (actorId.contains("Customer")) { DataObject dataObject = DataObject.getInstance("md_org_account"); Entity account = dataObject.getBrowseEntity(accountId); signer.setSignatoryNo(account.getString("code")); signer.setTenantName(account.getString("account_name")); signer.setReceiverName(account.getString("business_person")); signer.setContactPhone(account.getString("business_phone")); } else { DataObject dataObject = DataObject.getInstance("md_org"); Entity org = dataObject.getBrowseEntity(companyId); signer.setSignatoryNo(org.getString("id")); signer.setTenantName(ISignLetter.DefaultInitiator); signer.setReceiverName(org.getString("business_person")); signer.setContactPhone(org.getString("business_phone")); } return signer; } private boolean tokenValid(String token) { String weaverToken = callBackSourceMeta.getString(ISignLetter.AccessToken); if(!weaverToken.equals(token)) { return false; } return true; } }