SikuServiceImpl.java 127 KB

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