package com.malk.siku.service.impl; import com.alibaba.fastjson.JSONObject; import com.malk.server.aliwork.YDConf; import com.malk.server.aliwork.YDParam; import com.malk.server.common.McR; import com.malk.service.aliwork.YDClient; import com.malk.siku.service.SikuService; import com.malk.siku.utils.MkBxUtil; import com.malk.siku.utils.MkYpUtil; import com.malk.utils.UtilMap; import lombok.extern.slf4j.Slf4j; import org.apache.logging.log4j.util.Strings; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.FileOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.*; @Slf4j @Service public class SikuServiceImpl implements SikuService { @Autowired private YDClient ydClient; @Value(value = "${mk.downloadFilePath}") private String downloadFilePath; @Value(value = "${mk.downloadUrl}") private String downloadUrl; @Override public McR saveTradingPartner(Map map) { String formInstId = UtilMap.getString(map, "formInstId"); String type = UtilMap.getString(map, "type"); Map formData = ydClient.queryData(YDParam.builder() .formInstanceId(formInstId) .build(), YDConf.FORM_QUERY.retrieve_id).getFormData(); Map partner = new HashMap(); if ("客户".equals(type)){ //客户 partner.put("partnerName", "客户");//所属分类名称 partner.put("name", UtilMap.getString(formData,"textField_mkddjwy3"));//往来单位中文名 partner.put("partnerType", "客户");//往来关系,可选值为:"供应商"、"客户"、"供应商,客户"(既是供应商又是客户的情况下以中文逗号分隔(供应商在前)) partner.put("partnerProperty", "公司");//往来性质,可选值为:"公司"、"个体工商户" partner.put("businessCode", UtilMap.getString(formData,"serialNumberField_mkddjwy2"));//往来单位编码,不超过50个字符 partner.put("taxNumber", UtilMap.getString(formData,"textField_mkddjwys"));//税务登记号,不超过200个字符 partner.put("readOnly", false);//是否只读,默认false。如果为true,那么在每刻系统中往来单位的所有信息(如权限范围、收款账户等)均无法修改。(接口更新操作不受限制) partner.put("reMark", "");//往来单位备注 partner.put("enabled", true);//是否启用(true:启用;false:禁用)。若该参数为空,新增则默认为true,更新则保持系统内状态。 }else { //供应商 String hzlx = UtilMap.getString(formData, "radioField_mketkvw7"); partner.put("parentBizCode", "GYS");//所属分类业务编码 partner.put("name", "Free".equals(hzlx) ? UtilMap.getString(formData,"textField_mkkixdd6") : UtilMap.getString(formData,"textField_mketkvv0"));//往来单位中文名 partner.put("partnerType", "供应商");//往来关系,可选值为:"供应商"、"客户"、"供应商,客户"(既是供应商又是客户的情况下以中文逗号分隔(供应商在前)) partner.put("partnerProperty", "Free".equals(hzlx) ? "个体工商户" : "公司");//往来性质,可选值为:"公司"、"个体工商户" partner.put("businessCode", UtilMap.getString(formData,"serialNumberField_mketkvw4"));//往来单位编码,不超过50个字符 partner.put("taxNumber", "Free".equals(hzlx) ? "" : UtilMap.getString(formData,"textField_mketkvxo"));//税务登记号,不超过200个字符 partner.put("readOnly", false);//是否只读,默认false。如果为true,那么在每刻系统中往来单位的所有信息(如权限范围、收款账户等)均无法修改。(接口更新操作不受限制) partner.put("reMark", "");//往来单位备注 partner.put("enabled", "启用".equals(UtilMap.getString(formData,"radioField_mketkvw8")));//是否启用(true:启用;false:禁用)。若该参数为空,新增则默认为true,更新则保持系统内状态。 } Map body = new HashMap(); body.put("partnerList", Arrays.asList(partner)); Map result = MkBxUtil.saveTradingPartner(body); List data = UtilMap.getList(result, "data"); String status = UtilMap.getString(data.get(0), "status"); if ("ALL_FAIL".equals(status)){ //保存往来单位失败回写错误信息 String message = UtilMap.getString(data.get(0), "message"); ydClient.operateData(YDParam.builder() .formInstanceId(formInstId) .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mmx7nk6m, textareaField_mmx7nk6r","入库失败",message))) .build(), YDConf.FORM_OPERATION.update); } //保存往来单位账户 if ("SUCCESS".equals(status)){ Map account = new HashMap(); account.put("businessCode",UtilMap.getString(formData,"serialNumberField_mketkvw4")); Map accountItem = new HashMap(); accountItem.put("accountName",UtilMap.getString(formData,"textField_mketkvxa"));//账户名称 accountItem.put("accountNumber",UtilMap.getString(formData,"textField_mketkvxc"));//账号 accountItem.put("bankBranchName",UtilMap.getString(formData,"textField_mketkvx8"));//分支行 accountItem.put("accountType","BANK"); account.put("accounts",Arrays.asList(accountItem)); Map result2 = MkBxUtil.saveAccount(Arrays.asList(account)); List data2 = UtilMap.getList(result2, "data"); String status2 = UtilMap.getString(data2.get(0), "status"); if ("ALL_FAIL".equals(status2)){ String message = UtilMap.getString(data2.get(0), "message"); ydClient.operateData(YDParam.builder() .formInstanceId(formInstId) .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mmx7nk6m, textareaField_mmx7nk6r","入库成功,账号保存失败",message))) .build(), YDConf.FORM_OPERATION.update); }else { ydClient.operateData(YDParam.builder() .formInstanceId(formInstId) .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mmx7nk6m, textareaField_mmx7nk6r","入库成功",""))) .build(), YDConf.FORM_OPERATION.update); } } return McR.success(); } @Override public McR saveYpApplication(Map map) { String formInstId = UtilMap.getString(map, "formInstId"); Map formData = ydClient.queryData(YDParam.builder() .formInstanceId(formInstId) .build(), YDConf.FORM_QUERY.retrieve_id).getFormData(); Map application = new HashMap(); application.put("formSubTypeBizCode","KPSQD");//单据编码(云票系统内维护的) application.put("bizCode", UtilMap.getString(formData,"serialNumberField_mknspz75"));//外部系统中的开票申请单业务编码。必须系统内唯一,用于判断开票申请单是否已导入。 application.put("clientBizCode",UtilMap.getString(formData,"textField_mkxpe3fj"));//收票方bizCode(客户的业务编码(云票系统内维护的))与收票方开票信息字段二选一必填 // application.put("submitterBizCode","18857526310");//提交人工号,单据状态为审批中时必填 todo 暂时固定 周漂 // application.put("applicantBizCode","18857526310");//开票申请人工号 todo 暂时固定 周漂 /*Map clientLegalEntityOaDto = new HashMap();//收票方开票信息(不在云票系统内维护的)与收票方bizCode(客户的业务编码)二选一必填且优先级高于收票方bizCode(客户的业务编码)(也就是当两字段都有值时,忽略客户的业务编码) clientLegalEntityOaDto.put("invoiceTitle",UtilMap.getString(formData,"selectField_mkxmix7e"));//名称 clientLegalEntityOaDto.put("dutyParagraph",UtilMap.getString(formData,"textField_mm2wj87l"));//税号 clientLegalEntityOaDto.put("account",UtilMap.getString(formData,"textField_mm2wj87u"));//账号 clientLegalEntityOaDto.put("bankBranchName",UtilMap.getString(formData,"textField_mm2wj87t"));//银行 application.put("clientLegalEntityOaDto",clientLegalEntityOaDto);*/ application.put("legalEntityBizCode",UtilMap.getString(formData,"textField_mm2wj87x"));//公司主体code(后续传税号) application.put("estimatedDate",System.currentTimeMillis());//预计开票时间 String fplx = UtilMap.getString(formData, "selectField_mkdnuvem");//发票类型 String estimatedInvoiceType = ""; if (!"红冲".equals(fplx)){ estimatedInvoiceType = getEstimatedInvoiceType(fplx, estimatedInvoiceType); application.put("hasRedInvoice",false);//是否负数发票 application.put("redInvoiceReason",UtilMap.getString(formData,"textareaField_mmelm9xt"));//红冲原因 }else { String lzfplx = UtilMap.getString(formData, "textField_mm2wj87n");//蓝字发票类型 estimatedInvoiceType = getEstimatedInvoiceType(lzfplx, estimatedInvoiceType); application.put("hasRedInvoice",true);//是否负数发票 } application.put("estimatedInvoiceType",estimatedInvoiceType);//发票类型 application.put("phoneNumber",UtilMap.getString(formData,"textField_mkdo0azf"));//收票人电话 application.put("email",UtilMap.getString(formData,"textField_mkdo0azn"));//收票邮箱 application.put("applicationComment",UtilMap.getString(formData,"textareaField_mkdo0aze"));//开票备注 Map item = new HashMap(); item.put("productBizCode","1001");//产品bizcode item.put("invoiceName",UtilMap.getString(formData,"textField_mkgarw4d"));//开票名称 item.put("taxPercent",UtilMap.getDouble(formData,"numberField_mkgkboht")/100);//税率 item.put("forexName","CNY");//币种 item.put("exchangeRate",1);//外汇汇率 item.put("taxClassShortCode",UtilMap.getString(formData,"textField_mm49zsli"));//税收分类编码 if (!"红冲".equals(fplx)){ item.put("quantity",1);//数量 item.put("priceWithTax",UtilMap.getDouble(formData,"numberField_mkdo0azb"));//含税单价 }else { item.put("quantity",-1);//数量 item.put("priceWithTax",UtilMap.getDouble(formData,"numberField_mknspz7d"));//含税单价 Map originInvoice = new HashMap(); originInvoice.put("blueInvoiceNumber",UtilMap.getString(formData,"textField_mkxmix7d"));//原蓝字发票号 item.put("blueInvoiceDto",Arrays.asList(originInvoice)); } application.put("items",Arrays.asList(item)); Map result = MkYpUtil.application(Arrays.asList(application)); if (!isTrue(result)){ ydClient.operateData(YDParam.builder() .formInstanceId(formInstId) .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("radioField_mkxripcc, textareaField_mmlzqvn0","开票失败",getErrorMsg(result)))) .useLatestVersion(true) .build(), YDConf.FORM_OPERATION.update); } return McR.success(); } private boolean isTrue(Map result){ String messageCode = UtilMap.getString(result, "messageCode"); if (Objects.nonNull(messageCode) && "SUCCESS".equals(messageCode)){ return true; }else { return false; } } //获取错误信息 private String getErrorMsg(Map result) { String errorMsg = UtilMap.getString(result, "message"); Map data = UtilMap.getMap(result, "data"); if (Objects.nonNull(data)){ List errorData = UtilMap.getList(data, "errorData"); if (Objects.nonNull(errorData) && !errorData.isEmpty()){ for (Map errorDatum : errorData) { errorMsg = errorMsg + ";" + UtilMap.getString(errorDatum, "errorMessage"); } } } return errorMsg; } private static String getEstimatedInvoiceType(String fplx, String estimatedInvoiceType) { switch (fplx){ case "应/免税普票": estimatedInvoiceType = "ELECTRONIC_VAT";break;//电子发票(普通发票)(税号开通全电) case "专票": estimatedInvoiceType = "ELECTRONIC_SPACIAL_VAT";break;//电子发票(增值税专票)(税号开通全电) case "红冲":break; case "形式发票":break; case "收据":break; default:break; } return estimatedInvoiceType; } @Override public void invoiceWriteBack2(Map map) { //获取发票信息 Map calloutParams = UtilMap.getMap(map, "calloutParams"); String serviceType = UtilMap.getString(map, "serviceType"); Map bizData = UtilMap.getMap(calloutParams, "bizData"); if ("INVOICE_VAT_INVOICED_NOTIFY_AR".equals(serviceType)){ //发票开具成功后回调 String bizCode = UtilMap.getString(bizData, "bizCode");//发票号码 String invoiceNumber = UtilMap.getString(bizData, "invoiceNumber");//发票号码 String pdfUrl = UtilMap.getString(bizData, "pdfUrl");//pdf文件下载地址 String downloadPageUrl = UtilMap.getString(bizData, "downloadPageUrl");//发票下载页面链接 List detailItems = (List) UtilMap.getList(bizData, "detailItems"); List documentCorrelates = UtilMap.getList(detailItems.get(0), "documentCorrelates"); String lsh = UtilMap.getString(documentCorrelates.get(0), "bizCode");//开票申请单编号 //回写宜搭 Map formData = new HashMap(); formData.put("radioField_mkxripcc","开票成功"); formData.put("textField_mkxripc6",invoiceNumber); formData.put("textField_mm3aixk0",downloadPageUrl); formData.put("textareaField_mmlzqvn0",""); if (Strings.isNotBlank(pdfUrl)){ String fileName = invoiceNumber + ".pdf"; String downloadPath = downloadFilePath + fileName; downloadFile(pdfUrl,downloadPath);//下载pdf发票 String downloadUri = downloadUrl + "/files/" + fileName + "?option=download" + fileName; String previewUri = downloadUrl + "/files/"+fileName+"?option=preview" + fileName; Map attachmentField = new HashMap(); attachmentField.put("downloadUrl",downloadUri); attachmentField.put("name",fileName); attachmentField.put("previewUrl",previewUri); attachmentField.put("url",downloadUri); attachmentField.put("ext","pdf"); formData.put("attachmentField_mkxripc5",Arrays.asList(attachmentField)); } ydClient.operateData(YDParam.builder() .formInstanceId(bizCode) .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_mknspz75",lsh))) .formUuid("FORM-A9A47B0365DB437F8F4C8E01B4468220K7GU") .formDataJson(JSONObject.toJSONString(formData)) .build(), YDConf.FORM_OPERATION.upsert); }else if ("INVOICE_APPLICATION_VAT_FAIL_NOTIFY_AR".equals(serviceType)){ //开票失败后回调 String invoiceErrorMsg = UtilMap.getString(bizData, "invoiceErrorMsg"); String bizCode = UtilMap.getString(bizData, "bizCode"); } } @Override public McR saveBxReimbursement(Map map) { String formInstId = UtilMap.getString(map, "formInstId"); Map formData = ydClient.queryData(YDParam.builder() .formInstanceId(formInstId) .build(), YDConf.FORM_QUERY.retrieve_id).getFormData(); String type = UtilMap.getString(formData, "radioField_mkkmij3b");//需求单类型 String formSubTypeBizCode = "FT208629766551519240";//项目支付单 Double amt = UtilMap.getDouble(formData, "numberField_mkkmij6i"); String empId = ""; String deptBusinessCode = ""; String ydfqr = UtilMap.getString(formData, "textField_mmwvodde");//宜搭发起人工号 if (amt >= 5000){ //支付金额>=5000元,每刻发起人为宜搭采购单据发起人;每刻中的【费用承担部门】实际为采购单发起人所在部门,非每刻单据发起人部门 Map employeeDetails = MkBxUtil.employeeDetails(UtilMap.map("employeeIds", Arrays.asList(ydfqr))); if (Objects.nonNull(employeeDetails)){ List departments = UtilMap.getList(employeeDetails, "departments"); deptBusinessCode = UtilMap.getString(departments.get(0), "businessCode"); empId = ydfqr; }else { empId = "002";//默认沃洲洋 deptBusinessCode = "DI203800035494740082";//默认DI203800035494740082 } }else { //支付金额<5000元,每刻发起人为宜搭采购单据中的中台采购;每刻中的【费用承担部门】实际为采购单发起人所在部门,非每刻单据发起人部门 Map employeeDetails = MkBxUtil.employeeDetails(UtilMap.map("employeeIds", Arrays.asList(ydfqr))); if (Objects.nonNull(employeeDetails)){ List departments = UtilMap.getList(employeeDetails, "departments"); deptBusinessCode = UtilMap.getString(departments.get(0), "businessCode"); }else { deptBusinessCode = "DI203800035494740082";//默认DI203800035494740082 } String ztcggh = UtilMap.getString(formData, "textField_mmwvfb97");//中台采购工号 Map employeeDetails2 = MkBxUtil.employeeDetails(UtilMap.map("employeeIds", Arrays.asList(ztcggh))); if (Objects.nonNull(employeeDetails2)){ empId = ztcggh; }else { empId = "002";//默认沃洲洋 } } String submittedUserEmployeeId = empId;//提单人工号 String legalEntityBizCode = UtilMap.getString(formData, "textField_mmd6hio7");//公司抬头编码 String coverUserEmployeeId = empId;//承担人工号 String coverDepartmentBizCode = deptBusinessCode;//承担部门编码 String xqbh = UtilMap.getString(formData, "serialNumberField_mkkmij3o");//需求编号 long ldjssj = UtilMap.getLong(formData, "dateField_mkdf8q8q");//落地结束时间 String isFree = "FREE需求".equals(type) ? "是" : "否";//是否free String isDdf = "是".equals(UtilMap.getString(formData, "radioField_mkf2quln")) ? "1" : "2";//是否代垫付 String xmsssyb = UtilMap.getString(formData, "selectField_mkdedkv7");//项目所属事业部 String projectCode = UtilMap.getString(formData, "textField_mmoh6nvx");//项目编码 //针对多供应商分期付款拆分多条每刻项目支付单 if ("常规需求".equals(type)){ List detailList = UtilMap.getList(formData, "tableField_mkkmij56");//常规-采购明细 int index = 0; for (Map detail : detailList) { index++; String uuid = UtilMap.getString(detail, "textField_mmvhqm0q");//子表uuid Map body = new HashMap(); body.put("formCode",xqbh + "-" + index);//有值时会使用该值作为单据号 body.put("formSubTypeBizCode",formSubTypeBizCode);//表单类型的业务编号 body.put("submittedUserEmployeeId",submittedUserEmployeeId);//提单人工号 body.put("reimburseName",UtilMap.getString(detail,"textareaField_mkkmij5i"));//报销事由 body.put("legalEntityBizCode",legalEntityBizCode);//公司抬头编码 body.put("coverUserEmployeeId",coverUserEmployeeId);//承担人工号 body.put("coverDepartmentBizCode",coverDepartmentBizCode);//承担部门编码 body.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmbmohrb"));//往来单位编码 Map customObject = new HashMap(); customObject.put("CF4",new HashMap(){{put("currentTime",ldjssj);}});//落地结束时间 customObject.put("CF3",new HashMap(){{put("currentTime",UtilMap.getLong(detail,"dateField_mmvhqm0u"));}});//期望支付日期 customObject.put("CF6",isFree);////free 是;否 customObject.put("CF5",isDdf);//代垫付 是:1 ; 否:2 customObject.put("CF2",xmsssyb);//项目所属事业部 customObject.put("CF1",projectCode);//项目 customObject.put("CF7",UtilMap.getString(detail,"numberField_mmwt2wcn"));//逾期天数 body.put("customObject",customObject); //报销单费用导入 Map expenseListItem = new HashMap(); Map consumeAmount = new HashMap(); consumeAmount.put("amount",String.format("%.2f", UtilMap.getDouble(detail,"numberField_mkkmij5e")));//结算金额 consumeAmount.put("currency","CNY"); expenseListItem.put("consumeAmount",consumeAmount); expenseListItem.put("corpExpense",true);//是否对公费用,需要填写true String gysej = UtilMap.getString(detail, "selectField_mkkkw28y");//供应商二级 expenseListItem.put("expenseTypeBizCode",MkBxUtil.expenseTypeSearch(UtilMap.map("keyword",gysej)));//费用类型业务编码 expenseListItem.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票) expenseListItem.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填) expenseListItem.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填) expenseListItem.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmbmohrb"));//往来单位业务编码 Map consumeLocation = new HashMap(); consumeLocation.put("cityPair",null); consumeLocation.put("location","110001");//todo 暂时写死 110001 北京 expenseListItem.put("consumeLocation",consumeLocation); expenseListItem.put("corpExpenseResponsibleEmpIds",Arrays.asList("002"));//责任人/业务经办人(预付未到票/到票部分支付或不支付 两种场景必填) todo 暂时写死 002 wzy Map body2 = new HashMap(); body2.put("employeeId","002");//需要导入的对应员工的工号 body2.put("expenseList",Arrays.asList(expenseListItem)); List expenseCodes = MkBxUtil.receiveExpense(body2); body.put("expenseCodes",expenseCodes);//费用类型业务编码 //收款账户 Map payeeAccount = new HashMap(); payeeAccount.put("bankAcctName",UtilMap.getString(detail,"textField_mkkmij6z"));//账户名 payeeAccount.put("bankAcctNumber",UtilMap.getString(detail,"textField_mkkmij6y"));//银行账户 payeeAccount.put("paymentType","BANK");//账户类型;ALIPAY-支付宝,BANK-银行账户,CASH-现金 payeeAccount.put("accountType","CORP");//收款账户类型:个人(员工)-PERSONAL,公司(往来单位)-CORP body.put("payeeAccount",payeeAccount); body.put("stagingFlag",true);//暂存标识,默认为false表示不暂存 Map result = MkBxUtil.receiveReimburse(body); } }else { List detailList = UtilMap.getList(formData, "tableField_mkkmij61");//free-采购明细 int index = 0; for (Map detail : detailList) { index ++; String uuid = UtilMap.getString(detail, "textField_mmvhqm0s");//子表uuid Map body = new HashMap(); // body.put("formCode",xqbh + "-" + uuid);//有值时会使用该值作为单据号 body.put("formCode",xqbh + "-" +index);//有值时会使用该值作为单据号 body.put("formSubTypeBizCode",formSubTypeBizCode);//表单类型的业务编号 body.put("submittedUserEmployeeId",submittedUserEmployeeId);//提单人工号 body.put("reimburseName","FREE-" + UtilMap.getString(detail,"selectField_mkkixdd7"));//报销事由 body.put("legalEntityBizCode",legalEntityBizCode);//公司抬头编码 body.put("coverUserEmployeeId",coverUserEmployeeId);//承担人工号 body.put("coverDepartmentBizCode",coverDepartmentBizCode);//承担部门编码 body.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmekbfa2"));//往来单位编码 Map customObject = new HashMap(); customObject.put("CF4",new HashMap(){{put("currentTime",ldjssj);}});//落地结束时间 customObject.put("CF3",new HashMap(){{put("currentTime",UtilMap.getLong(detail,"dateField_mkkkw298"));}});//期望支付日期 customObject.put("CF6",isFree);//free 是;否 customObject.put("CF5",isDdf);//代垫付 是:1 ; 否:2 customObject.put("CF2",xmsssyb);//项目所属事业部 customObject.put("CF1",projectCode);//项目 customObject.put("CF7",UtilMap.getString(detail,"numberField_mmwswtkx"));//逾期天数 body.put("customObject",customObject); //报销单费用导入 Map expenseListItem = new HashMap(); Map consumeAmount = new HashMap(); consumeAmount.put("amount",String.format("%.2f", UtilMap.getDouble(detail,"numberField_mkkmij6p")));//结算金额 consumeAmount.put("currency","CNY"); expenseListItem.put("consumeAmount",consumeAmount); expenseListItem.put("corpExpense",true);//是否对公费用,需要填写true String gysej = UtilMap.getString(detail, "selectField_mmwuzaql");//供应商二级 expenseListItem.put("expenseTypeBizCode",MkBxUtil.expenseTypeSearch(UtilMap.map("keyword",gysej)));//费用类型业务编码 expenseListItem.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票) expenseListItem.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填) expenseListItem.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填) expenseListItem.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmekbfa2"));//往来单位业务编码 Map consumeLocation = new HashMap(); consumeLocation.put("cityPair",null); consumeLocation.put("location","110001");//todo 暂时写死 110001 北京 expenseListItem.put("consumeLocation",consumeLocation); expenseListItem.put("corpExpenseResponsibleEmpIds",Arrays.asList("002"));//责任人/业务经办人(预付未到票/到票部分支付或不支付 两种场景必填) todo 暂时写死 002 wzy Map body2 = new HashMap(); body2.put("employeeId","002");//需要导入的对应员工的工号 body2.put("expenseList",Arrays.asList(expenseListItem)); List expenseCodes = MkBxUtil.receiveExpense(body2); body.put("expenseCodes",expenseCodes);//费用类型业务编码 //收款账户 Map payeeAccount = new HashMap(); payeeAccount.put("bankAcctName",UtilMap.getString(detail,"textField_mketkvxa"));//账户名 payeeAccount.put("bankAcctNumber",UtilMap.getString(detail,"textField_mketkvxc"));//银行账户 payeeAccount.put("paymentType","BANK");//账户类型;ALIPAY-支付宝,BANK-银行账户,CASH-现金 payeeAccount.put("accountType","CORP");//收款账户类型:个人(员工)-PERSONAL,公司(往来单位)-CORP body.put("payeeAccount",payeeAccount); body.put("stagingFlag",true);//暂存标识,默认为false表示不暂存 Map result = MkBxUtil.receiveReimburse(body); } } /*Map body = new HashMap(); body.put("formCode",UtilMap.getString(formData,"serialNumberField_mkkmij3o"));//有值时会使用该值作为单据号 body.put("formSubTypeBizCode","FT208629766551519240");//表单类型的业务编号 todo 暂时写死 FT208629766551519240 宜搭支付单 body.put("submittedUserEmployeeId","002");//提单人工号 todo 暂时写死 002 wzy body.put("reimburseName",UtilMap.getString(formData,"textareaField_mmbmohr9"));//报销事由 body.put("legalEntityBizCode",UtilMap.getString(formData,"textField_mmd6hio7"));//公司抬头编码 body.put("coverUserEmployeeId","002");//承担人工号 todo 暂时写死 002 wzy body.put("coverDepartmentBizCode","DI203800035494740082");//承担部门编码 todo 暂时写死 DI203800035494740082 Map customObject = new HashMap(); customObject.put("CF4",new HashMap(){{put("currentTime",UtilMap.getLong(formData,"dateField_mkdf8q8q"));}});//落地结束时间 customObject.put("CF3",new HashMap(){{put("currentTime",UtilMap.getLong(formData,"dateField_mkkkw298"));}});//预计支付日期 customObject.put("CF6",UtilMap.getString(formData,"radioField_mkf2quln"));////free 是;否 customObject.put("CF5","是".equals(UtilMap.getString(formData,"radioField_mkf2quln")) ? "1" : "2");//代垫付 是:1 ; 否:2 customObject.put("CF2",UtilMap.getString(formData,"selectField_mkdedkv7"));//项目所属事业部 customObject.put("CF1",UtilMap.getString(formData,"textField_mmoh6nvx"));//项目 body.put("customObject",customObject); List expenseCodes = new ArrayList<>(); List collectionSchedule = new ArrayList<>(); List expenseList = new ArrayList<>(); if ("常规需求".equals(type)){ List detailList = UtilMap.getList(formData, "tableField_mkkmij56");//常规-采购明细 for (Map result : detailList) { Map item = new HashMap(); Map consumeAmount = new HashMap(); consumeAmount.put("amount",String.format("%.2f", UtilMap.getDouble(result,"numberField_mkkmij5e")));//结算金额 consumeAmount.put("currency","CNY"); item.put("consumeAmount",consumeAmount); item.put("corpExpense",true);//是否对公费用,需要填写true item.put("expenseTypeBizCode","200140");//费用类型业务编码 todo 暂时写死 200140 其他费用 item.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票) item.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填) item.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填) item.put("tradingPartnerBizCode",UtilMap.getString(result,"textField_mmbmohrb"));//往来单位业务编码 Map consumeLocation = new HashMap(); consumeLocation.put("cityPair",null); consumeLocation.put("location","110001"); item.put("consumeLocation",consumeLocation); item.put("corpExpenseResponsibleEmpIds",Arrays.asList("002"));//责任人/业务经办人(预付未到票/到票部分支付或不支付 两种场景必填) todo 暂时写死 002 wzy expenseList.add(item); Map collectionScheduleItem = new HashMap(); Map payeeAccount = new HashMap(); payeeAccount.put("bankAcctName",UtilMap.getString(result,"textField_mkkmij6z"));//账户名 payeeAccount.put("bankAcctNumber",UtilMap.getString(result,"textField_mkkmij6y"));//银行账户 payeeAccount.put("paymentType","BANK");//账户类型;ALIPAY-支付宝,BANK-银行账户,CASH-现金 payeeAccount.put("accountType","CORP");//收款账户类型:个人(员工)-PERSONAL,公司(往来单位)-CORP collectionScheduleItem.put("payeeAccount",payeeAccount); collectionScheduleItem.put("collectionTradingPartnerBizCode",UtilMap.getString(result,"textField_mmbmohrb"));//收款往来单位编码 collectionScheduleItem.put("amountRatio",0);//收款比例 collectionScheduleItem.put("amount",new HashMap<>(consumeAmount));//收款金额 collectionScheduleItem.put("collectionType","BANK");//支付类型 collectionSchedule.add(collectionScheduleItem); } }else { List detailList = UtilMap.getList(formData, "tableField_mkkmij61");//free-采购明细 for (Map result : detailList) { Map item = new HashMap(); Map consumeAmount = new HashMap(); consumeAmount.put("amount",String.format("%.2f", UtilMap.getDouble(result,"numberField_mkkmij6p")));//结算金额 consumeAmount.put("currency","CNY"); item.put("consumeAmount",consumeAmount); item.put("corpExpense",true);//是否对公费用,需要填写true item.put("expenseTypeBizCode","200140");//费用类型业务编码 todo 暂时写死 200140 其他费用 item.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票) item.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填) item.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填) item.put("tradingPartnerBizCode",UtilMap.getString(result,"textField_mmekbfa2"));//往来单位业务编码 Map consumeLocation = new HashMap(); consumeLocation.put("cityPair",null); consumeLocation.put("location","110001"); item.put("consumeLocation",consumeLocation); item.put("corpExpenseResponsibleEmpIds",Arrays.asList("002"));//责任人/业务经办人(预付未到票/到票部分支付或不支付 两种场景必填) todo 暂时写死 002 wzy expenseList.add(item); Map collectionScheduleItem = new HashMap(); Map payeeAccount = new HashMap(); payeeAccount.put("bankAcctName",UtilMap.getString(result,"textField_mketkvxa"));//账户名 payeeAccount.put("bankAcctNumber",UtilMap.getString(result,"textField_mketkvxc"));//银行账户 payeeAccount.put("paymentType","BANK");//账户类型;ALIPAY-支付宝,BANK-银行账户,CASH-现金 payeeAccount.put("accountType","CORP");//收款账户类型:个人(员工)-PERSONAL,公司(往来单位)-CORP collectionScheduleItem.put("payeeAccount",payeeAccount); collectionScheduleItem.put("collectionTradingPartnerBizCode",UtilMap.getString(result,"textField_mmekbfa2"));//收款往来单位编码 collectionScheduleItem.put("amountRatio",0);//收款比例 collectionScheduleItem.put("amount",new HashMap<>(consumeAmount));//收款金额 collectionScheduleItem.put("collectionType","BANK");//支付类型 collectionSchedule.add(collectionScheduleItem); } } //报销单费用导入 Map body2 = new HashMap(); body2.put("employeeId","002");//需要导入的对应员工的工号 body2.put("expenseList",expenseList); expenseCodes = MkBxUtil.receiveExpense(body2); body.put("expenseCodes",expenseCodes);//费用类型业务编码 body.put("collectionSchedule",collectionSchedule);//多人收款,如果已填充该字段,则无需填充上方的收款账户字段,若传多人收款,则paymentSceneBizCode参数必填 body.put("paymentSceneBizCode","DGYSSK");//多人收款场景(支付场景)表单业务编码,需要填写多人收款时必填 body.put("stagingFlag",false);////暂存标识,默认为false表示不暂存 Map result = MkBxUtil.receiveReimburse(body);*/ return McR.success(); } @Override public McR saveYpClient(Map map) { String formInstId = UtilMap.getString(map, "formInstId"); Map formData = ydClient.queryData(YDParam.builder() .formInstanceId(formInstId) .build(), YDConf.FORM_QUERY.retrieve_id).getFormData(); Map customerObj = new HashMap(); customerObj.put("bizCode",UtilMap.getString(formData,"serialNumberField_mkddjwy2"));//客户编码, 系统内唯一。 customerObj.put("name",UtilMap.getString(formData,"textField_mkddjwy3"));//客户名称,系统内唯一 customerObj.put("type","CORP");//客户类型: CORP (公司,默认), SELF_EMPLOYED(个体经营商) customerObj.put("nameAutoCode",false); customerObj.put("status","ENABLED");//客户状态:DISABLED("禁用" ,默认) ENABLED("启用") List contacts = new ArrayList<>(); List contactList = UtilMap.getList(formData, "tableField_mkddjwyv"); for (Map contact : contactList) { Map contactObj = new HashMap(); contactObj.put("name",UtilMap.getString(contact,"textField_mkddjwyw"));//联系人姓名 contactObj.put("phoneNumber",UtilMap.getString(contact,"textField_mkddjwyx"));//联系电话 contactObj.put("position",UtilMap.getString(contact,"textField_mkg8toy9"));//职位 contacts.add(contactObj); } customerObj.put("contacts",contacts);//联系人列表 List invoiceTitles = new ArrayList<>(); Map invoiceTitle = new HashMap(); invoiceTitle.put("invoiceTitle",UtilMap.getString(formData,"textField_mkddjwyr"));//发票抬头 invoiceTitle.put("dutyParagraph",UtilMap.getString(formData,"textField_mkddjwys"));//税号 invoiceTitle.put("bizCode",UtilMap.getString(formData,"textField_mkddjwys"));//业务编码 invoiceTitle.put("bankBranchName",UtilMap.getString(formData,"textField_mkddjwyt"));//开户行 invoiceTitle.put("account",UtilMap.getString(formData,"textField_mkddjwyu"));//银行账户 invoiceTitles.add(invoiceTitle); customerObj.put("invoiceTitles",invoiceTitles);//发票抬头列表 MkYpUtil.saveClient(Arrays.asList(customerObj)); return McR.success(); } @Override public void invoiceWriteBack(Map map) { Map calloutParams = UtilMap.getMap(map, "calloutParams"); Map bizData = UtilMap.getMap(calloutParams, "bizData"); List relatedDocuments = UtilMap.getList(bizData, "relatedDocuments"); for (Map relatedDocument : relatedDocuments) { String formType = UtilMap.getString(relatedDocument, "formType"); if ("RECEIVABLE_AR".equals(formType)){ String bizCode = UtilMap.getString(relatedDocument, "bizCode"); //应收单查询 Map body = new HashMap(); body.put("bizCodes",Arrays.asList(bizCode)); body.put("pageNum",1); body.put("pageSize",1); Map receivable = MkYpUtil.searchReceivable(body).get(0); Map invoice = ((List) UtilMap.getList(receivable, "invoiceList")).get(0); String invoiceNumber = UtilMap.getString(invoice, "invoiceNumber");//发票号码 Double receivedAmount = UtilMap.getDouble(receivable, "receivedAmount");//已收金额 List data = (List) ydClient.queryData(YDParam.builder() .formUuid("FORM-A9A47B0365DB437F8F4C8E01B4468220K7GU") .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mkxripc6",invoiceNumber))) .build(), YDConf.FORM_QUERY.retrieve_list).getData(); String formInstanceId = UtilMap.getString(data.get(0), "formInstanceId"); ydClient.operateData(YDParam.builder() .formInstanceId(formInstanceId) .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_ml8t9c4u",receivedAmount))) .build(), YDConf.FORM_OPERATION.update); return; } } } @Override public void invoiceWriteBack3(Map map) { String formCode = UtilMap.getString(map, "formCode"); String operation = UtilMap.getString(map, "operation"); if ("FORM_COMPLETE".equals(operation)){ //完成 }else if ("FORM_REJECT".equals(operation)){ //驳回 } String[] split = formCode.split("-"); String bh = split[0];//采购需求编号/直接采购单编号 String uuid = split[1];//子表uuid Map formData = UtilMap.getMap(map, "formData"); Map baseAmount = UtilMap.getMap(formData, "baseAmount"); Map value = UtilMap.getMap(baseAmount, "value"); String text = UtilMap.getString(value, "text"); double amt = Double.parseDouble(text); if (formCode.contains("需求")){ //采购需求&结算 List data = (List) ydClient.queryData(YDParam.builder() .formUuid("FORM-C8C1FBBA781C4C5EBAC487C07BC5A86AD2HO") .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_mkkmij3o", bh))) .build(), YDConf.FORM_QUERY.retrieve_list).getData(); String formInstanceId = UtilMap.getString(data.get(0), "formInstanceId"); Map ydFormData = UtilMap.getMap(data.get(0), "formData"); List detailList = UtilMap.getList(ydFormData, "tableField_mkkmij56"); for (Map detail : detailList) { if (uuid.equals(UtilMap.getString(detail, "textField_mmvhqm0q"))){ detail.put("selectField_mmvhqm0p","已付款"); break; } } Double yzf = UtilMap.getDouble(ydFormData, "numberField_mkf2qumf");//已支付 ydFormData.put("numberField_mkf2qumf",yzf + amt); ydClient.operateData(YDParam.builder() .formInstanceId(formInstanceId) .updateFormDataJson(JSONObject.toJSONString(ydFormData )) .build(), YDConf.FORM_OPERATION.update); }else { //直接采购结算单 List data = (List) ydClient.queryData(YDParam.builder() .formUuid("FORM-1AFEDDA034C74F0DB18FA60C941CB56EHUUG") .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_mkkmij3o", bh))) .build(), YDConf.FORM_QUERY.retrieve_list).getData(); String formInstanceId = UtilMap.getString(data.get(0), "formInstanceId"); ydClient.operateData(YDParam.builder() .formInstanceId(formInstanceId) .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_mkf2qumf",amt))) .build(), YDConf.FORM_OPERATION.update); } } @Override public McR saveBxReimbursement2(Map map) { String formInstId = UtilMap.getString(map, "formInstId"); Map formData = ydClient.queryData(YDParam.builder() .formInstanceId(formInstId) .build(), YDConf.FORM_QUERY.retrieve_id).getFormData(); String type = UtilMap.getString(formData, "radioField_mkkmij3b");//需求单类型 String formSubTypeBizCode = "FT208629766551519240";//项目支付单 Double amt = UtilMap.getDouble(formData, "numberField_mkkmij6i"); String empId = ""; String deptBusinessCode = ""; String ydfqr = UtilMap.getString(formData, "textField_mmwvodde");//宜搭发起人工号 if (amt >= 5000){ //支付金额>=5000元,每刻发起人为宜搭采购单据发起人;每刻中的【费用承担部门】实际为采购单发起人所在部门,非每刻单据发起人部门 Map employeeDetails = MkBxUtil.employeeDetails(UtilMap.map("employeeIds", Arrays.asList(ydfqr))); if (Objects.nonNull(employeeDetails)){ List departments = UtilMap.getList(employeeDetails, "departments"); deptBusinessCode = UtilMap.getString(departments.get(0), "businessCode"); empId = ydfqr; }else { empId = "002";//默认沃洲洋 deptBusinessCode = "DI203800035494740082";//默认DI203800035494740082 } }else { //支付金额<5000元,每刻发起人为宜搭采购单据中的中台采购;每刻中的【费用承担部门】实际为采购单发起人所在部门,非每刻单据发起人部门 Map employeeDetails = MkBxUtil.employeeDetails(UtilMap.map("employeeIds", Arrays.asList(ydfqr))); if (Objects.nonNull(employeeDetails)){ List departments = UtilMap.getList(employeeDetails, "departments"); deptBusinessCode = UtilMap.getString(departments.get(0), "businessCode"); }else { deptBusinessCode = "DI203800035494740082";//默认DI203800035494740082 } String ztcggh = UtilMap.getString(formData, "textField_mmwvfb97");//中台采购工号 Map employeeDetails2 = MkBxUtil.employeeDetails(UtilMap.map("employeeIds", Arrays.asList(ztcggh))); if (Objects.nonNull(employeeDetails2)){ empId = ztcggh; }else { empId = "002";//默认沃洲洋 } } String submittedUserEmployeeId = empId;//提单人工号 String legalEntityBizCode = UtilMap.getString(formData, "textField_mmd6hio7");//公司抬头编码 String coverUserEmployeeId = empId;//承担人工号 String coverDepartmentBizCode = deptBusinessCode;//承担部门编码 String xqbh = UtilMap.getString(formData, "serialNumberField_mkkmij3o");//需求编号 long ldjssj = UtilMap.getLong(formData, "dateField_mkdf8q8q");//落地结束时间 String isFree = "FREE采购".equals(UtilMap.getString(formData, "radioField_mkf2quln")) ? "是" : "否";//是否free String isDdf = "是".equals(UtilMap.getString(formData, "radioField_mkf2qulo")) ? "1" : "2";//是否代垫付 String xmsssyb = UtilMap.getString(formData, "selectField_mkdedkv7");//项目所属事业部 String projectCode = UtilMap.getString(formData, "textField_mmoh6nvx");//项目编码 //针对多供应商分期付款拆分多条每刻项目支付单 if ("常规采购".equals(type)){ List detailList = UtilMap.getList(formData, "tableField_mkkmij56");//常规-采购明细 int index = 0; for (Map detail : detailList) { index++; String uuid = UtilMap.getString(detail, "textField_mmvhqm0q");//子表uuid Map body = new HashMap(); body.put("formCode",xqbh + "-" + index);//有值时会使用该值作为单据号 body.put("formSubTypeBizCode",formSubTypeBizCode);//表单类型的业务编号 body.put("submittedUserEmployeeId",submittedUserEmployeeId);//提单人工号 body.put("reimburseName",UtilMap.getString(detail,"textareaField_mkkmij5i"));//报销事由 body.put("legalEntityBizCode",legalEntityBizCode);//公司抬头编码 body.put("coverUserEmployeeId",coverUserEmployeeId);//承担人工号 body.put("coverDepartmentBizCode",coverDepartmentBizCode);//承担部门编码 body.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmbmohrb"));//往来单位编码 Map customObject = new HashMap(); customObject.put("CF4",new HashMap(){{put("currentTime",ldjssj);}});//落地结束时间 customObject.put("CF3",new HashMap(){{put("currentTime",UtilMap.getLong(detail,"dateField_mkkkw298"));}});//期望支付日期 customObject.put("CF6",isFree);//free 是;否 customObject.put("CF5",isDdf);//代垫付 是:1 ; 否:2 customObject.put("CF2",xmsssyb);//项目所属事业部 customObject.put("CF1",projectCode);//项目 customObject.put("CF7",UtilMap.getString(detail,"numberField_mmwswtkv"));//逾期天数 body.put("customObject",customObject); //报销单费用导入 Map expenseListItem = new HashMap(); Map consumeAmount = new HashMap(); consumeAmount.put("amount",String.format("%.2f", UtilMap.getDouble(detail,"numberField_mkkmij5e")));//结算金额 consumeAmount.put("currency","CNY"); expenseListItem.put("consumeAmount",consumeAmount); expenseListItem.put("corpExpense",true);//是否对公费用,需要填写true String gysej = UtilMap.getString(detail, "selectField_mkkkw28y");//供应商二级 expenseListItem.put("expenseTypeBizCode",MkBxUtil.expenseTypeSearch(UtilMap.map("keyword",gysej)));//费用类型业务编码 expenseListItem.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票) expenseListItem.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填) expenseListItem.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填) expenseListItem.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmbmohrb"));//往来单位业务编码 Map consumeLocation = new HashMap(); consumeLocation.put("cityPair",null); consumeLocation.put("location","110001");//todo 暂时写死 110001 北京 expenseListItem.put("consumeLocation",consumeLocation); expenseListItem.put("corpExpenseResponsibleEmpIds",Arrays.asList("002"));//责任人/业务经办人(预付未到票/到票部分支付或不支付 两种场景必填) todo 暂时写死 002 wzy Map body2 = new HashMap(); body2.put("employeeId","002");//需要导入的对应员工的工号 body2.put("expenseList",Arrays.asList(expenseListItem)); List expenseCodes = MkBxUtil.receiveExpense(body2); body.put("expenseCodes",expenseCodes);//费用类型业务编码 //收款账户 Map payeeAccount = new HashMap(); payeeAccount.put("bankAcctName",UtilMap.getString(detail,"textField_mkkmij6z"));//账户名 payeeAccount.put("bankAcctNumber",UtilMap.getString(detail,"textField_mkkmij6y"));//银行账户 payeeAccount.put("paymentType","BANK");//账户类型;ALIPAY-支付宝,BANK-银行账户,CASH-现金 payeeAccount.put("accountType","CORP");//收款账户类型:个人(员工)-PERSONAL,公司(往来单位)-CORP body.put("payeeAccount",payeeAccount); body.put("stagingFlag",true);//暂存标识,默认为false表示不暂存 Map result = MkBxUtil.receiveReimburse(body); } }else { List detailList = UtilMap.getList(formData, "tableField_mkkmij61");//free-采购明细 int index = 0; for (Map detail : detailList) { index ++; String uuid = UtilMap.getString(detail, "textField_mmvhqm0s");//子表uuid Map body = new HashMap(); // body.put("formCode",xqbh + "-" + uuid);//有值时会使用该值作为单据号 body.put("formCode",xqbh + "-" +index);//有值时会使用该值作为单据号 body.put("formSubTypeBizCode",formSubTypeBizCode);//表单类型的业务编号 body.put("submittedUserEmployeeId",submittedUserEmployeeId);//提单人工号 body.put("reimburseName","FREE-" + UtilMap.getString(detail,"selectField_mkkixdd7"));//报销事由 body.put("legalEntityBizCode",legalEntityBizCode);//公司抬头编码 body.put("coverUserEmployeeId",coverUserEmployeeId);//承担人工号 body.put("coverDepartmentBizCode",coverDepartmentBizCode);//承担部门编码 body.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmekbfa2"));//往来单位编码 Map customObject = new HashMap(); customObject.put("CF4",new HashMap(){{put("currentTime",ldjssj);}});//落地结束时间 customObject.put("CF3",new HashMap(){{put("currentTime",UtilMap.getLong(detail,"dateField_mmvhtdy4"));}});//期望支付日期 customObject.put("CF6",isFree);//free 是;否 customObject.put("CF5",isDdf);//代垫付 是:1 ; 否:2 customObject.put("CF2",xmsssyb);//项目所属事业部 customObject.put("CF1",projectCode);//项目 customObject.put("CF7",UtilMap.getString(detail,"numberField_mmwswtkx"));//逾期天数 body.put("customObject",customObject); //报销单费用导入 Map expenseListItem = new HashMap(); Map consumeAmount = new HashMap(); consumeAmount.put("amount",String.format("%.2f", UtilMap.getDouble(detail,"numberField_mkkmij6p")));//结算金额 consumeAmount.put("currency","CNY"); expenseListItem.put("consumeAmount",consumeAmount); expenseListItem.put("corpExpense",true);//是否对公费用,需要填写true String gysej = UtilMap.getString(detail, "selectField_mmwuzaql");//供应商二级 expenseListItem.put("expenseTypeBizCode",MkBxUtil.expenseTypeSearch(UtilMap.map("keyword",gysej)));//费用类型业务编码 expenseListItem.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票) expenseListItem.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填) expenseListItem.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填) expenseListItem.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmekbfa2"));//往来单位业务编码 Map consumeLocation = new HashMap(); consumeLocation.put("cityPair",null); consumeLocation.put("location","110001");//todo 暂时写死 110001 北京 expenseListItem.put("consumeLocation",consumeLocation); expenseListItem.put("corpExpenseResponsibleEmpIds",Arrays.asList("002"));//责任人/业务经办人(预付未到票/到票部分支付或不支付 两种场景必填) todo 暂时写死 002 wzy Map body2 = new HashMap(); body2.put("employeeId","002");//需要导入的对应员工的工号 body2.put("expenseList",Arrays.asList(expenseListItem)); List expenseCodes = MkBxUtil.receiveExpense(body2); body.put("expenseCodes",expenseCodes);//费用类型业务编码 //收款账户 Map payeeAccount = new HashMap(); payeeAccount.put("bankAcctName",UtilMap.getString(detail,"textField_mketkvxa"));//账户名 payeeAccount.put("bankAcctNumber",UtilMap.getString(detail,"textField_mketkvxc"));//银行账户 payeeAccount.put("paymentType","BANK");//账户类型;ALIPAY-支付宝,BANK-银行账户,CASH-现金 payeeAccount.put("accountType","CORP");//收款账户类型:个人(员工)-PERSONAL,公司(往来单位)-CORP body.put("payeeAccount",payeeAccount); body.put("stagingFlag",true);//暂存标识,默认为false表示不暂存 Map result = MkBxUtil.receiveReimburse(body); } } return McR.success(); } //文件下载到本地 private void downloadFile(String downloadUri,String downloadPath){ try { URL url = new URL(downloadUri); HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); int responseCode = httpConn.getResponseCode(); // 检查HTTP响应代码是否为200 if (responseCode == HttpURLConnection.HTTP_OK) { InputStream inputStream = httpConn.getInputStream(); FileOutputStream outputStream = new FileOutputStream(downloadPath); byte[] buffer = new byte[4096]; int bytesRead = -1; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } outputStream.close(); inputStream.close(); } else { System.out.println("无法下载文件。HTTP响应代码: " + responseCode); } httpConn.disconnect(); }catch (Exception e){ throw new RuntimeException(e); } } }