SikuServiceImpl.java 65 KB

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