SikuServiceImpl.java 59 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066
  1. package com.malk.siku.service.impl;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.malk.server.aliwork.YDConf;
  4. import com.malk.server.aliwork.YDParam;
  5. import com.malk.server.common.McR;
  6. import com.malk.service.aliwork.YDClient;
  7. import com.malk.siku.service.SikuService;
  8. import com.malk.siku.utils.MkBxUtil;
  9. import com.malk.siku.utils.MkYpUtil;
  10. import com.malk.utils.UtilMap;
  11. import lombok.extern.slf4j.Slf4j;
  12. import org.apache.logging.log4j.util.Strings;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.beans.factory.annotation.Value;
  15. import org.springframework.stereotype.Service;
  16. import java.io.FileOutputStream;
  17. import java.io.InputStream;
  18. import java.net.HttpURLConnection;
  19. import java.net.URL;
  20. import java.util.*;
  21. @Slf4j
  22. @Service
  23. public class SikuServiceImpl implements SikuService {
  24. @Autowired
  25. private YDClient ydClient;
  26. @Value(value = "${mk.downloadFilePath}")
  27. private String downloadFilePath;
  28. @Value(value = "${mk.downloadUrl}")
  29. private String downloadUrl;
  30. @Override
  31. public McR saveTradingPartner(Map map) {
  32. String formInstId = UtilMap.getString(map, "formInstId");
  33. String type = UtilMap.getString(map, "type");
  34. Map formData = ydClient.queryData(YDParam.builder()
  35. .formInstanceId(formInstId)
  36. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  37. Map partner = new HashMap();
  38. if ("客户".equals(type)){
  39. //客户
  40. partner.put("partnerName", "客户");//所属分类名称
  41. partner.put("name", UtilMap.getString(formData,"textField_mkddjwy3"));//往来单位中文名
  42. partner.put("partnerType", "客户");//往来关系,可选值为:"供应商"、"客户"、"供应商,客户"(既是供应商又是客户的情况下以中文逗号分隔(供应商在前))
  43. partner.put("partnerProperty", "公司");//往来性质,可选值为:"公司"、"个体工商户"
  44. partner.put("businessCode", UtilMap.getString(formData,"serialNumberField_mkddjwy2"));//往来单位编码,不超过50个字符
  45. partner.put("taxNumber", UtilMap.getString(formData,"textField_mkddjwys"));//税务登记号,不超过200个字符
  46. partner.put("readOnly", false);//是否只读,默认false。如果为true,那么在每刻系统中往来单位的所有信息(如权限范围、收款账户等)均无法修改。(接口更新操作不受限制)
  47. partner.put("reMark", "");//往来单位备注
  48. partner.put("enabled", true);//是否启用(true:启用;false:禁用)。若该参数为空,新增则默认为true,更新则保持系统内状态。
  49. }else {
  50. //供应商
  51. String hzlx = UtilMap.getString(formData, "radioField_mketkvw7");
  52. partner.put("parentBizCode", "GYS");//所属分类业务编码
  53. partner.put("name", "Free".equals(hzlx) ? UtilMap.getString(formData,"textField_mkkixdd6") : UtilMap.getString(formData,"textField_mketkvv0"));//往来单位中文名
  54. partner.put("partnerType", "供应商");//往来关系,可选值为:"供应商"、"客户"、"供应商,客户"(既是供应商又是客户的情况下以中文逗号分隔(供应商在前))
  55. partner.put("partnerProperty", "Free".equals(hzlx) ? "个体工商户" : "公司");//往来性质,可选值为:"公司"、"个体工商户"
  56. partner.put("businessCode", UtilMap.getString(formData,"serialNumberField_mketkvw4"));//往来单位编码,不超过50个字符
  57. partner.put("taxNumber", "Free".equals(hzlx) ? "" : UtilMap.getString(formData,"textField_mketkvxo"));//税务登记号,不超过200个字符
  58. partner.put("readOnly", false);//是否只读,默认false。如果为true,那么在每刻系统中往来单位的所有信息(如权限范围、收款账户等)均无法修改。(接口更新操作不受限制)
  59. partner.put("reMark", "");//往来单位备注
  60. partner.put("enabled", "启用".equals(UtilMap.getString(formData,"radioField_mketkvw8")));//是否启用(true:启用;false:禁用)。若该参数为空,新增则默认为true,更新则保持系统内状态。
  61. }
  62. Map body = new HashMap();
  63. body.put("partnerList", Arrays.asList(partner));
  64. Map result = MkBxUtil.saveTradingPartner(body);
  65. List<Map> data = UtilMap.getList(result, "data");
  66. String status = UtilMap.getString(data.get(0), "status");
  67. if ("ALL_FAIL".equals(status)){
  68. //保存往来单位失败回写错误信息
  69. String message = UtilMap.getString(data.get(0), "message");
  70. ydClient.operateData(YDParam.builder()
  71. .formInstanceId(formInstId)
  72. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mmx7nk6m, textareaField_mmx7nk6r","入库失败",message)))
  73. .build(), YDConf.FORM_OPERATION.update);
  74. }
  75. //保存往来单位账户
  76. if ("SUCCESS".equals(status)){
  77. Map account = new HashMap();
  78. account.put("businessCode",UtilMap.getString(formData,"serialNumberField_mketkvw4"));
  79. Map accountItem = new HashMap();
  80. accountItem.put("accountName",UtilMap.getString(formData,"textField_mketkvxa"));//账户名称
  81. accountItem.put("accountNumber",UtilMap.getString(formData,"textField_mketkvxc"));//账号
  82. accountItem.put("bankBranchName",UtilMap.getString(formData,"textField_mketkvx8"));//分支行
  83. accountItem.put("accountType","BANK");
  84. account.put("accounts",Arrays.asList(accountItem));
  85. Map result2 = MkBxUtil.saveAccount(Arrays.asList(account));
  86. List<Map> data2 = UtilMap.getList(result2, "data");
  87. String status2 = UtilMap.getString(data2.get(0), "status");
  88. if ("ALL_FAIL".equals(status2)){
  89. String message = UtilMap.getString(data2.get(0), "message");
  90. ydClient.operateData(YDParam.builder()
  91. .formInstanceId(formInstId)
  92. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mmx7nk6m, textareaField_mmx7nk6r","入库成功,账号保存失败",message)))
  93. .build(), YDConf.FORM_OPERATION.update);
  94. }else {
  95. ydClient.operateData(YDParam.builder()
  96. .formInstanceId(formInstId)
  97. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mmx7nk6m, textareaField_mmx7nk6r","入库成功","")))
  98. .build(), YDConf.FORM_OPERATION.update);
  99. }
  100. }
  101. return McR.success();
  102. }
  103. @Override
  104. public McR saveYpApplication(Map map) {
  105. String formInstId = UtilMap.getString(map, "formInstId");
  106. Map formData = ydClient.queryData(YDParam.builder()
  107. .formInstanceId(formInstId)
  108. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  109. Map application = new HashMap();
  110. application.put("formSubTypeBizCode","KPSQD");//单据编码(云票系统内维护的)
  111. application.put("bizCode", UtilMap.getString(formData,"serialNumberField_mknspz75"));//外部系统中的开票申请单业务编码。必须系统内唯一,用于判断开票申请单是否已导入。
  112. application.put("clientBizCode",UtilMap.getString(formData,"textField_mkxpe3fj"));//收票方bizCode(客户的业务编码(云票系统内维护的))与收票方开票信息字段二选一必填
  113. // application.put("submitterBizCode","18857526310");//提交人工号,单据状态为审批中时必填 todo 暂时固定 周漂
  114. // application.put("applicantBizCode","18857526310");//开票申请人工号 todo 暂时固定 周漂
  115. /*Map clientLegalEntityOaDto = new HashMap();//收票方开票信息(不在云票系统内维护的)与收票方bizCode(客户的业务编码)二选一必填且优先级高于收票方bizCode(客户的业务编码)(也就是当两字段都有值时,忽略客户的业务编码)
  116. clientLegalEntityOaDto.put("invoiceTitle",UtilMap.getString(formData,"selectField_mkxmix7e"));//名称
  117. clientLegalEntityOaDto.put("dutyParagraph",UtilMap.getString(formData,"textField_mm2wj87l"));//税号
  118. clientLegalEntityOaDto.put("account",UtilMap.getString(formData,"textField_mm2wj87u"));//账号
  119. clientLegalEntityOaDto.put("bankBranchName",UtilMap.getString(formData,"textField_mm2wj87t"));//银行
  120. application.put("clientLegalEntityOaDto",clientLegalEntityOaDto);*/
  121. application.put("legalEntityBizCode",UtilMap.getString(formData,"textField_mm2wj87x"));//公司主体code(后续传税号)
  122. application.put("estimatedDate",System.currentTimeMillis());//预计开票时间
  123. String fplx = UtilMap.getString(formData, "selectField_mkdnuvem");//发票类型
  124. String estimatedInvoiceType = "";
  125. if (!"红冲".equals(fplx)){
  126. estimatedInvoiceType = getEstimatedInvoiceType(fplx, estimatedInvoiceType);
  127. application.put("hasRedInvoice",false);//是否负数发票
  128. application.put("redInvoiceReason",UtilMap.getString(formData,"textareaField_mmelm9xt"));//红冲原因
  129. }else {
  130. String lzfplx = UtilMap.getString(formData, "textField_mm2wj87n");//蓝字发票类型
  131. estimatedInvoiceType = getEstimatedInvoiceType(lzfplx, estimatedInvoiceType);
  132. application.put("hasRedInvoice",true);//是否负数发票
  133. }
  134. application.put("estimatedInvoiceType",estimatedInvoiceType);//发票类型
  135. application.put("phoneNumber",UtilMap.getString(formData,"textField_mkdo0azf"));//收票人电话
  136. application.put("email",UtilMap.getString(formData,"textField_mkdo0azn"));//收票邮箱
  137. application.put("applicationComment",UtilMap.getString(formData,"textareaField_mkdo0aze"));//开票备注
  138. Map item = new HashMap();
  139. item.put("productBizCode","1001");//产品bizcode
  140. item.put("invoiceName",UtilMap.getString(formData,"textField_mkgarw4d"));//开票名称
  141. item.put("taxPercent",UtilMap.getDouble(formData,"numberField_mkgkboht")/100);//税率
  142. item.put("forexName","CNY");//币种
  143. item.put("exchangeRate",1);//外汇汇率
  144. item.put("taxClassShortCode",UtilMap.getString(formData,"textField_mm49zsli"));//税收分类编码
  145. if (!"红冲".equals(fplx)){
  146. item.put("quantity",1);//数量
  147. item.put("priceWithTax",UtilMap.getDouble(formData,"numberField_mkdo0azb"));//含税单价
  148. }else {
  149. item.put("quantity",-1);//数量
  150. item.put("priceWithTax",UtilMap.getDouble(formData,"numberField_mknspz7d"));//含税单价
  151. Map originInvoice = new HashMap();
  152. originInvoice.put("blueInvoiceNumber",UtilMap.getString(formData,"textField_mkxmix7d"));//原蓝字发票号
  153. item.put("blueInvoiceDto",Arrays.asList(originInvoice));
  154. }
  155. application.put("items",Arrays.asList(item));
  156. Map result = MkYpUtil.application(Arrays.asList(application));
  157. if (!isTrue(result)){
  158. ydClient.operateData(YDParam.builder()
  159. .formInstanceId(formInstId)
  160. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("radioField_mkxripcc, textareaField_mmlzqvn0","开票失败",getErrorMsg(result))))
  161. .useLatestVersion(true)
  162. .build(), YDConf.FORM_OPERATION.update);
  163. }
  164. return McR.success();
  165. }
  166. private boolean isTrue(Map result){
  167. String messageCode = UtilMap.getString(result, "messageCode");
  168. if (Objects.nonNull(messageCode) && "SUCCESS".equals(messageCode)){
  169. return true;
  170. }else {
  171. return false;
  172. }
  173. }
  174. //获取错误信息
  175. private String getErrorMsg(Map result) {
  176. String errorMsg = UtilMap.getString(result, "message");
  177. Map data = UtilMap.getMap(result, "data");
  178. if (Objects.nonNull(data)){
  179. List<Map> errorData = UtilMap.getList(data, "errorData");
  180. if (Objects.nonNull(errorData) && !errorData.isEmpty()){
  181. for (Map errorDatum : errorData) {
  182. errorMsg = errorMsg + ";" + UtilMap.getString(errorDatum, "errorMessage");
  183. }
  184. }
  185. }
  186. return errorMsg;
  187. }
  188. private static String getEstimatedInvoiceType(String fplx, String estimatedInvoiceType) {
  189. switch (fplx){
  190. case "应/免税普票":
  191. estimatedInvoiceType = "ELECTRONIC_VAT";break;//电子发票(普通发票)(税号开通全电)
  192. case "专票":
  193. estimatedInvoiceType = "ELECTRONIC_SPACIAL_VAT";break;//电子发票(增值税专票)(税号开通全电)
  194. case "红冲":break;
  195. case "形式发票":break;
  196. case "收据":break;
  197. default:break;
  198. } return estimatedInvoiceType;
  199. }
  200. @Override
  201. public void invoiceWriteBack2(Map map) {
  202. //获取发票信息
  203. Map calloutParams = UtilMap.getMap(map, "calloutParams");
  204. String serviceType = UtilMap.getString(map, "serviceType");
  205. Map bizData = UtilMap.getMap(calloutParams, "bizData");
  206. if ("INVOICE_VAT_INVOICED_NOTIFY_AR".equals(serviceType)){
  207. //发票开具成功后回调
  208. String bizCode = UtilMap.getString(bizData, "bizCode");//发票号码
  209. String invoiceNumber = UtilMap.getString(bizData, "invoiceNumber");//发票号码
  210. String pdfUrl = UtilMap.getString(bizData, "pdfUrl");//pdf文件下载地址
  211. String downloadPageUrl = UtilMap.getString(bizData, "downloadPageUrl");//发票下载页面链接
  212. List<Map> detailItems = (List<Map>) UtilMap.getList(bizData, "detailItems");
  213. List<Map> documentCorrelates = UtilMap.getList(detailItems.get(0), "documentCorrelates");
  214. String lsh = UtilMap.getString(documentCorrelates.get(0), "bizCode");//开票申请单编号
  215. //回写宜搭
  216. Map formData = new HashMap();
  217. formData.put("radioField_mkxripcc","开票成功");
  218. formData.put("textField_mkxripc6",invoiceNumber);
  219. formData.put("textField_mm3aixk0",downloadPageUrl);
  220. formData.put("textareaField_mmlzqvn0","");
  221. if (Strings.isNotBlank(pdfUrl)){
  222. String fileName = invoiceNumber + ".pdf";
  223. String downloadPath = downloadFilePath + fileName;
  224. downloadFile(pdfUrl,downloadPath);//下载pdf发票
  225. String downloadUri = downloadUrl + "/files/" + fileName + "?option=download" + fileName;
  226. String previewUri = downloadUrl + "/files/"+fileName+"?option=preview" + fileName;
  227. Map attachmentField = new HashMap();
  228. attachmentField.put("downloadUrl",downloadUri);
  229. attachmentField.put("name",fileName);
  230. attachmentField.put("previewUrl",previewUri);
  231. attachmentField.put("url",downloadUri);
  232. attachmentField.put("ext","pdf");
  233. formData.put("attachmentField_mkxripc5",Arrays.asList(attachmentField));
  234. }
  235. ydClient.operateData(YDParam.builder()
  236. .formInstanceId(bizCode)
  237. .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_mknspz75",lsh)))
  238. .formUuid("FORM-A9A47B0365DB437F8F4C8E01B4468220K7GU")
  239. .formDataJson(JSONObject.toJSONString(formData))
  240. .build(), YDConf.FORM_OPERATION.upsert);
  241. }else if ("INVOICE_APPLICATION_VAT_FAIL_NOTIFY_AR".equals(serviceType)){
  242. //开票失败后回调
  243. String invoiceErrorMsg = UtilMap.getString(bizData, "invoiceErrorMsg");
  244. String bizCode = UtilMap.getString(bizData, "bizCode");
  245. }
  246. }
  247. @Override
  248. public McR saveBxReimbursement(Map map) {
  249. String formInstId = UtilMap.getString(map, "formInstId");
  250. Map formData = ydClient.queryData(YDParam.builder()
  251. .formInstanceId(formInstId)
  252. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  253. String type = UtilMap.getString(formData, "radioField_mkkmij3b");//需求单类型
  254. String formSubTypeBizCode = "FT208629766551519240";//项目支付单
  255. Double amt = UtilMap.getDouble(formData, "numberField_mkkmij6i");
  256. String empId = "";
  257. String deptBusinessCode = "";
  258. String ydfqr = UtilMap.getString(formData, "textField_mmwvodde");//宜搭发起人工号
  259. if (amt >= 5000){
  260. //支付金额>=5000元,每刻发起人为宜搭采购单据发起人;每刻中的【费用承担部门】实际为采购单发起人所在部门,非每刻单据发起人部门
  261. Map employeeDetails = MkBxUtil.employeeDetails(UtilMap.map("employeeIds", Arrays.asList(ydfqr)));
  262. if (Objects.nonNull(employeeDetails)){
  263. List<Map> departments = UtilMap.getList(employeeDetails, "departments");
  264. deptBusinessCode = UtilMap.getString(departments.get(0), "businessCode");
  265. empId = ydfqr;
  266. }else {
  267. empId = "002";//默认沃洲洋
  268. deptBusinessCode = "DI203800035494740082";//默认DI203800035494740082
  269. }
  270. }else {
  271. //支付金额<5000元,每刻发起人为宜搭采购单据中的中台采购;每刻中的【费用承担部门】实际为采购单发起人所在部门,非每刻单据发起人部门
  272. Map employeeDetails = MkBxUtil.employeeDetails(UtilMap.map("employeeIds", Arrays.asList(ydfqr)));
  273. if (Objects.nonNull(employeeDetails)){
  274. List<Map> departments = UtilMap.getList(employeeDetails, "departments");
  275. deptBusinessCode = UtilMap.getString(departments.get(0), "businessCode");
  276. }else {
  277. deptBusinessCode = "DI203800035494740082";//默认DI203800035494740082
  278. }
  279. String ztcggh = UtilMap.getString(formData, "textField_mmwvfb97");//中台采购工号
  280. Map employeeDetails2 = MkBxUtil.employeeDetails(UtilMap.map("employeeIds", Arrays.asList(ztcggh)));
  281. if (Objects.nonNull(employeeDetails2)){
  282. empId = ztcggh;
  283. }else {
  284. empId = "002";//默认沃洲洋
  285. }
  286. }
  287. String submittedUserEmployeeId = empId;//提单人工号
  288. String legalEntityBizCode = UtilMap.getString(formData, "textField_mmd6hio7");//公司抬头编码
  289. String coverUserEmployeeId = empId;//承担人工号
  290. String coverDepartmentBizCode = deptBusinessCode;//承担部门编码
  291. String xqbh = UtilMap.getString(formData, "serialNumberField_mkkmij3o");//需求编号
  292. long ldjssj = UtilMap.getLong(formData, "dateField_mkdf8q8q");//落地结束时间
  293. String isFree = "FREE需求".equals(type) ? "是" : "否";//是否free
  294. String isDdf = "是".equals(UtilMap.getString(formData, "radioField_mkf2quln")) ? "1" : "2";//是否代垫付
  295. String xmsssyb = UtilMap.getString(formData, "selectField_mkdedkv7");//项目所属事业部
  296. String projectCode = UtilMap.getString(formData, "textField_mmoh6nvx");//项目编码
  297. //针对多供应商分期付款拆分多条每刻项目支付单
  298. if ("常规需求".equals(type)){
  299. List<Map> detailList = UtilMap.getList(formData, "tableField_mkkmij56");//常规-采购明细
  300. int index = 0;
  301. for (Map detail : detailList) {
  302. index++;
  303. String uuid = UtilMap.getString(detail, "textField_mmvhqm0q");//子表uuid
  304. Map body = new HashMap();
  305. body.put("formCode",xqbh + "-" + index);//有值时会使用该值作为单据号
  306. body.put("formSubTypeBizCode",formSubTypeBizCode);//表单类型的业务编号
  307. body.put("submittedUserEmployeeId",submittedUserEmployeeId);//提单人工号
  308. body.put("reimburseName",UtilMap.getString(detail,"textareaField_mkkmij5i"));//报销事由
  309. body.put("legalEntityBizCode",legalEntityBizCode);//公司抬头编码
  310. body.put("coverUserEmployeeId",coverUserEmployeeId);//承担人工号
  311. body.put("coverDepartmentBizCode",coverDepartmentBizCode);//承担部门编码
  312. body.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmbmohrb"));//往来单位编码
  313. Map customObject = new HashMap();
  314. customObject.put("CF4",new HashMap<String,Long>(){{put("currentTime",ldjssj);}});//落地结束时间
  315. customObject.put("CF3",new HashMap<String,Long>(){{put("currentTime",UtilMap.getLong(detail,"dateField_mmvhqm0u"));}});//期望支付日期
  316. customObject.put("CF6",isFree);////free 是;否
  317. customObject.put("CF5",isDdf);//代垫付 是:1 ; 否:2
  318. customObject.put("CF2",xmsssyb);//项目所属事业部
  319. customObject.put("CF1",projectCode);//项目
  320. customObject.put("CF7",UtilMap.getString(detail,"numberField_mmwt2wcn"));//逾期天数
  321. body.put("customObject",customObject);
  322. //报销单费用导入
  323. Map expenseListItem = new HashMap();
  324. Map consumeAmount = new HashMap();
  325. consumeAmount.put("amount",String.format("%.2f", UtilMap.getDouble(detail,"numberField_mkkmij5e")));//结算金额
  326. consumeAmount.put("currency","CNY");
  327. expenseListItem.put("consumeAmount",consumeAmount);
  328. expenseListItem.put("corpExpense",true);//是否对公费用,需要填写true
  329. String gysej = UtilMap.getString(detail, "selectField_mkkkw28y");//供应商二级
  330. expenseListItem.put("expenseTypeBizCode",MkBxUtil.expenseTypeSearch(UtilMap.map("keyword",gysej)));//费用类型业务编码
  331. expenseListItem.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票)
  332. expenseListItem.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填)
  333. expenseListItem.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填)
  334. expenseListItem.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmbmohrb"));//往来单位业务编码
  335. Map consumeLocation = new HashMap();
  336. consumeLocation.put("cityPair",null);
  337. consumeLocation.put("location","110001");//todo 暂时写死 110001 北京
  338. expenseListItem.put("consumeLocation",consumeLocation);
  339. expenseListItem.put("corpExpenseResponsibleEmpIds",Arrays.asList("002"));//责任人/业务经办人(预付未到票/到票部分支付或不支付 两种场景必填) todo 暂时写死 002 wzy
  340. Map body2 = new HashMap();
  341. body2.put("employeeId","002");//需要导入的对应员工的工号
  342. body2.put("expenseList",Arrays.asList(expenseListItem));
  343. List<String> expenseCodes = MkBxUtil.receiveExpense(body2);
  344. body.put("expenseCodes",expenseCodes);//费用类型业务编码
  345. //收款账户
  346. Map payeeAccount = new HashMap();
  347. payeeAccount.put("bankAcctName",UtilMap.getString(detail,"textField_mkkmij6z"));//账户名
  348. payeeAccount.put("bankAcctNumber",UtilMap.getString(detail,"textField_mkkmij6y"));//银行账户
  349. payeeAccount.put("paymentType","BANK");//账户类型;ALIPAY-支付宝,BANK-银行账户,CASH-现金
  350. payeeAccount.put("accountType","CORP");//收款账户类型:个人(员工)-PERSONAL,公司(往来单位)-CORP
  351. body.put("payeeAccount",payeeAccount);
  352. body.put("stagingFlag",true);//暂存标识,默认为false表示不暂存
  353. Map result = MkBxUtil.receiveReimburse(body);
  354. }
  355. }else {
  356. List<Map> detailList = UtilMap.getList(formData, "tableField_mkkmij61");//free-采购明细
  357. int index = 0;
  358. for (Map detail : detailList) {
  359. index ++;
  360. String uuid = UtilMap.getString(detail, "textField_mmvhqm0s");//子表uuid
  361. Map body = new HashMap();
  362. // body.put("formCode",xqbh + "-" + uuid);//有值时会使用该值作为单据号
  363. body.put("formCode",xqbh + "-" +index);//有值时会使用该值作为单据号
  364. body.put("formSubTypeBizCode",formSubTypeBizCode);//表单类型的业务编号
  365. body.put("submittedUserEmployeeId",submittedUserEmployeeId);//提单人工号
  366. body.put("reimburseName","FREE-" + UtilMap.getString(detail,"selectField_mkkixdd7"));//报销事由
  367. body.put("legalEntityBizCode",legalEntityBizCode);//公司抬头编码
  368. body.put("coverUserEmployeeId",coverUserEmployeeId);//承担人工号
  369. body.put("coverDepartmentBizCode",coverDepartmentBizCode);//承担部门编码
  370. body.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmekbfa2"));//往来单位编码
  371. Map customObject = new HashMap();
  372. customObject.put("CF4",new HashMap<String,Long>(){{put("currentTime",ldjssj);}});//落地结束时间
  373. customObject.put("CF3",new HashMap<String,Long>(){{put("currentTime",UtilMap.getLong(detail,"dateField_mkkkw298"));}});//期望支付日期
  374. customObject.put("CF6",isFree);//free 是;否
  375. customObject.put("CF5",isDdf);//代垫付 是:1 ; 否:2
  376. customObject.put("CF2",xmsssyb);//项目所属事业部
  377. customObject.put("CF1",projectCode);//项目
  378. customObject.put("CF7",UtilMap.getString(detail,"numberField_mmwswtkx"));//逾期天数
  379. body.put("customObject",customObject);
  380. //报销单费用导入
  381. Map expenseListItem = new HashMap();
  382. Map consumeAmount = new HashMap();
  383. consumeAmount.put("amount",String.format("%.2f", UtilMap.getDouble(detail,"numberField_mkkmij6p")));//结算金额
  384. consumeAmount.put("currency","CNY");
  385. expenseListItem.put("consumeAmount",consumeAmount);
  386. expenseListItem.put("corpExpense",true);//是否对公费用,需要填写true
  387. String gysej = UtilMap.getString(detail, "selectField_mmwuzaql");//供应商二级
  388. expenseListItem.put("expenseTypeBizCode",MkBxUtil.expenseTypeSearch(UtilMap.map("keyword",gysej)));//费用类型业务编码
  389. expenseListItem.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票)
  390. expenseListItem.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填)
  391. expenseListItem.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填)
  392. expenseListItem.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmekbfa2"));//往来单位业务编码
  393. Map consumeLocation = new HashMap();
  394. consumeLocation.put("cityPair",null);
  395. consumeLocation.put("location","110001");//todo 暂时写死 110001 北京
  396. expenseListItem.put("consumeLocation",consumeLocation);
  397. expenseListItem.put("corpExpenseResponsibleEmpIds",Arrays.asList("002"));//责任人/业务经办人(预付未到票/到票部分支付或不支付 两种场景必填) todo 暂时写死 002 wzy
  398. Map body2 = new HashMap();
  399. body2.put("employeeId","002");//需要导入的对应员工的工号
  400. body2.put("expenseList",Arrays.asList(expenseListItem));
  401. List<String> expenseCodes = MkBxUtil.receiveExpense(body2);
  402. body.put("expenseCodes",expenseCodes);//费用类型业务编码
  403. //收款账户
  404. Map payeeAccount = new HashMap();
  405. payeeAccount.put("bankAcctName",UtilMap.getString(detail,"textField_mketkvxa"));//账户名
  406. payeeAccount.put("bankAcctNumber",UtilMap.getString(detail,"textField_mketkvxc"));//银行账户
  407. payeeAccount.put("paymentType","BANK");//账户类型;ALIPAY-支付宝,BANK-银行账户,CASH-现金
  408. payeeAccount.put("accountType","CORP");//收款账户类型:个人(员工)-PERSONAL,公司(往来单位)-CORP
  409. body.put("payeeAccount",payeeAccount);
  410. body.put("stagingFlag",true);//暂存标识,默认为false表示不暂存
  411. Map result = MkBxUtil.receiveReimburse(body);
  412. }
  413. }
  414. /*Map body = new HashMap();
  415. body.put("formCode",UtilMap.getString(formData,"serialNumberField_mkkmij3o"));//有值时会使用该值作为单据号
  416. body.put("formSubTypeBizCode","FT208629766551519240");//表单类型的业务编号 todo 暂时写死 FT208629766551519240 宜搭支付单
  417. body.put("submittedUserEmployeeId","002");//提单人工号 todo 暂时写死 002 wzy
  418. body.put("reimburseName",UtilMap.getString(formData,"textareaField_mmbmohr9"));//报销事由
  419. body.put("legalEntityBizCode",UtilMap.getString(formData,"textField_mmd6hio7"));//公司抬头编码
  420. body.put("coverUserEmployeeId","002");//承担人工号 todo 暂时写死 002 wzy
  421. body.put("coverDepartmentBizCode","DI203800035494740082");//承担部门编码 todo 暂时写死 DI203800035494740082
  422. Map customObject = new HashMap();
  423. customObject.put("CF4",new HashMap<String,Long>(){{put("currentTime",UtilMap.getLong(formData,"dateField_mkdf8q8q"));}});//落地结束时间
  424. customObject.put("CF3",new HashMap<String,Long>(){{put("currentTime",UtilMap.getLong(formData,"dateField_mkkkw298"));}});//预计支付日期
  425. customObject.put("CF6",UtilMap.getString(formData,"radioField_mkf2quln"));////free 是;否
  426. customObject.put("CF5","是".equals(UtilMap.getString(formData,"radioField_mkf2quln")) ? "1" : "2");//代垫付 是:1 ; 否:2
  427. customObject.put("CF2",UtilMap.getString(formData,"selectField_mkdedkv7"));//项目所属事业部
  428. customObject.put("CF1",UtilMap.getString(formData,"textField_mmoh6nvx"));//项目
  429. body.put("customObject",customObject);
  430. List<String> expenseCodes = new ArrayList<>();
  431. List<Map> collectionSchedule = new ArrayList<>();
  432. List<Map> expenseList = new ArrayList<>();
  433. if ("常规需求".equals(type)){
  434. List<Map> detailList = UtilMap.getList(formData, "tableField_mkkmij56");//常规-采购明细
  435. for (Map result : detailList) {
  436. Map item = new HashMap();
  437. Map consumeAmount = new HashMap();
  438. consumeAmount.put("amount",String.format("%.2f", UtilMap.getDouble(result,"numberField_mkkmij5e")));//结算金额
  439. consumeAmount.put("currency","CNY");
  440. item.put("consumeAmount",consumeAmount);
  441. item.put("corpExpense",true);//是否对公费用,需要填写true
  442. item.put("expenseTypeBizCode","200140");//费用类型业务编码 todo 暂时写死 200140 其他费用
  443. item.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票)
  444. item.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填)
  445. item.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填)
  446. item.put("tradingPartnerBizCode",UtilMap.getString(result,"textField_mmbmohrb"));//往来单位业务编码
  447. Map consumeLocation = new HashMap();
  448. consumeLocation.put("cityPair",null);
  449. consumeLocation.put("location","110001");
  450. item.put("consumeLocation",consumeLocation);
  451. item.put("corpExpenseResponsibleEmpIds",Arrays.asList("002"));//责任人/业务经办人(预付未到票/到票部分支付或不支付 两种场景必填) todo 暂时写死 002 wzy
  452. expenseList.add(item);
  453. Map collectionScheduleItem = new HashMap();
  454. Map payeeAccount = new HashMap();
  455. payeeAccount.put("bankAcctName",UtilMap.getString(result,"textField_mkkmij6z"));//账户名
  456. payeeAccount.put("bankAcctNumber",UtilMap.getString(result,"textField_mkkmij6y"));//银行账户
  457. payeeAccount.put("paymentType","BANK");//账户类型;ALIPAY-支付宝,BANK-银行账户,CASH-现金
  458. payeeAccount.put("accountType","CORP");//收款账户类型:个人(员工)-PERSONAL,公司(往来单位)-CORP
  459. collectionScheduleItem.put("payeeAccount",payeeAccount);
  460. collectionScheduleItem.put("collectionTradingPartnerBizCode",UtilMap.getString(result,"textField_mmbmohrb"));//收款往来单位编码
  461. collectionScheduleItem.put("amountRatio",0);//收款比例
  462. collectionScheduleItem.put("amount",new HashMap<>(consumeAmount));//收款金额
  463. collectionScheduleItem.put("collectionType","BANK");//支付类型
  464. collectionSchedule.add(collectionScheduleItem);
  465. }
  466. }else {
  467. List<Map> detailList = UtilMap.getList(formData, "tableField_mkkmij61");//free-采购明细
  468. for (Map result : detailList) {
  469. Map item = new HashMap();
  470. Map consumeAmount = new HashMap();
  471. consumeAmount.put("amount",String.format("%.2f", UtilMap.getDouble(result,"numberField_mkkmij6p")));//结算金额
  472. consumeAmount.put("currency","CNY");
  473. item.put("consumeAmount",consumeAmount);
  474. item.put("corpExpense",true);//是否对公费用,需要填写true
  475. item.put("expenseTypeBizCode","200140");//费用类型业务编码 todo 暂时写死 200140 其他费用
  476. item.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票)
  477. item.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填)
  478. item.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填)
  479. item.put("tradingPartnerBizCode",UtilMap.getString(result,"textField_mmekbfa2"));//往来单位业务编码
  480. Map consumeLocation = new HashMap();
  481. consumeLocation.put("cityPair",null);
  482. consumeLocation.put("location","110001");
  483. item.put("consumeLocation",consumeLocation);
  484. item.put("corpExpenseResponsibleEmpIds",Arrays.asList("002"));//责任人/业务经办人(预付未到票/到票部分支付或不支付 两种场景必填) todo 暂时写死 002 wzy
  485. expenseList.add(item);
  486. Map collectionScheduleItem = new HashMap();
  487. Map payeeAccount = new HashMap();
  488. payeeAccount.put("bankAcctName",UtilMap.getString(result,"textField_mketkvxa"));//账户名
  489. payeeAccount.put("bankAcctNumber",UtilMap.getString(result,"textField_mketkvxc"));//银行账户
  490. payeeAccount.put("paymentType","BANK");//账户类型;ALIPAY-支付宝,BANK-银行账户,CASH-现金
  491. payeeAccount.put("accountType","CORP");//收款账户类型:个人(员工)-PERSONAL,公司(往来单位)-CORP
  492. collectionScheduleItem.put("payeeAccount",payeeAccount);
  493. collectionScheduleItem.put("collectionTradingPartnerBizCode",UtilMap.getString(result,"textField_mmekbfa2"));//收款往来单位编码
  494. collectionScheduleItem.put("amountRatio",0);//收款比例
  495. collectionScheduleItem.put("amount",new HashMap<>(consumeAmount));//收款金额
  496. collectionScheduleItem.put("collectionType","BANK");//支付类型
  497. collectionSchedule.add(collectionScheduleItem);
  498. }
  499. }
  500. //报销单费用导入
  501. Map body2 = new HashMap();
  502. body2.put("employeeId","002");//需要导入的对应员工的工号
  503. body2.put("expenseList",expenseList);
  504. expenseCodes = MkBxUtil.receiveExpense(body2);
  505. body.put("expenseCodes",expenseCodes);//费用类型业务编码
  506. body.put("collectionSchedule",collectionSchedule);//多人收款,如果已填充该字段,则无需填充上方的收款账户字段,若传多人收款,则paymentSceneBizCode参数必填
  507. body.put("paymentSceneBizCode","DGYSSK");//多人收款场景(支付场景)表单业务编码,需要填写多人收款时必填
  508. body.put("stagingFlag",false);////暂存标识,默认为false表示不暂存
  509. Map result = MkBxUtil.receiveReimburse(body);*/
  510. return McR.success();
  511. }
  512. @Override
  513. public McR saveYpClient(Map map) {
  514. String formInstId = UtilMap.getString(map, "formInstId");
  515. Map formData = ydClient.queryData(YDParam.builder()
  516. .formInstanceId(formInstId)
  517. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  518. Map customerObj = new HashMap();
  519. customerObj.put("bizCode",UtilMap.getString(formData,"serialNumberField_mkddjwy2"));//客户编码, 系统内唯一。
  520. customerObj.put("name",UtilMap.getString(formData,"textField_mkddjwy3"));//客户名称,系统内唯一
  521. customerObj.put("type","CORP");//客户类型: CORP (公司,默认), SELF_EMPLOYED(个体经营商)
  522. customerObj.put("nameAutoCode",false);
  523. customerObj.put("status","ENABLED");//客户状态:DISABLED("禁用" ,默认) ENABLED("启用")
  524. List<Map> contacts = new ArrayList<>();
  525. List<Map> contactList = UtilMap.getList(formData, "tableField_mkddjwyv");
  526. for (Map contact : contactList) {
  527. Map contactObj = new HashMap();
  528. contactObj.put("name",UtilMap.getString(contact,"textField_mkddjwyw"));//联系人姓名
  529. contactObj.put("phoneNumber",UtilMap.getString(contact,"textField_mkddjwyx"));//联系电话
  530. contactObj.put("position",UtilMap.getString(contact,"textField_mkg8toy9"));//职位
  531. contacts.add(contactObj);
  532. }
  533. customerObj.put("contacts",contacts);//联系人列表
  534. List<Map> invoiceTitles = new ArrayList<>();
  535. Map invoiceTitle = new HashMap();
  536. invoiceTitle.put("invoiceTitle",UtilMap.getString(formData,"textField_mkddjwyr"));//发票抬头
  537. invoiceTitle.put("dutyParagraph",UtilMap.getString(formData,"textField_mkddjwys"));//税号
  538. invoiceTitle.put("bizCode",UtilMap.getString(formData,"textField_mkddjwys"));//业务编码
  539. invoiceTitle.put("bankBranchName",UtilMap.getString(formData,"textField_mkddjwyt"));//开户行
  540. invoiceTitle.put("account",UtilMap.getString(formData,"textField_mkddjwyu"));//银行账户
  541. invoiceTitles.add(invoiceTitle);
  542. customerObj.put("invoiceTitles",invoiceTitles);//发票抬头列表
  543. MkYpUtil.saveClient(Arrays.asList(customerObj));
  544. return McR.success();
  545. }
  546. @Override
  547. public void invoiceWriteBack(Map map) {
  548. Map calloutParams = UtilMap.getMap(map, "calloutParams");
  549. Map bizData = UtilMap.getMap(calloutParams, "bizData");
  550. List<Map> relatedDocuments = UtilMap.getList(bizData, "relatedDocuments");
  551. for (Map relatedDocument : relatedDocuments) {
  552. String formType = UtilMap.getString(relatedDocument, "formType");
  553. if ("RECEIVABLE_AR".equals(formType)){
  554. String bizCode = UtilMap.getString(relatedDocument, "bizCode");
  555. //应收单查询
  556. Map body = new HashMap();
  557. body.put("bizCodes",Arrays.asList(bizCode));
  558. body.put("pageNum",1);
  559. body.put("pageSize",1);
  560. Map receivable = MkYpUtil.searchReceivable(body).get(0);
  561. Map invoice = ((List<Map>) UtilMap.getList(receivable, "invoiceList")).get(0);
  562. String invoiceNumber = UtilMap.getString(invoice, "invoiceNumber");//发票号码
  563. Double receivedAmount = UtilMap.getDouble(receivable, "receivedAmount");//已收金额
  564. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  565. .formUuid("FORM-A9A47B0365DB437F8F4C8E01B4468220K7GU")
  566. .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mkxripc6",invoiceNumber)))
  567. .build(), YDConf.FORM_QUERY.retrieve_list).getData();
  568. String formInstanceId = UtilMap.getString(data.get(0), "formInstanceId");
  569. ydClient.operateData(YDParam.builder()
  570. .formInstanceId(formInstanceId)
  571. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_ml8t9c4u",receivedAmount)))
  572. .build(), YDConf.FORM_OPERATION.update);
  573. return;
  574. }
  575. }
  576. }
  577. @Override
  578. public void invoiceWriteBack3(Map map) {
  579. String formCode = UtilMap.getString(map, "formCode");
  580. String operation = UtilMap.getString(map, "operation");
  581. if ("FORM_COMPLETE".equals(operation)){
  582. //完成
  583. }else if ("FORM_REJECT".equals(operation)){
  584. //驳回
  585. }
  586. String[] split = formCode.split("-");
  587. String bh = split[0];//采购需求编号/直接采购单编号
  588. String uuid = split[1];//子表uuid
  589. Map formData = UtilMap.getMap(map, "formData");
  590. Map baseAmount = UtilMap.getMap(formData, "baseAmount");
  591. Map value = UtilMap.getMap(baseAmount, "value");
  592. String text = UtilMap.getString(value, "text");
  593. double amt = Double.parseDouble(text);
  594. if (formCode.contains("需求")){
  595. //采购需求&结算
  596. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  597. .formUuid("FORM-C8C1FBBA781C4C5EBAC487C07BC5A86AD2HO")
  598. .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_mkkmij3o", bh)))
  599. .build(), YDConf.FORM_QUERY.retrieve_list).getData();
  600. String formInstanceId = UtilMap.getString(data.get(0), "formInstanceId");
  601. Map ydFormData = UtilMap.getMap(data.get(0), "formData");
  602. List<Map> detailList = UtilMap.getList(ydFormData, "tableField_mkkmij56");
  603. for (Map detail : detailList) {
  604. if (uuid.equals(UtilMap.getString(detail, "textField_mmvhqm0q"))){
  605. detail.put("selectField_mmvhqm0p","已付款");
  606. break;
  607. }
  608. }
  609. Double yzf = UtilMap.getDouble(ydFormData, "numberField_mkf2qumf");//已支付
  610. ydFormData.put("numberField_mkf2qumf",yzf + amt);
  611. ydClient.operateData(YDParam.builder()
  612. .formInstanceId(formInstanceId)
  613. .updateFormDataJson(JSONObject.toJSONString(ydFormData ))
  614. .build(), YDConf.FORM_OPERATION.update);
  615. }else {
  616. //直接采购结算单
  617. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  618. .formUuid("FORM-1AFEDDA034C74F0DB18FA60C941CB56EHUUG")
  619. .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_mkkmij3o", bh)))
  620. .build(), YDConf.FORM_QUERY.retrieve_list).getData();
  621. String formInstanceId = UtilMap.getString(data.get(0), "formInstanceId");
  622. ydClient.operateData(YDParam.builder()
  623. .formInstanceId(formInstanceId)
  624. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_mkf2qumf",amt)))
  625. .build(), YDConf.FORM_OPERATION.update);
  626. }
  627. }
  628. @Override
  629. public McR saveBxReimbursement2(Map map) {
  630. String formInstId = UtilMap.getString(map, "formInstId");
  631. Map formData = ydClient.queryData(YDParam.builder()
  632. .formInstanceId(formInstId)
  633. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  634. String type = UtilMap.getString(formData, "radioField_mkkmij3b");//需求单类型
  635. String formSubTypeBizCode = "FT208629766551519240";//项目支付单
  636. Double amt = UtilMap.getDouble(formData, "numberField_mkkmij6i");
  637. String empId = "";
  638. String deptBusinessCode = "";
  639. String ydfqr = UtilMap.getString(formData, "textField_mmwvodde");//宜搭发起人工号
  640. if (amt >= 5000){
  641. //支付金额>=5000元,每刻发起人为宜搭采购单据发起人;每刻中的【费用承担部门】实际为采购单发起人所在部门,非每刻单据发起人部门
  642. Map employeeDetails = MkBxUtil.employeeDetails(UtilMap.map("employeeIds", Arrays.asList(ydfqr)));
  643. if (Objects.nonNull(employeeDetails)){
  644. List<Map> departments = UtilMap.getList(employeeDetails, "departments");
  645. deptBusinessCode = UtilMap.getString(departments.get(0), "businessCode");
  646. empId = ydfqr;
  647. }else {
  648. empId = "002";//默认沃洲洋
  649. deptBusinessCode = "DI203800035494740082";//默认DI203800035494740082
  650. }
  651. }else {
  652. //支付金额<5000元,每刻发起人为宜搭采购单据中的中台采购;每刻中的【费用承担部门】实际为采购单发起人所在部门,非每刻单据发起人部门
  653. Map employeeDetails = MkBxUtil.employeeDetails(UtilMap.map("employeeIds", Arrays.asList(ydfqr)));
  654. if (Objects.nonNull(employeeDetails)){
  655. List<Map> departments = UtilMap.getList(employeeDetails, "departments");
  656. deptBusinessCode = UtilMap.getString(departments.get(0), "businessCode");
  657. }else {
  658. deptBusinessCode = "DI203800035494740082";//默认DI203800035494740082
  659. }
  660. String ztcggh = UtilMap.getString(formData, "textField_mmwvfb97");//中台采购工号
  661. Map employeeDetails2 = MkBxUtil.employeeDetails(UtilMap.map("employeeIds", Arrays.asList(ztcggh)));
  662. if (Objects.nonNull(employeeDetails2)){
  663. empId = ztcggh;
  664. }else {
  665. empId = "002";//默认沃洲洋
  666. }
  667. }
  668. String submittedUserEmployeeId = empId;//提单人工号
  669. String legalEntityBizCode = UtilMap.getString(formData, "textField_mmd6hio7");//公司抬头编码
  670. String coverUserEmployeeId = empId;//承担人工号
  671. String coverDepartmentBizCode = deptBusinessCode;//承担部门编码
  672. String xqbh = UtilMap.getString(formData, "serialNumberField_mkkmij3o");//需求编号
  673. long ldjssj = UtilMap.getLong(formData, "dateField_mkdf8q8q");//落地结束时间
  674. String isFree = "FREE采购".equals(UtilMap.getString(formData, "radioField_mkf2quln")) ? "是" : "否";//是否free
  675. String isDdf = "是".equals(UtilMap.getString(formData, "radioField_mkf2qulo")) ? "1" : "2";//是否代垫付
  676. String xmsssyb = UtilMap.getString(formData, "selectField_mkdedkv7");//项目所属事业部
  677. String projectCode = UtilMap.getString(formData, "textField_mmoh6nvx");//项目编码
  678. //针对多供应商分期付款拆分多条每刻项目支付单
  679. if ("常规采购".equals(type)){
  680. List<Map> detailList = UtilMap.getList(formData, "tableField_mkkmij56");//常规-采购明细
  681. int index = 0;
  682. for (Map detail : detailList) {
  683. index++;
  684. String uuid = UtilMap.getString(detail, "textField_mmvhqm0q");//子表uuid
  685. Map body = new HashMap();
  686. body.put("formCode",xqbh + "-" + index);//有值时会使用该值作为单据号
  687. body.put("formSubTypeBizCode",formSubTypeBizCode);//表单类型的业务编号
  688. body.put("submittedUserEmployeeId",submittedUserEmployeeId);//提单人工号
  689. body.put("reimburseName",UtilMap.getString(detail,"textareaField_mkkmij5i"));//报销事由
  690. body.put("legalEntityBizCode",legalEntityBizCode);//公司抬头编码
  691. body.put("coverUserEmployeeId",coverUserEmployeeId);//承担人工号
  692. body.put("coverDepartmentBizCode",coverDepartmentBizCode);//承担部门编码
  693. body.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmbmohrb"));//往来单位编码
  694. Map customObject = new HashMap();
  695. customObject.put("CF4",new HashMap<String,Long>(){{put("currentTime",ldjssj);}});//落地结束时间
  696. customObject.put("CF3",new HashMap<String,Long>(){{put("currentTime",UtilMap.getLong(detail,"dateField_mkkkw298"));}});//期望支付日期
  697. customObject.put("CF6",isFree);//free 是;否
  698. customObject.put("CF5",isDdf);//代垫付 是:1 ; 否:2
  699. customObject.put("CF2",xmsssyb);//项目所属事业部
  700. customObject.put("CF1",projectCode);//项目
  701. customObject.put("CF7",UtilMap.getString(detail,"numberField_mmwswtkv"));//逾期天数
  702. body.put("customObject",customObject);
  703. //报销单费用导入
  704. Map expenseListItem = new HashMap();
  705. Map consumeAmount = new HashMap();
  706. consumeAmount.put("amount",String.format("%.2f", UtilMap.getDouble(detail,"numberField_mkkmij5e")));//结算金额
  707. consumeAmount.put("currency","CNY");
  708. expenseListItem.put("consumeAmount",consumeAmount);
  709. expenseListItem.put("corpExpense",true);//是否对公费用,需要填写true
  710. String gysej = UtilMap.getString(detail, "selectField_mkkkw28y");//供应商二级
  711. expenseListItem.put("expenseTypeBizCode",MkBxUtil.expenseTypeSearch(UtilMap.map("keyword",gysej)));//费用类型业务编码
  712. expenseListItem.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票)
  713. expenseListItem.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填)
  714. expenseListItem.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填)
  715. expenseListItem.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmbmohrb"));//往来单位业务编码
  716. Map consumeLocation = new HashMap();
  717. consumeLocation.put("cityPair",null);
  718. consumeLocation.put("location","110001");//todo 暂时写死 110001 北京
  719. expenseListItem.put("consumeLocation",consumeLocation);
  720. expenseListItem.put("corpExpenseResponsibleEmpIds",Arrays.asList("002"));//责任人/业务经办人(预付未到票/到票部分支付或不支付 两种场景必填) todo 暂时写死 002 wzy
  721. Map body2 = new HashMap();
  722. body2.put("employeeId","002");//需要导入的对应员工的工号
  723. body2.put("expenseList",Arrays.asList(expenseListItem));
  724. List<String> expenseCodes = MkBxUtil.receiveExpense(body2);
  725. body.put("expenseCodes",expenseCodes);//费用类型业务编码
  726. //收款账户
  727. Map payeeAccount = new HashMap();
  728. payeeAccount.put("bankAcctName",UtilMap.getString(detail,"textField_mkkmij6z"));//账户名
  729. payeeAccount.put("bankAcctNumber",UtilMap.getString(detail,"textField_mkkmij6y"));//银行账户
  730. payeeAccount.put("paymentType","BANK");//账户类型;ALIPAY-支付宝,BANK-银行账户,CASH-现金
  731. payeeAccount.put("accountType","CORP");//收款账户类型:个人(员工)-PERSONAL,公司(往来单位)-CORP
  732. body.put("payeeAccount",payeeAccount);
  733. body.put("stagingFlag",true);//暂存标识,默认为false表示不暂存
  734. Map result = MkBxUtil.receiveReimburse(body);
  735. }
  736. }else {
  737. List<Map> detailList = UtilMap.getList(formData, "tableField_mkkmij61");//free-采购明细
  738. int index = 0;
  739. for (Map detail : detailList) {
  740. index ++;
  741. String uuid = UtilMap.getString(detail, "textField_mmvhqm0s");//子表uuid
  742. Map body = new HashMap();
  743. // body.put("formCode",xqbh + "-" + uuid);//有值时会使用该值作为单据号
  744. body.put("formCode",xqbh + "-" +index);//有值时会使用该值作为单据号
  745. body.put("formSubTypeBizCode",formSubTypeBizCode);//表单类型的业务编号
  746. body.put("submittedUserEmployeeId",submittedUserEmployeeId);//提单人工号
  747. body.put("reimburseName","FREE-" + UtilMap.getString(detail,"selectField_mkkixdd7"));//报销事由
  748. body.put("legalEntityBizCode",legalEntityBizCode);//公司抬头编码
  749. body.put("coverUserEmployeeId",coverUserEmployeeId);//承担人工号
  750. body.put("coverDepartmentBizCode",coverDepartmentBizCode);//承担部门编码
  751. body.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmekbfa2"));//往来单位编码
  752. Map customObject = new HashMap();
  753. customObject.put("CF4",new HashMap<String,Long>(){{put("currentTime",ldjssj);}});//落地结束时间
  754. customObject.put("CF3",new HashMap<String,Long>(){{put("currentTime",UtilMap.getLong(detail,"dateField_mmvhtdy4"));}});//期望支付日期
  755. customObject.put("CF6",isFree);//free 是;否
  756. customObject.put("CF5",isDdf);//代垫付 是:1 ; 否:2
  757. customObject.put("CF2",xmsssyb);//项目所属事业部
  758. customObject.put("CF1",projectCode);//项目
  759. customObject.put("CF7",UtilMap.getString(detail,"numberField_mmwswtkx"));//逾期天数
  760. body.put("customObject",customObject);
  761. //报销单费用导入
  762. Map expenseListItem = new HashMap();
  763. Map consumeAmount = new HashMap();
  764. consumeAmount.put("amount",String.format("%.2f", UtilMap.getDouble(detail,"numberField_mkkmij6p")));//结算金额
  765. consumeAmount.put("currency","CNY");
  766. expenseListItem.put("consumeAmount",consumeAmount);
  767. expenseListItem.put("corpExpense",true);//是否对公费用,需要填写true
  768. String gysej = UtilMap.getString(detail, "selectField_mmwuzaql");//供应商二级
  769. expenseListItem.put("expenseTypeBizCode",MkBxUtil.expenseTypeSearch(UtilMap.map("keyword",gysej)));//费用类型业务编码
  770. expenseListItem.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票)
  771. expenseListItem.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填)
  772. expenseListItem.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填)
  773. expenseListItem.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmekbfa2"));//往来单位业务编码
  774. Map consumeLocation = new HashMap();
  775. consumeLocation.put("cityPair",null);
  776. consumeLocation.put("location","110001");//todo 暂时写死 110001 北京
  777. expenseListItem.put("consumeLocation",consumeLocation);
  778. expenseListItem.put("corpExpenseResponsibleEmpIds",Arrays.asList("002"));//责任人/业务经办人(预付未到票/到票部分支付或不支付 两种场景必填) todo 暂时写死 002 wzy
  779. Map body2 = new HashMap();
  780. body2.put("employeeId","002");//需要导入的对应员工的工号
  781. body2.put("expenseList",Arrays.asList(expenseListItem));
  782. List<String> expenseCodes = MkBxUtil.receiveExpense(body2);
  783. body.put("expenseCodes",expenseCodes);//费用类型业务编码
  784. //收款账户
  785. Map payeeAccount = new HashMap();
  786. payeeAccount.put("bankAcctName",UtilMap.getString(detail,"textField_mketkvxa"));//账户名
  787. payeeAccount.put("bankAcctNumber",UtilMap.getString(detail,"textField_mketkvxc"));//银行账户
  788. payeeAccount.put("paymentType","BANK");//账户类型;ALIPAY-支付宝,BANK-银行账户,CASH-现金
  789. payeeAccount.put("accountType","CORP");//收款账户类型:个人(员工)-PERSONAL,公司(往来单位)-CORP
  790. body.put("payeeAccount",payeeAccount);
  791. body.put("stagingFlag",true);//暂存标识,默认为false表示不暂存
  792. Map result = MkBxUtil.receiveReimburse(body);
  793. }
  794. }
  795. return McR.success();
  796. }
  797. //文件下载到本地
  798. private void downloadFile(String downloadUri,String downloadPath){
  799. try {
  800. URL url = new URL(downloadUri);
  801. HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
  802. int responseCode = httpConn.getResponseCode();
  803. // 检查HTTP响应代码是否为200
  804. if (responseCode == HttpURLConnection.HTTP_OK) {
  805. InputStream inputStream = httpConn.getInputStream();
  806. FileOutputStream outputStream = new FileOutputStream(downloadPath);
  807. byte[] buffer = new byte[4096];
  808. int bytesRead = -1;
  809. while ((bytesRead = inputStream.read(buffer)) != -1) {
  810. outputStream.write(buffer, 0, bytesRead);
  811. }
  812. outputStream.close();
  813. inputStream.close();
  814. } else {
  815. System.out.println("无法下载文件。HTTP响应代码: " + responseCode);
  816. }
  817. httpConn.disconnect();
  818. }catch (Exception e){
  819. throw new RuntimeException(e);
  820. }
  821. }
  822. }