SikuServiceImpl.java 141 KB

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