SikuServiceImpl.java 142 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711
  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.service.dingtalk.DDClient;
  8. import com.malk.service.dingtalk.DDClient_Contacts;
  9. import com.malk.service.dingtalk.DDClient_Personnel;
  10. import com.malk.siku.service.SikuService;
  11. import com.malk.siku.utils.MkBxUtil;
  12. import com.malk.siku.utils.MkYpUtil;
  13. import com.malk.siku.utils.QyddUtil;
  14. import com.malk.utils.UtilHttp;
  15. import com.malk.utils.UtilMap;
  16. import lombok.extern.slf4j.Slf4j;
  17. import org.apache.logging.log4j.util.Strings;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.beans.factory.annotation.Value;
  20. import org.springframework.scheduling.annotation.Async;
  21. import org.springframework.stereotype.Service;
  22. import java.io.FileOutputStream;
  23. import java.io.InputStream;
  24. import java.net.HttpURLConnection;
  25. import java.net.URL;
  26. import java.text.SimpleDateFormat;
  27. import java.util.*;
  28. import java.util.stream.Collectors;
  29. @Slf4j
  30. @Service
  31. public class SikuServiceImpl implements SikuService {
  32. @Autowired
  33. private YDClient ydClient;
  34. @Value(value = "${mk.downloadFilePath}")
  35. private String downloadFilePath;
  36. @Value(value = "${mk.downloadUrl}")
  37. private String downloadUrl;
  38. @Autowired
  39. private DDClient ddClient;
  40. //每刻报销 测试环境
  41. /*private static String mkbx_empId = "18857526310";//默认 周漂
  42. private static String mkbx_deptId = "DI205228744816739500";//默认 财务部*/
  43. //每刻报销 正式环境
  44. private static String mkbx_empId = "HZ769";//默认 周漂
  45. private static String mkbx_deptId = "DI205228744816739500";//默认 财务部
  46. //每刻云票 测试环境
  47. // private static String mkyp_empId = "18857526310";//默认 周漂
  48. //每刻云票 正式环境
  49. private static String mkyp_empId = "HZ769";//默认 周漂
  50. private static final Map<String,String> ddLegalEntity = new HashMap<>();//企业滴滴公司主体
  51. static{
  52. ddLegalEntity.put("91110105MA04B5ND7J","1125994677035472");//思库共创(北京)营销策划有限公司
  53. ddLegalEntity.put("91330110MA2AYPX2X1","1125994676962964");//杭州光映场景科技有限公司
  54. ddLegalEntity.put("91310120MA1JJJL131","1125994676938831");//上海造酷文化科技有限公司
  55. ddLegalEntity.put("913301060793092966","1125994676742442");//杭州思库营销策划有限公司
  56. ddLegalEntity.put("91330105MA27WGAY7W","1125994677125313");//思门(杭州)品牌营销策划有限公司
  57. ddLegalEntity.put("91330105MA2HYCM71D","1125994676919592");//思库文化传播集团有限公司
  58. ddLegalEntity.put("913301065995586166","1125994677114352");//杭州思库文化创意有限公司
  59. ddLegalEntity.put("91510100MADHQM1A62","1125994677036721");//思库(成都)文化传播有限公司
  60. ddLegalEntity.put("91330105MA2KGRJQ3T","1125994676949976");//光格(杭州)文化传播有限公司
  61. ddLegalEntity.put("91330109MA2B2A0E3N","1125994677041739");//杭州东东腔文化创意有限公司
  62. ddLegalEntity.put("","1125994336723042");//思库(浙江)文化传播有限公司
  63. }
  64. @Override
  65. public McR saveTradingPartner(Map map) {
  66. String formInstId = UtilMap.getString(map, "formInstId");
  67. String type = UtilMap.getString(map, "type");
  68. Map formData = ydClient.queryData(YDParam.builder()
  69. .formInstanceId(formInstId)
  70. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  71. Map partner = new HashMap();
  72. if ("客户".equals(type)){
  73. //客户
  74. // partner.put("parentName", "客户");//所属分类名称
  75. partner.put("name", UtilMap.getString(formData,"textField_mkddjwy3"));//往来单位中文名
  76. partner.put("partnerType", "客户");//往来关系,可选值为:"供应商"、"客户"、"供应商,客户"(既是供应商又是客户的情况下以中文逗号分隔(供应商在前))
  77. partner.put("partnerProperty", "公司");//往来性质,可选值为:"公司"、"个体工商户"
  78. partner.put("businessCode", UtilMap.getString(formData,"serialNumberField_mkddjwy2"));//往来单位编码,不超过50个字符
  79. partner.put("taxNumber", UtilMap.getString(formData,"textField_mkddjwys"));//税务登记号,不超过200个字符
  80. partner.put("readOnly", false);//是否只读,默认false。如果为true,那么在每刻系统中往来单位的所有信息(如权限范围、收款账户等)均无法修改。(接口更新操作不受限制)
  81. partner.put("reMark", "");//往来单位备注
  82. partner.put("enabled", true);//是否启用(true:启用;false:禁用)。若该参数为空,新增则默认为true,更新则保持系统内状态。
  83. }else {
  84. //供应商
  85. String hzlx = UtilMap.getString(formData, "radioField_mketkvw7");
  86. String freeType = UtilMap.getString(formData, "radioField_mmyoc59n");//free类别
  87. // partner.put("parentBizCode", "GYS");//所属分类业务编码
  88. partner.put("name", "个人".equals(freeType) ? UtilMap.getString(formData,"textField_mkkixdd6") : UtilMap.getString(formData,"textField_mketkvv0"));//往来单位中文名
  89. partner.put("partnerType", "供应商");//往来关系,可选值为:"供应商"、"客户"、"供应商,客户"(既是供应商又是客户的情况下以中文逗号分隔(供应商在前))
  90. partner.put("partnerProperty", "个人".equals(freeType) ? "个体工商户" : "公司");//往来性质,可选值为:"公司"、"个体工商户"
  91. partner.put("businessCode", UtilMap.getString(formData,"serialNumberField_mketkvw4"));//往来单位编码,不超过50个字符
  92. partner.put("taxNumber", "个人".equals(freeType) ? "" : UtilMap.getString(formData,"textField_mketkvxo"));//税务登记号,不超过200个字符
  93. partner.put("readOnly", false);//是否只读,默认false。如果为true,那么在每刻系统中往来单位的所有信息(如权限范围、收款账户等)均无法修改。(接口更新操作不受限制)
  94. partner.put("reMark", "");//往来单位备注
  95. partner.put("enabled", "启用".equals(UtilMap.getString(formData,"radioField_mketkvw8")));//是否启用(true:启用;false:禁用)。若该参数为空,新增则默认为true,更新则保持系统内状态。
  96. }
  97. Map body = new HashMap();
  98. body.put("partnerList", Arrays.asList(partner));
  99. Map result = MkBxUtil.saveTradingPartner(body);
  100. List<Map> data = UtilMap.getList(result, "data");
  101. String status = UtilMap.getString(data.get(0), "status");
  102. if ("ALL_FAIL".equals(status)){
  103. //保存往来单位失败回写错误信息
  104. String message = UtilMap.getString(data.get(0), "message");
  105. ydClient.operateData(YDParam.builder()
  106. .formInstanceId(formInstId)
  107. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mmx7nk6m, textareaField_mmx7nk6r","入库失败",message)))
  108. .build(), YDConf.FORM_OPERATION.update);
  109. }
  110. //保存往来单位账户
  111. if ("SUCCESS".equals(status)){
  112. Map account = new HashMap();
  113. account.put("businessCode",UtilMap.getString(formData,"serialNumberField_mketkvw4"));
  114. Map accountItem = new HashMap();
  115. accountItem.put("accountType","BANK");
  116. accountItem.put("accountName",UtilMap.getString(formData,"textField_mketkvxa"));//账户名称
  117. accountItem.put("accountNumber",UtilMap.getString(formData,"textField_mketkvxc"));//账号
  118. accountItem.put("acceptCcy",UtilMap.getString(formData,"textField_mqf1hmt2"));//币别
  119. String country = UtilMap.getString(formData, "selectField_mqenuvgn");
  120. if (!"中国".equals(country)){
  121. accountItem.put("bankBranchName",UtilMap.getString(formData,"selectField_mqenuvgo"));//开户银行(境外)
  122. accountItem.put("",UtilMap.getString(formData,"textField_mqg2ks6b"));//开户银行编码
  123. }else {
  124. accountItem.put("bankBranchNo",UtilMap.getString(formData,"textField_mp27zy92"));//联行号
  125. }
  126. account.put("accounts",Arrays.asList(accountItem));
  127. Map result2 = MkBxUtil.saveAccount(Arrays.asList(account));
  128. List<Map> data2 = UtilMap.getList(result2, "data");
  129. String status2 = UtilMap.getString(data2.get(0), "status");
  130. String message2 = UtilMap.getString(data2.get(0), "message");
  131. if ("ALL_FAIL".equals(status2) || Strings.isNotBlank(message2)){
  132. ydClient.operateData(YDParam.builder()
  133. .formInstanceId(formInstId)
  134. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mmx7nk6m, textareaField_mmx7nk6r","入库成功,账号保存失败",message2)))
  135. .build(), YDConf.FORM_OPERATION.update);
  136. }else {
  137. ydClient.operateData(YDParam.builder()
  138. .formInstanceId(formInstId)
  139. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mmx7nk6m, textareaField_mmx7nk6r","入库成功","")))
  140. .build(), YDConf.FORM_OPERATION.update);
  141. }
  142. }
  143. return McR.success();
  144. }
  145. @Override
  146. public McR saveYpApplication(Map map) {
  147. String formInstId = UtilMap.getString(map, "formInstId");
  148. Map formData = ydClient.queryData(YDParam.builder()
  149. .formInstanceId(formInstId)
  150. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  151. Map application = new HashMap();
  152. application.put("formSubTypeBizCode","KPSQD");//单据编码(云票系统内维护的)
  153. application.put("bizCode", UtilMap.getString(formData,"serialNumberField_mknspz75"));//外部系统中的开票申请单业务编码。必须系统内唯一,用于判断开票申请单是否已导入。
  154. application.put("clientBizCode",UtilMap.getString(formData,"textField_mkxpe3fj"));//收票方bizCode(客户的业务编码(云票系统内维护的))与收票方开票信息字段二选一必填
  155. application.put("clientLegalEntityBizCode",UtilMap.getString(formData,"textField_mkddjwys"));//收票方抬头code,如果不传默认第一个(云票系统内维护的)
  156. String jobNumber = UtilMap.getString(formData, "textField_mo0x02kw");//申请人工号
  157. List<Map> allEmployee = MkYpUtil.getAllEmployee();
  158. String employeeId = mkyp_empId;
  159. for (Map employee : allEmployee) {
  160. String employeeId2 = UtilMap.getString(employee, "employeeId");
  161. if (jobNumber.equals(employeeId2)){
  162. employeeId = employeeId2;
  163. break;
  164. }
  165. }
  166. application.put("submitterBizCode",employeeId);//提交人工号,单据状态为审批中时必填
  167. application.put("applicantBizCode",employeeId);//开票申请人工号
  168. /*Map clientLegalEntityOaDto = new HashMap();//收票方开票信息(不在云票系统内维护的)与收票方bizCode(客户的业务编码)二选一必填且优先级高于收票方bizCode(客户的业务编码)(也就是当两字段都有值时,忽略客户的业务编码)
  169. clientLegalEntityOaDto.put("invoiceTitle",UtilMap.getString(formData,"selectField_mkxmix7e"));//名称
  170. clientLegalEntityOaDto.put("dutyParagraph",UtilMap.getString(formData,"textField_mm2wj87l"));//税号
  171. clientLegalEntityOaDto.put("account",UtilMap.getString(formData,"textField_mm2wj87u"));//账号
  172. clientLegalEntityOaDto.put("bankBranchName",UtilMap.getString(formData,"textField_mm2wj87t"));//银行
  173. application.put("clientLegalEntityOaDto",clientLegalEntityOaDto);*/
  174. application.put("legalEntityBizCode",UtilMap.getString(formData,"textField_mn4dhy5g"));//公司主体code(后续传税号)
  175. application.put("estimatedDate",System.currentTimeMillis());//预计开票时间
  176. String fplx = UtilMap.getString(formData, "selectField_mkdnuvem");//发票类型
  177. String estimatedInvoiceType = "";
  178. if (!"红冲".equals(fplx)){
  179. estimatedInvoiceType = getEstimatedInvoiceType(fplx, estimatedInvoiceType);
  180. application.put("hasRedInvoice",false);//是否负数发票
  181. application.put("redInvoiceReason",UtilMap.getString(formData,"textareaField_mmelm9xt"));//红冲原因
  182. }else {
  183. String lzfplx = UtilMap.getString(formData, "textField_mm2wj87n");//蓝字发票类型
  184. estimatedInvoiceType = getEstimatedInvoiceType(lzfplx, estimatedInvoiceType);
  185. application.put("hasRedInvoice",true);//是否负数发票
  186. }
  187. application.put("estimatedInvoiceType",estimatedInvoiceType);//发票类型
  188. application.put("phoneNumber",UtilMap.getString(formData,"textField_mkdo0azf"));//收票人电话
  189. application.put("email",UtilMap.getString(formData,"textField_mkdo0azn"));//收票邮箱
  190. application.put("autoSendMail",true);//是否自动发送邮件/短信,若传true且填写正确的收票邮箱/手机号,则在开票申请单完全开票后自动发邮件/短信。不填写收票邮箱/短信或传false时,将不会自动交付电子发票。
  191. application.put("applicationComment",UtilMap.getString(formData,"textareaField_mkdo0aze"));//开票备注
  192. Map item = new HashMap();
  193. item.put("productBizCode","1001");//产品bizcode
  194. item.put("invoiceName",UtilMap.getString(formData,"textField_mn4ajusx"));//开票名称
  195. item.put("taxPercent",UtilMap.getDouble(formData,"numberField_mkgkboht")/100);//税率
  196. item.put("forexName","CNY");//币种
  197. item.put("exchangeRate",1);//外汇汇率
  198. item.put("taxClassShortCode",UtilMap.getString(formData,"textField_mm49zsli"));//税收分类编码
  199. if (!"红冲".equals(fplx)){
  200. item.put("quantity",1);//数量
  201. item.put("priceWithTax",UtilMap.getDouble(formData,"numberField_mkdo0azb"));//含税单价
  202. }else {
  203. item.put("quantity",-1);//数量
  204. item.put("priceWithTax",UtilMap.getDouble(formData,"numberField_mknspz7d"));//含税单价
  205. Map originInvoice = new HashMap();
  206. originInvoice.put("blueInvoiceNumber",UtilMap.getString(formData,"textField_mkxmix7d"));//原蓝字发票号
  207. item.put("blueInvoiceDto",Arrays.asList(originInvoice));
  208. }
  209. application.put("items",Arrays.asList(item));
  210. //若为红冲发票,先作废原蓝字发票应收单
  211. if ("红冲".equals(fplx)){
  212. //原蓝字发票应收单查询
  213. String lzlsh = UtilMap.getString(formData, "textField_mknspz7c");//原蓝字发票流水号
  214. Map body1 = new HashMap();
  215. body1.put("applicationInvoiceBizCodeList",Arrays.asList(lzlsh));
  216. body1.put("pageSize",1);
  217. body1.put("pageNum",1);
  218. List<Map> receivableList = MkYpUtil.searchReceivable(body1);
  219. if (!receivableList.isEmpty()){
  220. Map receivable = receivableList.get(0);
  221. String bizCode = UtilMap.getString(receivable, "bizCode");
  222. //作废原蓝字发票应收单
  223. Map body2 = new HashMap();
  224. body2.put("employeeId",employeeId);
  225. body2.put("bizCodeList",Arrays.asList(bizCode));
  226. MkYpUtil.receivableObsolete(body2);
  227. }
  228. }
  229. Map result = MkYpUtil.application(Arrays.asList(application));
  230. if (!isTrue(result)){
  231. ydClient.operateData(YDParam.builder()
  232. .formInstanceId(formInstId)
  233. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("radioField_mkxripcc, textareaField_mmlzqvn0","开票失败",getErrorMsg(result))))
  234. .useLatestVersion(true)
  235. .build(), YDConf.FORM_OPERATION.update);
  236. }
  237. return McR.success();
  238. }
  239. private boolean isTrue(Map result){
  240. String messageCode = UtilMap.getString(result, "messageCode");
  241. String code = UtilMap.getString(result,"code");
  242. if ((Objects.nonNull(messageCode) && "SUCCESS".equals(messageCode)) || (Objects.nonNull(code) && "ACK".equals(code))){
  243. return true;
  244. }else {
  245. return false;
  246. }
  247. }
  248. //获取错误信息
  249. private String getErrorMsg(Map result) {
  250. String errorMsg = UtilMap.getString(result, "message");
  251. Map data = UtilMap.getMap(result, "data");
  252. if (Objects.nonNull(data)){
  253. List<Map> errorData = UtilMap.getList(data, "errorData");
  254. if (Objects.nonNull(errorData) && !errorData.isEmpty()){
  255. for (Map errorDatum : errorData) {
  256. errorMsg = errorMsg + ";" + UtilMap.getString(errorDatum, "errorMessage");
  257. }
  258. }
  259. }
  260. return errorMsg;
  261. }
  262. private static String getEstimatedInvoiceType(String fplx, String estimatedInvoiceType) {
  263. switch (fplx){
  264. case "应/免税普票":
  265. estimatedInvoiceType = "ELECTRONIC_VAT";break;//电子发票(普通发票)(税号开通全电)
  266. case "专票":
  267. estimatedInvoiceType = "ELECTRONIC_SPACIAL_VAT";break;//电子发票(增值税专票)(税号开通全电)
  268. case "红冲":break;
  269. case "形式发票":break;
  270. case "收据":break;
  271. default:break;
  272. } return estimatedInvoiceType;
  273. }
  274. @Async
  275. @Override
  276. public void invoiceWriteBack2(Map map) {
  277. //获取发票信息
  278. Map calloutParams = UtilMap.getMap(map, "calloutParams");
  279. String serviceType = UtilMap.getString(calloutParams, "serviceType");
  280. Map bizData = UtilMap.getMap(calloutParams, "bizData");
  281. if ("INVOICE_VAT_INVOICED_NOTIFY_AR".equals(serviceType)){//开票成功逻辑移到应收单完成回调中
  282. /*//发票开具成功后回调
  283. String bizCode = UtilMap.getString(bizData, "bizCode");//发票号码
  284. String invoiceNumber = UtilMap.getString(bizData, "invoiceNumber");//发票号码
  285. long issueDate = UtilMap.getLong(bizData, "issueDate");//开票日期
  286. String pdfUrl = UtilMap.getString(bizData, "pdfUrl");//pdf文件下载地址
  287. String downloadPageUrl = UtilMap.getString(bizData, "downloadPageUrl");//发票下载页面链接
  288. List<Map> detailItems = (List<Map>) UtilMap.getList(bizData, "detailItems");
  289. List<Map> documentCorrelates = UtilMap.getList(detailItems.get(0), "documentCorrelates");
  290. String lsh = UtilMap.getString(documentCorrelates.get(0), "bizCode");//开票申请单编号
  291. //回写宜搭
  292. Map updateFormData = new HashMap();
  293. updateFormData.put("radioField_mkxripcc","开票成功");
  294. updateFormData.put("textField_mkxripc6",invoiceNumber);
  295. updateFormData.put("dateField_mnfpbwpd",issueDate);
  296. updateFormData.put("textField_mm3aixk0",downloadPageUrl);
  297. updateFormData.put("textareaField_mmlzqvn0","");
  298. if (Strings.isNotBlank(pdfUrl)){
  299. String fileName = invoiceNumber + ".pdf";
  300. String downloadPath = downloadFilePath + fileName;
  301. downloadFile(pdfUrl,downloadPath);//下载pdf发票
  302. String downloadUri = downloadUrl + "/files/" + fileName + "?option=download" + fileName;
  303. String previewUri = downloadUrl + "/files/"+fileName+"?option=preview" + fileName;
  304. Map attachmentField = new HashMap();
  305. attachmentField.put("downloadUrl",downloadUri);
  306. attachmentField.put("name",fileName);
  307. attachmentField.put("previewUrl",previewUri);
  308. attachmentField.put("url",downloadUri);
  309. attachmentField.put("ext","pdf");
  310. updateFormData.put("attachmentField_mkxripc5",Arrays.asList(attachmentField));
  311. }
  312. Map data = ((List<Map>)ydClient.queryData(YDParam.builder()
  313. .formInstanceId(bizCode)
  314. .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_mknspz75",lsh)))
  315. .formUuid("FORM-A9A47B0365DB437F8F4C8E01B4468220K7GU")
  316. .build(), YDConf.FORM_QUERY.retrieve_list).getData()).get(0);
  317. String formInstanceId = UtilMap.getString(data, "formInstanceId");
  318. ydClient.operateData(YDParam.builder()
  319. .formInstanceId(formInstanceId)
  320. .updateFormDataJson(JSONObject.toJSONString(updateFormData))
  321. .build(), YDConf.FORM_OPERATION.update);*/
  322. }else if ("INVOICE_APPLICATION_VAT_FAIL_NOTIFY_AR".equals(serviceType)){
  323. //开票失败后回调
  324. String invoiceErrorMsg = UtilMap.getString(bizData, "invoiceErrorMsg");
  325. String bizCode = UtilMap.getString(bizData, "bizCode");
  326. Map data = ((List<Map>)ydClient.queryData(YDParam.builder()
  327. .formInstanceId(bizCode)
  328. .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_mknspz75",bizCode)))
  329. .formUuid("FORM-A9A47B0365DB437F8F4C8E01B4468220K7GU")
  330. .build(), YDConf.FORM_QUERY.retrieve_list).getData()).get(0);
  331. String formInstanceId = UtilMap.getString(data, "formInstanceId");
  332. ydClient.operateData(YDParam.builder()
  333. .formInstanceId(formInstanceId)
  334. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("radioField_mkxripcc, textareaField_mmlzqvn0","开票失败",invoiceErrorMsg)))
  335. .build(), YDConf.FORM_OPERATION.update);
  336. }
  337. }
  338. @Override
  339. public McR saveBxReimbursement(Map map) {
  340. String formInstId = UtilMap.getString(map, "formInstId");
  341. Map formData = ydClient.queryData(YDParam.builder()
  342. .formInstanceId(formInstId)
  343. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  344. String type = UtilMap.getString(formData, "radioField_mkkmij3b");//需求单类型
  345. String formSubTypeBizCode = "FT208629766551519240";//项目支付单
  346. Double amt = UtilMap.getDouble(formData, "numberField_mkkmij6i");
  347. String empId = "";
  348. String deptBusinessCode = "";
  349. String ydfqr = UtilMap.getString(formData, "textField_mmwvodde");//宜搭发起人工号
  350. String ztcggh = UtilMap.getString(formData, "textField_mmwvfb97");//中台采购工号
  351. String legalEntityBizCode = UtilMap.getString(formData, "textField_mmd6hio7");//公司抬头编码
  352. String xqbh = UtilMap.getString(formData, "serialNumberField_mkkmij3o");//需求编号
  353. long ldjssj = UtilMap.getLong(formData, "dateField_mkdf8q8q");//落地结束时间
  354. String isFree = "FREE需求".equals(type) ? "是" : "否";//是否free
  355. String isDdf = "是".equals(UtilMap.getString(formData, "radioField_mkf2quln")) ? "1" : "2";//是否代垫付
  356. String xmsssyb = UtilMap.getString(formData, "selectField_mkdedkv7");//项目所属事业部
  357. String projectCode = UtilMap.getString(formData, "textField_mmoh6nvx");//项目编码
  358. //针对多供应商分期付款拆分多条每刻项目支付单
  359. if ("常规需求".equals(type)){
  360. List<Map> detailList = UtilMap.getList(formData, "tableField_mkkmij56");//常规-采购明细
  361. for (Map detail : detailList) {
  362. String uuid = UtilMap.getString(detail, "textField_mmvhqm0q");//子表uuid
  363. int index = UtilMap.getInt(detail, "numberField_mn36ykxx");//子表index
  364. Map body = new HashMap();
  365. body.put("formCode",xqbh + "-" + index);//有值时会使用该值作为单据号
  366. body.put("formSubTypeBizCode",formSubTypeBizCode);//表单类型的业务编号
  367. String mktdrgh = UtilMap.getString(detail, "textField_mok5mtsh");//每刻提单人工号
  368. body.put("submittedUserEmployeeId",mktdrgh);//提单人工号
  369. body.put("coverUserEmployeeId",mktdrgh);//承担人工号
  370. List<Map> internalTravelPartner = new ArrayList<>();//内部参与人
  371. internalTravelPartner.add(new HashMap<String,String>(){{put("employeeId",ydfqr);}});
  372. internalTravelPartner.add(new HashMap<String,String>(){{put("employeeId",ztcggh);}});
  373. body.put("travelPartnerInfo",new HashMap<String,List<Map>>(){{put("internalTravelPartner",internalTravelPartner);}});//参与人
  374. //查询宜搭发起人部门
  375. Map employeeDetails = MkBxUtil.employeeDetails(UtilMap.map("employeeIds", Arrays.asList(ydfqr)));
  376. String coverDepartmentBizCode = mkbx_deptId;
  377. if (Objects.nonNull(employeeDetails)){
  378. List<Map> departments = UtilMap.getList(employeeDetails, "departments");
  379. coverDepartmentBizCode = UtilMap.getString(departments.get(0), "businessCode");
  380. }
  381. body.put("coverDepartmentBizCode",coverDepartmentBizCode);//承担部门编码
  382. body.put("reimburseName",UtilMap.getString(detail,"textareaField_mkkmij5i"));//报销事由
  383. body.put("legalEntityBizCode",legalEntityBizCode);//公司抬头编码
  384. body.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmbmohrb"));//往来单位编码
  385. Map customObject = new HashMap();
  386. customObject.put("CF4",new HashMap<String,Long>(){{put("currentTime",ldjssj);}});//落地结束时间
  387. customObject.put("CF3",new HashMap<String,Long>(){{put("currentTime",UtilMap.getLong(detail,"dateField_mmvhqm0u"));}});//期望支付日期
  388. customObject.put("CF6",isFree);////free 是;否
  389. customObject.put("CF5",isDdf);//代垫付 是:1 ; 否:2
  390. customObject.put("CF2",xmsssyb);//项目所属事业部
  391. customObject.put("CF1",projectCode);//项目
  392. customObject.put("CF7",UtilMap.getString(detail,"numberField_mmwt2wcn"));//逾期天数
  393. Map consumeAmount = new HashMap();
  394. consumeAmount.put("amount",String.format("%.2f", UtilMap.getDouble(detail,"numberField_mkkmij5e")));//结算金额
  395. consumeAmount.put("currency","CNY");
  396. customObject.put("CF42",consumeAmount);//采购金额
  397. body.put("customObject",customObject);
  398. //报销单费用导入
  399. Map expenseListItem = new HashMap();
  400. expenseListItem.put("consumeAmount",consumeAmount);
  401. expenseListItem.put("corpExpense",true);//是否对公费用,需要填写true
  402. String gysej = UtilMap.getString(detail, "selectField_mkkkw28y");//供应商二级
  403. expenseListItem.put("expenseTypeBizCode",UtilMap.getString(detail,"textField_mp0m3ks3"));//费用类型业务编码
  404. expenseListItem.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票)
  405. expenseListItem.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填)
  406. expenseListItem.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填)
  407. expenseListItem.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmbmohrb"));//往来单位业务编码
  408. Map consumeLocation = new HashMap();
  409. consumeLocation.put("cityPair",null);
  410. consumeLocation.put("location","110001");//todo 暂时写死 110001 北京
  411. expenseListItem.put("consumeLocation",consumeLocation);
  412. expenseListItem.put("corpExpenseResponsibleEmpIds",Arrays.asList(mktdrgh));//责任人/业务经办人(预付未到票/到票部分支付或不支付 两种场景必填)
  413. Map body2 = new HashMap();
  414. body2.put("employeeId",mktdrgh);//需要导入的对应员工的工号
  415. body2.put("expenseList",Arrays.asList(expenseListItem));
  416. List<String> expenseCodes = new ArrayList<>();
  417. try {
  418. expenseCodes = MkBxUtil.receiveExpense(body2);
  419. }catch (Exception e){
  420. ydClient.operateData(YDParam.builder()
  421. .formInstanceId(formInstId)
  422. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mpp9c6w9, textareaField_mpp9c6wa","推送失败",e.getMessage())))
  423. .build(), YDConf.FORM_OPERATION.update);
  424. continue;
  425. }
  426. body.put("expenseCodes",expenseCodes);//费用类型业务编码
  427. //收款账户
  428. Map payeeAccount = new HashMap();
  429. payeeAccount.put("bankAcctName",UtilMap.getString(detail,"textField_mkkmij6z"));//账户名
  430. payeeAccount.put("bankAcctNumber",UtilMap.getString(detail,"textField_mkkmij6y"));//银行账户
  431. payeeAccount.put("paymentType","BANK");//账户类型;ALIPAY-支付宝,BANK-银行账户,CASH-现金
  432. payeeAccount.put("accountType","CORP");//收款账户类型:个人(员工)-PERSONAL,公司(往来单位)-CORP
  433. body.put("payeeAccount",payeeAccount);
  434. body.put("stagingFlag",true);//暂存标识,默认为false表示不暂存
  435. Map result = MkBxUtil.receiveReimburse(body);
  436. if (isTrue(result)){
  437. ydClient.operateData(YDParam.builder()
  438. .formInstanceId(formInstId)
  439. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mpp9c6w9, textareaField_mpp9c6wa","推送成功","")))
  440. .build(), YDConf.FORM_OPERATION.update);
  441. }else {
  442. String message = UtilMap.getString(result, "message");
  443. ydClient.operateData(YDParam.builder()
  444. .formInstanceId(formInstId)
  445. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mpp9c6w9, textareaField_mpp9c6wa","推送失败",message)))
  446. .build(), YDConf.FORM_OPERATION.update);
  447. }
  448. }
  449. }else {
  450. List<Map> detailList = UtilMap.getList(formData, "tableField_mkkmij61");//free-采购明细
  451. for (Map detail : detailList) {
  452. String uuid = UtilMap.getString(detail, "textField_mmvhqm0s");//子表uuid
  453. int index = UtilMap.getInt(detail, "numberField_mn36ykxz");//子表index
  454. Map body = new HashMap();
  455. body.put("formCode",xqbh + "-" +index);//有值时会使用该值作为单据号
  456. body.put("formSubTypeBizCode",formSubTypeBizCode);//表单类型的业务编号
  457. String mktdrgh = UtilMap.getString(detail, "textField_mok5mtsf");//每刻提单人工号
  458. body.put("submittedUserEmployeeId",mktdrgh);//提单人工号
  459. body.put("coverUserEmployeeId",mktdrgh);//承担人工号
  460. List<Map> internalTravelPartner = new ArrayList<>();//内部参与人
  461. internalTravelPartner.add(new HashMap<String,String>(){{put("employeeId",ydfqr);}});
  462. internalTravelPartner.add(new HashMap<String,String>(){{put("employeeId",ztcggh);}});
  463. body.put("travelPartnerInfo",new HashMap<String,List<Map>>(){{put("internalTravelPartner",internalTravelPartner);}});//参与人
  464. //查询宜搭发起人部门
  465. Map employeeDetails = MkBxUtil.employeeDetails(UtilMap.map("employeeIds", Arrays.asList(ydfqr)));
  466. String coverDepartmentBizCode = mkbx_deptId;
  467. if (Objects.nonNull(employeeDetails)){
  468. List<Map> departments = UtilMap.getList(employeeDetails, "departments");
  469. coverDepartmentBizCode = UtilMap.getString(departments.get(0), "businessCode");
  470. }
  471. body.put("coverDepartmentBizCode",coverDepartmentBizCode);//承担部门编码
  472. body.put("reimburseName","FREE-" + UtilMap.getString(detail,"textareaField_mkkmij64"));//报销事由
  473. body.put("legalEntityBizCode",legalEntityBizCode);//公司抬头编码
  474. body.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmekbfa2"));//往来单位编码
  475. Map customObject = new HashMap();
  476. customObject.put("CF4",new HashMap<String,Long>(){{put("currentTime",ldjssj);}});//落地结束时间
  477. customObject.put("CF3",new HashMap<String,Long>(){{put("currentTime",UtilMap.getLong(detail,"dateField_mkkkw298"));}});//期望支付日期
  478. customObject.put("CF6",isFree);//free 是;否
  479. customObject.put("CF5",isDdf);//代垫付 是:1 ; 否:2
  480. customObject.put("CF2",xmsssyb);//项目所属事业部
  481. customObject.put("CF1",projectCode);//项目
  482. customObject.put("CF7",UtilMap.getString(detail,"numberField_mmwswtkx"));//逾期天数
  483. Map consumeAmount = new HashMap();
  484. consumeAmount.put("amount",String.format("%.2f", UtilMap.getDouble(detail,"numberField_mkkmij6p")));//结算金额
  485. consumeAmount.put("currency","CNY");
  486. customObject.put("CF42",consumeAmount);//采购金额
  487. body.put("customObject",customObject);
  488. //报销单费用导入
  489. Map expenseListItem = new HashMap();
  490. expenseListItem.put("consumeAmount",consumeAmount);
  491. expenseListItem.put("corpExpense",true);//是否对公费用,需要填写true
  492. String gysej = UtilMap.getString(detail, "selectField_mmwuzaql");//供应商二级
  493. expenseListItem.put("expenseTypeBizCode",UtilMap.getString(detail,"textField_mp0m3ks5"));//费用类型业务编码
  494. expenseListItem.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票)
  495. expenseListItem.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填)
  496. expenseListItem.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填)
  497. expenseListItem.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmekbfa2"));//往来单位业务编码
  498. Map consumeLocation = new HashMap();
  499. consumeLocation.put("cityPair",null);
  500. consumeLocation.put("location","110001");//todo 暂时写死 110001 北京
  501. expenseListItem.put("consumeLocation",consumeLocation);
  502. expenseListItem.put("corpExpenseResponsibleEmpIds",Arrays.asList(mktdrgh));//责任人/业务经办人(预付未到票/到票部分支付或不支付 两种场景必填)
  503. Map body2 = new HashMap();
  504. body2.put("employeeId",mktdrgh);//需要导入的对应员工的工号
  505. body2.put("expenseList",Arrays.asList(expenseListItem));
  506. List<String> expenseCodes = new ArrayList<>();
  507. try {
  508. expenseCodes = MkBxUtil.receiveExpense(body2);
  509. }catch (Exception e){
  510. ydClient.operateData(YDParam.builder()
  511. .formInstanceId(formInstId)
  512. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mpp9c6w9, textareaField_mpp9c6wa","推送失败",e.getMessage())))
  513. .build(), YDConf.FORM_OPERATION.update);
  514. continue;
  515. }
  516. body.put("expenseCodes",expenseCodes);//费用类型业务编码
  517. //收款账户
  518. Map payeeAccount = new HashMap();
  519. payeeAccount.put("bankAcctName",UtilMap.getString(detail,"textField_mketkvxa"));//账户名
  520. payeeAccount.put("bankAcctNumber",UtilMap.getString(detail,"textField_mketkvxc"));//银行账户
  521. payeeAccount.put("paymentType","BANK");//账户类型;ALIPAY-支付宝,BANK-银行账户,CASH-现金
  522. payeeAccount.put("accountType","CORP");//收款账户类型:个人(员工)-PERSONAL,公司(往来单位)-CORP
  523. body.put("payeeAccount",payeeAccount);
  524. body.put("stagingFlag",true);//暂存标识,默认为false表示不暂存
  525. Map result = MkBxUtil.receiveReimburse(body);
  526. if (isTrue(result)){
  527. ydClient.operateData(YDParam.builder()
  528. .formInstanceId(formInstId)
  529. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mpp9c6w9, textareaField_mpp9c6wa","推送成功","")))
  530. .build(), YDConf.FORM_OPERATION.update);
  531. }else {
  532. String message = UtilMap.getString(result, "message");
  533. ydClient.operateData(YDParam.builder()
  534. .formInstanceId(formInstId)
  535. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mpp9c6w9, textareaField_mpp9c6wa","推送失败",message)))
  536. .build(), YDConf.FORM_OPERATION.update);
  537. }
  538. }
  539. }
  540. /*Map body = new HashMap();
  541. body.put("formCode",UtilMap.getString(formData,"serialNumberField_mkkmij3o"));//有值时会使用该值作为单据号
  542. body.put("formSubTypeBizCode","FT208629766551519240");//表单类型的业务编号 todo 暂时写死 FT208629766551519240 宜搭支付单
  543. body.put("submittedUserEmployeeId","002");//提单人工号 todo 暂时写死 002 wzy
  544. body.put("reimburseName",UtilMap.getString(formData,"textareaField_mmbmohr9"));//报销事由
  545. body.put("legalEntityBizCode",UtilMap.getString(formData,"textField_mmd6hio7"));//公司抬头编码
  546. body.put("coverUserEmployeeId","002");//承担人工号 todo 暂时写死 002 wzy
  547. body.put("coverDepartmentBizCode","DI203800035494740082");//承担部门编码 todo 暂时写死 DI203800035494740082
  548. Map customObject = new HashMap();
  549. customObject.put("CF4",new HashMap<String,Long>(){{put("currentTime",UtilMap.getLong(formData,"dateField_mkdf8q8q"));}});//落地结束时间
  550. customObject.put("CF3",new HashMap<String,Long>(){{put("currentTime",UtilMap.getLong(formData,"dateField_mkkkw298"));}});//预计支付日期
  551. customObject.put("CF6",UtilMap.getString(formData,"radioField_mkf2quln"));////free 是;否
  552. customObject.put("CF5","是".equals(UtilMap.getString(formData,"radioField_mkf2quln")) ? "1" : "2");//代垫付 是:1 ; 否:2
  553. customObject.put("CF2",UtilMap.getString(formData,"selectField_mkdedkv7"));//项目所属事业部
  554. customObject.put("CF1",UtilMap.getString(formData,"textField_mmoh6nvx"));//项目
  555. body.put("customObject",customObject);
  556. List<String> expenseCodes = new ArrayList<>();
  557. List<Map> collectionSchedule = new ArrayList<>();
  558. List<Map> expenseList = new ArrayList<>();
  559. if ("常规需求".equals(type)){
  560. List<Map> detailList = UtilMap.getList(formData, "tableField_mkkmij56");//常规-采购明细
  561. for (Map result : detailList) {
  562. Map item = new HashMap();
  563. Map consumeAmount = new HashMap();
  564. consumeAmount.put("amount",String.format("%.2f", UtilMap.getDouble(result,"numberField_mkkmij5e")));//结算金额
  565. consumeAmount.put("currency","CNY");
  566. item.put("consumeAmount",consumeAmount);
  567. item.put("corpExpense",true);//是否对公费用,需要填写true
  568. item.put("expenseTypeBizCode","200140");//费用类型业务编码 todo 暂时写死 200140 其他费用
  569. item.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票)
  570. item.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填)
  571. item.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填)
  572. item.put("tradingPartnerBizCode",UtilMap.getString(result,"textField_mmbmohrb"));//往来单位业务编码
  573. Map consumeLocation = new HashMap();
  574. consumeLocation.put("cityPair",null);
  575. consumeLocation.put("location","110001");
  576. item.put("consumeLocation",consumeLocation);
  577. item.put("corpExpenseResponsibleEmpIds",Arrays.asList("002"));//责任人/业务经办人(预付未到票/到票部分支付或不支付 两种场景必填) todo 暂时写死 002 wzy
  578. expenseList.add(item);
  579. Map collectionScheduleItem = new HashMap();
  580. Map payeeAccount = new HashMap();
  581. payeeAccount.put("bankAcctName",UtilMap.getString(result,"textField_mkkmij6z"));//账户名
  582. payeeAccount.put("bankAcctNumber",UtilMap.getString(result,"textField_mkkmij6y"));//银行账户
  583. payeeAccount.put("paymentType","BANK");//账户类型;ALIPAY-支付宝,BANK-银行账户,CASH-现金
  584. payeeAccount.put("accountType","CORP");//收款账户类型:个人(员工)-PERSONAL,公司(往来单位)-CORP
  585. collectionScheduleItem.put("payeeAccount",payeeAccount);
  586. collectionScheduleItem.put("collectionTradingPartnerBizCode",UtilMap.getString(result,"textField_mmbmohrb"));//收款往来单位编码
  587. collectionScheduleItem.put("amountRatio",0);//收款比例
  588. collectionScheduleItem.put("amount",new HashMap<>(consumeAmount));//收款金额
  589. collectionScheduleItem.put("collectionType","BANK");//支付类型
  590. collectionSchedule.add(collectionScheduleItem);
  591. }
  592. }else {
  593. List<Map> detailList = UtilMap.getList(formData, "tableField_mkkmij61");//free-采购明细
  594. for (Map result : detailList) {
  595. Map item = new HashMap();
  596. Map consumeAmount = new HashMap();
  597. consumeAmount.put("amount",String.format("%.2f", UtilMap.getDouble(result,"numberField_mkkmij6p")));//结算金额
  598. consumeAmount.put("currency","CNY");
  599. item.put("consumeAmount",consumeAmount);
  600. item.put("corpExpense",true);//是否对公费用,需要填写true
  601. item.put("expenseTypeBizCode","200140");//费用类型业务编码 todo 暂时写死 200140 其他费用
  602. item.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票)
  603. item.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填)
  604. item.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填)
  605. item.put("tradingPartnerBizCode",UtilMap.getString(result,"textField_mmekbfa2"));//往来单位业务编码
  606. Map consumeLocation = new HashMap();
  607. consumeLocation.put("cityPair",null);
  608. consumeLocation.put("location","110001");
  609. item.put("consumeLocation",consumeLocation);
  610. item.put("corpExpenseResponsibleEmpIds",Arrays.asList("002"));//责任人/业务经办人(预付未到票/到票部分支付或不支付 两种场景必填) todo 暂时写死 002 wzy
  611. expenseList.add(item);
  612. Map collectionScheduleItem = new HashMap();
  613. Map payeeAccount = new HashMap();
  614. payeeAccount.put("bankAcctName",UtilMap.getString(result,"textField_mketkvxa"));//账户名
  615. payeeAccount.put("bankAcctNumber",UtilMap.getString(result,"textField_mketkvxc"));//银行账户
  616. payeeAccount.put("paymentType","BANK");//账户类型;ALIPAY-支付宝,BANK-银行账户,CASH-现金
  617. payeeAccount.put("accountType","CORP");//收款账户类型:个人(员工)-PERSONAL,公司(往来单位)-CORP
  618. collectionScheduleItem.put("payeeAccount",payeeAccount);
  619. collectionScheduleItem.put("collectionTradingPartnerBizCode",UtilMap.getString(result,"textField_mmekbfa2"));//收款往来单位编码
  620. collectionScheduleItem.put("amountRatio",0);//收款比例
  621. collectionScheduleItem.put("amount",new HashMap<>(consumeAmount));//收款金额
  622. collectionScheduleItem.put("collectionType","BANK");//支付类型
  623. collectionSchedule.add(collectionScheduleItem);
  624. }
  625. }
  626. //报销单费用导入
  627. Map body2 = new HashMap();
  628. body2.put("employeeId","002");//需要导入的对应员工的工号
  629. body2.put("expenseList",expenseList);
  630. expenseCodes = MkBxUtil.receiveExpense(body2);
  631. body.put("expenseCodes",expenseCodes);//费用类型业务编码
  632. body.put("collectionSchedule",collectionSchedule);//多人收款,如果已填充该字段,则无需填充上方的收款账户字段,若传多人收款,则paymentSceneBizCode参数必填
  633. body.put("paymentSceneBizCode","DGYSSK");//多人收款场景(支付场景)表单业务编码,需要填写多人收款时必填
  634. body.put("stagingFlag",false);////暂存标识,默认为false表示不暂存
  635. Map result = MkBxUtil.receiveReimburse(body);*/
  636. return McR.success();
  637. }
  638. @Override
  639. public McR saveYpClient(Map map) {
  640. String formInstId = UtilMap.getString(map, "formInstId");
  641. Map formData = ydClient.queryData(YDParam.builder()
  642. .formInstanceId(formInstId)
  643. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  644. Map customerObj = new HashMap();
  645. customerObj.put("bizCode",UtilMap.getString(formData,"serialNumberField_mkddjwy2"));//客户编码, 系统内唯一。
  646. customerObj.put("name",UtilMap.getString(formData,"textField_mkddjwy3"));//客户名称,系统内唯一
  647. customerObj.put("type","CORP");//客户类型: CORP (公司,默认), SELF_EMPLOYED(个体经营商)
  648. customerObj.put("nameAutoCode",false);
  649. customerObj.put("status","ENABLED");//客户状态:DISABLED("禁用" ,默认) ENABLED("启用")
  650. List<Map> contacts = new ArrayList<>();
  651. List<Map> contactList = UtilMap.getList(formData, "tableField_mkddjwyv");
  652. for (Map contact : contactList) {
  653. Map contactObj = new HashMap();
  654. contactObj.put("name",UtilMap.getString(contact,"textField_mkddjwyw"));//联系人姓名
  655. contactObj.put("phoneNumber",UtilMap.getString(contact,"textField_mkddjwyx"));//联系电话
  656. contactObj.put("position",UtilMap.getString(contact,"textField_mkg8toy9"));//职位
  657. contacts.add(contactObj);
  658. }
  659. customerObj.put("contacts",contacts);//联系人列表
  660. List<Map> invoiceTitles = new ArrayList<>();
  661. List<Map> accounts = new ArrayList<>();
  662. List<Map> invoiceList = UtilMap.getList(formData, "tableField_mn496ozf");
  663. for (Map invoice : invoiceList) {
  664. Map invoiceTitle = new HashMap();
  665. invoiceTitle.put("invoiceTitle",UtilMap.getString(invoice,"textField_mkddjwyr"));//发票抬头
  666. invoiceTitle.put("dutyParagraph",UtilMap.getString(invoice,"textField_mkddjwys"));//税号
  667. invoiceTitle.put("bizCode",UtilMap.getString(invoice,"textField_mkddjwys"));//业务编码
  668. invoiceTitle.put("bankBranchName",UtilMap.getString(invoice,"textField_mkddjwyt"));//开户行
  669. invoiceTitle.put("account",UtilMap.getString(invoice,"textField_mkddjwyu"));//银行账户
  670. invoiceTitles.add(invoiceTitle);
  671. Map account = new HashMap();
  672. account.put("paymentType","BANK");//账户类型,
  673. account.put("bankAcctName",UtilMap.getString(invoice,"textField_mkddjwyr"));//账户名
  674. account.put("bankAcctNumber",UtilMap.getString(invoice,"textField_mkddjwyu"));//银行对应银行卡号
  675. account.put("bankName",UtilMap.getString(invoice,"textField_mkddjwyt"));//银行名称
  676. accounts.add(account);
  677. }
  678. customerObj.put("invoiceTitles",invoiceTitles);//账户信息
  679. customerObj.put("accounts",accounts);//账户信息
  680. MkYpUtil.saveClient(Arrays.asList(customerObj));
  681. return McR.success();
  682. }
  683. @Async
  684. @Override
  685. public void invoiceWriteBack(Map map) {
  686. Map calloutParams = UtilMap.getMap(map, "calloutParams");
  687. Map bizData = UtilMap.getMap(calloutParams, "bizData");
  688. long verifyDate = UtilMap.getLong(bizData, "verifyDate");//核销日期
  689. List<Map> upStreamItemList = UtilMap.getList(bizData, "upStreamItemList");//主核销方核销明细
  690. Double totalVerifyAmount = UtilMap.getDouble(upStreamItemList.get(0), "totalVerifyAmount");//本次核销金额
  691. List<Map> relatedDocuments = UtilMap.getList(bizData, "relatedDocuments");
  692. for (Map relatedDocument : relatedDocuments) {
  693. String formType = UtilMap.getString(relatedDocument, "formType");
  694. if ("RECEIVABLE_AR".equals(formType)){
  695. String bizCode = UtilMap.getString(relatedDocument, "bizCode");
  696. //应收单查询
  697. Map body = new HashMap();
  698. body.put("bizCodes",Arrays.asList(bizCode));
  699. body.put("pageNum",1);
  700. body.put("pageSize",1);
  701. Map receivable = MkYpUtil.searchReceivable(body).get(0);
  702. Map invoice = ((List<Map>) UtilMap.getList(receivable, "invoiceList")).get(0);
  703. String invoiceNumber = UtilMap.getString(invoice, "invoiceNumber");//发票号码
  704. Double receivedAmount = UtilMap.getDouble(receivable, "receivedAmount");//已收金额
  705. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  706. .formUuid("FORM-A9A47B0365DB437F8F4C8E01B4468220K7GU")
  707. .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mkxripc6",invoiceNumber)))
  708. .build(), YDConf.FORM_QUERY.retrieve_list).getData();
  709. String formInstanceId = UtilMap.getString(data.get(0), "formInstanceId");
  710. Map updateFormData = new HashMap();
  711. updateFormData.put("numberField_ml8t9c4u",receivedAmount);//已收金额
  712. updateFormData.put("dateField_mnfpbwpe",verifyDate);//核销日期
  713. updateFormData.put("numberField_mngxcnih",totalVerifyAmount);//本次核销金额
  714. ydClient.operateData(YDParam.builder()
  715. .formInstanceId(formInstanceId)
  716. .updateFormDataJson(JSONObject.toJSONString(updateFormData))
  717. .build(), YDConf.FORM_OPERATION.update);
  718. return;
  719. }
  720. }
  721. }
  722. @Async
  723. @Override
  724. public void invoiceWriteBack3(Map map) {
  725. String formCode = UtilMap.getString(map, "formCode");
  726. if (!formCode.contains("需求") && !formCode.contains("采购")){
  727. //判断是否为核销报销单
  728. Map formData = UtilMap.getMap(map, "formData");
  729. Map expenseList = UtilMap.getMap(formData, "expenseList");
  730. List<Map> expenseValueList = UtilMap.getList(expenseList, "value");
  731. for (Map expenseValue : expenseValueList) {
  732. Map deductionList = UtilMap.getMap(expenseValue, "deductionList");//当前对公费用核销的数据(当前到票核销场景核销了哪些“预付未到票”记录)
  733. Map expenseDeductionTaxAmount = UtilMap.getMap(expenseValue, "expenseDeductionTaxAmount");//费用级抵扣税额(消费币种)
  734. Double sj = UtilMap.getDouble(expenseDeductionTaxAmount, "amount");//每刻实际税金
  735. List<Map> deductionValueList = UtilMap.getList(deductionList, "value");
  736. Map deductionValue = deductionValueList.get(0);
  737. Double deductionAmount = UtilMap.getDouble(deductionValue, "deductionAmount");//核销金额
  738. String targetFormCode = UtilMap.getString(deductionValue, "targetFormCode");//核销报销单编号
  739. if (targetFormCode.contains("需求") || targetFormCode.contains("采购")){
  740. //更新宜搭核销金额及税金
  741. updateYdDeduction(targetFormCode,deductionAmount,sj);
  742. }
  743. }
  744. return;
  745. }
  746. Map reimburseDetailInfo = MkBxUtil.reimburseDetailInfo(formCode);
  747. Boolean installment = UtilMap.getBoolean(reimburseDetailInfo, "installment");//是否使用分期付款
  748. Boolean firstPeriodPayment = UtilMap.getBoolean(reimburseDetailInfo, "firstPeriodPayment");//分期情况下首期是否随本单支付
  749. double amt = 0;
  750. if (installment){
  751. if (firstPeriodPayment){
  752. List<Map> collectionSchedule = UtilMap.getList(reimburseDetailInfo, "collectionSchedule");
  753. Map collectionAmount = UtilMap.getMap(collectionSchedule.get(0), "collectionAmount");
  754. amt = UtilMap.getDouble(collectionAmount,"amount");
  755. }else {
  756. return;
  757. }
  758. }else {
  759. Map paymentAmount = UtilMap.getMap(reimburseDetailInfo, "paymentAmount");
  760. amt = UtilMap.getDouble(paymentAmount, "amount");//应付金额
  761. }
  762. long approvedAt = UtilMap.getLong(reimburseDetailInfo, "approvedAt");//审批通过时间
  763. String[] split = formCode.split("-");
  764. String bh = split[0];//采购需求编号/直接采购单编号
  765. int index = Integer.parseInt(split[1]);//子表索引
  766. Map updateFormData = new HashMap();
  767. List<Map> updateDetailList = new ArrayList<>();
  768. if (formCode.contains("需求")){
  769. //采购需求&结算
  770. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  771. .formUuid("FORM-C8C1FBBA781C4C5EBAC487C07BC5A86AD2HO")
  772. .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_mkkmij3o", bh)))
  773. .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
  774. String formInstanceId = UtilMap.getString(data.get(0), "formInstanceId");
  775. Map ydFormData = UtilMap.getMap(data.get(0), "formData");
  776. String type = UtilMap.getString(ydFormData, "radioField_mkkmij3b");
  777. if ("常规需求".equals(type)){
  778. List<Map> detailList = UtilMap.getList(ydFormData, "tableField_mkkmij56");
  779. for (Map detail : detailList) {
  780. Map detailMap = new HashMap();
  781. if (index == UtilMap.getInt(detail, "numberField_mn36ykxx")){
  782. Double jscb = UtilMap.getDouble(detail, "numberField_mkkmij5e");//结算成本
  783. Double yfkje = UtilMap.getDouble(detail, "numberField_mmvqom6l");//已付款金额
  784. String fkzt = UtilMap.getString(detail, "selectField_mmvhqm0p");//付款状态
  785. if (yfkje + amt == jscb){
  786. detailMap.put("selectField_mmvhqm0p","全部付款");
  787. }else if (yfkje + amt < jscb && yfkje + amt > 0 && !"部分退款".equals(fkzt)){
  788. detailMap.put("selectField_mmvhqm0p","部分付款");
  789. }
  790. detailMap.put("numberField_mmvqom6l",yfkje + amt);
  791. detailMap.put("dateField_mnh6e4zy",approvedAt);
  792. }
  793. updateDetailList.add(detailMap);
  794. }
  795. updateFormData.put("tableField_mkkmij56",updateDetailList);
  796. }else {
  797. List<Map> detailList = UtilMap.getList(ydFormData, "tableField_mkkmij61");
  798. for (Map detail : detailList) {
  799. Map detailMap = new HashMap();
  800. if (index == UtilMap.getInt(detail, "numberField_mn36ykxz")){
  801. Double jscb = UtilMap.getDouble(detail, "numberField_mkkmij6p");//结算成本
  802. Double yfkje = UtilMap.getDouble(detail, "numberField_mmvqs9h6");//已付款金额
  803. String fkzt = UtilMap.getString(detail, "selectField_mkkmij6a");//付款状态
  804. if (yfkje + amt == jscb){
  805. detailMap.put("selectField_mkkmij6a","全部付款");
  806. }else if (yfkje + amt < jscb && yfkje + amt > 0 && !"部分退款".equals(fkzt)){
  807. detailMap.put("selectField_mkkmij6a","部分付款");
  808. }
  809. detailMap.put("numberField_mmvqs9h6",yfkje + amt);
  810. detailMap.put("dateField_mnh6e4zw",approvedAt);
  811. }
  812. updateDetailList.add(detailMap);
  813. }
  814. updateFormData.put("tableField_mkkmij61",updateDetailList);
  815. }
  816. Double yzf = UtilMap.getDouble(ydFormData, "numberField_mkf2qumf");//已支付
  817. updateFormData.put("numberField_mkf2qumf",yzf + amt);//已支付
  818. updateFormData.put("numberField_mnibjld0",amt);//最新支付金额
  819. ydClient.operateData(YDParam.builder()
  820. .formInstanceId(formInstanceId)
  821. .updateFormDataJson(JSONObject.toJSONString(updateFormData))
  822. .useLatestVersion(true)
  823. .build(), YDConf.FORM_OPERATION.update);
  824. }else {
  825. //直接采购结算单
  826. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  827. .formUuid("FORM-1AFEDDA034C74F0DB18FA60C941CB56EHUUG")
  828. .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_mkkmij3o", bh)))
  829. .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
  830. String formInstanceId = UtilMap.getString(data.get(0), "formInstanceId");
  831. Map ydFormData = UtilMap.getMap(data.get(0), "formData");
  832. String type = UtilMap.getString(ydFormData, "radioField_mkkmij3b");
  833. if ("常规采购".equals(type)){
  834. List<Map> detailList = UtilMap.getList(ydFormData, "tableField_mkkmij56");
  835. for (Map detail : detailList) {
  836. Map detailMap = new HashMap();
  837. if (index == UtilMap.getInt(detail, "numberField_mn36ykxx")){
  838. Double jscb = UtilMap.getDouble(detail, "numberField_mkkmij5e");//结算成本
  839. Double yfkje = UtilMap.getDouble(detail, "numberField_mmvqom6k");//已付款金额
  840. String fkzt = UtilMap.getString(detail, "selectField_mmvhtdy0");//付款状态
  841. if (yfkje + amt == jscb){
  842. detailMap.put("selectField_mmvhtdy0","全部付款");
  843. }else if (yfkje + amt < jscb && yfkje + amt > 0 && !"部分退款".equals(fkzt)){
  844. detailMap.put("selectField_mmvhtdy0","部分付款");
  845. }
  846. detailMap.put("numberField_mmvqom6k",yfkje + amt);
  847. detailMap.put("dateField_mnh6e4zy",approvedAt);
  848. }
  849. updateDetailList.add(detailMap);
  850. }
  851. updateFormData.put("tableField_mkkmij56",updateDetailList);
  852. }else {
  853. List<Map> detailList = UtilMap.getList(ydFormData, "tableField_mkkmij61");
  854. for (Map detail : detailList) {
  855. Map detailMap = new HashMap();
  856. if (index == UtilMap.getInt(detail, "numberField_mn36ykxz")){
  857. Double jscb = UtilMap.getDouble(detail, "numberField_mkkmij6p");//结算成本
  858. Double yfkje = UtilMap.getDouble(detail, "numberField_mmvqom6l");//已付款金额
  859. String fkzt = UtilMap.getString(detail, "selectField_mkkmij6a");//付款状态
  860. if (yfkje + amt == jscb){
  861. detailMap.put("selectField_mkkmij6a","全部付款");
  862. }else if (yfkje + amt < jscb && yfkje + amt > 0 && !"部分退款".equals(fkzt)){
  863. detailMap.put("selectField_mkkmij6a","部分付款");
  864. }
  865. detailMap.put("numberField_mmvqom6l",yfkje + amt);
  866. detailMap.put("dateField_mnh6e4zw",approvedAt);
  867. }
  868. updateDetailList.add(detailMap);
  869. }
  870. updateFormData.put("tableField_mkkmij61",updateDetailList);
  871. }
  872. Double yzf = UtilMap.getDouble(ydFormData, "numberField_mkf2qumf");//已支付
  873. updateFormData.put("numberField_mkf2qumf",yzf + amt);//已支付
  874. updateFormData.put("numberField_mnibjld0",amt);//最新支付金额
  875. ydClient.operateData(YDParam.builder()
  876. .formInstanceId(formInstanceId)
  877. .updateFormDataJson(JSONObject.toJSONString(updateFormData))
  878. .useLatestVersion(true)
  879. .build(), YDConf.FORM_OPERATION.update);
  880. }
  881. }
  882. //更新宜搭采购已核销金额
  883. private void updateYdDeduction(String formCode, Double deductionAmount,Double sj) {
  884. String[] split = formCode.split("-");
  885. String bh = split[0];
  886. int index = Integer.parseInt(split[1]);
  887. Map updateFormData = new HashMap();
  888. List<Map> updateDetailList = new ArrayList<>();
  889. if (formCode.contains("需求")){
  890. //采购需求&结算
  891. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  892. .formUuid("FORM-C8C1FBBA781C4C5EBAC487C07BC5A86AD2HO")
  893. .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_mkkmij3o", bh)))
  894. .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
  895. String formInstanceId = UtilMap.getString(data.get(0), "formInstanceId");
  896. Map ydFormData = UtilMap.getMap(data.get(0), "formData");
  897. String type = UtilMap.getString(ydFormData, "radioField_mkkmij3b");
  898. if ("常规需求".equals(type)){
  899. List<Map> detailList = UtilMap.getList(ydFormData, "tableField_mkkmij56");
  900. for (Map detail : detailList) {
  901. Map detailMap = new HashMap();
  902. if (index == UtilMap.getInt(detail, "numberField_mn36ykxx")){
  903. Double yhxje = UtilMap.getDouble(detail, "numberField_mniatky8");//已核销金额
  904. Double ythje = UtilMap.getDouble(detail, "numberField_mn4g182f");//已退回金额
  905. Double mksjsj = UtilMap.getDouble(detail, "numberField_mob8gv4p");//每刻实际税金
  906. Double ydsj = UtilMap.getDouble(detail, "numberField_mmsvi56x");//税金
  907. Double ydcgje = UtilMap.getDouble(detail, "numberField_mkkmij5e");//采购金额
  908. detailMap.put("numberField_mniatky8",yhxje + deductionAmount);
  909. detailMap.put("numberField_mob8gv4p",mksjsj + sj);//每刻实际税金
  910. //若采购金额等于已核销金额+本次核销金额+已退回金额
  911. if (ydcgje == yhxje + deductionAmount + ythje){
  912. Double totalSj = UtilMap.getDouble(ydFormData, "numberField_mkkmij6k");//总税金
  913. updateFormData.put("numberField_mkkmij6k",totalSj - ydsj + sj);//总税金
  914. updateFormData.put("numberField_mob8gv4v",-ydsj + sj);//最新税金插值
  915. }
  916. }
  917. updateDetailList.add(detailMap);
  918. }
  919. updateFormData.put("tableField_mkkmij56",updateDetailList);
  920. }else {
  921. List<Map> detailList = UtilMap.getList(ydFormData, "tableField_mkkmij61");
  922. for (Map detail : detailList) {
  923. Map detailMap = new HashMap();
  924. if (index == UtilMap.getInt(detail, "numberField_mn36ykxz")){
  925. Double yhxje = UtilMap.getDouble(detail, "numberField_mniatkya");//已核销金额
  926. Double ythje = UtilMap.getDouble(detail, "numberField_mn4g182g");//已退回金额
  927. Double mksjsj = UtilMap.getDouble(detail, "numberField_mob8gv4q");//每刻实际税金
  928. Double ydsj = UtilMap.getDouble(detail, "numberField_mn3zekbx");//税金
  929. Double ydcgje = UtilMap.getDouble(detail, "numberField_mkkmij6p");//采购金额
  930. detailMap.put("numberField_mniatkya",yhxje + deductionAmount);
  931. detailMap.put("numberField_mob8gv4q",mksjsj + sj);//每刻实际税金
  932. //若采购金额等于已核销金额+本次核销金额+已退回金额
  933. if (ydcgje == yhxje + deductionAmount + ythje){
  934. Double totalSj = UtilMap.getDouble(ydFormData, "numberField_mkkmij6k");//总税金
  935. updateFormData.put("numberField_mkkmij6k",totalSj - ydsj + sj);//总税金
  936. updateFormData.put("numberField_mob8gv4v",-ydsj + sj);//最新税金插值
  937. }
  938. }
  939. updateDetailList.add(detailMap);
  940. }
  941. updateFormData.put("tableField_mkkmij61",updateDetailList);
  942. }
  943. ydClient.operateData(YDParam.builder()
  944. .formInstanceId(formInstanceId)
  945. .updateFormDataJson(JSONObject.toJSONString(updateFormData))
  946. .useLatestVersion(true)
  947. .build(), YDConf.FORM_OPERATION.update);
  948. }else {
  949. //直接采购结算单
  950. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  951. .formUuid("FORM-1AFEDDA034C74F0DB18FA60C941CB56EHUUG")
  952. .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_mkkmij3o", bh)))
  953. .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
  954. String formInstanceId = UtilMap.getString(data.get(0), "formInstanceId");
  955. Map ydFormData = UtilMap.getMap(data.get(0), "formData");
  956. String type = UtilMap.getString(ydFormData, "radioField_mkkmij3b");
  957. if ("常规采购".equals(type)){
  958. List<Map> detailList = UtilMap.getList(ydFormData, "tableField_mkkmij56");
  959. for (Map detail : detailList) {
  960. Map detailMap = new HashMap();
  961. if (index == UtilMap.getInt(detail, "numberField_mn36ykxx")){
  962. Double yhxje = UtilMap.getDouble(detail, "numberField_mniatky8");//已核销金额
  963. Double ythje = UtilMap.getDouble(detail, "numberField_mn4g182f");//已退回金额
  964. Double mksjsj = UtilMap.getDouble(detail, "numberField_mob8gv4p");//每刻实际税金
  965. Double ydsj = UtilMap.getDouble(detail, "numberField_mmsvi56x");//税金
  966. Double ydcgje = UtilMap.getDouble(detail, "numberField_mkkmij5e");//采购金额
  967. detailMap.put("numberField_mniatky8",yhxje + deductionAmount);
  968. detailMap.put("numberField_mob8gv4p",mksjsj + sj);//每刻实际税金
  969. //若采购金额等于已核销金额+本次核销金额+已退回金额
  970. if (ydcgje == yhxje + deductionAmount + ythje){
  971. Double totalSj = UtilMap.getDouble(ydFormData, "numberField_mkkmij6k");//总税金
  972. updateFormData.put("numberField_mkkmij6k",totalSj - ydsj + sj);//总税金
  973. updateFormData.put("numberField_mob8gv4v",-ydsj + sj);//最新税金插值
  974. }
  975. }
  976. updateDetailList.add(detailMap);
  977. }
  978. updateFormData.put("tableField_mkkmij56",updateDetailList);
  979. }else {
  980. List<Map> detailList = UtilMap.getList(ydFormData, "tableField_mkkmij61");
  981. for (Map detail : detailList) {
  982. Map detailMap = new HashMap();
  983. if (index == UtilMap.getInt(detail, "numberField_mn36ykxz")){
  984. Double yhxje = UtilMap.getDouble(detail, "numberField_mniatkya");//已核销金额
  985. Double ythje = UtilMap.getDouble(detail, "numberField_mn4g182g");//已退回金额
  986. Double mksjsj = UtilMap.getDouble(detail, "numberField_mob8gv4q");//每刻实际税金
  987. Double ydsj = UtilMap.getDouble(detail, "numberField_mn3zekbx");//税金
  988. Double ydcgje = UtilMap.getDouble(detail, "numberField_mkkmij6p");//采购金额
  989. detailMap.put("numberField_mniatkya",yhxje + deductionAmount);
  990. detailMap.put("numberField_mob8gv4q",mksjsj + sj);//每刻实际税金
  991. //若采购金额等于已核销金额+本次核销金额+已退回金额
  992. if (ydcgje == yhxje + deductionAmount + ythje){
  993. Double totalSj = UtilMap.getDouble(ydFormData, "numberField_mkkmij6k");//总税金
  994. updateFormData.put("numberField_mkkmij6k",totalSj - ydsj + sj);//总税金
  995. updateFormData.put("numberField_mob8gv4v",-ydsj + sj);//最新税金插值
  996. }
  997. }
  998. updateDetailList.add(detailMap);
  999. }
  1000. updateFormData.put("tableField_mkkmij61",updateDetailList);
  1001. }
  1002. ydClient.operateData(YDParam.builder()
  1003. .formInstanceId(formInstanceId)
  1004. .updateFormDataJson(JSONObject.toJSONString(updateFormData))
  1005. .useLatestVersion(true)
  1006. .build(), YDConf.FORM_OPERATION.update);
  1007. }
  1008. }
  1009. @Override
  1010. public McR saveBxReimbursement2(Map map) {
  1011. String formInstId = UtilMap.getString(map, "formInstId");
  1012. Map formData = ydClient.queryData(YDParam.builder()
  1013. .formInstanceId(formInstId)
  1014. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  1015. String type = UtilMap.getString(formData, "radioField_mkkmij3b");//需求单类型
  1016. String formSubTypeBizCode = "FT208629766551519240";//项目支付单
  1017. Double amt = UtilMap.getDouble(formData, "numberField_mkkmij6i");
  1018. String empId = "";
  1019. String deptBusinessCode = "";
  1020. String ydfqr = UtilMap.getString(formData, "textField_mmwvodde");//宜搭发起人工号
  1021. String ztcggh = UtilMap.getString(formData, "textField_mmwvfb97");//中台采购工号
  1022. String legalEntityBizCode = UtilMap.getString(formData, "textField_mmd6hio7");//公司抬头编码
  1023. String xqbh = UtilMap.getString(formData, "serialNumberField_mkkmij3o");//需求编号
  1024. long ldjssj = UtilMap.getLong(formData, "dateField_mkdf8q8q");//落地结束时间
  1025. String isFree = "FREE采购".equals(UtilMap.getString(formData, "radioField_mkf2quln")) ? "是" : "否";//是否free
  1026. String isDdf = "是".equals(UtilMap.getString(formData, "radioField_mkf2qulo")) ? "1" : "2";//是否代垫付
  1027. String xmsssyb = UtilMap.getString(formData, "selectField_mkdedkv7");//项目所属事业部
  1028. String projectCode = UtilMap.getString(formData, "textField_mmoh6nvx");//项目编码
  1029. //针对多供应商分期付款拆分多条每刻项目支付单
  1030. if ("常规采购".equals(type)){
  1031. List<Map> detailList = UtilMap.getList(formData, "tableField_mkkmij56");//常规-采购明细
  1032. for (Map detail : detailList) {
  1033. String uuid = UtilMap.getString(detail, "textField_mmvhqm0q");//子表uuid
  1034. int index = UtilMap.getInt(detail, "numberField_mn36ykxx");//子表uuid
  1035. Map body = new HashMap();
  1036. body.put("formCode",xqbh + "-" + index);//有值时会使用该值作为单据号
  1037. body.put("formSubTypeBizCode",formSubTypeBizCode);//表单类型的业务编号
  1038. String mktdrgh = UtilMap.getString(detail, "textField_mok5mtsh");//每刻提单人工号
  1039. body.put("submittedUserEmployeeId",mktdrgh);//提单人工号
  1040. body.put("coverUserEmployeeId",mktdrgh);//承担人工号
  1041. List<Map> internalTravelPartner = new ArrayList<>();//内部参与人
  1042. internalTravelPartner.add(new HashMap<String,String>(){{put("employeeId",ydfqr);}});
  1043. internalTravelPartner.add(new HashMap<String,String>(){{put("employeeId",ztcggh);}});
  1044. body.put("travelPartnerInfo",new HashMap<String,List<Map>>(){{put("internalTravelPartner",internalTravelPartner);}});//参与人
  1045. //查询宜搭发起人部门
  1046. Map employeeDetails = MkBxUtil.employeeDetails(UtilMap.map("employeeIds", Arrays.asList(ydfqr)));
  1047. String coverDepartmentBizCode = mkbx_deptId;
  1048. if (Objects.nonNull(employeeDetails)){
  1049. List<Map> departments = UtilMap.getList(employeeDetails, "departments");
  1050. coverDepartmentBizCode = UtilMap.getString(departments.get(0), "businessCode");
  1051. }
  1052. body.put("coverDepartmentBizCode",coverDepartmentBizCode);//承担部门编码
  1053. body.put("legalEntityBizCode",legalEntityBizCode);//公司抬头编码
  1054. body.put("reimburseName",UtilMap.getString(detail,"textareaField_mkkmij5i"));//报销事由
  1055. body.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmbmohrb"));//往来单位编码
  1056. Map customObject = new HashMap();
  1057. customObject.put("CF4",new HashMap<String,Long>(){{put("currentTime",ldjssj);}});//落地结束时间
  1058. customObject.put("CF3",new HashMap<String,Long>(){{put("currentTime",UtilMap.getLong(detail,"dateField_mkkkw298"));}});//期望支付日期
  1059. customObject.put("CF6",isFree);//free 是;否
  1060. customObject.put("CF5",isDdf);//代垫付 是:1 ; 否:2
  1061. customObject.put("CF2",xmsssyb);//项目所属事业部
  1062. customObject.put("CF1",projectCode);//项目
  1063. customObject.put("CF7",UtilMap.getString(detail,"numberField_mmwswtkv"));//逾期天数
  1064. Map consumeAmount = new HashMap();
  1065. consumeAmount.put("amount",String.format("%.2f", UtilMap.getDouble(detail,"numberField_mkkmij5e")));//结算金额
  1066. consumeAmount.put("currency","CNY");
  1067. customObject.put("CF42",consumeAmount);//采购金额
  1068. body.put("customObject",customObject);
  1069. //报销单费用导入
  1070. Map expenseListItem = new HashMap();
  1071. expenseListItem.put("consumeAmount",consumeAmount);
  1072. expenseListItem.put("corpExpense",true);//是否对公费用,需要填写true
  1073. String gysej = UtilMap.getString(detail, "selectField_mkkkw28y");//供应商二级
  1074. expenseListItem.put("expenseTypeBizCode",UtilMap.getString(detail,"textField_mp0m3ks3"));//费用类型业务编码
  1075. expenseListItem.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票)
  1076. expenseListItem.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填)
  1077. expenseListItem.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填)
  1078. expenseListItem.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmbmohrb"));//往来单位业务编码
  1079. Map consumeLocation = new HashMap();
  1080. consumeLocation.put("cityPair",null);
  1081. consumeLocation.put("location","110001");//todo 暂时写死 110001 北京
  1082. expenseListItem.put("consumeLocation",consumeLocation);
  1083. expenseListItem.put("corpExpenseResponsibleEmpIds",Arrays.asList(mktdrgh));//责任人/业务经办人(预付未到票/到票部分支付或不支付 两种场景必填)
  1084. Map body2 = new HashMap();
  1085. body2.put("employeeId",mktdrgh);//需要导入的对应员工的工号
  1086. body2.put("expenseList",Arrays.asList(expenseListItem));
  1087. List<String> expenseCodes = new ArrayList<>();
  1088. try {
  1089. expenseCodes = MkBxUtil.receiveExpense(body2);
  1090. }catch (Exception e){
  1091. ydClient.operateData(YDParam.builder()
  1092. .formInstanceId(formInstId)
  1093. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mpp9c6w9, textareaField_mpp9c6wa","推送失败",e.getMessage())))
  1094. .build(), YDConf.FORM_OPERATION.update);
  1095. continue;
  1096. }
  1097. body.put("expenseCodes",expenseCodes);//费用类型业务编码
  1098. //收款账户
  1099. Map payeeAccount = new HashMap();
  1100. payeeAccount.put("bankAcctName",UtilMap.getString(detail,"textField_mkkmij6z"));//账户名
  1101. payeeAccount.put("bankAcctNumber",UtilMap.getString(detail,"textField_mkkmij6y"));//银行账户
  1102. payeeAccount.put("paymentType","BANK");//账户类型;ALIPAY-支付宝,BANK-银行账户,CASH-现金
  1103. payeeAccount.put("accountType","CORP");//收款账户类型:个人(员工)-PERSONAL,公司(往来单位)-CORP
  1104. body.put("payeeAccount",payeeAccount);
  1105. body.put("stagingFlag",true);//暂存标识,默认为false表示不暂存
  1106. Map result = MkBxUtil.receiveReimburse(body);
  1107. if (isTrue(result)){
  1108. ydClient.operateData(YDParam.builder()
  1109. .formInstanceId(formInstId)
  1110. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mpp9c6w9, textareaField_mpp9c6wa","推送成功","")))
  1111. .build(), YDConf.FORM_OPERATION.update);
  1112. }else {
  1113. String message = UtilMap.getString(result, "message");
  1114. ydClient.operateData(YDParam.builder()
  1115. .formInstanceId(formInstId)
  1116. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mpp9c6w9, textareaField_mpp9c6wa","推送失败",message)))
  1117. .build(), YDConf.FORM_OPERATION.update);
  1118. }
  1119. }
  1120. }else {
  1121. List<Map> detailList = UtilMap.getList(formData, "tableField_mkkmij61");//free-采购明细
  1122. for (Map detail : detailList) {
  1123. String uuid = UtilMap.getString(detail, "textField_mmvhqm0s");//子表uuid
  1124. int index = UtilMap.getInt(detail, "numberField_mn36ykxz");//子表uuid
  1125. Map body = new HashMap();
  1126. body.put("formCode",xqbh + "-" +index);//有值时会使用该值作为单据号
  1127. body.put("formSubTypeBizCode",formSubTypeBizCode);//表单类型的业务编号
  1128. String mktdrgh = UtilMap.getString(detail, "textField_mok5mtsf");//每刻提单人工号
  1129. body.put("submittedUserEmployeeId",mktdrgh);//提单人工号
  1130. body.put("coverUserEmployeeId",mktdrgh);//承担人工号
  1131. List<Map> internalTravelPartner = new ArrayList<>();//内部参与人
  1132. internalTravelPartner.add(new HashMap<String,String>(){{put("employeeId",ydfqr);}});
  1133. internalTravelPartner.add(new HashMap<String,String>(){{put("employeeId",ztcggh);}});
  1134. body.put("travelPartnerInfo",new HashMap<String,List<Map>>(){{put("internalTravelPartner",internalTravelPartner);}});//参与人
  1135. //查询宜搭发起人部门
  1136. Map employeeDetails = MkBxUtil.employeeDetails(UtilMap.map("employeeIds", Arrays.asList(ydfqr)));
  1137. String coverDepartmentBizCode = mkbx_deptId;
  1138. if (Objects.nonNull(employeeDetails)){
  1139. List<Map> departments = UtilMap.getList(employeeDetails, "departments");
  1140. coverDepartmentBizCode = UtilMap.getString(departments.get(0), "businessCode");
  1141. }
  1142. body.put("coverDepartmentBizCode",coverDepartmentBizCode);//承担部门编码
  1143. body.put("reimburseName","FREE-" + UtilMap.getString(detail,"textareaField_mkkmij64"));//报销事由
  1144. body.put("legalEntityBizCode",legalEntityBizCode);//公司抬头编码
  1145. body.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmekbfa2"));//往来单位编码
  1146. Map customObject = new HashMap();
  1147. customObject.put("CF4",new HashMap<String,Long>(){{put("currentTime",ldjssj);}});//落地结束时间
  1148. customObject.put("CF3",new HashMap<String,Long>(){{put("currentTime",UtilMap.getLong(detail,"dateField_mmvhtdy4"));}});//期望支付日期
  1149. customObject.put("CF6",isFree);//free 是;否
  1150. customObject.put("CF5",isDdf);//代垫付 是:1 ; 否:2
  1151. customObject.put("CF2",xmsssyb);//项目所属事业部
  1152. customObject.put("CF1",projectCode);//项目
  1153. customObject.put("CF7",UtilMap.getString(detail,"numberField_mmwswtkx"));//逾期天数
  1154. Map consumeAmount = new HashMap();
  1155. consumeAmount.put("amount",String.format("%.2f", UtilMap.getDouble(detail,"numberField_mkkmij6p")));//结算金额
  1156. consumeAmount.put("currency","CNY");
  1157. customObject.put("CF42",consumeAmount);//采购金额
  1158. body.put("customObject",customObject);
  1159. //报销单费用导入
  1160. Map expenseListItem = new HashMap();
  1161. expenseListItem.put("consumeAmount",consumeAmount);
  1162. expenseListItem.put("corpExpense",true);//是否对公费用,需要填写true
  1163. String gysej = UtilMap.getString(detail, "selectField_mmwuzaql");//供应商二级
  1164. expenseListItem.put("expenseTypeBizCode",UtilMap.getString(detail,"textField_mp0m3ks5"));//费用类型业务编码
  1165. expenseListItem.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票)
  1166. expenseListItem.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填)
  1167. expenseListItem.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填)
  1168. expenseListItem.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmekbfa2"));//往来单位业务编码
  1169. Map consumeLocation = new HashMap();
  1170. consumeLocation.put("cityPair",null);
  1171. consumeLocation.put("location","110001");//todo 暂时写死 110001 北京
  1172. expenseListItem.put("consumeLocation",consumeLocation);
  1173. expenseListItem.put("corpExpenseResponsibleEmpIds",Arrays.asList(mktdrgh));//责任人/业务经办人(预付未到票/到票部分支付或不支付 两种场景必填)
  1174. Map body2 = new HashMap();
  1175. body2.put("employeeId",mktdrgh);//需要导入的对应员工的工号
  1176. body2.put("expenseList",Arrays.asList(expenseListItem));
  1177. List<String> expenseCodes = new ArrayList<>();
  1178. try {
  1179. expenseCodes = MkBxUtil.receiveExpense(body2);
  1180. }catch (Exception e){
  1181. ydClient.operateData(YDParam.builder()
  1182. .formInstanceId(formInstId)
  1183. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mpp9c6w9, textareaField_mpp9c6wa","推送失败",e.getMessage())))
  1184. .build(), YDConf.FORM_OPERATION.update);
  1185. continue;
  1186. }
  1187. body.put("expenseCodes",expenseCodes);//费用类型业务编码
  1188. //收款账户
  1189. Map payeeAccount = new HashMap();
  1190. payeeAccount.put("bankAcctName",UtilMap.getString(detail,"textField_mketkvxa"));//账户名
  1191. payeeAccount.put("bankAcctNumber",UtilMap.getString(detail,"textField_mketkvxc"));//银行账户
  1192. payeeAccount.put("paymentType","BANK");//账户类型;ALIPAY-支付宝,BANK-银行账户,CASH-现金
  1193. payeeAccount.put("accountType","CORP");//收款账户类型:个人(员工)-PERSONAL,公司(往来单位)-CORP
  1194. body.put("payeeAccount",payeeAccount);
  1195. body.put("stagingFlag",true);//暂存标识,默认为false表示不暂存
  1196. Map result = MkBxUtil.receiveReimburse(body);
  1197. if (isTrue(result)){
  1198. ydClient.operateData(YDParam.builder()
  1199. .formInstanceId(formInstId)
  1200. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mpp9c6w9, textareaField_mpp9c6wa","推送成功","")))
  1201. .build(), YDConf.FORM_OPERATION.update);
  1202. }else {
  1203. String message = UtilMap.getString(result, "message");
  1204. ydClient.operateData(YDParam.builder()
  1205. .formInstanceId(formInstId)
  1206. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mpp9c6w9, textareaField_mpp9c6wa","推送失败",message)))
  1207. .build(), YDConf.FORM_OPERATION.update);
  1208. }
  1209. }
  1210. }
  1211. return McR.success();
  1212. }
  1213. @Override
  1214. public McR checkBudgetAmt(Map map) {
  1215. String projectCode = UtilMap.getString(map, "projectCode");
  1216. long ldqssj = UtilMap.getLong(map, "ldqssj");//落地起始时间
  1217. //落地起始时间在几月份
  1218. Calendar calendar = Calendar.getInstance();
  1219. calendar.setTimeInMillis(ldqssj);
  1220. int month = calendar.get(Calendar.MONTH) + 1;
  1221. List<Map> list = UtilMap.getList(map, "list");
  1222. List<String> subjectCodeList = new ArrayList<>();
  1223. Map<String,Double> cgmxMap = new HashMap();
  1224. for (Map map1 : list) {
  1225. Double jscb = UtilMap.getDouble(map1, "numberField_mkkmij5e");//结算成本
  1226. String subjectCode = UtilMap.getString(map1, "textField_mn8nhpnz");//预算科目编号
  1227. subjectCodeList.add(subjectCode);
  1228. if (cgmxMap.containsKey(subjectCode)){
  1229. cgmxMap.put(subjectCode,UtilMap.getDouble(cgmxMap,subjectCode) + jscb);
  1230. }else {
  1231. cgmxMap.put(subjectCode,jscb);
  1232. }
  1233. }
  1234. Map body = new HashMap();
  1235. body.put("budgetPlanBizCode","全面预算");//预算方案编码
  1236. body.put("budgetOrgBizCodes",Arrays.asList(projectCode));//预算组织编码
  1237. body.put("budgetSubjectBizCodes",subjectCodeList);//预算科目编码
  1238. body.put("pageNum",1);
  1239. body.put("pageSize",50);
  1240. List<Map> budgetList = MkBxUtil.budgetInfo(body);
  1241. boolean flag = true;
  1242. StringBuilder errorMsg = new StringBuilder();
  1243. for (Map budget : budgetList) {
  1244. String subjectCode = UtilMap.getString(budget, "subjectBizCode");
  1245. String subjectName = UtilMap.getString(budget, "subjectName");
  1246. List<Map> budgetUnits = UtilMap.getList(budget, "budgetUnits");
  1247. for (Map budgetUnit : budgetUnits) {
  1248. int periodNum = UtilMap.getInt(budgetUnit, "periodNum");
  1249. if (periodNum == month) {
  1250. Double usableAmount = UtilMap.getDouble(budgetUnit, "usableAmount");
  1251. Double jscb = cgmxMap.get(subjectCode);
  1252. if (jscb > usableAmount) {
  1253. flag = false;
  1254. errorMsg.append("[").append(subjectName).append("]预算金额不足,剩余可用预算金额[").append(usableAmount).append("];");
  1255. }
  1256. break;
  1257. }
  1258. }
  1259. }
  1260. Map result = new HashMap();
  1261. result.put("flag",flag);
  1262. result.put("errorMsg", errorMsg.toString());
  1263. return McR.success(result);
  1264. }
  1265. @Override
  1266. public void updateBudget(Map map) {
  1267. String formInstId = UtilMap.getString(map, "formInstId");
  1268. String type = UtilMap.getString(map, "type");
  1269. Map formData = ydClient.queryData(YDParam.builder()
  1270. .formInstanceId(formInstId).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  1271. String projectCode = UtilMap.getString(formData, "textField_mmoh6nvx");
  1272. long ldqssj = UtilMap.getLong(formData, "dateField_mkdf8q8p");
  1273. //落地起始时间在几月份
  1274. Calendar calendar = Calendar.getInstance();
  1275. calendar.setTimeInMillis(ldqssj);
  1276. int month = calendar.get(Calendar.MONTH) + 1;
  1277. Map body = new HashMap();
  1278. body.put("budgetPlanBizCode","全面预算");
  1279. body.put("increment",false);
  1280. body.put("onlyError",false);
  1281. List<Map> budgets = new ArrayList<>();
  1282. if ("冻结".equals(type)){
  1283. Map budget = new HashMap();
  1284. budget.put("budgetOrgBizCode",projectCode);
  1285. // budget.put("budgetSubjectBizCode","");
  1286. Map budgetUnit = new HashMap();
  1287. budgetUnit.put("periodNum",month);
  1288. budgetUnit.put("budgetAmount",0);//置零 相当于冻结
  1289. budget.put("budgetUnits",Arrays.asList(budgetUnit));
  1290. budgets.add(budget);
  1291. }else {//释放
  1292. Map budget = new HashMap();
  1293. budget.put("budgetOrgBizCode",projectCode);
  1294. // budget.put("budgetSubjectBizCode","");
  1295. Double amt = UtilMap.getDouble(formData, "numberField_mkga10nj");
  1296. Map budgetUnit = new HashMap();
  1297. budgetUnit.put("periodNum",month);
  1298. budgetUnit.put("budgetAmount",amt);
  1299. budget.put("budgetUnits",Arrays.asList(budgetUnit));
  1300. budgets.add(budget);
  1301. }
  1302. body.put("budgets",budgets);
  1303. MkBxUtil.batchBudget(body);
  1304. }
  1305. @Async
  1306. @Override
  1307. public void invoiceWriteBack4(Map map) {
  1308. String formCode = UtilMap.getString(map, "formCode");//付款单编号
  1309. //查询付款单详情
  1310. Map paymentDetailInfo = MkBxUtil.paymentDetailInfo(formCode);
  1311. String reimburseFormSubTypeBizCode = UtilMap.getString(paymentDetailInfo, "reimburseFormSubTypeBizCode");//关联的报销单的单据小类编码
  1312. //项目支付单(对公)
  1313. if ("FT208629766551519240".equals(reimburseFormSubTypeBizCode)){
  1314. String reimburseCode = UtilMap.getString(paymentDetailInfo, "reimburseCode");
  1315. //宜搭推送的项目支付单编号 格式:流水号-index
  1316. if (reimburseCode.contains("采购") || reimburseCode.contains("需求")){
  1317. String[] split = reimburseCode.split("-");
  1318. String ydFormCode = split[0];
  1319. int index = Integer.parseInt(split[1]);
  1320. Map approvedAmount = UtilMap.getMap(paymentDetailInfo, "approvedAmount");
  1321. Double amt = UtilMap.getDouble(approvedAmount, "amount");//审批通过金额
  1322. long settledAt = UtilMap.getLong(paymentDetailInfo, "settledAt");//支付时间
  1323. Map updateFormData = new HashMap();
  1324. List<Map> updateDetailList = new ArrayList<>();
  1325. if (reimburseCode.contains("需求")){
  1326. //采购需求&结算
  1327. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  1328. .formUuid("FORM-C8C1FBBA781C4C5EBAC487C07BC5A86AD2HO")
  1329. .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_mkkmij3o", ydFormCode)))
  1330. .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
  1331. String formInstanceId = UtilMap.getString(data.get(0), "formInstanceId");
  1332. Map ydFormData = UtilMap.getMap(data.get(0), "formData");
  1333. String type = UtilMap.getString(ydFormData, "radioField_mkkmij3b");
  1334. if ("常规需求".equals(type)){
  1335. List<Map> detailList = UtilMap.getList(ydFormData, "tableField_mkkmij56");
  1336. for (Map detail : detailList) {
  1337. Map detailMap = new HashMap();
  1338. if (index == UtilMap.getInt(detail, "numberField_mn36ykxx")){
  1339. Double jscb = UtilMap.getDouble(detail, "numberField_mkkmij5e");//结算成本
  1340. Double yfkje = UtilMap.getDouble(detail, "numberField_mmvqom6l");//已付款金额
  1341. String fkzt = UtilMap.getString(detail, "selectField_mmvhqm0p");//付款状态
  1342. if (yfkje + amt == jscb){
  1343. detailMap.put("selectField_mmvhqm0p","全部付款");
  1344. }else if (yfkje + amt < jscb && yfkje + amt > 0 && !"部分退款".equals(fkzt)){
  1345. detailMap.put("selectField_mmvhqm0p","部分付款");
  1346. }
  1347. detailMap.put("numberField_mmvqom6l",yfkje + amt);
  1348. detailMap.put("dateField_mnh6e4zy",settledAt);
  1349. }
  1350. updateDetailList.add(detailMap);
  1351. }
  1352. updateFormData.put("tableField_mkkmij56",updateDetailList);
  1353. }else {
  1354. List<Map> detailList = UtilMap.getList(ydFormData, "tableField_mkkmij61");
  1355. for (Map detail : detailList) {
  1356. Map detailMap = new HashMap();
  1357. if (index == UtilMap.getInt(detail, "numberField_mn36ykxz")){
  1358. Double jscb = UtilMap.getDouble(detail, "numberField_mkkmij6p");//结算成本
  1359. Double yfkje = UtilMap.getDouble(detail, "numberField_mmvqs9h6");//已付款金额
  1360. String fkzt = UtilMap.getString(detail, "selectField_mkkmij6a");//付款状态
  1361. if (yfkje + amt == jscb){
  1362. detail.put("selectField_mkkmij6a","全部付款");
  1363. }else if (yfkje + amt < jscb && yfkje + amt > 0 && !"部分退款".equals(fkzt)){
  1364. detailMap.put("selectField_mkkmij6a","部分付款");
  1365. }
  1366. detailMap.put("numberField_mmvqs9h6",yfkje + amt);
  1367. detailMap.put("dateField_mnh6e4zy",settledAt);
  1368. }
  1369. updateDetailList.add(detailMap);
  1370. }
  1371. updateFormData.put("tableField_mkkmij61",updateDetailList);
  1372. }
  1373. Double yzf = UtilMap.getDouble(ydFormData, "numberField_mkf2qumf");//已支付
  1374. updateFormData.put("numberField_mkf2qumf",yzf + amt);//已支付
  1375. updateFormData.put("numberField_mnibjld0",amt);//最新支付金额
  1376. ydClient.operateData(YDParam.builder()
  1377. .formInstanceId(formInstanceId)
  1378. .updateFormDataJson(JSONObject.toJSONString(updateFormData))
  1379. .build(), YDConf.FORM_OPERATION.update);
  1380. }else {
  1381. //直接采购结算单
  1382. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  1383. .formUuid("FORM-1AFEDDA034C74F0DB18FA60C941CB56EHUUG")
  1384. .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_mkkmij3o", ydFormCode)))
  1385. .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
  1386. String formInstanceId = UtilMap.getString(data.get(0), "formInstanceId");
  1387. Map ydFormData = UtilMap.getMap(data.get(0), "formData");
  1388. String type = UtilMap.getString(ydFormData, "radioField_mkkmij3b");
  1389. if ("常规采购".equals(type)){
  1390. List<Map> detailList = UtilMap.getList(ydFormData, "tableField_mkkmij56");
  1391. for (Map detail : detailList) {
  1392. Map detailMap = new HashMap();
  1393. if (index == UtilMap.getInt(detail, "numberField_mn36ykxx")){
  1394. Double jscb = UtilMap.getDouble(detail, "numberField_mkkmij5e");//结算成本
  1395. Double yfkje = UtilMap.getDouble(detail, "numberField_mmvqom6k");//已付款金额
  1396. String fkzt = UtilMap.getString(detail, "selectField_mmvhtdy0");//付款状态
  1397. if (yfkje + amt == jscb){
  1398. detailMap.put("selectField_mmvhtdy0","全部付款");
  1399. }else if (yfkje + amt < jscb && yfkje + amt > 0 && !"部分退款".equals(fkzt)){
  1400. detailMap.put("selectField_mmvhtdy0","部分付款");
  1401. }
  1402. detailMap.put("numberField_mmvqom6k",yfkje + amt);
  1403. detailMap.put("dateField_mnh6e4zy",settledAt);
  1404. }
  1405. updateDetailList.add(detailMap);
  1406. }
  1407. updateFormData.put("tableField_mkkmij56",updateDetailList);
  1408. }else {
  1409. List<Map> detailList = UtilMap.getList(ydFormData, "tableField_mkkmij61");
  1410. for (Map detail : detailList) {
  1411. Map detailMap = new HashMap();
  1412. if (index == UtilMap.getInt(detail, "numberField_mn36ykxz")){
  1413. Double jscb = UtilMap.getDouble(detail, "numberField_mkkmij6p");//结算成本
  1414. Double yfkje = UtilMap.getDouble(detail, "numberField_mmvqom6l");//已付款金额
  1415. String fkzt = UtilMap.getString(detail, "selectField_mkkmij6a");//付款状态
  1416. if (yfkje + amt == jscb){
  1417. detailMap.put("selectField_mkkmij6a","全部付款");
  1418. }else if (yfkje + amt < jscb && yfkje + amt > 0 && !"部分退款".equals(fkzt)){
  1419. detailMap.put("selectField_mkkmij6a","部分付款");
  1420. }
  1421. detailMap.put("numberField_mmvqom6l",yfkje + amt);
  1422. detailMap.put("dateField_mnh6e4zy",settledAt);
  1423. }
  1424. updateDetailList.add(detailMap);
  1425. }
  1426. updateFormData.put("tableField_mkkmij61",updateDetailList);
  1427. }
  1428. Double yzf = UtilMap.getDouble(ydFormData, "numberField_mkf2qumf");//已支付
  1429. updateFormData.put("numberField_mkf2qumf",yzf + amt);//已支付
  1430. updateFormData.put("numberField_mnibjld0",amt);//最新支付金额
  1431. ydClient.operateData(YDParam.builder()
  1432. .formInstanceId(formInstanceId)
  1433. .updateFormDataJson(JSONObject.toJSONString(updateFormData))
  1434. .build(), YDConf.FORM_OPERATION.update);
  1435. }
  1436. }
  1437. }
  1438. }
  1439. @Async
  1440. @Override
  1441. public void invoiceWriteBack5(Map map) {
  1442. //防止查询不到单据详情
  1443. try {
  1444. Thread.sleep(3000);
  1445. } catch (InterruptedException e) {
  1446. throw new RuntimeException(e);
  1447. }
  1448. String formCode = UtilMap.getString(map, "formCode");
  1449. Map repayDetailInfo = MkBxUtil.repayDetailInfo(formCode);
  1450. Map repayAmount = UtilMap.getMap(repayDetailInfo, "repayAmount");
  1451. Double amount = UtilMap.getDouble(repayAmount, "amount");//还款金额
  1452. List<Map> returnDeductions = UtilMap.getList(repayDetailInfo, "returnDeductions");
  1453. for (Map returnDeduction : returnDeductions) {
  1454. String recordFormCode = UtilMap.getString(returnDeduction, "recordFormCode");
  1455. if (recordFormCode.contains("采购") || recordFormCode.contains("需求")){
  1456. updateYdRepay(recordFormCode,amount);
  1457. }
  1458. }
  1459. }
  1460. @Async
  1461. @Override
  1462. public void invoiceWriteBack6(Map map) {
  1463. String formCode = UtilMap.getString(map, "formCode");//单据号
  1464. Map formData = UtilMap.getMap(map, "formData");
  1465. String formSubTypeBizCode = getMkStrValue(formData, "formSubTypeBizCode");//单据类型业务编码
  1466. Map ydFormData = new HashMap();
  1467. switch (formSubTypeBizCode){
  1468. case "FT210319434976347227"://押金/保证金支付单
  1469. String isProject = getMkStrValue(formData, "CF32");//是否项目相关
  1470. if (!"是".equals(isProject)) return;
  1471. String loanName = getMkStrValue(formData, "loanName");//事由
  1472. double payableAmount = Double.parseDouble(getMkStrValue(formData, "payableAmount"));//借款金额
  1473. String legalEntity = getMkStrValue(formData, "legalEntity");//所属公司
  1474. Map loanUser = getMkListValue(formData, "loanUser").get(0);//借款人
  1475. String employeeName = UtilMap.getString(loanUser, "text");//借款人姓名
  1476. List<String> loanDdUser = getDdUserId(employeeName);
  1477. Map cf0 = getMkMapValue(formData, "CF0");
  1478. String projectCode = UtilMap.getString(cf0, "businessCode");//项目流水号
  1479. String projectName = UtilMap.getString(cf0, "text");//项目名称
  1480. Long expectRepayDate = getMkDateValue(formData, "expectRepayDate");//预计归还时间
  1481. String loanDepartment = getMkStrValue(formData, "loanDepartment");//借款部门
  1482. Map payeeAccount = getMkMapValue(formData, "payeeAccount");
  1483. String bankAcctNumber = UtilMap.getString(payeeAccount, "bankAcctNumber");//收款账户
  1484. ydFormData.put("textField_mnsm4ozj",legalEntity);
  1485. ydFormData.put("textField_mnsm4p09",projectName);
  1486. ydFormData.put("textField_mnsm4ozk",formCode);
  1487. ydFormData.put("textareaField_mnsm4ozp",loanName);
  1488. ydFormData.put("employeeField_mnsm4ozu",loanDdUser);
  1489. ydFormData.put("textField_mnsm4ozv",loanDepartment);
  1490. ydFormData.put("numberField_mnsm4p00",payableAmount);
  1491. ydFormData.put("dateField_mnsm4p01",expectRepayDate);
  1492. ydFormData.put("textField_mnsm4p07",bankAcctNumber);
  1493. ydFormData.put("textField_mnwtck7h","押金/保证金支付单");
  1494. ydFormData.put("textField_mnwtwu9z",projectCode);
  1495. break;
  1496. case "FT203800208910336098"://借款单(项目)
  1497. String loanName2 = getMkStrValue(formData, "loanName");//事由
  1498. double payableAmount2 = Double.parseDouble(getMkStrValue(formData, "payableAmount"));//借款金额
  1499. String legalEntity2 = getMkStrValue(formData, "legalEntity");//所属公司
  1500. Map loanUser2 = getMkListValue(formData, "loanUser").get(0);//借款人
  1501. String employeeName2 = UtilMap.getString(loanUser2, "text");//借款人姓名
  1502. List<String> loanDdUser2 = getDdUserId(employeeName2);
  1503. Map cf0_2 = getMkMapValue(formData, "CF0");
  1504. String projectCode2 = UtilMap.getString(cf0_2, "businessCode");//项目流水号
  1505. String projectName2 = UtilMap.getString(cf0_2, "text");//项目名称
  1506. Long expectRepayDate2 = getMkDateValue(formData, "expectRepayDate");//预计归还时间
  1507. String loanDepartment2 = getMkStrValue(formData, "loanDepartment");//借款部门
  1508. Map payeeAccount2 = getMkMapValue(formData, "payeeAccount");
  1509. String bankAcctNumber2 = UtilMap.getString(payeeAccount2, "bankAcctNumber");//收款账户
  1510. String comments = getMkStrValue(formData, "comments");//备用金用途
  1511. ydFormData.put("textField_mnsm4ozj",legalEntity2);
  1512. ydFormData.put("textField_mnsm4p09",projectName2);
  1513. ydFormData.put("textField_mnsm4ozk",formCode);
  1514. ydFormData.put("textareaField_mnsm4ozp",loanName2);
  1515. ydFormData.put("employeeField_mnsm4ozu",loanDdUser2);
  1516. ydFormData.put("textField_mnsm4ozv",loanDepartment2);
  1517. ydFormData.put("numberField_mnsm4p00",payableAmount2);
  1518. ydFormData.put("dateField_mnsm4p01",expectRepayDate2);
  1519. ydFormData.put("textField_mnsm4p07",bankAcctNumber2);
  1520. ydFormData.put("textField_mnwtck7h","借款单(项目)");
  1521. ydFormData.put("textField_mnwtwu9z",projectCode2);
  1522. ydFormData.put("textareaField_mnsm4p0c",comments);
  1523. break;
  1524. default:
  1525. return;
  1526. }
  1527. ydClient.operateData(YDParam.builder()
  1528. .formUuid("FORM-204D3E39C2EB49FEA4121D73E8A71F796A2U")
  1529. .formDataJson(JSONObject.toJSONString(ydFormData))
  1530. .build(), YDConf.FORM_OPERATION.create);
  1531. }
  1532. @Async
  1533. @Override
  1534. public void invoiceWriteBack7(Map map) {
  1535. String formDataCode = UtilMap.getString(map, "formDataCode");//单据类型
  1536. String formCode = UtilMap.getString(map, "formCode");//单据号
  1537. Map formData = UtilMap.getMap(map, "formData");
  1538. String repaymentName = getMkStrValue(formData, "repaymentName");//事由
  1539. double repayAmount = Double.parseDouble(getMkStrValue(formData, "repayAmount"));//还款金额
  1540. String legalEntity = getMkStrValue(formData, "legalEntity");//所属公司
  1541. Map repayUser = getMkListValue(formData, "repayUser").get(0);//责任人
  1542. String employeeName = UtilMap.getString(repayUser, "text");//责任人姓名
  1543. List<String> repayDdUser = getDdUserId(employeeName);
  1544. // Long repaymentDate = getMkDateValue(formData, "repaymentDate");//还款日期
  1545. String repayDept = getMkStrValue(formData, "repayDept");//责任人部门
  1546. String comments = getMkStrValue(formData, "comments");//备注
  1547. List<Map> loanDeductionList = getMkListValue(formData, "loanDeductionList");//核销借款
  1548. List<Map> ydLoanDeductionList = new ArrayList<>();
  1549. for (Map loanDeduction : loanDeductionList) {
  1550. Map ydLoanDeduction = new HashMap();
  1551. Double deductionAmount = UtilMap.getDouble(loanDeduction, "deductionAmount");//核销金额
  1552. String loanFormCode = UtilMap.getString(loanDeduction, "loanFormCode");//借款单单据号
  1553. //借款单详情
  1554. Map loanDetailInfo = MkBxUtil.loanDetailInfo(loanFormCode);
  1555. Map customObject = UtilMap.getMap(loanDetailInfo, "customObject");
  1556. Map cf0 = UtilMap.getMap(customObject, "CF0");
  1557. String projectCode = UtilMap.getString(cf0, "detailBusinessCode");//项目流水号
  1558. String projectName = UtilMap.getString(cf0, "text");//项目名称
  1559. String loanName = UtilMap.getString(loanDetailInfo, "loanName");//事由
  1560. ydLoanDeduction.put("textField_mnsmfo6t",loanName);
  1561. ydLoanDeduction.put("textField_mnxzo8la",loanFormCode);
  1562. ydLoanDeduction.put("textField_mnwlnnmz",projectName);
  1563. ydLoanDeduction.put("textField_mnwtwu9z",projectCode);
  1564. ydLoanDeduction.put("numberField_mnxzo8l8",deductionAmount);
  1565. ydLoanDeductionList.add(ydLoanDeduction);
  1566. }
  1567. Map ydFormData = new HashMap();
  1568. ydFormData.put("textField_mnsmfo6f",legalEntity);
  1569. ydFormData.put("textField_mnxzo8l5",formCode);
  1570. ydFormData.put("textareaField_mnsmfo6k",repaymentName);
  1571. ydFormData.put("employeeField_mnsmfo6l",repayDdUser);
  1572. ydFormData.put("textField_mnsmfo6m",repayDept);
  1573. ydFormData.put("numberField_mnsmfo6s",repayAmount);
  1574. ydFormData.put("textareaField_mnsmfo70",comments);
  1575. ydFormData.put("textField_mnwtck7h","还款/退款单");
  1576. ydFormData.put("tableField_mnxzo8l6",ydLoanDeductionList);
  1577. ydClient.operateData(YDParam.builder()
  1578. .formUuid("FORM-D8589EE237894F4E9FF9B1A0D4BDCABFKNYM")
  1579. .formDataJson(JSONObject.toJSONString(ydFormData))
  1580. .build(), YDConf.FORM_OPERATION.create);
  1581. }
  1582. @Async
  1583. @Override
  1584. public void invoiceWriteBack8(Map map) {
  1585. String formCode = UtilMap.getString(map, "formCode");//单据号
  1586. Map formData = UtilMap.getMap(map, "formData");
  1587. String formSubTypeBizCode = getMkStrValue(formData, "formSubTypeBizCode");//单据类型业务编码
  1588. Map ydFormData = new HashMap();
  1589. switch (formSubTypeBizCode){
  1590. case "FT204655110165381205"://项目报销单(个人)
  1591. String reimburseName = getMkStrValue(formData, "reimburseName");//事由
  1592. String legalEntity = getMkStrValue(formData, "legalEntity");//公司抬头
  1593. Map coverUser = getMkListValue(formData, "coverUser").get(0);//承担人
  1594. String coverUserName = UtilMap.getString(coverUser, "text");//承担人姓名
  1595. List<String> coverDdUser = getDdUserId(coverUserName);//承担人钉钉id
  1596. String coverDepartment = getMkStrValue(formData, "coverDepartment");//承担部门
  1597. Map cf0 = getMkMapValue(formData, "CF0");
  1598. String projectCode = UtilMap.getString(cf0, "businessCode");//项目流水号
  1599. String projectName = UtilMap.getString(cf0, "text");//项目名称
  1600. String cf31 = getMkStrValue(formData, "CF31");//代垫付
  1601. Map payeeAccount = getMkMapValue(formData, "payeeAccount");
  1602. String bankAcctNumber = UtilMap.getString(payeeAccount, "bankAcctNumber");//收款账户
  1603. List<Map> expenseList = getMkListValue(formData, "expenseList");
  1604. List<Map> ydExpenseList = new ArrayList<>();
  1605. double totalAmt = 0d;
  1606. double totalTaxAmt = 0d;
  1607. for (Map expense : expenseList) {
  1608. String expenseType = getMkStrValue(expense, "expenseTypeCode");//费用类型
  1609. double acceptAmount = Double.parseDouble(getMkStrValue(expense, "acceptAmount"));//收款金额
  1610. String comments = getMkStrValue(expense, "comments");//用途
  1611. long consumeTime = getMkDateValue(expense, "consumeTime");//消费日期
  1612. List<Map> invoiceTaxList = getMkListValue(expense, "invoiceTaxList");//税票信息
  1613. double deductionTaxAmount = 0;
  1614. for (Map invoiceTax : invoiceTaxList) {
  1615. deductionTaxAmount += Double.parseDouble(getMkStrValue(invoiceTax, "deductionTaxAmount"));//抵扣税额
  1616. }
  1617. Map expenseMap = new HashMap();
  1618. expenseMap.put("textField_mnwlpiwc",expenseType);
  1619. expenseMap.put("numberField_mnwlpiwd",acceptAmount);
  1620. expenseMap.put("textareaField_mnwlpiwh",comments);
  1621. expenseMap.put("dateField_mnwlpiwe",consumeTime);
  1622. expenseMap.put("numberField_mol7a35x",deductionTaxAmount);
  1623. ydExpenseList.add(expenseMap);
  1624. totalAmt += acceptAmount;
  1625. totalTaxAmt += deductionTaxAmount;
  1626. }
  1627. ydFormData.put("textField_mnyfvfxr",formCode);
  1628. ydFormData.put("textField_mnwtck7h","项目报销单(个人)");
  1629. ydFormData.put("textField_mnwtwu9z",projectCode);
  1630. ydFormData.put("textField_mnwlpivn",projectName);
  1631. ydFormData.put("textareaField_mnwlpivb",reimburseName);
  1632. ydFormData.put("textField_mnwlpivg",legalEntity);
  1633. ydFormData.put("textField_mnwlpivi",coverDepartment);
  1634. ydFormData.put("employeeField_mnwlpivh",coverDdUser);
  1635. ydFormData.put("textField_mnwlpiw6",bankAcctNumber);
  1636. ydFormData.put("textField_mnwlpivq",cf31);
  1637. ydFormData.put("tableField_mnwlpiwb",ydExpenseList);
  1638. ydFormData.put("numberField_mo007gcg",totalAmt);
  1639. ydFormData.put("numberField_mowkibv8",totalTaxAmt);
  1640. break;
  1641. case "FT212801282906280987"://打车(企业支付)
  1642. String cf36 = getMkStrValue(formData, "CF36");//是否有项目
  1643. if (!"是".equals(cf36)) return;
  1644. String reimburseName2 = getMkStrValue(formData, "reimburseName");//事由
  1645. String legalEntity2 = getMkStrValue(formData, "legalEntity");//公司抬头
  1646. Map coverUser2 = getMkListValue(formData, "coverUser").get(0);//承担人
  1647. String coverUserName2 = UtilMap.getString(coverUser2, "text");//承担人姓名
  1648. List<String> coverDdUser2 = getDdUserId(coverUserName2);//承担人钉钉id
  1649. String coverDepartment2 = getMkStrValue(formData, "coverDepartment");//承担部门
  1650. Map cf0_2 = getMkMapValue(formData, "CF0");
  1651. String projectCode2 = UtilMap.getString(cf0_2, "businessCode");//项目流水号
  1652. String projectName2 = UtilMap.getString(cf0_2, "text");//项目名称
  1653. String cf31_2 = getMkStrValue(formData, "CF31");//代垫付
  1654. Map payeeAccount2 = getMkMapValue(formData, "payeeAccount");
  1655. String bankAcctNumber2 = UtilMap.getString(payeeAccount2, "bankAcctNumber");//收款账户
  1656. List<Map> expenseList2 = getMkListValue(formData, "expenseList");
  1657. List<Map> ydExpenseList2 = new ArrayList<>();
  1658. double totalAmt2 = 0d;
  1659. double totalTaxAmt2 = 0d;
  1660. for (Map expense : expenseList2) {
  1661. String expenseType = getMkStrValue(expense, "expenseTypeCode");//费用类型
  1662. double acceptAmount = Double.parseDouble(getMkStrValue(expense, "acceptAmount"));//收款金额
  1663. String comments = getMkStrValue(expense, "comments");//用途
  1664. long consumeTime = getMkDateValue(expense, "consumeTime");//消费日期
  1665. List<Map> invoiceTaxList = getMkListValue(expense, "invoiceTaxList");//税票信息
  1666. double deductionTaxAmount = 0;
  1667. for (Map invoiceTax : invoiceTaxList) {
  1668. deductionTaxAmount += Double.parseDouble(getMkStrValue(invoiceTax, "deductionTaxAmount"));//抵扣税额
  1669. }
  1670. Map expenseMap = new HashMap();
  1671. expenseMap.put("textField_mnwlpiwc",expenseType);
  1672. expenseMap.put("numberField_mnwlpiwd",acceptAmount);
  1673. expenseMap.put("textareaField_mnwlpiwh",comments);
  1674. expenseMap.put("dateField_mnwlpiwe",consumeTime);
  1675. expenseMap.put("numberField_mol7a35x",deductionTaxAmount);
  1676. ydExpenseList2.add(expenseMap);
  1677. totalAmt2 += acceptAmount;
  1678. totalTaxAmt2 += deductionTaxAmount;
  1679. }
  1680. ydFormData.put("textField_mnyfvfxr",formCode);
  1681. ydFormData.put("textField_mnwtck7h","打车(企业支付)");
  1682. ydFormData.put("textField_mnwtwu9z",projectCode2);
  1683. ydFormData.put("textField_mnwlpivn",projectName2);
  1684. ydFormData.put("textareaField_mnwlpivb",reimburseName2);
  1685. ydFormData.put("textField_mnwlpivg",legalEntity2);
  1686. ydFormData.put("textField_mnwlpivi",coverDepartment2);
  1687. ydFormData.put("employeeField_mnwlpivh",coverDdUser2);
  1688. ydFormData.put("textField_mnwlpiw6",bankAcctNumber2);
  1689. ydFormData.put("textField_mnwlpivq",cf31_2);
  1690. ydFormData.put("tableField_mnwlpiwb",ydExpenseList2);
  1691. ydFormData.put("numberField_mo007gcg",totalAmt2);
  1692. ydFormData.put("numberField_mowkibv8",totalTaxAmt2);
  1693. break;
  1694. case "FT204524106635297811"://项目差旅报销单
  1695. String reimburseName3 = getMkStrValue(formData, "reimburseName");//事由
  1696. String legalEntity3 = getMkStrValue(formData, "legalEntity");//公司抬头
  1697. Map coverUser3 = getMkListValue(formData, "coverUser").get(0);//承担人
  1698. String coverUserName3 = UtilMap.getString(coverUser3, "text");//承担人姓名
  1699. List<String> coverDdUser3 = getDdUserId(coverUserName3);//承担人钉钉id
  1700. String coverDepartment3 = getMkStrValue(formData, "coverDepartment");//承担部门
  1701. Map cf0_3 = getMkMapValue(formData, "CF0");
  1702. String projectCode3 = UtilMap.getString(cf0_3, "businessCode");//项目流水号
  1703. String projectName3 = UtilMap.getString(cf0_3, "text");//项目名称
  1704. String cf31_3 = getMkStrValue(formData, "CF31");//代垫付
  1705. Map payeeAccount3 = getMkMapValue(formData, "payeeAccount");
  1706. String bankAcctNumber3 = UtilMap.getString(payeeAccount3, "bankAcctNumber");//收款账户
  1707. List<Map> expenseList3 = getMkListValue(formData, "expenseList");
  1708. List<Map> ydExpenseList3 = new ArrayList<>();
  1709. double totalAmt3 = 0d;
  1710. double totalTaxAmt3 = 0d;
  1711. for (Map expense : expenseList3) {
  1712. String expenseType = getMkStrValue(expense, "expenseTypeCode");//费用类型
  1713. double acceptAmount = Double.parseDouble(getMkStrValue(expense, "acceptAmount"));//收款金额
  1714. String comments = getMkStrValue(expense, "comments");//用途
  1715. long consumeTime = getMkDateValue(expense, "consumeTime");//消费日期
  1716. List<Map> invoiceTaxList = getMkListValue(expense, "invoiceTaxList");//税票信息
  1717. double deductionTaxAmount = 0;
  1718. for (Map invoiceTax : invoiceTaxList) {
  1719. deductionTaxAmount += Double.parseDouble(getMkStrValue(invoiceTax, "deductionTaxAmount"));//抵扣税额
  1720. }
  1721. Map expenseMap = new HashMap();
  1722. expenseMap.put("textField_mnwlpiwc",expenseType);
  1723. expenseMap.put("numberField_mnwlpiwd",acceptAmount);
  1724. expenseMap.put("textareaField_mnwlpiwh",comments);
  1725. expenseMap.put("dateField_mnwlpiwe",consumeTime);
  1726. expenseMap.put("numberField_mol7a35x",deductionTaxAmount);
  1727. ydExpenseList3.add(expenseMap);
  1728. totalAmt3 += acceptAmount;
  1729. totalTaxAmt3 += deductionTaxAmount;
  1730. }
  1731. ydFormData.put("textField_mnyfvfxr",formCode);
  1732. ydFormData.put("textField_mnwtck7h","项目差旅报销单");
  1733. ydFormData.put("textField_mnwtwu9z",projectCode3);
  1734. ydFormData.put("textField_mnwlpivn",projectName3);
  1735. ydFormData.put("textareaField_mnwlpivb",reimburseName3);
  1736. ydFormData.put("textField_mnwlpivg",legalEntity3);
  1737. ydFormData.put("textField_mnwlpivi",coverDepartment3);
  1738. ydFormData.put("employeeField_mnwlpivh",coverDdUser3);
  1739. ydFormData.put("textField_mnwlpiw6",bankAcctNumber3);
  1740. ydFormData.put("textField_mnwlpivq",cf31_3);
  1741. ydFormData.put("tableField_mnwlpiwb",ydExpenseList3);
  1742. ydFormData.put("numberField_mo007gcg",totalAmt3);
  1743. ydFormData.put("numberField_mowkibv8",totalTaxAmt3);
  1744. break;
  1745. default:
  1746. return;
  1747. }
  1748. ydClient.operateData(YDParam.builder()
  1749. .formUuid("FORM-4F0DF576764A472AA6CF4AC0E26061559AR4")
  1750. .formDataJson(JSONObject.toJSONString(ydFormData))
  1751. .build(), YDConf.FORM_OPERATION.create);
  1752. }
  1753. @Override
  1754. public McR saveRepayment(Map map) {
  1755. String formInstId = UtilMap.getString(map, "formInstId");
  1756. Map formData = ydClient.queryData(YDParam.builder()
  1757. .formInstanceId(formInstId)
  1758. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  1759. String thbh = UtilMap.getString(formData, "serialNumberField_mkkmij3o");//退回编号
  1760. String type = UtilMap.getString(formData, "radioField_mkkmij3b");
  1761. String ssgssh = UtilMap.getString(formData, "textField_mmd6hio7");//所属公司税号
  1762. String sqrgh = UtilMap.getString(formData, "textField_mmwvodde");//申请人工号
  1763. Map employeeDetails = MkBxUtil.employeeDetails(UtilMap.map("employeeIds", Arrays.asList(sqrgh)));
  1764. String deptBusinessCode = "";
  1765. String empId = "";
  1766. if (Objects.nonNull(employeeDetails)){
  1767. List<Map> departments = UtilMap.getList(employeeDetails, "departments");
  1768. deptBusinessCode = UtilMap.getString(departments.get(0), "businessCode");
  1769. empId = sqrgh;
  1770. }else {
  1771. empId = mkbx_empId;
  1772. deptBusinessCode = mkbx_deptId;
  1773. }
  1774. if ("直接采购".equals(type)){
  1775. String cgbh = UtilMap.getString(formData, "textField_mn4fwdj5");//采购编号
  1776. List<Map> cgmxList = UtilMap.getList(formData, "tableField_mkkmij56");
  1777. for (Map cgmx : cgmxList) {
  1778. Double amt = UtilMap.getDouble(cgmx, "numberField_mn2wqvpp");//退回金额
  1779. if (amt == 0) continue;
  1780. int index = UtilMap.getInt(cgmx, "numberField_mn36ykxx");//索引
  1781. String thsy = UtilMap.getString(cgmx, "textareaField_mo2k0ien");//退回事由
  1782. String gysbh = UtilMap.getString(cgmx, "textField_mmbmohrb");//供应商编号
  1783. Map reimburseDetailInfo = MkBxUtil.reimburseDetailInfo(cgbh + "-" + index);
  1784. Map expense = ((List<Map>) UtilMap.getList(reimburseDetailInfo, "expenseList")).get(0);
  1785. String expenseCode = UtilMap.getString(expense, "code");//费用编码
  1786. Map noReceiptReturn = new HashMap();
  1787. noReceiptReturn.put("recordExpenseCode",expenseCode);
  1788. noReceiptReturn.put("recordDeductionAmount",new HashMap<String,Object>(){{put("currency","CNY");put("amount",amt);}});
  1789. Map body = new HashMap();
  1790. body.put("formCode",thbh + index);
  1791. body.put("repaymentName",thsy);
  1792. body.put("formSubTypeBizCode","FT212654855978767371");
  1793. body.put("submittedUserEmployeeId",empId);
  1794. body.put("coverEmployeeId",empId);
  1795. body.put("departmentBizCode",deptBusinessCode);
  1796. body.put("legalEntityBizCode",ssgssh);
  1797. body.put("repayAmount",new HashMap<String,Object>(){{put("currency","CNY");put("amount",amt);}});
  1798. body.put("repaymentDate",System.currentTimeMillis());
  1799. body.put("tradingPartnerBizCode",gysbh);
  1800. body.put("paymentType","BANK");
  1801. body.put("noReceiptReturnList",Arrays.asList(noReceiptReturn));
  1802. body.put("stagingFlag",false);
  1803. MkBxUtil.receiveRepayment(body);
  1804. }
  1805. }else {//需求采购
  1806. String xqbh = UtilMap.getString(formData, "textField_mn4fwdj4");//需求编号
  1807. List<Map> cgmxList = UtilMap.getList(formData, "tableField_mn2xmq2b");
  1808. for (Map cgmx : cgmxList) {
  1809. Double amt = UtilMap.getDouble(cgmx, "numberField_mn2xmq1p");//退回金额
  1810. if (amt == 0) continue;
  1811. int index = UtilMap.getInt(cgmx, "numberField_mn39fdfe");//索引
  1812. String thsy = UtilMap.getString(cgmx, "textareaField_mo2k0iep");//退回事由
  1813. String gysbh = UtilMap.getString(cgmx, "textField_mn2xmq27");//供应商编号
  1814. Map reimburseDetailInfo = MkBxUtil.reimburseDetailInfo(xqbh + "-" + index);
  1815. Map expense = ((List<Map>) UtilMap.getList(reimburseDetailInfo, "expenseList")).get(0);
  1816. String expenseCode = UtilMap.getString(expense, "code");//费用编码
  1817. Map noReceiptReturn = new HashMap();
  1818. noReceiptReturn.put("recordExpenseCode",expenseCode);
  1819. noReceiptReturn.put("recordDeductionAmount",new HashMap<String,Object>(){{put("currency","CNY");put("amount",amt);}});
  1820. Map body = new HashMap();
  1821. body.put("formCode",thbh + index);
  1822. body.put("repaymentName",thsy);
  1823. body.put("formSubTypeBizCode","FT212654855978767371");
  1824. body.put("submittedUserEmployeeId",empId);
  1825. body.put("coverEmployeeId",empId);
  1826. body.put("departmentBizCode",deptBusinessCode);
  1827. body.put("legalEntityBizCode",ssgssh);
  1828. body.put("repayAmount",new HashMap<String,Object>(){{put("currency","CNY");put("amount",amt);}});
  1829. body.put("repaymentDate",System.currentTimeMillis());
  1830. body.put("tradingPartnerBizCode",gysbh);
  1831. body.put("paymentType","BANK");
  1832. body.put("noReceiptReturnList",Arrays.asList(noReceiptReturn));
  1833. body.put("stagingFlag",false);
  1834. MkBxUtil.receiveRepayment(body);
  1835. }
  1836. }
  1837. return McR.success();
  1838. }
  1839. @Async
  1840. @Override
  1841. public void invoiceWriteBack9(Map map) {
  1842. Map calloutParams = UtilMap.getMap(map, "calloutParams");
  1843. String serviceType = UtilMap.getString(calloutParams, "serviceType");
  1844. Map bizData = UtilMap.getMap(calloutParams, "bizData");
  1845. if ("RECEIVABLE_AR_COMPLETED_NOTIFY_AR".equals(serviceType)){
  1846. List<Map> invoiceList = UtilMap.getList(bizData, "invoiceList");
  1847. Map invoiceMap = invoiceList.get(0);
  1848. String invoiceNumber = UtilMap.getString(invoiceMap, "invoiceNumber");//发票号码
  1849. long formDate = UtilMap.getLong(invoiceMap, "formDate");//开票日期
  1850. String invoiceApplicationBizCode = ((List<String>)UtilMap.getList(bizData, "invoiceApplicationBizCodes")).get(0);//开票申请单编号
  1851. Map updateFormData = new HashMap();
  1852. updateFormData.put("radioField_mkxripcc","开票成功");
  1853. updateFormData.put("textField_mkxripc6",invoiceNumber);
  1854. updateFormData.put("dateField_mnfpbwpd",formDate);
  1855. updateFormData.put("textareaField_mmlzqvn0","");
  1856. //发票下载信息查询
  1857. Map invoiceInfo = MkYpUtil.getInvoiceInfo(invoiceNumber);
  1858. if (Objects.nonNull(invoiceInfo)){
  1859. String pdfUrl = UtilMap.getString(invoiceInfo, "pdfUrl");//发票下载地址
  1860. String downloadPageUrl = UtilMap.getString(invoiceInfo, "downloadPageUrl");//发票下载页面地址
  1861. if (Strings.isNotBlank(pdfUrl)){
  1862. String fileName = invoiceNumber + ".pdf";
  1863. String downloadPath = downloadFilePath + fileName;
  1864. downloadFile(pdfUrl,downloadPath);//下载pdf发票
  1865. String downloadUri = downloadUrl + "files/" + fileName + "?option=download";
  1866. String previewUri = downloadUrl + "files/" + fileName + "?option=preview";
  1867. Map attachmentField = new HashMap();
  1868. attachmentField.put("downloadUrl",downloadUri);
  1869. attachmentField.put("name",fileName);
  1870. attachmentField.put("previewUrl",previewUri);
  1871. attachmentField.put("url",downloadUri);
  1872. attachmentField.put("ext","pdf");
  1873. updateFormData.put("attachmentField_mkxripc5",Arrays.asList(attachmentField));
  1874. }
  1875. if (Strings.isNotBlank(downloadPageUrl)){
  1876. updateFormData.put("textField_mm3aixk0",downloadPageUrl);
  1877. }
  1878. }
  1879. //回写宜搭
  1880. Map data = ((List<Map>)ydClient.queryData(YDParam.builder()
  1881. .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_mknspz75",invoiceApplicationBizCode)))
  1882. .formUuid("FORM-A9A47B0365DB437F8F4C8E01B4468220K7GU")
  1883. .build(), YDConf.FORM_QUERY.retrieve_list).getData()).get(0);
  1884. String formInstanceId = UtilMap.getString(data, "formInstanceId");
  1885. ydClient.operateData(YDParam.builder()
  1886. .formInstanceId(formInstanceId)
  1887. .updateFormDataJson(JSONObject.toJSONString(updateFormData))
  1888. .build(), YDConf.FORM_OPERATION.update);
  1889. }
  1890. }
  1891. @Override
  1892. public McR ddProject(Map map) {
  1893. String formInstId = UtilMap.getString(map, "formInstId");
  1894. String type = UtilMap.getString(map, "type");
  1895. Map formData = ydClient.queryData(YDParam.builder()
  1896. .formInstanceId(formInstId)
  1897. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  1898. String projectCode = UtilMap.getString(formData, "serialNumberField_mknemyna");//项目流水号
  1899. String projectName = UtilMap.getString(formData, "textField_mkdedkvu");//项目名称
  1900. String projectProgress = UtilMap.getString(formData, "selectField_mkdf8q80");//项目进度
  1901. String projectManager = UtilMap.getString(formData, "textField_mo8lkotd");//项目负责人工号
  1902. List<String> projectMember = UtilMap.getList(formData, "multiSelectField_mo9iilfl");//项目成员工号
  1903. String ztcg = UtilMap.getString(formData, "textField_mo9iilfm");//中台采购工号
  1904. List<String> leader_employee_id = new ArrayList<>();
  1905. leader_employee_id.add(projectManager);//第一个为主负责人,后续为其他负责人
  1906. leader_employee_id.addAll(projectMember);
  1907. leader_employee_id.add(ztcg);
  1908. //leader_employee_id去重
  1909. leader_employee_id = leader_employee_id.stream().distinct().collect(Collectors.toList());
  1910. String htqygssh = UtilMap.getString(formData, "textField_mo9nav1d");//合同签约公司税号
  1911. if ("add".equals(type)){//新增
  1912. String startDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date());//项目开始时间
  1913. //当前时间+一年半
  1914. Calendar calendar = Calendar.getInstance();
  1915. calendar.setTime(new Date());
  1916. calendar.add(Calendar.YEAR, 1);
  1917. calendar.add(Calendar.MONTH, 6);
  1918. String endDate = new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime());//项目结束时间
  1919. Map body = new HashMap();
  1920. body.put("out_budget_id",projectCode);
  1921. body.put("name",projectName);
  1922. body.put("type",2);
  1923. body.put("budget_cycle",0);
  1924. body.put("total_quota",0);
  1925. body.put("member_used",1);//0 :全员可见 1:项目成员可见 2:公司主体可见
  1926. body.put("legal_entity_id",ddLegalEntity.get(htqygssh));//项目所属公司主体ID
  1927. body.put("start_date",startDate);
  1928. body.put("expiry_date",endDate);
  1929. body.put("leader_employee_id",JSONObject.toJSONString(leader_employee_id));
  1930. Map result = QyddUtil.BudgetCenterAdd(body);
  1931. return McR.success(result);
  1932. }else if ("update".equals(type)){//更新
  1933. Map body = new HashMap();
  1934. body.put("out_budget_id",projectCode);
  1935. body.put("name",projectName);
  1936. body.put("type",2);
  1937. body.put("member_used",1);//0 :全员可见 1:项目成员可见 2:公司主体可见
  1938. body.put("legal_entity_id",ddLegalEntity.get(htqygssh));//项目所属公司主体ID
  1939. body.put("leader_employee_id",JSONObject.toJSONString(leader_employee_id));
  1940. Map result = QyddUtil.BudgetCenterEdit(body);
  1941. return McR.success(result);
  1942. }else{//封账
  1943. Map body = new HashMap();
  1944. body.put("out_budget_id",projectCode);
  1945. body.put("name",projectName);
  1946. body.put("type",2);
  1947. body.put("expiry_date",new SimpleDateFormat("yyyy-MM-dd").format(new Date()));//项目结束时间 封账时间
  1948. Map result = QyddUtil.BudgetCenterEdit(body);
  1949. return McR.success(result);
  1950. }
  1951. }
  1952. private static String getMkStrValue(Map formData, String entityName) {
  1953. Map title = UtilMap.getMap(formData, entityName);
  1954. Map value = UtilMap.getMap(title, "value");
  1955. String text = UtilMap.getString(value, "text");
  1956. return text;
  1957. }
  1958. private static Map getMkMapValue(Map formData, String entityName) {
  1959. Map title = UtilMap.getMap(formData, entityName);
  1960. Map value = UtilMap.getMap(title, "value");
  1961. return value;
  1962. }
  1963. private static List<Map> getMkListValue(Map formData, String entityName) {
  1964. Map title = UtilMap.getMap(formData, entityName);
  1965. List<Map> value = UtilMap.getList(title, "value");
  1966. return value;
  1967. }
  1968. private static Long getMkDateValue(Map formData, String entityName) {
  1969. Map title = UtilMap.getMap(formData, entityName);
  1970. Map value = UtilMap.getMap(title, "value");
  1971. String type = UtilMap.getString(title, "type");
  1972. long currentTime = new Date().getTime();
  1973. if ("DateTimeInput".equals(type)){
  1974. currentTime = UtilMap.getLong(value, "currentTime");
  1975. }else if ("DateRangeInput".equals(type)){
  1976. currentTime = UtilMap.getLong(value, "startTime");
  1977. }
  1978. return currentTime;
  1979. }
  1980. //根据员工名字匹配员工id
  1981. private List<String> getDdUserId(String Name){
  1982. HashMap body = new HashMap();
  1983. body.put("queryWord", Name);
  1984. body.put("offset",0);
  1985. body.put("size",1);
  1986. String s1 = UtilHttp.doPost("https://api.dingtalk.com/v1.0/contact/users/search", ddClient.initTokenHeader(), null, body);
  1987. List<String> list = JSONObject.parseObject(s1).getJSONArray("list").toJavaList(String.class);
  1988. return list;
  1989. }
  1990. //更新宜搭采购已退回金额
  1991. private void updateYdRepay(String formCode, Double amount) {
  1992. String[] split = formCode.split("-");
  1993. String bh = split[0];
  1994. int index = Integer.parseInt(split[1]);
  1995. Map updateFormData = new HashMap();
  1996. List<Map> updateDetailList = new ArrayList<>();
  1997. if (formCode.contains("需求")){
  1998. //采购需求&结算
  1999. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  2000. .formUuid("FORM-C8C1FBBA781C4C5EBAC487C07BC5A86AD2HO")
  2001. .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_mkkmij3o", bh)))
  2002. .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
  2003. String formInstanceId = UtilMap.getString(data.get(0), "formInstanceId");
  2004. Map ydFormData = UtilMap.getMap(data.get(0), "formData");
  2005. String type = UtilMap.getString(ydFormData, "radioField_mkkmij3b");
  2006. if ("常规需求".equals(type)){
  2007. List<Map> detailList = UtilMap.getList(ydFormData, "tableField_mkkmij56");
  2008. for (Map detail : detailList) {
  2009. Map detailMap = new HashMap();
  2010. if (index == UtilMap.getInt(detail, "numberField_mn36ykxx")){
  2011. Double ythje = UtilMap.getDouble(detail, "numberField_mn4g182f");//已退回金额
  2012. detailMap.put("numberField_mn4g182f",ythje + amount);
  2013. detailMap.put("selectField_mmvhqm0p","部分退款");
  2014. }
  2015. updateDetailList.add(detailMap);
  2016. }
  2017. updateFormData.put("tableField_mkkmij56",updateDetailList);
  2018. }else {
  2019. List<Map> detailList = UtilMap.getList(ydFormData, "tableField_mkkmij61");
  2020. for (Map detail : detailList) {
  2021. Map detailMap = new HashMap();
  2022. if (index == UtilMap.getInt(detail, "numberField_mn36ykxz")){
  2023. Double ythje = UtilMap.getDouble(detail, "numberField_mn4g182g");//已退回金额
  2024. detailMap.put("numberField_mn4g182g",ythje + amount);
  2025. detailMap.put("selectField_mkkmij6a","部分退款");
  2026. }
  2027. updateDetailList.add(detailMap);
  2028. }
  2029. updateFormData.put("tableField_mkkmij61",updateDetailList);
  2030. }
  2031. Double totalAmt = UtilMap.getDouble(ydFormData, "numberField_mn4g5e28");//已退回
  2032. updateFormData.put("numberField_mn4g5e28",totalAmt + amount);
  2033. ydClient.operateData(YDParam.builder()
  2034. .formInstanceId(formInstanceId)
  2035. .updateFormDataJson(JSONObject.toJSONString(updateFormData))
  2036. .useLatestVersion(true)
  2037. .build(), YDConf.FORM_OPERATION.update);
  2038. }else {
  2039. //直接采购结算单
  2040. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  2041. .formUuid("FORM-1AFEDDA034C74F0DB18FA60C941CB56EHUUG")
  2042. .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_mkkmij3o", bh)))
  2043. .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
  2044. String formInstanceId = UtilMap.getString(data.get(0), "formInstanceId");
  2045. Map ydFormData = UtilMap.getMap(data.get(0), "formData");
  2046. String type = UtilMap.getString(ydFormData, "radioField_mkkmij3b");
  2047. if ("常规采购".equals(type)){
  2048. List<Map> detailList = UtilMap.getList(ydFormData, "tableField_mkkmij56");
  2049. for (Map detail : detailList) {
  2050. Map detailMap = new HashMap();
  2051. if (index == UtilMap.getInt(detail, "numberField_mn36ykxx")){
  2052. Double ythje = UtilMap.getDouble(detail, "numberField_mn4g182f");//已退回金额
  2053. detailMap.put("numberField_mn4g182f",ythje + amount);
  2054. detailMap.put("selectField_mmvhtdy0","部分退款");
  2055. }
  2056. updateDetailList.add(detailMap);
  2057. }
  2058. updateFormData.put("tableField_mkkmij56",updateDetailList);
  2059. }else {
  2060. List<Map> detailList = UtilMap.getList(ydFormData, "tableField_mkkmij61");
  2061. for (Map detail : detailList) {
  2062. Map detailMap = new HashMap();
  2063. if (index == UtilMap.getInt(detail, "numberField_mn36ykxz")){
  2064. Double ythje = UtilMap.getDouble(detail, "numberField_mn4g182g");//已退回金额
  2065. detailMap.put("numberField_mn4g182g",ythje + amount);
  2066. detailMap.put("selectField_mkkmij6a","部分退款");
  2067. }
  2068. updateDetailList.add(detailMap);
  2069. }
  2070. updateFormData.put("tableField_mkkmij61",updateDetailList);
  2071. }
  2072. Double totalAmt = UtilMap.getDouble(ydFormData, "numberField_mn4g5e28");//已退回
  2073. updateFormData.put("numberField_mn4g5e28",totalAmt + amount);
  2074. ydClient.operateData(YDParam.builder()
  2075. .formInstanceId(formInstanceId)
  2076. .updateFormDataJson(JSONObject.toJSONString(updateFormData))
  2077. .useLatestVersion(true)
  2078. .build(), YDConf.FORM_OPERATION.update);
  2079. }
  2080. }
  2081. //文件下载到本地
  2082. private void downloadFile(String downloadUri,String downloadPath){
  2083. try {
  2084. URL url = new URL(downloadUri);
  2085. HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
  2086. int responseCode = httpConn.getResponseCode();
  2087. // 检查HTTP响应代码是否为200
  2088. if (responseCode == HttpURLConnection.HTTP_OK) {
  2089. InputStream inputStream = httpConn.getInputStream();
  2090. FileOutputStream outputStream = new FileOutputStream(downloadPath);
  2091. byte[] buffer = new byte[4096];
  2092. int bytesRead = -1;
  2093. while ((bytesRead = inputStream.read(buffer)) != -1) {
  2094. outputStream.write(buffer, 0, bytesRead);
  2095. }
  2096. outputStream.close();
  2097. inputStream.close();
  2098. } else {
  2099. System.out.println("无法下载文件。HTTP响应代码: " + responseCode);
  2100. }
  2101. httpConn.disconnect();
  2102. }catch (Exception e){
  2103. throw new RuntimeException(e);
  2104. }
  2105. }
  2106. }