diff --git a/buildpackage/src/main/java/com/hzya/frame/plugin/lets/dingtalk/callback/service/impl/CallBackServiceImpl.java b/buildpackage/src/main/java/com/hzya/frame/plugin/lets/dingtalk/callback/service/impl/CallBackServiceImpl.java index aaac1cc4..3b2595f3 100644 --- a/buildpackage/src/main/java/com/hzya/frame/plugin/lets/dingtalk/callback/service/impl/CallBackServiceImpl.java +++ b/buildpackage/src/main/java/com/hzya/frame/plugin/lets/dingtalk/callback/service/impl/CallBackServiceImpl.java @@ -12,9 +12,15 @@ import com.hzya.frame.plugin.lets.dingtalk.callback.service.CallBackService; import com.hzya.frame.plugin.lets.dingtalk.dao.IDingU8cBillDao; import com.hzya.frame.plugin.lets.dingtalk.entity.DingU8cBillEntity; import com.hzya.frame.plugin.lets.dingtalk.utils.DingTalkUtils; +import com.hzya.frame.plugin.lets.dingtalk.utils.FileUtil; +import com.hzya.frame.plugin.lets.dingtalk.utils.PushU8CFileUtil; import com.hzya.frame.plugin.lets.dingtalk.vo.DingCallbackCrypto; -import com.hzya.frame.plugin.lets.u8cdto.ArapDjzb; -import com.hzya.frame.plugin.lets.u8cdto.GeneralBillVO_4ADto; +import com.hzya.frame.plugin.lets.dingtalk.vo.FileModuleVO; +import com.hzya.frame.plugin.lets.dingtalk.vo.SysFileVO; +import com.hzya.frame.plugin.lets.entity.BdCorpEntity; +import com.hzya.frame.plugin.lets.entity.BdDeptdocEntity; +import com.hzya.frame.plugin.lets.u8cdto.*; +import com.hzya.frame.plugin.lets.util.QueryU8CEntityUtil; import com.hzya.frame.plugin.lets.util.pushData.Attribute; import com.hzya.frame.plugin.lets.util.pushData.PushU8CByApiCode; import com.hzya.frame.plugin.lets.util.pushData.ZTResult; @@ -24,10 +30,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.time.LocalDate; +import java.util.*; import java.util.stream.Collectors; @Service("callBackService") @@ -88,7 +92,6 @@ public class CallBackServiceImpl implements CallBackService { logger.info("采购付款申请(新) -> PROC-AC33FC85-FB44-49FC-B926-1D966AE3BBD2"); transferBill(eventJson);//特殊业务处理(新) break; - } } @@ -96,7 +99,7 @@ public class CallBackServiceImpl implements CallBackService { Map successMap = callbackCrypto.getEncryptedMap("success"); logger.info("=============================================================================================================================钉钉回调执行结束《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《"); return successMap; - }catch (Exception e){ + } catch (Exception e) { logger.error("execute", e); Assert.state(false, "excute:{}", e); } @@ -165,8 +168,8 @@ public class CallBackServiceImpl implements CallBackService { //审批u8c单据 approveArapDjzb(dingU8cBillEntity, remark); - }catch (Exception e){ - logger.error("代理采购(付款单)->采购付款申请(店群专用)回调报错:"+e); + } catch (Exception e) { + logger.error("代理采购(付款单)->采购付款申请(店群专用)回调报错:" + e); } } @@ -175,7 +178,7 @@ public class CallBackServiceImpl implements CallBackService { * 代理采购(付款单)->采购付款申请(店群专用) * 回调,审核付款单 */ - public void agencyBill(JSONObject eventJson) throws Exception{ + public void agencyBill(JSONObject eventJson) throws Exception { try { //获取token String token = getDingTalkToken(); @@ -183,7 +186,7 @@ public class CallBackServiceImpl implements CallBackService { String processInstanceId = eventJson.getString("processInstanceId"); DingU8cBillEntity dingU8cBillEntity = queryU8CDing(processInstanceId); if (dingU8cBillEntity == null) { - Assert.state(false,"代理采购(付款单)->采购付款申请(店群专用)回调:未查询到相关审批实例,实例id:{}",processInstanceId); + Assert.state(false, "代理采购(付款单)->采购付款申请(店群专用)回调:未查询到相关审批实例,实例id:{}", processInstanceId); } //查询实例的具体信息 GetProcessInstanceResponse processInstanceDetails = DingTalkUtils.getProcessInstanceDetails(token, processInstanceId); @@ -203,7 +206,7 @@ public class CallBackServiceImpl implements CallBackService { operationRecords = operationRecords.stream().filter(item -> !item.getType().equals("START_PROCESS_INSTANCE")).collect(Collectors.toList()); System.out.println(operationRecords); - String remark=""; + String remark = ""; //钉钉问题记录执行明细 for (GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResultOperationRecords operationRecord : operationRecords) { @@ -225,22 +228,23 @@ public class CallBackServiceImpl implements CallBackService { dingU8cBillDao.saveOrUpDateV2(dingU8cBillEntity); //审批u8c单据 - approveArapDjzb(dingU8cBillEntity,remark); - }catch (Exception e){ - logger.error("代理采购(付款单)->采购付款申请(店群专用)回调报错:"+e); + approveArapDjzb(dingU8cBillEntity, remark); + } catch (Exception e) { + logger.error("代理采购(付款单)->采购付款申请(店群专用)回调报错:" + e); } } /** * 根据ding_talk_process_id查询 */ - public DingU8cBillEntity queryU8CDing(String ding_talk_process_id){ + public DingU8cBillEntity queryU8CDing(String ding_talk_process_id) { DingU8cBillEntity dingU8cBillEntity = new DingU8cBillEntity(); dingU8cBillEntity.setDingTalkProcessId(ding_talk_process_id); + dingU8cBillEntity.setSts("Y"); List query = dingU8cBillDao.query(dingU8cBillEntity); - if(query.size()==0){ + if (query.size() == 0) { return null; - }else{ + } else { return query.get(0); } } @@ -252,7 +256,7 @@ public class CallBackServiceImpl implements CallBackService { * 1、付款单审核 * 2、付款单新增 */ - public void transferBill(JSONObject eventJson) throws Exception{ + public void transferBill(JSONObject eventJson) throws Exception { try { //获取token String token = getDingTalkToken(); @@ -260,9 +264,9 @@ public class CallBackServiceImpl implements CallBackService { String processInstanceId = eventJson.getString("processInstanceId"); DingU8cBillEntity dingU8cBillEntity = queryU8CDing(processInstanceId); if (dingU8cBillEntity == null) { - //新增 - addArapBill(processInstanceId); - }else { + //新增u8c付款单、保存日志、上传附件 + addArapBill(processInstanceId,token); + } else { //查询实例的具体信息 GetProcessInstanceResponse processInstanceDetails = DingTalkUtils.getProcessInstanceDetails(token, processInstanceId); GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResult processInstanceResponseBodyResult = processInstanceDetails.getBody().getResult(); @@ -305,7 +309,7 @@ public class CallBackServiceImpl implements CallBackService { approveArapDjzb(dingU8cBillEntity, remark); } - }catch (Exception e){ + } catch (Exception e) { } } @@ -314,20 +318,25 @@ public class CallBackServiceImpl implements CallBackService { private PushU8CByApiCode pushU8CByApiCode; /** * 审核付款单 + * * @param remark 处理意见 */ - public void approveArapDjzb(DingU8cBillEntity dingU8cBillEntity,String remark) throws Exception { - Map bills=new HashMap(); - bills.put("djbh",dingU8cBillEntity.getU8cBillCode()); - bills.put("dwbm",dingU8cBillEntity.getU8cCodeCorp()); - bills.put("opinion",remark); + public void approveArapDjzb(DingU8cBillEntity dingU8cBillEntity, String remark) throws Exception { + //获取当前时间 + LocalDate now = LocalDate.now(); + + Map bills = new HashMap(); + bills.put("djbh", dingU8cBillEntity.getU8cBillCode()); + bills.put("dwbm", dingU8cBillEntity.getU8cCodeCorp()); + bills.put("opinion", remark); bills.put("operatorid", OverallConstant.getOverAllValue("u8cApiZdrCode")); + bills.put("operatedate", now); String jsonStr = JSONUtil.toJsonStr(bills); - jsonStr="{\"bills\":["+jsonStr+"]}"; + jsonStr = "{\"bills\":[" + jsonStr + "]}"; System.out.println(jsonStr); //推送 - String response=""; + String response = ""; try { ZTResult ztResult = pushU8CByApiCode.pushByCode(OverallConstant.getOverAllValue("arapFkApproveCode"), jsonStr); //两层判断,一层中台转发,一层u8c返回 @@ -347,8 +356,8 @@ public class CallBackServiceImpl implements CallBackService { //成功 dingU8cBillEntity.setApprove("Y"); dingU8cBillDao.saveOrUpDateV2(dingU8cBillEntity); - }catch (Exception e){ - logger.error("推送U8C--> 丽知:审核付款单审核 失败"+e); + } catch (Exception e) { + logger.error("推送U8C--> 丽知:审核付款单审核 失败" + e); //失败 dingU8cBillEntity.setApprove("N"); dingU8cBillEntity.setPushInfo(e.getMessage()); @@ -356,23 +365,187 @@ public class CallBackServiceImpl implements CallBackService { } } - + @Autowired + private QueryU8CEntityUtil queryU8CEntityUtil; + @Autowired + private FileUtil fileUtil; + @Autowired + private PushU8CFileUtil pushU8CFileUtil; /** * 付款单新增 + * 1、付款单保存及审批 + * 2、附件上传 */ - public void addArapBill(String processInstanceId) throws Exception { + public void addArapBill(String processInstanceId,String token) throws Exception { //查询实例的具体信息 GetProcessInstanceResponse processInstanceDetails = DingTalkUtils.getProcessInstanceDetails(token, processInstanceId); GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResult processInstanceResponseBodyResult = processInstanceDetails.getBody().getResult(); + List formComponentValues = processInstanceResponseBodyResult.getFormComponentValues(); + + //需要的信息:公司、部门、项目所属类目、费用所属项目、申请理由、申请金额、备注、附件 + String corpName = ""; + String corpCode = ""; + String deptName = ""; + String deptCode = ""; + String xmName = ""; + String xmCode = ""; + String fyName = ""; + String fyCode = ""; + String ly = ""; + String je = ""; + String bz = ""; + String fjJson=""; + for (GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResultFormComponentValues formComponentValue : formComponentValues) { + if ("费用所属公司".equals(formComponentValue.getValue())) { + corpName = formComponentValue.getName(); + } + if ("费用所属部门".equals(formComponentValue.getValue())) { + deptName = formComponentValue.getName(); + } + if ("项目所属类目".equals(formComponentValue.getValue())) { + xmName = formComponentValue.getName(); + } + if ("费用所属项目".equals(formComponentValue.getValue())) { + fyName = formComponentValue.getName(); + } + if ("申请理由".equals(formComponentValue.getValue())) { + ly = formComponentValue.getName(); + } + if ("申请金额(元)".equals(formComponentValue.getValue())) { + je = formComponentValue.getName(); + } + if ("备注".equals(formComponentValue.getValue())) { + bz = formComponentValue.getName(); + } + if("DDAttachment".equals(formComponentValue.getComponentType())){ + fjJson = formComponentValue.getValue(); + } + } + + String mapStr=""; + String response=""; + + try { + ArapDjzbVO billvo = new ArapDjzbVO(); + ArapDjzbVO.Parentt parentvo = new ArapDjzbVO.Parentt(); + //djrq 单据日期 + LocalDate now = LocalDate.now(); + parentvo.setDjrq(now.toString()); + + //dwbm 公司 + BdCorpEntity bdCorpEntity = queryU8CEntityUtil.queryBdCorpByUnitName(corpName); + if (bdCorpEntity == null) { + Assert.state(false, "钉钉回调->付款单新增:根据表单【费用所属公司】:{},未查询到u8c对应公司,请检查名称。", corpName); + } + parentvo.setDwbm(bdCorpEntity.getUnitcode()); + + //wldx 往来对象标识(0 客户 1供应商 2部门 3业务员 ) + parentvo.setWldx("2"); + + //deptid 部门 + BdDeptdocEntity bdDeptdocEntity = queryU8CEntityUtil.queryBdDeptDocByPkCorpAndDeptName(bdCorpEntity.getPkCorp(), deptName); + if (bdDeptdocEntity == null) { + Assert.state(false, "钉钉回调->付款单新增:根据表单【费用所属部门】:{}。在公司:{},下未查询到u8c对应部门,请检查部门名称。", corpName, deptName); + } + parentvo.setDeptid(bdDeptdocEntity.getDeptcode()); + + //lrr 录入人 + parentvo.setLrr(OverallConstant.getOverAllValue("u8cApiZdrCode")); + //shr 审核人 + parentvo.setLrr(OverallConstant.getOverAllValue("u8cApiZdrCode")); + //shrq 审核日期 + parentvo.setShrq(now.toString()); + + List children = new ArrayList<>(); + ArapDjzbVO.Childrenn childrenvo = new ArapDjzbVO.Childrenn(); + //jfybje 借方原币金额 + childrenvo.setJfybje(je); + children.add(childrenvo); + billvo.setParentvo(parentvo); + billvo.setChildren(children); + mapStr = JSONUtil.toJsonStr(billvo); + //推送u8c + ZTResult ztResult = pushU8CByApiCode.pushByCode(OverallConstant.getOverAllValue("otheroutqzCode"), mapStr); + if ("false".equals(ztResult.getFlag())) { + //转发失败 + response = JSONUtil.toJsonStr(ztResult.getAttribute()); + Assert.state(false, "付款单新增.中台转发失败,失败原因:{}", ztResult.getAttribute()); + } + Attribute attribute = ztResult.getAttribute(); + boolean isSuccess = false; + String vbillcode = ""; + String vbillId = ""; + if ("success".equals(attribute.getStatus())) { + isSuccess = true; + String data = attribute.getData(); + ArapDjzbVO arapDjzbVO = resultDataHandle(data); + vbillcode = arapDjzbVO.getParentvo().getDjbh(); + vbillId = arapDjzbVO.getParentvo().getVouchid(); + } + if (!isSuccess) { + Assert.state(false, "推送U8C--> 付款单新增 失败 接口返回结果:{} 接口入参:{}", attribute.getErrormsg(), mapStr); + } + + //成功 + DingU8cBillEntity dingU8cBillEntity = new DingU8cBillEntity(); + dingU8cBillEntity.setU8cPkCorp(bdCorpEntity.getPkCorp());//公司主键 + dingU8cBillEntity.setU8cCodeCorp(bdCorpEntity.getUnitcode());//公司编码 + dingU8cBillEntity.setU8cBillType(null);//单据类型 + dingU8cBillEntity.setU8cBillCode(vbillcode);//单据号 + dingU8cBillEntity.setU8cBillId(vbillId);//单据主键 + dingU8cBillEntity.setPushStatus("Y");//推送成功 + dingU8cBillEntity.setPushInfo("success");//推送成功 + dingU8cBillEntity.setDingTalkProcessId(processInstanceId);//钉钉审批实例id + dingU8cBillEntity.setCreate_time(new Date());//创建时间 + dingU8cBillEntity.setApprove(null);//Y审核 N不审核 + dingU8cBillEntity.setInitiate("D");//D钉钉发起,U u8c发起 + dingU8cBillDao.saveOrUpDateV2(dingU8cBillEntity); + + //上传附件,获取附件的表单,转base64,上传u8c + List fileModuleVOList = JSONUtil.toList(fjJson, FileModuleVO.class); + List sysFileVOS = fileUtil.DingFileTransBase64(fileModuleVOList, processInstanceId, token); + + for (SysFileVO sysFileVO : sysFileVOS) { + //上传u8c单据 + pushU8CFileUtil.pushFile(vbillId,sysFileVO); + } + }catch (Exception e){ + logger.error(e); + //成功 + DingU8cBillEntity dingU8cBillEntity = new DingU8cBillEntity(); + dingU8cBillEntity.setU8cPkCorp(corpName);//公司主键 + dingU8cBillEntity.setU8cCodeCorp(null);//公司编码 + dingU8cBillEntity.setU8cBillType(null);//单据类型 + dingU8cBillEntity.setU8cBillCode(null);//单据号 + dingU8cBillEntity.setU8cBillId(null);//单据主键 + dingU8cBillEntity.setPushStatus("N");//推送成功 + dingU8cBillEntity.setPushInfo(e.getMessage());//推送成功 + dingU8cBillEntity.setDingTalkProcessId(processInstanceId);//钉钉审批实例id + dingU8cBillEntity.setCreate_time(new Date());//创建时间 + dingU8cBillEntity.setApprove(null);//Y审核 N不审核 + dingU8cBillEntity.setInitiate("D");//D钉钉发起,U u8c发起 + dingU8cBillDao.saveOrUpDateV2(dingU8cBillEntity); + } + } + + private ArapDjzbVO resultDataHandle(String resultData) { + try { + if (resultData != null && !"".equals(resultData)) { + if (resultData.contains("[")) { + resultData = resultData.substring(1, resultData.length() - 1); + } + return JSON.parseObject(resultData, ArapDjzbVO.class); + } + } catch (Exception e) { + e.printStackTrace(); + logger.error("解析返回参数失败的错误", e); + //如果解析失败,记录原因,但是不能影响结果的记录 + } + return null; } public static void main(String[] args) { - Map bills=new HashMap(); - bills.put("djbh","FK2108160001"); - bills.put("dwbm","SHLZ"); - bills.put("operatorid", "tbadmin"); - String jsonStr = JSONUtil.toJsonStr(bills); - jsonStr="{\"bills\":["+jsonStr+"]}"; - System.out.println(jsonStr); +// LocalDate now = LocalDate.now(); +// System.out.println(now.toString()); } } diff --git a/buildpackage/src/main/java/com/hzya/frame/plugin/lets/dingtalk/dao/impl/DingU8cBillDaoImpl.java b/buildpackage/src/main/java/com/hzya/frame/plugin/lets/dingtalk/dao/impl/DingU8cBillDaoImpl.java index 98c2d3ac..4d769bda 100644 --- a/buildpackage/src/main/java/com/hzya/frame/plugin/lets/dingtalk/dao/impl/DingU8cBillDaoImpl.java +++ b/buildpackage/src/main/java/com/hzya/frame/plugin/lets/dingtalk/dao/impl/DingU8cBillDaoImpl.java @@ -62,6 +62,7 @@ public class DingU8cBillDaoImpl extends MybatisGenericDao + @@ -31,6 +32,7 @@ ,ding_talk_process_id ,ding_res ,approve + ,initiate ,modify_time ,create_time ,sts @@ -52,10 +54,10 @@ and ding_talk_process_id = #{dingTalkProcessId} and ding_res = #{ding_res} and approve = #{approve} + and initiate = #{initiate} and modify_time = #{modify_time} and create_time = #{create_time} and sts = #{sts} - and sts='Y' @@ -74,6 +76,7 @@ and ding_talk_process_id = #{dingTalkProcessId} and ding_res = #{ding_res} and approve = #{approve} + and initiate = #{initiate} and modify_time = #{modify_time} and create_time = #{create_time} and sts = #{sts} @@ -98,6 +101,7 @@ and ding_talk_process_id like concat('%',#{dingTalkProcessId},'%') and ding_res like concat('%',#{ding_res},'%') and approve like concat('%',#{approve},'%') + and initiate like concat('%',#{initiate},'%') and modify_time like concat('%',#{modify_time},'%') and create_time like concat('%',#{create_time},'%') and sts like concat('%',#{sts},'%') @@ -122,6 +126,7 @@ or ding_talk_process_id = #{dingTalkProcessId} or ding_res = #{ding_res} or approve = #{approve} + or initiate = #{initiate} or modify_time = #{modify_time} or create_time = #{create_time} or sts = #{sts} @@ -144,6 +149,7 @@ ding_talk_process_id , ding_res , approve , + initiate , modify_time , create_time , sts , @@ -162,6 +168,7 @@ #{dingTalkProcessId} , #{ding_res} , #{approve} , + #{initiate} , #{modify_time} , #{create_time} , #{sts} , @@ -169,33 +176,6 @@ ) - - - insert into ding_u8c_bill(u8c_pk_corp, u8c_code_corp, u8c_bill_type, u8c_bill_code, u8c_bill_id, push_status, push_info, ding_talk_process_id, modify_time, create_time, sts, sts) - values - - (#{entity.u8cPkCorp},#{entity.u8cCodeCorp},#{entity.u8cBillType},#{entity.u8cBillCode},#{entity.u8cBillId},#{entity.pushStatus},#{entity.pushInfo},#{entity.dingTalkProcessId},#{entity.modify_time},#{entity.create_time},#{entity.sts}, 'Y') - - - - - insert into ding_u8c_bill(u8c_pk_corp, u8c_code_corp, u8c_bill_type, u8c_bill_code, u8c_bill_id, push_status, push_info, ding_talk_process_id, modify_time, create_time, sts) - values - - (#{entity.u8cPkCorp},#{entity.u8cCodeCorp},#{entity.u8cBillType},#{entity.u8cBillCode},#{entity.u8cBillId},#{entity.pushStatus},#{entity.pushInfo},#{entity.dingTalkProcessId},#{entity.modify_time},#{entity.create_time},#{entity.sts}) - - on duplicate key update - u8c_pk_corp = values(u8c_pk_corp), - u8c_code_corp = values(u8c_code_corp), - u8c_bill_type = values(u8c_bill_type), - u8c_bill_code = values(u8c_bill_code), - u8c_bill_id = values(u8c_bill_id), - push_status = values(push_status), - push_info = values(push_info), - ding_talk_process_id = values(ding_talk_process_id), - modify_time = values(modify_time), - create_time = values(create_time), - sts = values(sts) update ding_u8c_bill set @@ -210,6 +190,7 @@ update ding_u8c_bill set ding_talk_process_id = #{dingTalkProcessId}, ding_res = #{ding_res}, approve = #{approve}, + initiate = #{initiate}, modify_time = #{modify_time}, create_time = #{create_time}, sts = #{sts}, @@ -221,23 +202,6 @@ where id = #{id} update ding_u8c_bill set sts= 'N' ,modify_time = #{modify_time},modify_user_id = #{modify_user_id} where id = #{id} - - -update ding_u8c_bill set sts= 'N' ,modify_time = #{modify_time},modify_user_id = #{modify_user_id} - - and id = #{id} - and u8c_pk_corp = #{u8cPkCorp} - and u8c_code_corp = #{u8cCodeCorp} - and u8c_bill_type = #{u8cBillType} - and u8c_bill_code = #{u8cBillCode} - and u8c_bill_id = #{u8cBillId} - and push_status = #{pushStatus} - and push_info = #{pushInfo} - and ding_talk_process_id = #{dingTalkProcessId} - and sts = #{sts} - and sts='Y' - - delete from ding_u8c_bill where id = #{id} diff --git a/buildpackage/src/main/java/com/hzya/frame/plugin/lets/dingtalk/utils/DingTalkUtils.java b/buildpackage/src/main/java/com/hzya/frame/plugin/lets/dingtalk/utils/DingTalkUtils.java index 2c92521b..cc0e647f 100644 --- a/buildpackage/src/main/java/com/hzya/frame/plugin/lets/dingtalk/utils/DingTalkUtils.java +++ b/buildpackage/src/main/java/com/hzya/frame/plugin/lets/dingtalk/utils/DingTalkUtils.java @@ -595,4 +595,37 @@ public class DingTalkUtils { } } + /** + * 下载审批实例实例附件 + * @param token + * @param processInstanceId + * @param fileId + * @throws Exception + */ + public static GrantProcessInstanceForDownloadFileResponse downloadProcessFile (String token,String processInstanceId,String fileId) throws Exception { + Client client = createClient(); + com.aliyun.dingtalkworkflow_1_0.models.GrantProcessInstanceForDownloadFileHeaders grantProcessInstanceForDownloadFileHeaders = new com.aliyun.dingtalkworkflow_1_0.models.GrantProcessInstanceForDownloadFileHeaders(); + grantProcessInstanceForDownloadFileHeaders.xAcsDingtalkAccessToken = token; + com.aliyun.dingtalkworkflow_1_0.models.GrantProcessInstanceForDownloadFileRequest grantProcessInstanceForDownloadFileRequest = new com.aliyun.dingtalkworkflow_1_0.models.GrantProcessInstanceForDownloadFileRequest() + .setProcessInstanceId(processInstanceId) + .setFileId(fileId); + try { + GrantProcessInstanceForDownloadFileResponse grantProcessInstanceForDownloadFileResponse = + client.grantProcessInstanceForDownloadFileWithOptions(grantProcessInstanceForDownloadFileRequest, grantProcessInstanceForDownloadFileHeaders, new RuntimeOptions()); + return grantProcessInstanceForDownloadFileResponse; + } catch (TeaException err) { + if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) { + Assert.state(false, err.getMessage()); + } + + } catch (Exception _err) { + TeaException err = new TeaException(_err.getMessage(), _err); + if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) { + Assert.state(false, err.getMessage()); + } + + } + return null; + } + } diff --git a/buildpackage/src/main/java/com/hzya/frame/plugin/lets/dingtalk/utils/FileUtil.java b/buildpackage/src/main/java/com/hzya/frame/plugin/lets/dingtalk/utils/FileUtil.java index 45e90d5c..f0391580 100644 --- a/buildpackage/src/main/java/com/hzya/frame/plugin/lets/dingtalk/utils/FileUtil.java +++ b/buildpackage/src/main/java/com/hzya/frame/plugin/lets/dingtalk/utils/FileUtil.java @@ -5,6 +5,7 @@ import com.aliyun.dingtalkstorage_1_0.models.AddPermissionResponse; import com.aliyun.dingtalkstorage_1_0.models.CommitFileRequest; import com.aliyun.dingtalkstorage_1_0.models.CommitFileResponse; import com.aliyun.dingtalkstorage_1_0.models.GetFileUploadInfoResponse; +import com.aliyun.dingtalkworkflow_1_0.models.GrantProcessInstanceForDownloadFileResponse; import com.hzya.frame.plugin.lets.dingtalk.vo.FileModuleVO; import com.hzya.frame.plugin.lets.dingtalk.vo.SysFileVO; import org.apache.commons.lang.StringUtils; @@ -13,10 +14,13 @@ import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; -import java.io.ByteArrayOutputStream; -import java.io.OutputStream; +import java.io.*; import java.net.HttpURLConnection; import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Base64; import java.util.List; import java.util.Map; @@ -110,4 +114,57 @@ public class FileUtil { } return fileModuleVO; } + + /** + * 钉钉审批实例附件下载,转base64编码 + * @Param fileModuleVOList 钉钉附件列表 + * @Param token token + * @Param processInstanceId 审批实例id + */ + public List DingFileTransBase64(List fileModuleVOList,String token,String processInstanceId) throws Exception { + List sysFileVOList=new ArrayList<>(); + + for (FileModuleVO fileModuleVO : fileModuleVOList) { + SysFileVO sysFileVO = new SysFileVO(); + String targetPath = "D:\\ding-file\\download\\"+processInstanceId+"_"+fileModuleVO.getFileId()+"\\"; + + //附件下载 + GrantProcessInstanceForDownloadFileResponse grantProcessInstanceForDownloadFileResponse = DingTalkUtils.downloadProcessFile(token, processInstanceId, fileModuleVO.getFileId()); + String uri = grantProcessInstanceForDownloadFileResponse.getBody().getResult().getDownloadUri(); + URL url = new URL(uri); + HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); + int responseCode = httpConn.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK) { + InputStream inputStream = httpConn.getInputStream(); + FileOutputStream outputStream = new FileOutputStream(targetPath); + byte[] buffer = new byte[4096]; + int bytesRead; + + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + //转为base64编码 + // 读取文件内容到字节数组 + byte[] fileContent = Files.readAllBytes(Paths.get(targetPath)); + // 将字节数组转换为 Base64 编码的字符串 + String encodedString = Base64.getEncoder().encodeToString(fileContent); + + sysFileVO.setFileName(fileModuleVO.getFileName()); + sysFileVO.setType(fileModuleVO.getFileType()); + sysFileVO.setBaseCode(encodedString); + System.out.println(sysFileVO); + sysFileVOList.add(sysFileVO); + + //关闭资源 + outputStream.close(); + inputStream.close(); + httpConn.disconnect(); + } else { + throw new IOException("无法下载文件,HTTP响应码: " + responseCode); + } + } + return sysFileVOList; + } + + } diff --git a/buildpackage/src/main/java/com/hzya/frame/plugin/lets/dingtalk/utils/PushU8CFileTest.java b/buildpackage/src/main/java/com/hzya/frame/plugin/lets/dingtalk/utils/PushU8CFileTest.java new file mode 100644 index 00000000..9ba1e029 --- /dev/null +++ b/buildpackage/src/main/java/com/hzya/frame/plugin/lets/dingtalk/utils/PushU8CFileTest.java @@ -0,0 +1,64 @@ +package com.hzya.frame.plugin.lets.dingtalk.utils; + + +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpException; +import org.apache.commons.httpclient.methods.PostMethod; +import org.apache.commons.httpclient.methods.RequestEntity; +import org.apache.commons.httpclient.methods.StringRequestEntity; + +import cn.hutool.json.JSONUtil; + +import java.io.UnsupportedEncodingException; +import java.util.HashMap; +import java.util.Map; + +public class PushU8CFileTest { + public static void main(String[] args) throws Exception { + // 服务器访问地址及端口,例如 http://ip:port + String serviceUrl = "http://39.170.109.90:9099"; + // 服务名,例如 /u8cloud/api/cmp/hj/insert + String serviceName = "/u8cloud/api/file/upload/base64"; + // 各服务的参数设置,具体可参照服务描述页面的请求参数示例 + String json = ""; + + // 使用U8cloud系统中设置,具体节点路径为: + // 应用集成 - 系统集成平台 - 系统信息设置 + // 设置信息中具体属性的对照关系如下: + Map map = new HashMap(); + map.put("trantype", "code"); // 档案翻译方式,枚举值为:编码请录入 code, 名称请录入 name, 主键请录入 pk + map.put("system", "lz1"); // 系统编码 + map.put("usercode", "admin1"); // 用户 + map.put("password", "83f1ad3e7fa3617f1aae62ae7413c810"); // 密码,需要 MD5 加密后录入 + + + String encodedString = "5Zyw5Z2A77yaL3U4Y2xvdWQvYXBpL3VhcGJkL2N1c3Rkb2MvdXBkYXRlDQoNCuWFpeWPgjt7DQoJImNiZG9jdm8iOiBbDQoJCXsNCiAgICAgICAgICAgICJhZGRycyI6W10sDQogICAgICAgICAgICAiYmFua3MiOltdLA0KCQkJInBhcmVudHZvIjogew0KCQkJCSJwa19jdWJhc2RvYyI6ICIwMDAxQTExMDAwMDAwMDAwSERSVSIsDQoJCQkJInBrX2FyZWFjbCI6ICJGRiIsDQoJCQkJImN1c3RzaG9ydG5hbWUiOiAi5YiY56GVIiwNCgkJCQkiY3VzdG5hbWUiOiAi5YiY56GVIiwNCgkJCQkiZGVmMSI6IDk0MTcNCgkJCX0NCgkJfQ0KCV0NCn0NCg0K6L+U5Zue77yaDQp7DQoJInN0YXR1cyI6ICJmYWxpZWQiLA0KCSJlcnJvcm1zZyI6ICJVOEPov5Tlm57kv6Hmga86bnVsbCIsDQoJInN0YWNrdHJhY2UiOiAiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uXHJcbnU4Yy5icy5iZC5jdXN0ZG9jLmJwLkN1c3Rkb2NBUElVcGRhdGVCUC51cGRhdGUoQ3VzdGRvY0FQSVVwZGF0ZUJQLmphdmE6OTQpXHJcbnU4Yy5pbXBsLmJkLmN1c3Rkb2MuYWN0aW9uLkN1c3Rkb2NBUElVcGRhdGVBY3Rpb24uc2F2ZShDdXN0ZG9jQVBJVXBkYXRlQWN0aW9uLmphdmE6MTYpXHJcbnU4Yy5pbXBsLmJkLmN1c3Rkb2MuYWN0aW9uLkN1c3Rkb2NBUElVcGRhdGVBY3Rpb24uc2F2ZShDdXN0ZG9jQVBJVXBkYXRlQWN0aW9uLmphdmE6OClcclxudThjLmJzLmFjdGlvbi5zYXZlLkFic3RyYWN0QmF0Y2hTYXZlQWN0aW9uLmJ1c2luZXNzUHJvY2VzcyhBYnN0cmFjdEJhdGNoU2F2ZUFjdGlvbi5qYXZhOjY1KVxyXG51OGMuYnMuYWN0aW9uLnNhdmUuQWJzdHJhY3RCYXRjaFNhdmVBY3Rpb24uc2F2ZShBYnN0cmFjdEJhdGNoU2F2ZUFjdGlvbi5qYXZhOjE2NylcclxudThjLmJzLmFjdGlvbi5zYXZlLkFic3RyYWN0QmF0Y2hTYXZlQWN0aW9uLmRvQWN0aW9uKEFic3RyYWN0QmF0Y2hTYXZlQWN0aW9uLmphdmE6ODApXHJcbnU4Yy5icy5pbnZva2UuYnAuSlNPTkludm9rZUJQLmludm9rZShKU09OSW52b2tlQlAuamF2YTo4MClcclxudThjLmltcGwuaW52b2tlLmpzb24uSW52b2tlV2l0aEpTb25JbXBsLmludm9rZShJbnZva2VXaXRoSlNvbkltcGwuamF2YTozMSlcclxuc3VuLnJlZmxlY3QuR2VuZXJhdGVkTWV0aG9kQWNjZXNzb3I1ODUuaW52b2tlKFVua25vd24gU291cmNlKVxyXG5qYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuaW52b2tlKE1ldGhvZC5qYXZhOjQ5OClcclxubmMuYnMuZnJhbWV3b3JrLmVqYi5DTVRQcm94eUltcGwuZGVsZWdhdGUoQ01UUHJveHlJbXBsLmphdmE6MjIpXHJcbm5jLml0Zi5mcmFtZXdvcmsuZWpiLkNNVFByb3h5RWpiQmVhbi5kZWxlZ2F0ZShDTVRQcm94eUVqYkJlYW4uamF2YTo0NClcclxubmMuaXRmLmZyYW1ld29yay5lamIuQ01UUHJveHlfTG9jYWwuZGVsZWdhdGUoQ01UUHJveHlfTG9jYWwuamF2YTo2MSlcclxuc3VuLnJlZmxlY3QuR2VuZXJhdGVkTWV0aG9kQWNjZXNzb3IxODkuaW52b2tlKFVua25vd24gU291cmNlKVxyXG5qYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuaW52b2tlKE1ldGhvZC5qYXZhOjQ5OClcclxubmMuYnMuZnJhbWV3b3JrLmVqYi5BYnN0cmFjdEVKQlNlcnZpY2VIYW5kbGVyLmludm9rZShBYnN0cmFjdEVKQlNlcnZpY2VIYW5kbGVyLmphdmE6NTYpXHJcbm5jLmJzLmZyYW1ld29yay5lamIuQWJzdHJhY3RFSkJTZXJ2aWNlSGFuZGxlci5pbnZva2UoQWJzdHJhY3RFSkJTZXJ2aWNlSGFuZGxlci5qYXZhOjM0KVxyXG5jb20uc3VuLnByb3h5LiRQcm94eTEyLmRlbGVnYXRlKFVua25vd24gU291cmNlKVxyXG5uYy5icy5mcmFtZXdvcmsuZWpiLkNNVEVKQlNlcnZpY2VIYW5kbGVyLmludm9rZShDTVRFSkJTZXJ2aWNlSGFuZGxlci5qYXZhOjMyKVxyXG5jb20uc3VuLnByb3h5LiRQcm94eTQxLmludm9rZShVbmtub3duIFNvdXJjZSlcclxudThjLnZvLm9pcC50YXNrLkFQSVRhc2suZXhlY3V0ZShBUElUYXNrLmphdmE6OTkpXHJcbnU4Yy5pbXBsLm9pcC50YXNrLkFQSVRhc2tTZXJ2aWNlSW1wbC5leGVjdXRlVGFzayhBUElUYXNrU2VydmljZUltcGwuamF2YTo3MClcclxudThjLnNlcnZlci5BUElDb250cm9sbGVyLmZvcldhcmQoQVBJQ29udHJvbGxlci5qYXZhOjE0MylcclxudThjLnNlcnZlci5BUElTZXJ2bGV0Rm9ySlNPTi5kb0FjdGlvbihBUElTZXJ2bGV0Rm9ySlNPTi5qYXZhOjc4KVxyXG5uYy5icy5mcmFtZXdvcmsuc2VydmVyLmV4dHN5cy5FeHRTeXN0ZW1JbnZva2VyU2VydmxldC5kb0FjdGlvbihFeHRTeXN0ZW1JbnZva2VyU2VydmxldC5qYXZhOjE3MClcclxubmMuYnMuZnJhbWV3b3JrLnNlcnZlci5leHRzeXMuRXh0U3lzdGVtSW52b2tlclNlcnZsZXQuZG9Qb3N0KEV4dFN5c3RlbUludm9rZXJTZXJ2bGV0LmphdmE6NzYpXHJcbmphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldC5zZXJ2aWNlKEh0dHBTZXJ2bGV0LmphdmE6NjgxKVxyXG5qYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQuc2VydmljZShIdHRwU2VydmxldC5qYXZhOjc2NClcclxub3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLkFwcGxpY2F0aW9uRmlsdGVyQ2hhaW4uaW50ZXJuYWxEb0ZpbHRlcihBcHBsaWNhdGlvbkZpbHRlckNoYWluLmphdmE6MjMxKVxyXG5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuQXBwbGljYXRpb25GaWx0ZXJDaGFpbi5kb0ZpbHRlcihBcHBsaWNhdGlvbkZpbHRlckNoYWluLmphdmE6MTY2KVxyXG5vcmcuYXBhY2hlLnRvbWNhdC53ZWJzb2NrZXQuc2VydmVyLldzRmlsdGVyLmRvRmlsdGVyKFdzRmlsdGVyLmphdmE6NTIpXHJcbm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5BcHBsaWNhdGlvbkZpbHRlckNoYWluLmludGVybmFsRG9GaWx0ZXIoQXBwbGljYXRpb25GaWx0ZXJDaGFpbi5qYXZhOjE5Mylcclxub3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLkFwcGxpY2F0aW9uRmlsdGVyQ2hhaW4uZG9GaWx0ZXIoQXBwbGljYXRpb25GaWx0ZXJDaGFpbi5qYXZhOjE2NilcclxubmMuYnMuZnJhbWV3b3JrLnNlcnZlci5Mb2dnZXJTZXJ2bGV0RmlsdGVyLmRvRmlsdGVyKExvZ2dlclNlcnZsZXRGaWx0ZXIuamF2YTozNClcclxub3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLkFwcGxpY2F0aW9uRmlsdGVyQ2hhaW4uaW50ZXJuYWxEb0ZpbHRlcihBcHBsaWNhdGlvbkZpbHRlckNoYWluLmphdmE6MTkzKVxyXG5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuQXBwbGljYXRpb25GaWx0ZXJDaGFpbi5kb0ZpbHRlcihBcHBsaWNhdGlvbkZpbHRlckNoYWluLmphdmE6MTY2KVxyXG5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRXcmFwcGVyVmFsdmUuaW52b2tlKFN0YW5kYXJkV3JhcHBlclZhbHZlLmphdmE6MTk3KVxyXG5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0VmFsdmUuaW52b2tlKFN0YW5kYXJkQ29udGV4dFZhbHZlLmphdmE6OTcpXHJcbm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5BdXRoZW50aWNhdG9yQmFzZS5pbnZva2UoQXV0aGVudGljYXRvckJhc2UuamF2YTo1NDMpXHJcbm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3RWYWx2ZS5pbnZva2UoU3RhbmRhcmRIb3N0VmFsdmUuamF2YToxMzUpXHJcbm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkVycm9yUmVwb3J0VmFsdmUuaW52b2tlKEVycm9yUmVwb3J0VmFsdmUuamF2YTo5Milcclxub3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuUmVtb3RlSXBWYWx2ZS5pbnZva2UoUmVtb3RlSXBWYWx2ZS5qYXZhOjc2OSlcclxub3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lVmFsdmUuaW52b2tlKFN0YW5kYXJkRW5naW5lVmFsdmUuamF2YTo3OClcclxub3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuQ295b3RlQWRhcHRlci5zZXJ2aWNlKENveW90ZUFkYXB0ZXIuamF2YTozNjcpXHJcbm9yZy5hcGFjaGUuY295b3RlLmh0dHAxMS5IdHRwMTFQcm9jZXNzb3Iuc2VydmljZShIdHRwMTFQcm9jZXNzb3IuamF2YTo2MzkpXHJcbm9yZy5hcGFjaGUuY295b3RlLkFic3RyYWN0UHJvY2Vzc29yTGlnaHQucHJvY2VzcyhBYnN0cmFjdFByb2Nlc3NvckxpZ2h0LmphdmE6NjUpXHJcbm9yZy5hcGFjaGUuY295b3RlLkFic3RyYWN0UHJvdG9jb2wkQ29ubmVjdGlvbkhhbmRsZXIucHJvY2VzcyhBYnN0cmFjdFByb3RvY29sLmphdmE6ODgyKVxyXG5vcmcuYXBhY2hlLnRvbWNhdC51dGlsLm5ldC5OaW9FbmRwb2ludCRTb2NrZXRQcm9jZXNzb3IuZG9SdW4oTmlvRW5kcG9pbnQuamF2YToxNjQ3KVxyXG5vcmcuYXBhY2hlLnRvbWNhdC51dGlsLm5ldC5Tb2NrZXRQcm9jZXNzb3JCYXNlLnJ1bihTb2NrZXRQcm9jZXNzb3JCYXNlLmphdmE6NDkpXHJcbm9yZy5hcGFjaGUudG9tY2F0LnV0aWwudGhyZWFkcy5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExOTEpXHJcbm9yZy5hcGFjaGUudG9tY2F0LnV0aWwudGhyZWFkcy5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2NTkpXHJcbm9yZy5hcGFjaGUudG9tY2F0LnV0aWwudGhyZWFkcy5UYXNrVGhyZWFkJFdyYXBwaW5nUnVubmFibGUucnVuKFRhc2tUaHJlYWQuamF2YTo2MSlcclxuamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxyXG4iLA0KCSJ0YXNrTnVtYmVyIjogIjIwMjQxMDIzMzkzMDQiDQp9"; + + Map fileMap=new HashMap<>(); + fileMap.put("content",encodedString); + fileMap.put("creator","tbadmin");//制单人code,这里是王安 + fileMap.put("file_name","测试小文件11.txt"); + fileMap.put("upload_path","1001A2100000000021BK");//单据主键 + String jsonFileMap = JSONUtil.toJsonStr(fileMap); + json="{\"file\":["+jsonFileMap+"]}"; + System.out.println(json); + + //上传 + HttpClient httpClient = new HttpClient(); + PostMethod httpPost = new PostMethod(serviceUrl+serviceName); + httpPost.setRequestHeader("content-type","application/json;charset=utf-8"); + for (Map.Entry entry : map.entrySet()) { + httpPost.setRequestHeader(entry.getKey(), entry.getValue() + .toString()); + } + + RequestEntity entity = new StringRequestEntity(json,"application/json", "UTF-8"); + httpPost.setRequestEntity(entity); + httpClient.executeMethod(httpPost); + String responseBodyAsString = httpPost.getResponseBodyAsString(); + System.out.println(responseBodyAsString); + + + } + +} diff --git a/buildpackage/src/main/java/com/hzya/frame/plugin/lets/dingtalk/utils/PushU8CFileUtil.java b/buildpackage/src/main/java/com/hzya/frame/plugin/lets/dingtalk/utils/PushU8CFileUtil.java new file mode 100644 index 00000000..51b27fab --- /dev/null +++ b/buildpackage/src/main/java/com/hzya/frame/plugin/lets/dingtalk/utils/PushU8CFileUtil.java @@ -0,0 +1,67 @@ +package com.hzya.frame.plugin.lets.dingtalk.utils; + + +import cn.hutool.json.JSONUtil; +import com.hzya.frame.plugin.lets.constant.OverallConstant; +import com.hzya.frame.plugin.lets.dingtalk.callback.service.impl.CallBackServiceImpl; +import com.hzya.frame.plugin.lets.dingtalk.vo.SysFileVO; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.methods.PostMethod; +import org.apache.commons.httpclient.methods.RequestEntity; +import org.apache.commons.httpclient.methods.StringRequestEntity; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +@Component +public class PushU8CFileUtil { + protected static Logger logger = LogManager.getLogger(PushU8CFileUtil.class); + + /** + * 推送u8c单据附件 + * @Param vouchId 单据主键 + * @Param sysFileVO 文件信息 + */ + public static void pushFile(String vouchId, SysFileVO sysFileVO) throws Exception{ + + // 服务器访问地址及端口,例如 http://ip:port + String serviceUrl = OverallConstant.getOverAllValue("u8cApiUrl"); + // 服务名,例如 /u8cloud/api/cmp/hj/insert + String serviceName = "/u8cloud/api/file/upload/base64"; + + Map map = new HashMap(); + map.put("trantype", OverallConstant.getOverAllValue("u8cApiTrantypeCode")); // 档案翻译方式,枚举值为:编码请录入 code, 名称请录入 name, 主键请录入 pk + map.put("system", OverallConstant.getOverAllValue("u8cApiSystemCode")); // 系统编码 + map.put("usercode", OverallConstant.getOverAllValue("u8cApiUsercodeCode")); // 用户 + map.put("password", OverallConstant.getOverAllValue("u8cApiPasswordCode")); // 密码,需要 MD5 加密后录入 + + Map fileMap=new HashMap<>(); + fileMap.put("content",sysFileVO.getBaseCode()); + fileMap.put("creator","tbadmin");//制单人code + fileMap.put("file_name",sysFileVO.getFileName()); + fileMap.put("upload_path",vouchId);//单据主键 + String jsonFileMap = JSONUtil.toJsonStr(fileMap); + String json="{\"file\":["+jsonFileMap+"]}"; + System.out.println(json); + + //上传 + HttpClient httpClient = new HttpClient(); + PostMethod httpPost = new PostMethod(serviceUrl+serviceName); + httpPost.setRequestHeader("content-type","application/json;charset=utf-8"); + for (Map.Entry entry : map.entrySet()) { + httpPost.setRequestHeader(entry.getKey(), entry.getValue() + .toString()); + } + + RequestEntity entity = new StringRequestEntity(json,"application/json", "UTF-8"); + httpPost.setRequestEntity(entity); + httpClient.executeMethod(httpPost); + String responseBodyAsString = httpPost.getResponseBodyAsString(); + logger.info("推送u8c单据附件,推送单据主键:{},u8c返回信息:{}",vouchId,responseBodyAsString); + + + } +} diff --git a/buildpackage/src/main/java/com/hzya/frame/plugin/lets/dingtalk/utils/Test.java b/buildpackage/src/main/java/com/hzya/frame/plugin/lets/dingtalk/utils/Test.java index 762dea5d..61bfbdaa 100644 --- a/buildpackage/src/main/java/com/hzya/frame/plugin/lets/dingtalk/utils/Test.java +++ b/buildpackage/src/main/java/com/hzya/frame/plugin/lets/dingtalk/utils/Test.java @@ -1,13 +1,24 @@ package com.hzya.frame.plugin.lets.dingtalk.utils; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenResponseBody; -import com.aliyun.dingtalkworkflow_1_0.models.GetAttachmentSpaceResponse; -import com.aliyun.dingtalkworkflow_1_0.models.GetProcessCodeByNameResponse; +import com.aliyun.dingtalkworkflow_1_0.models.*; import com.dingtalk.api.response.OapiUserListidResponse; import com.dingtalk.api.response.OapiV2UserGetResponse; import com.dingtalk.api.response.OapiV2UserGetbymobileResponse; -import org.apache.commons.codec.binary.Base64; - +import com.hzya.frame.plugin.lets.dingtalk.vo.FileModuleVO; +import com.hzya.frame.plugin.lets.dingtalk.vo.SysFileVO; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Base64; +import java.util.List; import java.util.UUID; /** @@ -18,13 +29,13 @@ import java.util.UUID; * 采购付款申请(店群专用) PROC-285CCF2B-524F-4055-BE62-FC31F490C654 25354973072 */ public class Test { -// public static void main(String[] args) throws Exception { -// String appKey="ding5qfifcktfqfjlem0"; -// String appSecret="BVuLOy_K0F8f5np69VuBeKdb1zfwqhuPsAV49lNbYVbx5TnfSTHjwEcad9Vwzfq1"; + public static void main(String[] args) throws Exception { + String appKey="ding5qfifcktfqfjlem0"; + String appSecret="BVuLOy_K0F8f5np69VuBeKdb1zfwqhuPsAV49lNbYVbx5TnfSTHjwEcad9Vwzfq1"; //获取token -// GetAccessTokenResponseBody tokenBody = DingTalkUtils.getTokenBody(appKey, appSecret); -// System.out.println(tokenBody.getAccessToken()); + GetAccessTokenResponseBody tokenBody = DingTalkUtils.getTokenBody(appKey, appSecret); + System.out.println(tokenBody.getAccessToken()); //获取用户列表 // OapiUserListidResponse userIdList = DingTalkUtils.getUserIdList(tokenBody.getAccessToken()); @@ -49,11 +60,73 @@ public class Test { // System.out.println(processCode1.getBody().getResult().getProcessCode());//PROC-EC6B5BD2-DE3C-456E-9591-6F7B377E39E4 // GetProcessCodeByNameResponse processCode2 = DingTalkUtils.getProcessCode(tokenBody.getAccessToken(), "采购付款申请(店群专用)"); // System.out.println(processCode2.getBody().getResult().getProcessCode());//PROC-285CCF2B-524F-4055-BE62-FC31F490C654 -// } - public static void main(String[] args) { - String key = Base64.encodeBase64String(UUID.randomUUID().toString().replaceAll("-","").getBytes()); - System.out.println(key); + + GetProcessInstanceResponse processInstanceDetails = DingTalkUtils.getProcessInstanceDetails(tokenBody.getAccessToken(), "TkERtV0BRW6GeqXcA0sMQg05751730701542"); + System.out.println(processInstanceDetails.getBody().getResult().getFormComponentValues()); + List formComponentValues = + processInstanceDetails.getBody().getResult().getFormComponentValues(); + //获取附件的表单 + List fileModuleVOList=new ArrayList<>(); + for (GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResultFormComponentValues formComponentValue : formComponentValues) { + if("DDAttachment".equals(formComponentValue.getComponentType())){ + String value = formComponentValue.getValue(); + System.out.println(value); + fileModuleVOList = JSONUtil.toList(value, FileModuleVO.class); + } } + List sysFileVOList=new ArrayList<>(); + for (FileModuleVO fileModuleVO : fileModuleVOList) { +// String targetPath = "D:\\ding-file\\download\\"+fileModuleVO.getFileName()+fileModuleVO.getFileId()+"."+fileModuleVO.getFileType(); + String targetPath = "D:\\ding-file\\download\\"+"TkERtV0BRW6GeqXcA0sMQg05751730701542\\"; + SysFileVO sysFileVO = new SysFileVO(); + GrantProcessInstanceForDownloadFileResponse grantProcessInstanceForDownloadFileResponse = DingTalkUtils.downloadProcessFile(tokenBody.getAccessToken(), "TkERtV0BRW6GeqXcA0sMQg05751730701542", fileModuleVO.getFileId()); + System.out.println(grantProcessInstanceForDownloadFileResponse.getBody().getResult().getDownloadUri()); + String uri = grantProcessInstanceForDownloadFileResponse.getBody().getResult().getDownloadUri(); + URL url = new URL(uri); + HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); + int responseCode = httpConn.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK) { + InputStream inputStream = httpConn.getInputStream(); + FileOutputStream outputStream = new FileOutputStream(targetPath); + byte[] buffer = new byte[4096]; + int bytesRead; + + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + //转为base64编码 + // 读取文件内容到字节数组 + byte[] fileContent = Files.readAllBytes(Paths.get(targetPath)); + // 将字节数组转换为 Base64 编码的字符串 + String encodedString = Base64.getEncoder().encodeToString(fileContent); + + sysFileVO.setFileName(fileModuleVO.getFileName()); + sysFileVO.setType(fileModuleVO.getFileType()); + sysFileVO.setBaseCode(encodedString); + System.out.println(sysFileVO); + sysFileVOList.add(sysFileVO); + + //关闭资源 + outputStream.close(); + inputStream.close(); + httpConn.disconnect(); + } else { + throw new IOException("无法下载文件,HTTP响应码: " + responseCode); + } + } + + + } + +// /** +// * 生成回调key +// * @param args +// */ +// public static void main(String[] args) { +// String key = Base64.encodeBase64String(UUID.randomUUID().toString().replaceAll("-","").getBytes()); +// System.out.println(key); +// +// } } diff --git a/buildpackage/src/main/java/com/hzya/frame/plugin/lets/util/QueryU8CEntityUtil.java b/buildpackage/src/main/java/com/hzya/frame/plugin/lets/util/QueryU8CEntityUtil.java index 8723b57e..705c506e 100644 --- a/buildpackage/src/main/java/com/hzya/frame/plugin/lets/util/QueryU8CEntityUtil.java +++ b/buildpackage/src/main/java/com/hzya/frame/plugin/lets/util/QueryU8CEntityUtil.java @@ -66,8 +66,69 @@ public class QueryU8CEntityUtil { return null; } } + public BdCorpEntity queryBdCorpByUnitName(String unitName) { + BdCorpEntity entity = new BdCorpEntity(); + entity.setDr(0); + entity.setUnitname(unitName); + entity.setDataSourceCode(ProfilesActiveConstant.LETS_DATE_SOURCE); + List query = iBdCorpDao.query(entity); + if (query.size() >= 1) { + return query.get(0); + } else { + return null; + } + } ////////////////////////////////////////////////////////////////////////////////////////公司 + ////////////////////////////////////////////////////////////////////////////////////////部门 + @Autowired + private IBdDeptdocDao bdDeptdocDao; + /** + * 根据公司主键查询全部部门 + */ + public List queryBdDeptDocByPkCorp(String pkCorp){ + BdDeptdocEntity bdDeptdocEntity = new BdDeptdocEntity(); + bdDeptdocEntity.setDr(0); + bdDeptdocEntity.setPkCorp(pkCorp); + List query = bdDeptdocDao.query(bdDeptdocEntity); + return query; + } + + /** + * 根据公司主键、部门编码查询部门 + */ + public BdDeptdocEntity queryBdDeptDocByPkCorpAndDeptCode(String pkCorp,String deptCode){ + BdDeptdocEntity bdDeptdocEntity = new BdDeptdocEntity(); + bdDeptdocEntity.setDr(0); + bdDeptdocEntity.setPkCorp(pkCorp); + bdDeptdocEntity.setDeptcode(deptCode); + List query = bdDeptdocDao.query(bdDeptdocEntity); + if (query.size() >= 1) { + return query.get(0); + } else { + return null; + } + + } + + + /** + * 根据公司主键、部门名称查询部门 + */ + public BdDeptdocEntity queryBdDeptDocByPkCorpAndDeptName(String pkCorp,String deptName) { + BdDeptdocEntity bdDeptdocEntity = new BdDeptdocEntity(); + bdDeptdocEntity.setDr(0); + bdDeptdocEntity.setPkCorp(pkCorp); + bdDeptdocEntity.setDeptname(deptName); + List query = bdDeptdocDao.query(bdDeptdocEntity); + if (query.size() >= 1) { + return query.get(0); + } else { + return null; + } + } + ////////////////////////////////////////////////////////////////////////////////////////部门 + ////////////////////////////////////////////////////////////////////////////////////////仓库 @Autowired private IBdStordocDao iBdStordocDao;