JinlunTaskServiceImpl.java 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757
  1. package com.malk.jinlun.service.impl;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.kingdee.bos.webapi.entity.IdentifyInfo;
  4. import com.kingdee.bos.webapi.sdk.K3CloudApi;
  5. import com.malk.jinlun.config.KDWebApiConf;
  6. import com.malk.jinlun.entity.BillQuery;
  7. import com.malk.jinlun.service.CpClient;
  8. import com.malk.jinlun.service.JinlunTaskService;
  9. import com.malk.utils.UtilMap;
  10. import lombok.extern.slf4j.Slf4j;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.stereotype.Service;
  13. import java.util.ArrayList;
  14. import java.util.HashMap;
  15. import java.util.List;
  16. import java.util.Map;
  17. @Slf4j
  18. @Service
  19. public class JinlunTaskServiceImpl implements JinlunTaskService {
  20. @Autowired
  21. private KDWebApiConf kdWebApiConf;
  22. @Autowired
  23. private CpClient cpClient;
  24. @Override
  25. public void syncMaterial() {
  26. log.info("开始同步物料数据");
  27. K3CloudApi client = new K3CloudApi(initIden());
  28. List<Map> result = new ArrayList<>();
  29. List<Map> materialList = new ArrayList<>();
  30. int startRow = 0;
  31. int limit = 2000;
  32. BillQuery billQuery = new BillQuery();
  33. billQuery.setFormId("BD_MATERIAL");
  34. billQuery.setFieldKeys("FNumber,FName,F_Sl_xingnengid.FName,F_Sl_cihuaid.FName,FSpecification,FErpClsID,F_Sl_xingzhuangid.FName,F_Sl_ducengid.FName,F_Sl_ischongciid.FName,F_Sl_chihuaguige,F_Sl_midu,F_Sl_guige,F_Sl_weight,F_Sl_ischeck,F_Sl_qianguige,F_Sl_cixiangchang,F_NLD_gongyi.FName,F_Sl_biaomianji,FMaterialGroup.FName,FCategoryID.FName,FVOLUME,FBaseUnitId.FName,FSaleUnitId.FName,FSalePriceUnitId.FName");
  35. List<Map> filterString = new ArrayList<>();
  36. //审核日期为昨天至今天
  37. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","265",1,"","","0"));//审核日期在今天之前N天以后
  38. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","420","2024-10-20 00:00:00","","","0"));//审核日期年=XX
  39. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FNumber","67","35","","","0"));//物料编码等于XX
  40. billQuery.setFilterString(filterString);
  41. billQuery.setLimit(limit);
  42. do {
  43. billQuery.setStartRow(startRow);
  44. String s = null;
  45. try {
  46. s = client.billQuery(JSONObject.toJSONString(billQuery));
  47. } catch (Exception e) {
  48. throw new RuntimeException(e);
  49. }
  50. result = (List<Map>)JSONObject.parse(s);
  51. materialList.addAll(result);
  52. startRow += limit;
  53. }while (result.size() == limit);
  54. for (Map map : materialList) {
  55. Map data = new HashMap();
  56. data.put("ShortText1757932581400",UtilMap.getString(map,"FName"));//物料名称
  57. data.put("ShortText1757932557449",UtilMap.getString(map,"FNumber"));//物料编码
  58. data.put("ShortText1757932601205",UtilMap.getString(map,"F_Sl_xingnengid.FName"));//性能
  59. data.put("ShortText1757932616477",UtilMap.getString(map,"F_Sl_cihuaid.FName"));//磁化方向
  60. data.put("ShortText1757932652570",UtilMap.getString(map,"F_Sl_xingzhuangid.FName"));//形状
  61. data.put("ShortText1757932660567",UtilMap.getString(map,"F_Sl_ducengid.FName"));//镀层
  62. data.put("Dropdown1757932715739",UtilMap.getString(map,"F_Sl_ischongciid.FName"));//是否充磁
  63. data.put("ShortText1757932699628",UtilMap.getString(map,"F_Sl_chihuaguige"));//磁化规格
  64. data.put("Number1757932755471",UtilMap.getDouble(map,"F_Sl_midu"));//密度(g/mm³)
  65. data.put("ShortText1757932739089",UtilMap.getString(map,"F_Sl_guige"));//尺寸规格
  66. data.put("Number1757932746124",UtilMap.getDouble(map,"F_Sl_weight"));//单重(kg)
  67. data.put("Logic1757932804393",UtilMap.getBoolean(map,"F_Sl_ischeck"));//是否需要检验
  68. data.put("ShortText1757932821074",UtilMap.getString(map,"F_Sl_qianguige"));//带前后缀规格
  69. data.put("Number1757932837126",UtilMap.getDouble(map,"F_Sl_cixiangchang"));//磁向长
  70. data.put("ShortText1757932874077",UtilMap.getString(map,"F_NLD_gongyi.FName"));//工序
  71. data.put("Number1757932881710",UtilMap.getDouble(map,"F_Sl_biaomianji"));//表面积
  72. data.put("ShortText1760342223781",UtilMap.getString(map,"FSpecification"));//规格型号
  73. data.put("ShortText1757933029016",UtilMap.getString(map,"FMaterialGroup.FName"));//物料分组
  74. data.put("ShortText1757933017962",UtilMap.getString(map,"FCategoryID.FName"));//存货类别
  75. String fErpClsID = UtilMap.getString(map, "FErpClsID");
  76. String wlsx = "";
  77. switch (fErpClsID){
  78. case "10":wlsx = "资产";break;
  79. case "9":wlsx = "配置";break;
  80. case "2":wlsx = "自制";break;
  81. case "11":wlsx = "费用";break;
  82. case "12":wlsx = "模型";break;
  83. case "5":wlsx = "虚拟";break;
  84. case "7":wlsx = "一次性";break;
  85. case "13":wlsx = "产品系列";break;
  86. case "3":wlsx = "委外";break;
  87. case "4":wlsx = "特征";break;
  88. case "6":wlsx = "服务";break;
  89. case "1":wlsx = "原材料";break;
  90. }
  91. data.put("ShortText1757933048314",wlsx);//物料属性
  92. data.put("Number1757933060744",UtilMap.getDouble(map,"FVOLUME"));//体积
  93. data.put("ShortText1757933079170",UtilMap.getString(map,"FBaseUnitId.FName"));//基本单位
  94. data.put("Text1760411136055",UtilMap.getString(map,"FSaleUnitId.FName"));//销售单位
  95. data.put("Text1760411137275",UtilMap.getString(map,"FSalePriceUnitId.FName"));//销售计价单位
  96. String schemaCode = "WL";
  97. //查询是否存在
  98. Map result2 = cpClient.getCpBoList(schemaCode, UtilMap.map("queryFilterType, propertyCode, propertyValue", "Eq", "ShortText1757932557449", UtilMap.getString(map,"FNumber")), 0, 1, null);
  99. Map bizObjectPage = UtilMap.getMap(UtilMap.getMap(result2, "data"),"bizObjectPage");
  100. int totalElements = UtilMap.getInt(bizObjectPage, "totalElements");
  101. if (totalElements > 0) {
  102. //云枢更新销售出库单
  103. Map content = ((List<Map>) UtilMap.getList(bizObjectPage, "content")).get(0);
  104. String bizObjectId = UtilMap.getString(content,"bizObjectId");//主表实例id
  105. data.put("id",bizObjectId);
  106. Map result3 = cpClient.updateCpBo(schemaCode, data,null);
  107. }else {
  108. //云枢新增销售出库单
  109. Map result3 = cpClient.createCpBo(schemaCode, data,null);
  110. }
  111. }
  112. }
  113. @Override
  114. public void syncSaleOut() {
  115. log.info("开始同步销售出库单数据");
  116. K3CloudApi client = new K3CloudApi(initIden());
  117. List<Map> result = new ArrayList<>();
  118. List<Map> saleOutList = new ArrayList<>();
  119. int startRow = 0;
  120. int limit = 2000;
  121. BillQuery billQuery = new BillQuery();
  122. billQuery.setFormId("SAL_OUTSTOCK");
  123. billQuery.setFieldKeys("FBillNo,FBillTypeID.FName,FDate,FSettleCurrID.FName,FCustomerID.FName,FCustomerID.FShortName,FHeadLocationID.FName,FMaterialID.FNumber,FMaterialID.FName,FMaterialID.FSpecification,FMaterialID.F_Sl_ducengid,F_VMKV_Text_WLZT,FPriceUnitQty,FRealQty,FUnitID.FName,FPriceUnitId.FName,FAuxUnitID.FName,FAuxUnitQty,FIsFree,FPrice,FTaxPrice,FEntryTaxRate,FAmount,FAllAmount,FDiscount,FEntrynote");
  124. List<Map> filterString = new ArrayList<>();
  125. //审核日期为昨天至今天
  126. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","265",1,"","","0"));//审核日期在今天之前N天以后
  127. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","420","2025-10-20 00:00:00","","","0"));//审核日期年=XX
  128. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FNumber","67","35","","","0"));//物料编码等于XX
  129. billQuery.setFilterString(filterString);
  130. billQuery.setLimit(limit);
  131. do {
  132. billQuery.setStartRow(startRow);
  133. String s = null;
  134. try {
  135. s = client.billQuery(JSONObject.toJSONString(billQuery));
  136. } catch (Exception e) {
  137. throw new RuntimeException(e);
  138. }
  139. result = (List<Map>)JSONObject.parse(s);
  140. saleOutList.addAll(result);
  141. startRow += limit;
  142. }while (result.size() == limit);
  143. List<Map<String,Object>> dataList = new ArrayList<>();
  144. for (Map saleOut : saleOutList) {
  145. Map data = new HashMap();
  146. data.put("ShortText1760153678207",UtilMap.getString(saleOut,"FBillNo"));//单据编号
  147. data.put("ShortText1760153685839",UtilMap.getString(saleOut,"FBillTypeID.FName"));//单据类型
  148. data.put("Date1760153694040",UtilMap.getString(saleOut, "FDate").replace("T"," "));//日期
  149. data.put("ShortText1760153691233",UtilMap.getString(saleOut,"FSettleCurrID.FName"));//结算币别
  150. data.put("ShortText1760153707273",UtilMap.getString(saleOut,"FCustomerID.FName"));//客户名称
  151. data.put("ShortText1760153714871",UtilMap.getString(saleOut,"FCustomerID.FShortName"));//客户简称
  152. data.put("ShortText1760153722192",UtilMap.getString(saleOut,"FHeadLocationID.FName"));//交货地点
  153. List<Map> entry = new ArrayList<>();
  154. Map entryMap = new HashMap();
  155. entryMap.put("Number1760153738400",UtilMap.getString(saleOut,"FMaterialID.FNumber"));//物料编码
  156. entryMap.put("ShortText1760153773163",UtilMap.getString(saleOut,"FMaterialID.FNumber"));//物料编码
  157. entryMap.put("Text1760153778635",UtilMap.getString(saleOut,"FMaterialID.FName"));//物料名称
  158. entryMap.put("Text1760153786986",UtilMap.getString(saleOut,"FMaterialID.FSpecification"));//规格型号
  159. entryMap.put("ShortText1762245895776",UtilMap.getString(saleOut,"FMaterialID.F_Sl_ducengid"));//镀锌
  160. entryMap.put("Text1762245901183",UtilMap.getString(saleOut,"F_VMKV_Text_WLZT"));//物料状态
  161. entryMap.put("Number1760153811668",UtilMap.getDouble(saleOut,"FPriceUnitQty"));//计价数量
  162. Double sfsl = UtilMap.getDouble(saleOut, "FRealQty");
  163. entryMap.put("Number1760153958907", sfsl);//实发数量
  164. entryMap.put("Text1760153793403",UtilMap.getString(saleOut,"FPriceUnitId.FName"));//计价单位
  165. String kcdw = UtilMap.getString(saleOut, "FUnitID.FName");
  166. entryMap.put("ShortText1762508609328", kcdw);//库存单位
  167. entryMap.put("Text1762508629987",UtilMap.getString(saleOut,"FAuxUnitID.FName"));//库存辅单位
  168. Double kcfdwsl = UtilMap.getDouble(saleOut, "FAuxUnitQty");
  169. entryMap.put("Number1762508641763", kcfdwsl);//库存辅单位数量
  170. entryMap.put("Logic1760171983887",UtilMap.getBoolean(saleOut,"FIsFree"));//是否赠品
  171. entryMap.put("Number1760153991898",UtilMap.getDouble(saleOut,"FPrice"));//单价
  172. entryMap.put("Number1760154006703",UtilMap.getDouble(saleOut,"FTaxPrice"));//计价单价
  173. entryMap.put("Number1762225120251",UtilMap.getDouble(saleOut,"FEntryTaxRate"));//税率
  174. entryMap.put("Number1760154034052",UtilMap.getDouble(saleOut,"FAmount"));//金额
  175. entryMap.put("Number1760154039959",UtilMap.getDouble(saleOut,"FAllAmount"));//价税合计
  176. entryMap.put("Number1760154058940",UtilMap.getDouble(saleOut,"FDiscount"));//折扣额
  177. entryMap.put("ShortText1760154066042",UtilMap.getString(saleOut,"FEntrynote"));//备注
  178. if ("Pcs".equals(kcdw)){
  179. entryMap.put("Number1762509492431",sfsl);//数量
  180. entryMap.put("Number1762509515885",kcfdwsl);//重量
  181. }else {
  182. entryMap.put("Number1762509492431",0);//数量
  183. entryMap.put("Number1762509515885",sfsl);//重量
  184. }
  185. entry.add(entryMap);
  186. data.put("Sheet1760153734916",entry);
  187. dataList.add(data);
  188. }
  189. //处理同一出库单多个明细
  190. List<Map<String, Object>> list = mergeListMap(dataList, "ShortText1760153678207", "Sheet1760153734916");
  191. for (Map<String, Object> map : list) {
  192. String schemaCode = "XSCKD";
  193. //查询是否存在
  194. Map result2 = cpClient.getCpBoList(schemaCode, UtilMap.map("queryFilterType, propertyCode, propertyValue", "Eq", "ShortText1760153678207", UtilMap.getString(map, "ShortText1760153678207")), 0, 1, null);
  195. Map bizObjectPage = UtilMap.getMap(UtilMap.getMap(result2, "data"),"bizObjectPage");
  196. int totalElements = UtilMap.getInt(bizObjectPage, "totalElements");
  197. List<Map> items = (List<Map>) map.get("Sheet1760153734916");
  198. if (totalElements > 0) {
  199. //云枢更新销售出库单
  200. Map content = ((List<Map>) UtilMap.getList(bizObjectPage, "content")).get(0);
  201. Map map1 = UtilMap.getMap(content, "data");
  202. List<Map> list1 = UtilMap.getList(map1, "Sheet1760153734916");
  203. for (int i = 0; i < items.size(); i++) {
  204. items.get(i).put("rowStatus", "Modified");
  205. items.get(i).put("id", (UtilMap.getString(list1.get(i),"id")));//子表实例id
  206. }
  207. items.forEach(item -> item.put("rowStatus", "Modified"));
  208. String bizObjectId = UtilMap.getString(content,"bizObjectId");//主表实例id
  209. map.put("id",bizObjectId);
  210. Map result3 = cpClient.updateCpBo(schemaCode, map,null);
  211. }else {
  212. //云枢新增销售出库单
  213. items.forEach(item -> item.put("rowStatus", "added"));
  214. Map result3 = cpClient.createCpBo(schemaCode, map,null);
  215. }
  216. }
  217. }
  218. @Override
  219. public void syncReceipt() {
  220. log.info("开始同步收款单数据");
  221. K3CloudApi client = new K3CloudApi(initIden());
  222. List<Map> result = new ArrayList<>();
  223. List<Map> receiptList = new ArrayList<>();
  224. int startRow = 0;
  225. int limit = 2000;
  226. BillQuery billQuery = new BillQuery();
  227. billQuery.setFormId("AR_RECEIVEBILL");
  228. billQuery.setFieldKeys("FBillNo,FBillTypeID.FName,FPAYUNITTYPE,FDate,FPAYUNIT.FName,FCURRENCYID.FName,FRECEIVEAMOUNTFOR_H,FREALRECAMOUNTFOR,F_VMKV_Combo,FSALEERID.FName,F_VMKV_Base_83g.FName,FSETTLETYPEID,FSETTLETYPEID.FName,FPURPOSEID.FName,FACCOUNTID.FNumber,FACCOUNTID.FName,FRECTOTALAMOUNTFOR,FREALRECAMOUNTFOR_D,FCOMMENT");
  229. List<Map> filterString = new ArrayList<>();
  230. //审核日期为昨天至今天
  231. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","265",1,"","","0"));//审核日期在今天之前N天以后
  232. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","420","2025-10-20 00:00:00","","","0"));//审核日期年=XX
  233. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FNumber","67","35","","","0"));//物料编码等于XX
  234. billQuery.setFilterString(filterString);
  235. billQuery.setLimit(limit);
  236. do {
  237. billQuery.setStartRow(startRow);
  238. String s = null;
  239. try {
  240. s = client.billQuery(JSONObject.toJSONString(billQuery));
  241. } catch (Exception e) {
  242. throw new RuntimeException(e);
  243. }
  244. result = (List<Map>)JSONObject.parse(s);
  245. receiptList.addAll(result);
  246. startRow += limit;
  247. }while (result.size() == limit);
  248. List<Map<String,Object>> dataList = new ArrayList<>();
  249. for (Map receipt : receiptList) {
  250. Map data = new HashMap();
  251. data.put("ShortText1760585125989",UtilMap.getString(receipt,"FBillNo"));//单据编号
  252. data.put("ShortText1760585107833",UtilMap.getString(receipt,"FBillTypeID.FName"));//单据类型
  253. data.put("Date1760585187315",UtilMap.getString(receipt, "FDate").replace("T"," "));//业务日期
  254. data.put("Text1760585197637",UtilMap.getString(receipt,"FSALEERID.FName"));//销售员
  255. data.put("ShortText1760585145727",UtilMap.getString(receipt,"F_VMKV_Base_83g.FName"));//跟单员
  256. data.put("ShortText1760585132200",UtilMap.getString(receipt,"FPAYUNIT.FName"));//付款单位
  257. String FPAYUNITTYPE = UtilMap.getString(receipt, "FPAYUNITTYPE");
  258. String FPAYUNITTYPE_VALUE = "";
  259. switch (FPAYUNITTYPE){
  260. case "BD_Supplier" : FPAYUNITTYPE_VALUE = "供应商";break;
  261. case "BD_Customer" : FPAYUNITTYPE_VALUE = "客户";break;
  262. case "BD_Department" : FPAYUNITTYPE_VALUE = "部门";break;
  263. case "BD_Empinfo" : FPAYUNITTYPE_VALUE = "员工";break;
  264. case "FIN_OTHERS" : FPAYUNITTYPE_VALUE = "其他往来单位";break;
  265. case "ORG_Organizations" : FPAYUNITTYPE_VALUE = "组织机构";break;
  266. case "BD_BANK" : FPAYUNITTYPE_VALUE = "银行";break;
  267. default:break;
  268. }
  269. data.put("ShortText1760585114989", FPAYUNITTYPE_VALUE);//付款单位类型
  270. data.put("ShortText1760585150625",UtilMap.getString(receipt,"FCURRENCYID.FName"));//币别
  271. String F_VMKV_Combo = UtilMap.getString(receipt, "F_VMKV_Combo");
  272. String F_VMKV_Combo_VALUE = "";
  273. switch (F_VMKV_Combo){
  274. case "ART" : F_VMKV_Combo_VALUE = "佳丰";break;
  275. case "JLCC" : F_VMKV_Combo_VALUE = "金轮";break;
  276. case "NOT" : F_VMKV_Combo_VALUE = "暂不确定";break;
  277. default:break;
  278. }
  279. data.put("ShortText1760585157387", F_VMKV_Combo_VALUE);//佳丰/金轮
  280. data.put("Number1760585167781",UtilMap.getDouble(receipt,"FRECEIVEAMOUNTFOR_H"));//应收金额
  281. data.put("Number1760585178357",UtilMap.getDouble(receipt,"FREALRECAMOUNTFOR"));//实收金额
  282. List<Map> entry = new ArrayList<>();
  283. Map entryMap = new HashMap();
  284. entryMap.put("ShortText1760585209233",UtilMap.getString(receipt,"FSETTLETYPEID.FName"));//结算方式
  285. entryMap.put("ShortText1760585224298",UtilMap.getString(receipt,"FPURPOSEID.FName"));//收款用途
  286. entryMap.put("ShortText1760585384491",UtilMap.getString(receipt,"FACCOUNTID.FNumber"));//我方银行账户
  287. entryMap.put("Text1760585393271",UtilMap.getString(receipt,"FACCOUNTID.FName"));//我方账户名称
  288. entryMap.put("Number1760585235219",UtilMap.getDouble(receipt,"FRECTOTALAMOUNTFOR"));//应收金额
  289. entryMap.put("Number1760585242849",UtilMap.getDouble(receipt,"FREALRECAMOUNTFOR_D"));//实收金额
  290. entryMap.put("ShortText1760585258640",UtilMap.getString(receipt,"FCOMMENT"));//备注
  291. entry.add(entryMap);
  292. data.put("Sheet1760585205663",entry);
  293. dataList.add(data);
  294. }
  295. //处理同一收款单多个明细
  296. List<Map<String, Object>> list = mergeListMap(dataList, "ShortText1760585125989", "Sheet1760585205663");
  297. for (Map<String, Object> map : list) {
  298. String schemaCode = "SKD";
  299. //查询是否存在
  300. Map result2 = cpClient.getCpBoList(schemaCode, UtilMap.map("queryFilterType, propertyCode, propertyValue", "Eq", "ShortText1760585125989", UtilMap.getString(map, "ShortText1760585125989")), 0, 1, null);
  301. Map bizObjectPage = UtilMap.getMap(UtilMap.getMap(result2, "data"),"bizObjectPage");
  302. int totalElements = UtilMap.getInt(bizObjectPage, "totalElements");
  303. List<Map> items = (List<Map>) map.get("Sheet1760585205663");
  304. if (totalElements > 0) {
  305. //云枢更新收款单
  306. Map content = ((List<Map>) UtilMap.getList(bizObjectPage, "content")).get(0);
  307. Map map1 = UtilMap.getMap(content, "data");
  308. List<Map> list1 = UtilMap.getList(map1, "Sheet1760585205663");
  309. for (int i = 0; i < items.size(); i++) {
  310. items.get(i).put("rowStatus", "Modified");
  311. items.get(i).put("id", (UtilMap.getString(list1.get(i),"id")));//子表实例id
  312. }
  313. items.forEach(item -> item.put("rowStatus", "Modified"));
  314. String bizObjectId = UtilMap.getString(content,"bizObjectId");//主表实例id
  315. map.put("id",bizObjectId);
  316. Map result3 = cpClient.updateCpBo(schemaCode, map,null);
  317. }else {
  318. //云枢新增收款单
  319. items.forEach(item -> item.put("rowStatus", "added"));
  320. Map result3 = cpClient.createCpBo(schemaCode, map,null);
  321. }
  322. }
  323. }
  324. @Override
  325. public void syncReceivable() {
  326. log.info("开始同步应收单数据");
  327. K3CloudApi client = new K3CloudApi(initIden());
  328. List<Map> result = new ArrayList<>();
  329. List<Map> receiptList = new ArrayList<>();
  330. int startRow = 0;
  331. int limit = 2000;
  332. BillQuery billQuery = new BillQuery();
  333. billQuery.setFormId("AR_receivable");
  334. billQuery.setFieldKeys("FBillTypeID.FName,FBillNo,FCUSTOMERID.FName,FSALEERID.FName,F_VMKV_Base_qtr.FName,FSetAccountType,FCURRENCYID.FName,FDate,FENDDATE_H,FPayConditon.FName,FALLAMOUNTFOR,FEntityDetail_FEntryID,FMATERIALID.FNumber,FMATERIALID.FName,FMATERIALID.F_Sl_xingnengid,FPRICEUNITID.FName,FPriceQty,FStockUnitId.FName,FStockQty,FSalUnitId.FName,FSalQty,FTaxPrice,FPrice,FEntryTaxRate,FNoTaxAmountFor_D,FTAXAMOUNTFOR_D,FALLAMOUNTFOR_D,FIsFree,FLot.FName,FRECEIVEAMOUNT,FComment");
  335. List<Map> filterString = new ArrayList<>();
  336. //审核日期为昨天至今天
  337. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","265",1,"","","0"));//审核日期在今天之前N天以后
  338. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","39","2025-10-14 00:00:00","","","0"));//审核日期大于等于XX
  339. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","16","2025-10-16 00:00:00","","","0"));//审核日期小于等于XX
  340. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FAPPROVEDATE","420","2025-10-21 00:00:00","","","0"));//审核日期年=XX
  341. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FDATE","420","2025-10-21 00:00:00","","","0"));//业务日期年=XX
  342. billQuery.setFilterString(filterString);
  343. billQuery.setLimit(limit);
  344. do {
  345. billQuery.setStartRow(startRow);
  346. String s = null;
  347. try {
  348. s = client.billQuery(JSONObject.toJSONString(billQuery));
  349. } catch (Exception e) {
  350. throw new RuntimeException(e);
  351. }
  352. result = (List<Map>)JSONObject.parse(s);
  353. receiptList.addAll(result);
  354. startRow += limit;
  355. }while (result.size() == limit);
  356. List<Map<String,Object>> dataList = new ArrayList<>();
  357. for (Map receipt : receiptList) {
  358. Map data = new HashMap();
  359. data.put("ShortText1760602123650",UtilMap.getString(receipt,"FBillNo"));//发票号码
  360. data.put("ShortText1760602106521",UtilMap.getString(receipt,"FBillTypeID.FName"));//单据类型
  361. data.put("Date1760602205733",UtilMap.getString(receipt, "FDate").replace("T"," "));//业务日期
  362. data.put("ShortText1760602136864",UtilMap.getString(receipt,"FSALEERID.FName"));//销售员
  363. data.put("Text1760602141164",UtilMap.getString(receipt,"F_VMKV_Base_qtr.FName"));//跟单员
  364. data.put("ShortText1760602119316",UtilMap.getString(receipt,"FCUSTOMERID.FName"));//客户
  365. String FSetAccountType = UtilMap.getString(receipt, "FSetAccountType");
  366. String FSetAccountType_VALUE = "";
  367. switch (FSetAccountType){
  368. case "1" : FSetAccountType_VALUE = "业务应收";break;
  369. case "3" : FSetAccountType_VALUE = "财务应收";break;
  370. case "2" : FSetAccountType_VALUE = "暂估应收";break;
  371. default:break;
  372. }
  373. data.put("ShortText1760602147441", FSetAccountType_VALUE);//立账类型
  374. data.put("ShortText1760602218380",UtilMap.getString(receipt,"FPayConditon.FName"));//收款条件
  375. data.put("ShortText1760602197718",UtilMap.getString(receipt,"FCURRENCYID.FName"));//币别
  376. data.put("Number1760602528131",UtilMap.getDouble(receipt,"FALLAMOUNTFOR"));//价税合计
  377. data.put("Date1760602209998",UtilMap.getString(receipt,"FENDDATE_H").replace("T"," "));//到期日
  378. List<Map> entry = new ArrayList<>();
  379. Map entryMap = new HashMap();
  380. entryMap.put("ShortText1760605881791",UtilMap.getString(receipt,"FEntityDetail_FEntryID"));//分录ID
  381. entryMap.put("ShortText1760602287318",UtilMap.getString(receipt,"FMATERIALID.FNumber"));//物料编码
  382. entryMap.put("Text1760602292846",UtilMap.getString(receipt,"FMATERIALID.FName"));//物料名称
  383. entryMap.put("Text1760602314150",UtilMap.getString(receipt,"FMATERIALID.F_Sl_xingnengid"));//性能
  384. String jjdw = UtilMap.getString(receipt, "FPRICEUNITID.FName");
  385. entryMap.put("Text1760602299878", jjdw);//计价单位
  386. Double jjsl = UtilMap.getDouble(receipt, "FPriceQty");
  387. entryMap.put("Number1760602320518", jjsl);//计价数量
  388. String kcdw = UtilMap.getString(receipt, "FStockUnitId.FName");
  389. entryMap.put("Text1762914941284", kcdw);//库存单位
  390. Double kcsl = UtilMap.getDouble(receipt, "FStockQty");
  391. entryMap.put("Number1762914960910", kcsl);//库存数量
  392. String xsdw = UtilMap.getString(receipt, "FSalUnitId.FName");
  393. entryMap.put("Text1762914943634", xsdw);//销售单位
  394. Double xssl = UtilMap.getDouble(receipt, "FSalQty");
  395. entryMap.put("Number1762914972786", xssl);//销售数量
  396. entryMap.put("Number1760602330651",UtilMap.getDouble(receipt,"FTaxPrice"));//含税单价
  397. entryMap.put("Number1760602338551",UtilMap.getDouble(receipt,"FPrice"));//单价
  398. entryMap.put("Number1760602343876",UtilMap.getDouble(receipt,"FEntryTaxRate"));//税率
  399. entryMap.put("Number1760602347414",UtilMap.getDouble(receipt,"FNoTaxAmountFor_D"));//不含税金额
  400. entryMap.put("Number1760602354115",UtilMap.getDouble(receipt,"FTAXAMOUNTFOR_D"));//税额
  401. entryMap.put("Number1760602359012",UtilMap.getDouble(receipt,"FALLAMOUNTFOR_D"));//价税合计
  402. entryMap.put("Logic1760602369561",UtilMap.getString(receipt,"FIsFree"));//是否赠品
  403. entryMap.put("ShortText1760602387059",UtilMap.getString(receipt,"FLot.FName"));//批号
  404. entryMap.put("Number1760602396337",UtilMap.getDouble(receipt,"FRECEIVEAMOUNT"));//已结算金额
  405. entryMap.put("Text1760602391849",UtilMap.getString(receipt,"FComment"));//备注
  406. double sl = 0.0;
  407. double zl = 0.0;
  408. if ("Pcs".equals(jjdw)) {
  409. sl = jjsl;
  410. if ("Kg".equals(xsdw)) {
  411. zl = kcsl;
  412. }
  413. }else {
  414. zl = jjsl;
  415. if ("Pcs".equals(kcdw)) {
  416. sl = kcsl;
  417. }
  418. }
  419. entryMap.put("Number1762915279108", sl);//数量
  420. entryMap.put("Number1762915289424", zl);//重量
  421. entry.add(entryMap);
  422. data.put("Sheet1760602277185",entry);
  423. dataList.add(data);
  424. }
  425. //处理同一收款单多个明细
  426. List<Map<String, Object>> list = mergeListMap(dataList, "ShortText1760602123650", "Sheet1760602277185");
  427. for (Map<String, Object> map : list) {
  428. String schemaCode = "YSD";
  429. //查询是否存在
  430. Map result2 = cpClient.getCpBoList(schemaCode, UtilMap.map("queryFilterType, propertyCode, propertyValue", "Eq", "ShortText1760602123650", UtilMap.getString(map, "ShortText1760602123650")), 0, 1, null);
  431. Map bizObjectPage = UtilMap.getMap(UtilMap.getMap(result2, "data"),"bizObjectPage");
  432. int totalElements = UtilMap.getInt(bizObjectPage, "totalElements");
  433. List<Map> items = (List<Map>) map.get("Sheet1760602277185");
  434. if (totalElements > 0) {
  435. //云枢更新应收单
  436. Map content = ((List<Map>) UtilMap.getList(bizObjectPage, "content")).get(0);
  437. Map map1 = UtilMap.getMap(content, "data");
  438. List<Map> list1 = UtilMap.getList(map1, "Sheet1760602277185");
  439. for (int i = 0; i < items.size(); i++) {
  440. items.get(i).put("rowStatus", "Modified");
  441. items.get(i).put("id", (UtilMap.getString(list1.get(i),"id")));//子表实例id
  442. }
  443. items.forEach(item -> item.put("rowStatus", "Modified"));
  444. String bizObjectId = UtilMap.getString(content,"bizObjectId");//主表实例id
  445. map.put("id",bizObjectId);
  446. Map result3 = cpClient.updateCpBo(schemaCode, map,null);
  447. }else {
  448. //云枢新增应收单
  449. items.forEach(item -> item.put("rowStatus", "added"));
  450. Map result3 = cpClient.createCpBo(schemaCode, map,null);
  451. }
  452. }
  453. }
  454. @Override
  455. public void syncSaleReturn() {
  456. log.info("开始同步销售退货单数据");
  457. K3CloudApi client = new K3CloudApi(initIden());
  458. List<Map> result = new ArrayList<>();
  459. List<Map> saleReturnList = new ArrayList<>();
  460. int startRow = 0;
  461. int limit = 2000;
  462. BillQuery billQuery = new BillQuery();
  463. billQuery.setFormId("SAL_RETURNSTOCK");
  464. billQuery.setFieldKeys("FBillTypeID.FName,FBillNo,FDate,FRetcustId.FName,FSettleCurrId.FName,FHeadNote,FEntity_FEntryID,FMaterialId.FNumber,FMaterialId.FName,FMaterialId.FSpecification,FMaterialId.F_Sl_xingnengid,FMustqty,FRealQty,FPriceUnitId.FName,FPriceUnitQty,FPrice,FTaxPrice,FIsFree,FEntryTaxRate,FAmount,FEntryTaxAmount,FAllAmount,FReturnType.FDataValue,FStockId.FName,FDeliveryDate,FNote,FLot.FName");
  465. List<Map> filterString = new ArrayList<>();
  466. //审核日期为昨天至今天
  467. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","265",1,"","","0"));//审核日期在今天之前N天以后
  468. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FAPPROVEDATE","420","2025-10-21 00:00:00","","","0"));//审核日期年=XX
  469. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FDATE","420","2025-10-21 00:00:00","","","0"));//业务日期年=XX
  470. billQuery.setFilterString(filterString);
  471. billQuery.setLimit(limit);
  472. do {
  473. billQuery.setStartRow(startRow);
  474. String s = null;
  475. try {
  476. s = client.billQuery(JSONObject.toJSONString(billQuery));
  477. } catch (Exception e) {
  478. throw new RuntimeException(e);
  479. }
  480. result = (List<Map>)JSONObject.parse(s);
  481. saleReturnList.addAll(result);
  482. startRow += limit;
  483. }while (result.size() == limit);
  484. List<Map<String,Object>> dataList = new ArrayList<>();
  485. for (Map receipt : saleReturnList) {
  486. Map data = new HashMap();
  487. data.put("ShortText1761032880442",UtilMap.getString(receipt,"FBillNo"));//单据编号
  488. data.put("ShortText1761032890399",UtilMap.getString(receipt,"FBillTypeID.FName"));//单据类型
  489. data.put("Date1761032895713",UtilMap.getString(receipt, "FDate").replace("T"," "));//日期
  490. data.put("ShortText1761032899575",UtilMap.getString(receipt,"FRetcustId.FName"));//退货客户
  491. data.put("ShortText1761032904895",UtilMap.getString(receipt,"FSettleCurrId.FName"));//结算币别
  492. data.put("ShortText1761032937812",UtilMap.getString(receipt,"FHeadNote"));//退货备注
  493. List<Map> entry = new ArrayList<>();
  494. Map entryMap = new HashMap();
  495. entryMap.put("ShortText1761033279692",UtilMap.getString(receipt,"FEntity_FEntryID"));//分录ID
  496. entryMap.put("ShortText1761032968041",UtilMap.getString(receipt,"FMaterialId.FNumber"));//物料编码
  497. entryMap.put("Text1761032973000",UtilMap.getString(receipt,"FMaterialId.FName"));//物料名称
  498. entryMap.put("ShortText1761033477673",UtilMap.getString(receipt,"FMaterialId.F_Sl_xingnengid"));//性能
  499. entryMap.put("ShortText1761032979494",UtilMap.getString(receipt,"FMaterialId.FSpecification"));//规格型号
  500. entryMap.put("Number1761032987168",UtilMap.getDouble(receipt,"FMustqty"));//应退数量
  501. entryMap.put("Number1761032997394",UtilMap.getDouble(receipt,"FRealQty"));//实退数量
  502. entryMap.put("ShortText1761033008702",UtilMap.getString(receipt,"FPriceUnitId.FName"));//计价单位
  503. entryMap.put("Number1761033960104",UtilMap.getDouble(receipt,"FPriceUnitQty"));//计价数量
  504. entryMap.put("Number1761033026518",UtilMap.getDouble(receipt,"FTaxPrice"));//含税单价
  505. entryMap.put("Number1761033015285",UtilMap.getDouble(receipt,"FPrice"));//单价
  506. entryMap.put("Number1761033046672",UtilMap.getDouble(receipt,"FEntryTaxRate"));//税率
  507. entryMap.put("Number1761033064064",UtilMap.getDouble(receipt,"FAmount"));//金额
  508. entryMap.put("Number1761033076151",UtilMap.getDouble(receipt,"FEntryTaxAmount"));//税额
  509. entryMap.put("Number1761033079296",UtilMap.getDouble(receipt,"FAllAmount"));//价税合计
  510. entryMap.put("Logic1761033036005",UtilMap.getBoolean(receipt,"FIsFree"));//是否赠品
  511. entryMap.put("ShortText1761033090318",UtilMap.getString(receipt,"FReturnType.FDataValue"));//退货类型
  512. entryMap.put("ShortText1761033099990",UtilMap.getString(receipt,"FStockId.FName"));//仓库
  513. entryMap.put("Date1761033104411",UtilMap.getString(receipt,"FDeliveryDate").replace("T"," "));//退货日期
  514. entryMap.put("Text1761033119394",UtilMap.getString(receipt,"FLot.FName"));//批号
  515. entryMap.put("ShortText1761033111040",UtilMap.getString(receipt,"FNote"));//备注
  516. entry.add(entryMap);
  517. data.put("Sheet1761032958852",entry);
  518. dataList.add(data);
  519. }
  520. //处理同一收款单多个明细
  521. List<Map<String, Object>> list = mergeListMap(dataList, "ShortText1761032880442", "Sheet1761032958852");
  522. for (Map<String, Object> map : list) {
  523. String schemaCode = "XSTHD";
  524. //查询是否存在
  525. Map result2 = cpClient.getCpBoList(schemaCode, UtilMap.map("queryFilterType, propertyCode, propertyValue", "Eq", "ShortText1761032880442", UtilMap.getString(map, "ShortText1761032880442")), 0, 1, null);
  526. Map bizObjectPage = UtilMap.getMap(UtilMap.getMap(result2, "data"),"bizObjectPage");
  527. int totalElements = UtilMap.getInt(bizObjectPage, "totalElements");
  528. List<Map> items = (List<Map>) map.get("Sheet1761032958852");
  529. if (totalElements > 0) {
  530. //云枢更新销售出库单
  531. Map content = ((List<Map>) UtilMap.getList(bizObjectPage, "content")).get(0);
  532. Map map1 = UtilMap.getMap(content, "data");
  533. List<Map> list1 = UtilMap.getList(map1, "Sheet1761032958852");
  534. for (int i = 0; i < items.size(); i++) {
  535. items.get(i).put("rowStatus", "Modified");
  536. items.get(i).put("id", (UtilMap.getString(list1.get(i),"id")));//子表实例id
  537. }
  538. items.forEach(item -> item.put("rowStatus", "Modified"));
  539. String bizObjectId = UtilMap.getString(content,"bizObjectId");//主表实例id
  540. map.put("id",bizObjectId);
  541. Map result3 = cpClient.updateCpBo(schemaCode, map,null);
  542. }else {
  543. //云枢新增销售出库单
  544. items.forEach(item -> item.put("rowStatus", "added"));
  545. Map result3 = cpClient.createCpBo(schemaCode, map,null);
  546. }
  547. }
  548. }
  549. private IdentifyInfo initIden(){
  550. //注意 1:此处不再使用参数形式传入用户名及密码等敏感信息,改为在登录配置文件中设置。
  551. //注意 2:必须先配置第三方系统登录授权信息后,再进行业务操作,详情参考各语言版本SDK介绍中的登录配置文件说明。
  552. //读取配置,初始化SDK
  553. IdentifyInfo iden = new IdentifyInfo();
  554. iden.setUserName(kdWebApiConf.getXKDApiUserName());
  555. iden.setAppId(kdWebApiConf.getXKDApiAppID());
  556. iden.setdCID(kdWebApiConf.getXKDApiAcctID());
  557. iden.setAppSecret(kdWebApiConf.getXKDApiAppSec());
  558. iden.setServerUrl(kdWebApiConf.getXKDApiServerUrl());
  559. return iden;
  560. }
  561. public static List<Map<String, Object>> mergeListMap(List<Map<String, Object>> originalList,String key,String list) {
  562. // 使用 Map 来临时存储合并后的结果,key 为 code,value 为合并后的 Map
  563. Map<String, Map<String, Object>> mergedMap = new HashMap<>();
  564. for (Map<String, Object> item : originalList) {
  565. String code = (String) item.get(key);
  566. @SuppressWarnings("unchecked")
  567. List<Map<String, Object>> details = (List<Map<String, Object>>) item.get(list);
  568. if (mergedMap.containsKey(code)) {
  569. // 如果已存在该 code,只合并 details
  570. Map<String, Object> existingItem = mergedMap.get(code);
  571. @SuppressWarnings("unchecked")
  572. List<Map<String, Object>> existingDetails = (List<Map<String, Object>>) existingItem.get(list);
  573. existingDetails.addAll(details);
  574. } else {
  575. // 如果不存在该 key,保存整个 Map(包括其他 key)
  576. // 但需要深拷贝 list,避免后续修改影响原始数据
  577. Map<String, Object> newItem = new HashMap<>();
  578. for (Map.Entry<String, Object> entry : item.entrySet()) {
  579. if ("details".equals(entry.getKey())) {
  580. // 深拷贝 details 列表
  581. @SuppressWarnings("unchecked")
  582. List<Map<String, Object>> originalDetails = (List<Map<String, Object>>) entry.getValue();
  583. newItem.put(entry.getKey(), new ArrayList<>(originalDetails));
  584. } else {
  585. newItem.put(entry.getKey(), entry.getValue());
  586. }
  587. }
  588. mergedMap.put(code, newItem);
  589. }
  590. }
  591. // 转换回 List
  592. return new ArrayList<>(mergedMap.values());
  593. }
  594. }