KdHuaGaoServiceImpl.java 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905
  1. package com.malk.huagao.service.impl;
  2. import cn.hutool.core.date.DateUtil;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.google.gson.Gson;
  5. import com.kingdee.bos.webapi.entity.IdentifyInfo;
  6. import com.kingdee.bos.webapi.entity.RepoRet;
  7. import com.kingdee.bos.webapi.sdk.K3CloudApi;
  8. import com.malk.huagao.KdEntity.BillQuery;
  9. import com.malk.huagao.KdEntity.View;
  10. import com.malk.huagao.config.KDWebApiConf;
  11. import com.malk.huagao.service.KdHuaGaoService;
  12. import com.malk.server.aliwork.YDConf;
  13. import com.malk.server.aliwork.YDParam;
  14. import com.malk.server.aliwork.YDSearch;
  15. import com.malk.server.common.McR;
  16. import com.malk.server.dingtalk.DDConf;
  17. import com.malk.server.dingtalk.DDR_New;
  18. import com.malk.service.aliwork.YDClient;
  19. import com.malk.service.dingtalk.DDClient;
  20. import com.malk.utils.UtilHttp;
  21. import com.malk.utils.UtilMap;
  22. import lombok.extern.slf4j.Slf4j;
  23. import org.apache.logging.log4j.util.Strings;
  24. import org.slf4j.MDC;
  25. import org.springframework.beans.factory.annotation.Autowired;
  26. import org.springframework.scheduling.annotation.Async;
  27. import org.springframework.stereotype.Service;
  28. import java.time.LocalDate;
  29. import java.time.LocalDateTime;
  30. import java.time.ZoneId;
  31. import java.time.ZonedDateTime;
  32. import java.time.temporal.TemporalAdjusters;
  33. import java.time.temporal.WeekFields;
  34. import java.util.*;
  35. import java.util.stream.Collectors;
  36. import static org.junit.Assert.fail;
  37. @Slf4j
  38. @Service
  39. public class KdHuaGaoServiceImpl implements KdHuaGaoService {
  40. @Autowired
  41. private KDWebApiConf kdWebApiConf;
  42. @Autowired
  43. private YDClient ydClient;
  44. @Autowired
  45. private DDClient ddClient;
  46. @Autowired
  47. private DDConf ddConf;
  48. //在库状态
  49. private static final Map<String,String> STOCK_STATUS = new HashMap<>();
  50. static{
  51. STOCK_STATUS.put("0","待入库");
  52. STOCK_STATUS.put("1","在库");
  53. STOCK_STATUS.put("2","待出库");
  54. STOCK_STATUS.put("3","出库");
  55. STOCK_STATUS.put("4","待售出");
  56. STOCK_STATUS.put("5","售出");
  57. STOCK_STATUS.put("6","待退料");
  58. STOCK_STATUS.put("7","退料");
  59. }
  60. @Override
  61. public void syncBDSerialMainFile() {
  62. MDC.put("MDC_KEY_PID","1002");
  63. // 获取当前日期
  64. LocalDate today = LocalDate.now();
  65. int year = today.getYear();//获取当前年份
  66. int month = today.getMonthValue();//当前月份
  67. WeekFields weekFields = WeekFields.of(Locale.getDefault());
  68. int weekOfMonth = today.get(weekFields.weekOfMonth());//当前日期是当月的第几周
  69. try {
  70. //删除宜搭当周序列号主档数据
  71. log.info("开始删除序列号主档数据:{}年,{}月,{}周",year,month,weekOfMonth);
  72. List<List<String>> formInstanceIdListList = new ArrayList<>();//实例id集合,每100条
  73. DDR_New ddrNew = new DDR_New();
  74. int pageSize = 100;
  75. int pageNumber = 0;
  76. do {
  77. pageNumber++;
  78. ddrNew = ydClient.queryData(YDParam.builder()
  79. .formUuid("FORM-3B2E5C93D7E6494B9AD920B48A90159F7DZ4")
  80. .searchFieldJson(JSONObject.toJSONString(UtilMap.map("numberField_mev270x6, numberField_mev270x5, textField_mev2ers5", Arrays.asList(year,year), Arrays.asList(month,month), weekOfMonth)))
  81. .pageNumber(pageNumber)
  82. .pageSize(pageSize)
  83. .build(), YDConf.FORM_QUERY.retrieve_search_form_id);
  84. formInstanceIdListList.addAll(Collections.singleton((List<String>) ddrNew.getData()));
  85. }while (ddrNew.getPageNumber() * pageSize < ddrNew.getTotalCount());
  86. for (List<String> formInstanceIdList : formInstanceIdListList) {
  87. if (!formInstanceIdList.isEmpty()){
  88. ydClient.operateData(YDParam.builder()
  89. .formUuid("FORM-3B2E5C93D7E6494B9AD920B48A90159F7DZ4")
  90. .formInstanceIdList(formInstanceIdList)
  91. .build(), YDConf.FORM_OPERATION.delete_batch);
  92. }
  93. }
  94. log.info("删除序列号主档数据完成:{}年,{}月,{}周",year,month,weekOfMonth);
  95. K3CloudApi client = new K3CloudApi(initIden());
  96. int startRow = 0;
  97. int limit = 2000;
  98. BillQuery billQuery = new BillQuery();
  99. billQuery.setLimit(limit);
  100. billQuery.setFormId("BD_SerialMainFile");
  101. billQuery.setFieldKeys("FNumber,FMaterialID.FNumber,FMaterialID.FName,FMaterialID.FSpecification,FMaterialID.F_QUXZ_Assistant,FZKTS,FStockStatus,FStockId.FName,FStockLocID.FF100001.FName,FCustId.FName");
  102. List<Map> filterString = new ArrayList<>();
  103. //仓库等于成品仓 仓位等于默认仓位或样机仓位 在库状态等于待入库或在库
  104. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FStockId.FName","67","成品仓","","","0"));//仓库名称等于XX
  105. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FStockLocId.FF100001.FName","67","默认仓位","(","","1"));//仓位等于XX
  106. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FStockLocId.FF100001.FName","67","样机仓位","",")","0"));//仓位等于XX
  107. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FStockStatus","29","0","(","","1"));//在库状态等于XX
  108. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FStockStatus","29","1","",")","0"));//在库状态等于XX
  109. billQuery.setFilterString(filterString);
  110. List<Map> result = new ArrayList<>();
  111. List<Map> list = new ArrayList<>();
  112. do {
  113. billQuery.setStartRow(startRow);
  114. String s = client.billQuery(JSONObject.toJSONString(billQuery));
  115. result = (List<Map>)JSONObject.parse(s);
  116. list.addAll(result);
  117. startRow += limit;
  118. }while (result.size() == limit);
  119. List<Map> originList = new ArrayList<>();
  120. for (Map map : list) {
  121. Map formData = new HashMap();
  122. formData.put("textField_mev1n46z",UtilMap.getString(map,"FNumber"));//序列号
  123. formData.put("textField_mev1n470",UtilMap.getString(map,"FMaterialID.FNumber"));//物料编码
  124. formData.put("textField_mev1n471",UtilMap.getString(map,"FMaterialID.FName"));//物料名称
  125. formData.put("textField_mev1n472",UtilMap.getString(map,"FMaterialID.FSpecification"));//规格型号
  126. String ssxl = UtilMap.getString(map, "FMaterialID.F_QUXZ_Assistant");
  127. formData.put("textField_mev1n477", ssxl);//所属系列
  128. Double zkts = UtilMap.getDouble(map, "FZKTS");
  129. formData.put("numberField_mev1n478", zkts);//在库天数
  130. String stockStatus = STOCK_STATUS.get(UtilMap.getString(map, "FStockStatus"));
  131. formData.put("textField_mev1n476", stockStatus);//在库状态
  132. formData.put("textField_mev1n473",UtilMap.getString(map,"FStockId.FName"));//仓库
  133. String cw = UtilMap.getString(map, "FStockLocID.FF100001.FName");
  134. formData.put("textField_mev1n474", cw);//仓位
  135. formData.put("textField_mev1n475",UtilMap.getString(map,"FCustId.FName"));//客户
  136. //在库天数分类
  137. int zktsfl = 1;
  138. if ("待入库".equals(stockStatus)){
  139. zktsfl = 1;
  140. }else {
  141. if (zkts <= 30){
  142. zktsfl = 2;
  143. }else if (zkts <= 60){
  144. zktsfl = 3;
  145. }else if (zkts <= 90){
  146. zktsfl = 4;
  147. }else {
  148. zktsfl = 5;
  149. }
  150. }
  151. formData.put("selectField_mf205zr0",zktsfl);
  152. formData.put("numberField_mev270x6",year);
  153. formData.put("numberField_mev270x5",month);
  154. formData.put("textField_mev2ers5",weekOfMonth);
  155. formData.put("numberField_mfat6egj",1);//统计数值,默认1
  156. ydClient.operateData(YDParam.builder()
  157. .formUuid("FORM-3B2E5C93D7E6494B9AD920B48A90159F7DZ4")
  158. .formDataJson(JSONObject.toJSONString(formData))
  159. .build(), YDConf.FORM_OPERATION.create);
  160. Map origin = new HashMap();
  161. origin.put("cw",cw);
  162. origin.put("ssxl",ssxl);
  163. origin.put("zktsfl",zktsfl);
  164. origin.put("value",1);
  165. originList.add(origin);
  166. }
  167. //删除宜搭历史最新库存信息
  168. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  169. .formUuid("FORM-4CB51E04B8344622BE880C9D573F68CANKWU")
  170. .searchFieldJson(JSONObject.toJSONString(UtilMap.map("numberField_mev270x6, numberField_mev270x5",Arrays.asList(year,year), Arrays.asList(month,month))))
  171. .build(), YDConf.FORM_QUERY.retrieve_list).getData();
  172. List<String> formInstanceIdList = new ArrayList<>();
  173. for (Map datum : data) {
  174. formInstanceIdList.add(UtilMap.getString(datum,"formInstanceId"));
  175. }
  176. if (!formInstanceIdList.isEmpty()){
  177. ydClient.operateData(YDParam.builder()
  178. .formUuid("FORM-4CB51E04B8344622BE880C9D573F68CANKWU")
  179. .formInstanceIdList(formInstanceIdList)
  180. .build(), YDConf.FORM_OPERATION.delete_batch);
  181. }
  182. List<Map> data2 = (List<Map>) ydClient.queryData(YDParam.builder()
  183. .formUuid("FORM-5764CC3F6D964FD3A165BD7D4D75999FO8NQ")
  184. .searchFieldJson(JSONObject.toJSONString(UtilMap.map("numberField_mev270x6",Arrays.asList(year,year))))
  185. .build(), YDConf.FORM_QUERY.retrieve_list).getData();
  186. List<String> formInstanceIdList2 = new ArrayList<>();
  187. for (Map datum : data2) {
  188. formInstanceIdList2.add(UtilMap.getString(datum,"formInstanceId"));
  189. }
  190. if (!formInstanceIdList2.isEmpty()){
  191. ydClient.operateData(YDParam.builder()
  192. .formUuid("FORM-5764CC3F6D964FD3A165BD7D4D75999FO8NQ")
  193. .formInstanceIdList(formInstanceIdList2)
  194. .build(), YDConf.FORM_OPERATION.delete_batch);
  195. }
  196. //将最新库存信息写入宜搭
  197. List<Map> grouprList = originList.stream()
  198. .collect(Collectors.groupingBy(
  199. item -> Arrays.asList(
  200. item.get("cw"),
  201. item.get("ssxl"),
  202. item.get("zktsfl")
  203. ),
  204. Collectors.summingInt(item -> UtilMap.getInt(item, "value"))
  205. )).entrySet()
  206. .stream()
  207. .map(entry -> {
  208. // 将分组键(List<Object>)和汇总值转换为 Map
  209. List<Object> key = entry.getKey();
  210. Map<String, Object> groupedItem = new LinkedHashMap<>();
  211. groupedItem.put("textField_mev1n474", key.get(0));
  212. groupedItem.put("textField_mev1n477", key.get(1));
  213. groupedItem.put("selectField_mf205zr0", key.get(2));
  214. groupedItem.put("numberField_mev270x6", year);
  215. groupedItem.put("numberField_mev270x5", month);
  216. groupedItem.put("numberField_mfat6egj", entry.getValue());
  217. return groupedItem;
  218. }).collect(Collectors.toList());
  219. for (Map groupMap : grouprList) {
  220. ydClient.operateData(YDParam.builder()
  221. .formUuid("FORM-4CB51E04B8344622BE880C9D573F68CANKWU")
  222. .formDataJson(JSONObject.toJSONString(groupMap))
  223. .build(), YDConf.FORM_OPERATION.create);
  224. ydClient.operateData(YDParam.builder()
  225. .formUuid("FORM-5764CC3F6D964FD3A165BD7D4D75999FO8NQ")
  226. .formDataJson(JSONObject.toJSONString(groupMap))
  227. .build(), YDConf.FORM_OPERATION.create);
  228. }
  229. }catch (Exception e){
  230. fail(e.getMessage());
  231. }
  232. }
  233. @Override
  234. public void syncSTKInventory() {
  235. MDC.put("MDC_KEY_PID","1002");
  236. // 获取当前日期
  237. LocalDate today = LocalDate.now();
  238. int year = today.getYear();//获取当前年份
  239. int month = today.getMonthValue();//当前月份
  240. WeekFields weekFields = WeekFields.of(Locale.getDefault());
  241. int weekOfMonth = today.get(weekFields.weekOfMonth());//当前日期是当月的第几周
  242. try {
  243. //删除宜搭当周库存信息
  244. log.info("开始删除即时库存数据:{}年,{}月,{}周",year,month,weekOfMonth);
  245. List<List<String>> formInstanceIdListList = new ArrayList<>();//实例id集合,每100条
  246. DDR_New ddrNew = new DDR_New();
  247. int pageSize = 100;
  248. int pageNumber = 0;
  249. do {
  250. pageNumber++;
  251. ddrNew = ydClient.queryData(YDParam.builder()
  252. .formUuid("FORM-06C833A3B1804929987033DD6B0E7B2F73JP")
  253. .searchFieldJson(JSONObject.toJSONString(UtilMap.map("numberField_mev270x6, numberField_mev270x5, textField_mev2ers5", Arrays.asList(year,year), Arrays.asList(month,month), weekOfMonth)))
  254. .pageNumber(pageNumber)
  255. .pageSize(pageSize)
  256. .build(), YDConf.FORM_QUERY.retrieve_search_form_id);
  257. formInstanceIdListList.addAll(Collections.singleton((List<String>) ddrNew.getData()));
  258. }while (ddrNew.getPageNumber() * pageSize < ddrNew.getTotalCount());
  259. for (List<String> formInstanceIdList : formInstanceIdListList) {
  260. if (!formInstanceIdList.isEmpty()){
  261. ydClient.operateData(YDParam.builder()
  262. .formUuid("FORM-06C833A3B1804929987033DD6B0E7B2F73JP")
  263. .formInstanceIdList(formInstanceIdList)
  264. .build(), YDConf.FORM_OPERATION.delete_batch);
  265. }
  266. }
  267. log.info("删除即时库存数据完成:{}年,{}月,{}周",year,month,weekOfMonth);
  268. log.info("开始同步即时库存数据:{}年,{}月,{}周",year,month,weekOfMonth);
  269. K3CloudApi client = new K3CloudApi(initIden());
  270. int startRow = 0;
  271. int limit = 2000;
  272. BillQuery billQuery = new BillQuery();
  273. billQuery.setLimit(limit);
  274. billQuery.setFormId("STK_Inventory");
  275. billQuery.setFieldKeys("FMaterialID.FNumber,FMaterialID.FName,FMaterialID.FSpecification,FMaterialID.F_QUXZ_Assistant,FMaterialID.FSTOREURNOM,FMaterialID.FSTOREURNUM,FStockId,FStockId.FName,FLot,FLot.FName,FStockUnitId,FStockUnitId.FName,FBaseQty,FStockStatusId.FName");
  276. List<Map> filterString = new ArrayList<>();
  277. //仓库等于成品仓或组装半成品仓
  278. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FStockName","338","成品仓,组装半成品仓","","","0"));//仓库名称 IN XX
  279. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FBaseQty","21",0,"","","0"));//库存量(主单位) > 0
  280. billQuery.setFilterString(filterString);
  281. List<Map> result = new ArrayList<>();
  282. List<Map> list = new ArrayList<>();
  283. do {
  284. billQuery.setStartRow(startRow);
  285. String s = client.billQuery(JSONObject.toJSONString(billQuery));
  286. result = (List<Map>)JSONObject.parse(s);
  287. list.addAll(result);
  288. startRow += limit;
  289. }while (result.size() == limit);
  290. List<Map> originList = new ArrayList<>();
  291. for (Map map : list) {
  292. Map formData = new HashMap();
  293. String FMaterialNumber = UtilMap.getString(map,"FMaterialID.FNumber");//物料编码
  294. String FMaterialName = UtilMap.getString(map,"FMaterialID.FName");//物料名称
  295. String FMaterialSpecification = UtilMap.getString(map,"FMaterialID.FSpecification");//物料规格
  296. String FQUXZAssistant = Objects.nonNull(map.get("FMaterialID.F_QUXZ_Assistant")) ? UtilMap.getString(map,"FMaterialID.F_QUXZ_Assistant") : "--";//所属系列
  297. String FStockName = UtilMap.getString(map,"FStockId.FName");//仓库名称
  298. String FLotName = UtilMap.getString(map,"FLot.FName");//批号
  299. String FStockUnitName = UtilMap.getString(map,"FStockUnitId.FName");//库存主单位
  300. Double FBaseQty = UtilMap.getDouble(map,"FBaseQty");//库存数量
  301. String FStockStatusName = UtilMap.getString(map,"FStockStatusId.FName");//库存状态
  302. Double FSTOREURNOM = UtilMap.getDouble(map, "FMaterialID.FSTOREURNOM");
  303. Double FSTOREURNUM = UtilMap.getDouble(map, "FMaterialID.FSTOREURNUM");
  304. Double FQty = FBaseQty * FSTOREURNOM / FSTOREURNUM;//库存量(主单位)
  305. formData.put("textField_mfarr0ei",FMaterialNumber);
  306. formData.put("textField_mfarr0en",FMaterialName);
  307. formData.put("textField_mfarr0eo",FMaterialSpecification);
  308. formData.put("textField_mflwgj61", FQUXZAssistant);
  309. formData.put("textField_mfarr0et",FStockName);
  310. formData.put("textField_mfarr0eu",FLotName);
  311. formData.put("textField_mfarr0ev",FStockUnitName);
  312. formData.put("numberField_mfarr0f2",FQty);
  313. formData.put("textField_mfarr0f4",FStockStatusName);
  314. formData.put("numberField_mev270x6",year);
  315. formData.put("numberField_mev270x5",month);
  316. formData.put("textField_mev2ers5",weekOfMonth);
  317. ydClient.operateData(YDParam.builder()
  318. .formUuid("FORM-06C833A3B1804929987033DD6B0E7B2F73JP")
  319. .formDataJson(JSONObject.toJSONString(formData))
  320. .build(), YDConf.FORM_OPERATION.create);
  321. Map origin = new HashMap();
  322. origin.put("ck",FStockName);
  323. origin.put("ssxl",FQUXZAssistant);
  324. origin.put("value",FQty);
  325. originList.add(origin);
  326. }
  327. log.info("同步即时库存数据结束:{}年,{}月,{}周",year,month,weekOfMonth);
  328. //删除宜搭历史最新库存信息
  329. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  330. .formUuid("FORM-35A70C47B4904437B05935AC0B23F981TR4B")
  331. .searchFieldJson(JSONObject.toJSONString(UtilMap.map("numberField_mev270x6, numberField_mev270x5",Arrays.asList(year,year), Arrays.asList(month,month))))
  332. .build(), YDConf.FORM_QUERY.retrieve_list).getData();
  333. List<String> formInstanceIdList = new ArrayList<>();
  334. for (Map datum : data) {
  335. formInstanceIdList.add(UtilMap.getString(datum,"formInstanceId"));
  336. }
  337. if (!formInstanceIdList.isEmpty()){
  338. ydClient.operateData(YDParam.builder()
  339. .formUuid("FORM-35A70C47B4904437B05935AC0B23F981TR4B")
  340. .formInstanceIdList(formInstanceIdList)
  341. .build(), YDConf.FORM_OPERATION.delete_batch);
  342. }
  343. List<Map> data2 = (List<Map>) ydClient.queryData(YDParam.builder()
  344. .formUuid("FORM-842BAB01084747E5B7E0811A16BE6AA56FUH")
  345. .searchFieldJson(JSONObject.toJSONString(UtilMap.map("numberField_mev270x6",Arrays.asList(year,year))))
  346. .build(), YDConf.FORM_QUERY.retrieve_list).getData();
  347. List<String> formInstanceIdList2 = new ArrayList<>();
  348. for (Map datum : data2) {
  349. formInstanceIdList2.add(UtilMap.getString(datum,"formInstanceId"));
  350. }
  351. if (!formInstanceIdList2.isEmpty()){
  352. ydClient.operateData(YDParam.builder()
  353. .formUuid("FORM-842BAB01084747E5B7E0811A16BE6AA56FUH")
  354. .formInstanceIdList(formInstanceIdList2)
  355. .build(), YDConf.FORM_OPERATION.delete_batch);
  356. }
  357. //将最新库存信息写入宜搭
  358. List<Map> grouprList = originList.stream()
  359. .collect(Collectors.groupingBy(
  360. item -> Arrays.asList(
  361. item.get("ck"),
  362. item.get("ssxl")
  363. ),
  364. Collectors.summingDouble(item -> UtilMap.getDouble(item, "value"))
  365. )).entrySet()
  366. .stream()
  367. .map(entry -> {
  368. // 将分组键(List<Object>)和汇总值转换为 Map
  369. List<Object> key = entry.getKey();
  370. Map<String, Object> groupedItem = new LinkedHashMap<>();
  371. groupedItem.put("textField_mfarr0et", key.get(0));
  372. groupedItem.put("textField_mflwgj61", key.get(1));
  373. groupedItem.put("numberField_mev270x6", year);
  374. groupedItem.put("numberField_mev270x5", month);
  375. groupedItem.put("numberField_mfarr0f2", entry.getValue());
  376. return groupedItem;
  377. }).collect(Collectors.toList());
  378. for (Map groupMap : grouprList) {
  379. ydClient.operateData(YDParam.builder()
  380. .formUuid("FORM-35A70C47B4904437B05935AC0B23F981TR4B")
  381. .formDataJson(JSONObject.toJSONString(groupMap))
  382. .build(), YDConf.FORM_OPERATION.create);
  383. ydClient.operateData(YDParam.builder()
  384. .formUuid("FORM-842BAB01084747E5B7E0811A16BE6AA56FUH")
  385. .formDataJson(JSONObject.toJSONString(groupMap))
  386. .build(), YDConf.FORM_OPERATION.create);
  387. }
  388. }catch (Exception e){
  389. fail(e.getMessage());
  390. }
  391. }
  392. //定时同步昨日到今天的
  393. @Override
  394. public void syncPRDReturnMtrl() {
  395. MDC.put("MDC_KEY_PID","1002");
  396. K3CloudApi client = new K3CloudApi(initIden());
  397. int startRow = 0;
  398. int limit = 2000;
  399. BillQuery billQuery = new BillQuery();
  400. billQuery.setLimit(limit);
  401. billQuery.setFormId("PRD_ReturnMtrl");
  402. billQuery.setFieldKeys("FBillNo,FDate,FPPBOMEntryId,FMaterialId.FNumber,FMaterialId.FName,FMaterialId.FSpecification,FMaterialId.FDefaultVendor,FReturnType,FQty");
  403. List<Map> filterString = new ArrayList<>();
  404. //审核日期为昨日到现在且单据状态等于已审核
  405. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","265",1,"","","0"));//审核日期在今天之前XX天之后
  406. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FDocumentStatus","105","C","","","0"));//单据状态等于XX
  407. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","420","2025-01-01","","","0"));//审核日期等于XX年
  408. billQuery.setFilterString(filterString);
  409. List<Map> result = new ArrayList<>();
  410. List<Map> list = new ArrayList<>();
  411. do {
  412. billQuery.setStartRow(startRow);
  413. try {
  414. result = (List<Map>)JSONObject.parse(client.billQuery(JSONObject.toJSONString(billQuery)));
  415. } catch (Exception e) {
  416. fail(e.getMessage());
  417. }
  418. list.addAll(result);
  419. startRow += limit;
  420. }while (result.size() == limit);
  421. for (Map map : list) {
  422. Map formData = new HashMap();
  423. String fBillNo = UtilMap.getString(map, "FBillNo");
  424. formData.put("textField_mfm7o4wb", fBillNo);//单据编号
  425. String fDate = UtilMap.getString(map, "FDate");
  426. // 解析字符串为 LocalDateTime
  427. LocalDateTime localDateTime = LocalDateTime.parse(fDate);
  428. // 将 LocalDateTime 转换为 ZonedDateTime
  429. ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault());
  430. formData.put("dateField_mfm7o4wc", zonedDateTime.toInstant().toEpochMilli());//单据日期
  431. String fppbomEntryId = UtilMap.getString(map, "FPPBOMEntryId");
  432. formData.put("textField_mfmaqppu", fppbomEntryId);//分录明细id
  433. formData.put("textField_mfm7o4we", UtilMap.getString(map,"FMaterialId.FNumber"));//物料编码
  434. formData.put("textField_mfm7o4wf", UtilMap.getString(map,"FMaterialId.FName"));//物料名称
  435. formData.put("textField_mfm7o4wg", UtilMap.getString(map,"FMaterialId.FSpecification"));//物料规格
  436. formData.put("textField_mfq6bwfl", UtilMap.getString(map,"FMaterialId.FDefaultVendor"));//默认供应商
  437. //退料类型
  438. String type = UtilMap.getString(map, "FReturnType");
  439. String typeValue = "";
  440. switch (type){
  441. case "1": typeValue = "良品退料";break;
  442. case "2": typeValue = "来料不良退料";break;
  443. case "3": typeValue = "作业不良退料";break;
  444. default:break;
  445. }
  446. formData.put("textField_mfm7o4wh", typeValue);
  447. formData.put("numberField_mfm7o4wj", UtilMap.getDouble(map,"FQty"));//退料数量
  448. ydClient.operateData(YDParam.builder()
  449. .formUuid("FORM-D21383AF87AC48BEB577485C37F46E8FUAIK")
  450. .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mfm7o4wb, textField_mfmaqppu, textField_mfm7o4wh",fBillNo,fppbomEntryId,typeValue)))
  451. .formDataJson(JSONObject.toJSONString(formData))
  452. .build(), YDConf.FORM_OPERATION.upsert);
  453. }
  454. }
  455. @Async
  456. @Override
  457. public void syncReport(String type,String userId) {
  458. try {
  459. switch (type){
  460. case "成品库存天数看看板": syncBDSerialMainFile();break;
  461. case "成品/组件库存看板": syncSTKInventory();break;
  462. case "不良物料退库统计看板": syncPRDReturnMtrl();break;
  463. case "成品/样机出库看板": syncDLVNotice();break;
  464. default:break;
  465. }
  466. //发送工作通知
  467. if (Objects.nonNull(userId)){
  468. sendDdMsg(ddClient.getAccessToken(),ddConf.getAgentId(),userId,"更新" + type + "完成 时间:" + DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss"));
  469. }
  470. }catch (Exception e){
  471. //发送工作通知
  472. if (Objects.nonNull(userId)){
  473. sendDdMsg(ddClient.getAccessToken(),ddConf.getAgentId(),userId,"更新" + type + "异常:" + e.getMessage() + " 时间:" + DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss"));
  474. }
  475. }
  476. }
  477. @Override
  478. public void syncPendingProducts() {
  479. MDC.put("MDC_KEY_PID","1002");
  480. // 获取当前日期
  481. LocalDate today = LocalDate.now();
  482. int year = today.getYear();//获取当前年份
  483. int month = today.getMonthValue();//当前月份
  484. WeekFields weekFields = WeekFields.of(Locale.getDefault());
  485. int weekOfMonth = today.get(weekFields.weekOfMonth());//当前日期是当月的第几周
  486. /*int year = 2025;//获取当前年份
  487. int month = 9;//当前月份
  488. int weekOfMonth = 4;//当前日期是当月的第几周*/
  489. DDR_New ddrNew = new DDR_New();
  490. int pageSize = 100;
  491. int pageNumber = 0;
  492. List<Map> list = new ArrayList<>();
  493. do {
  494. pageNumber++;
  495. ddrNew = ydClient.queryData(YDParam.builder()
  496. .formUuid("FORM-C4751EF730D74299A0449E40C2601AE5L2BU")
  497. .searchCondition(JSONObject.toJSONString(UtilMap.map("numberField_mev270x6, numberField_mev270x5, textField_mev2ers5", Arrays.asList(year,year), Arrays.asList(month,month), weekOfMonth)))
  498. .pageNumber(pageNumber)
  499. .pageSize(pageSize)
  500. .build(), YDConf.FORM_QUERY.retrieve_list);
  501. List<Map> data = (List<Map>) ddrNew.getData();
  502. for (Map datum : data) {
  503. list.add(UtilMap.getMap(datum,"formData"));
  504. }
  505. }while (ddrNew.getPageNumber() * pageSize < ddrNew.getTotalCount());
  506. //删除宜搭历史最新库存信息
  507. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  508. .formUuid("FORM-BC40899D61134DDFB80E6C693E9EA930Y6NW")
  509. .searchFieldJson(JSONObject.toJSONString(UtilMap.map("numberField_mev270x6, numberField_mev270x5",Arrays.asList(year,year), Arrays.asList(month,month))))
  510. .build(), YDConf.FORM_QUERY.retrieve_list).getData();
  511. List<String> formInstanceIdList = new ArrayList<>();
  512. for (Map datum : data) {
  513. formInstanceIdList.add(UtilMap.getString(datum,"formInstanceId"));
  514. }
  515. if (!formInstanceIdList.isEmpty()){
  516. ydClient.operateData(YDParam.builder()
  517. .formUuid("FORM-BC40899D61134DDFB80E6C693E9EA930Y6NW")
  518. .formInstanceIdList(formInstanceIdList)
  519. .build(), YDConf.FORM_OPERATION.delete_batch);
  520. }
  521. List<Map> data2 = (List<Map>) ydClient.queryData(YDParam.builder()
  522. .formUuid("FORM-28F9CA5CEBFA488A83B1A20721692B6CD3P8")
  523. .searchFieldJson(JSONObject.toJSONString(UtilMap.map("numberField_mev270x6",Arrays.asList(year,year))))
  524. .build(), YDConf.FORM_QUERY.retrieve_list).getData();
  525. List<String> formInstanceIdList2 = new ArrayList<>();
  526. for (Map datum : data2) {
  527. formInstanceIdList2.add(UtilMap.getString(datum,"formInstanceId"));
  528. }
  529. if (!formInstanceIdList2.isEmpty()){
  530. ydClient.operateData(YDParam.builder()
  531. .formUuid("FORM-28F9CA5CEBFA488A83B1A20721692B6CD3P8")
  532. .formInstanceIdList(formInstanceIdList2)
  533. .build(), YDConf.FORM_OPERATION.delete_batch);
  534. }
  535. //将最新库存信息写入宜搭
  536. List<Map> grouprList = list.stream()
  537. .collect(Collectors.groupingBy(
  538. item -> Arrays.asList(
  539. item.get("textField_mfes8fg5")
  540. ),
  541. Collectors.summingDouble(item -> UtilMap.getDouble(item, "numberField_mfes8fg7"))
  542. )).entrySet()
  543. .stream()
  544. .map(entry -> {
  545. // 将分组键(List<Object>)和汇总值转换为 Map
  546. List<Object> key = entry.getKey();
  547. Map<String, Object> groupedItem = new LinkedHashMap<>();
  548. groupedItem.put("textField_mfes8fg5", key.get(0));
  549. groupedItem.put("numberField_mev270x6", year);
  550. groupedItem.put("numberField_mev270x5", month);
  551. groupedItem.put("numberField_mfes8fg7", entry.getValue());
  552. return groupedItem;
  553. }).collect(Collectors.toList());
  554. for (Map groupMap : grouprList) {
  555. ydClient.operateData(YDParam.builder()
  556. .formUuid("FORM-BC40899D61134DDFB80E6C693E9EA930Y6NW")
  557. .formDataJson(JSONObject.toJSONString(groupMap))
  558. .build(), YDConf.FORM_OPERATION.create);
  559. ydClient.operateData(YDParam.builder()
  560. .formUuid("FORM-28F9CA5CEBFA488A83B1A20721692B6CD3P8")
  561. .formDataJson(JSONObject.toJSONString(groupMap))
  562. .build(), YDConf.FORM_OPERATION.create);
  563. }
  564. }
  565. @Override
  566. public void syncDLVNotice() {
  567. MDC.put("MDC_KEY_PID","1002");
  568. K3CloudApi client = new K3CloudApi(initIden());
  569. int startRow = 0;
  570. int limit = 2000;
  571. BillQuery billQuery = new BillQuery();
  572. billQuery.setLimit(limit);
  573. billQuery.setFormId("SAL_DELIVERYNOTICE");
  574. billQuery.setFieldKeys("FBillNo,FDate,FCustomerID.FName,F_QUXZ_Assistant.FNumber,FEntity_FEntryID,FMaterialId.FNumber,FMaterialId.FName,FMaterialId.FSpecification,FMaterialId.F_QUXZ_Assistant,FUnitID.FName,FQty,FIsFree,FHGZBDay.FNumber,FStockID.FName");
  575. List<Map> filterString = new ArrayList<>();
  576. //审核日期为昨日到现在且单据状态等于已审核且明细收件人电话不为空
  577. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","265",1,"","","0"));//审核日期在今天之前XX天之后
  578. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FDocumentStatus","105","C","","","0"));//单据状态等于XX
  579. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FHGReceiveDZ","52","","","","0"));//明细收件人地址不为空
  580. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FHGReceiveDh","52","","","","0"));//明细收件人电话不为空
  581. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","420","2025-01-01","","","0"));//审核日期等于XX年
  582. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","63","","","","0"));//审核日期等于本月
  583. billQuery.setFilterString(filterString);
  584. List<Map> result = new ArrayList<>();
  585. List<Map> list = new ArrayList<>();
  586. do {
  587. billQuery.setStartRow(startRow);
  588. try {
  589. result = (List<Map>)JSONObject.parse(client.billQuery(JSONObject.toJSONString(billQuery)));
  590. } catch (Exception e) {
  591. fail(e.getMessage());
  592. }
  593. list.addAll(result);
  594. startRow += limit;
  595. }while (result.size() == limit);
  596. for (Map map : list) {
  597. Map formData = new HashMap();
  598. String fBillNo = UtilMap.getString(map, "FBillNo");
  599. formData.put("textField_mfqf1fj5", fBillNo);//单据编号
  600. String fDate = UtilMap.getString(map, "FDate");
  601. // 解析字符串为 LocalDateTime
  602. LocalDateTime localDateTime = LocalDateTime.parse(fDate);
  603. // 将 LocalDateTime 转换为 ZonedDateTime
  604. ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault());
  605. //localDateTime是当月的第几周
  606. int week = localDateTime.get(WeekFields.ISO.weekOfWeekBasedYear());
  607. formData.put("dateField_mfqf1fj4", zonedDateTime.toInstant().toEpochMilli());//单据日期
  608. formData.put("textField_mfqf1fj6",UtilMap.getString(map,"FCustomerID.FName"));//客户名称
  609. String F_QUXZ_AssistantFNumber = UtilMap.getString(map, "F_QUXZ_Assistant.FNumber");
  610. String F_QUXZ_Assistant = "";
  611. switch (F_QUXZ_AssistantFNumber){
  612. case "01": F_QUXZ_Assistant = "正常订单";break;
  613. case "02": F_QUXZ_Assistant = "样机订单";break;
  614. case "03": F_QUXZ_Assistant = "租赁订单";break;
  615. case "04": F_QUXZ_Assistant = "维修订单";break;
  616. case "05": F_QUXZ_Assistant = "研发订单";break;
  617. case "06": F_QUXZ_Assistant = "服务订单";break;
  618. case "10": F_QUXZ_Assistant = "营销支持";break;
  619. case "JD": F_QUXZ_Assistant = "京东订单";break;
  620. case "SHZY": F_QUXZ_Assistant = "售后专用";break;
  621. case "TM": F_QUXZ_Assistant = "天猫订单";break;
  622. default:break;
  623. }
  624. formData.put("textField_mfqhmwpu", F_QUXZ_Assistant);//销售类型
  625. String fEntityFEntryID = UtilMap.getString(map, "FEntity_FEntryID");
  626. formData.put("textField_mfqf1fjm", fEntityFEntryID);//销售订单分录id
  627. formData.put("textField_mfqf1fj7", UtilMap.getString(map,"FMaterialId.FNumber"));//物料编码
  628. formData.put("textField_mfqf1fj8", UtilMap.getString(map,"FMaterialId.FName"));//物料名称
  629. formData.put("textField_mfqf1fj9", UtilMap.getString(map,"FMaterialId.FSpecification"));//物料规格
  630. formData.put("textField_mfqf1fk3", UtilMap.getString(map,"FMaterialId.F_QUXZ_Assistant"));//所属系列
  631. formData.put("textField_mfqf1fjb", UtilMap.getString(map,"FUnitID.FName"));//销售单位
  632. formData.put("numberField_mfqf1fjd", UtilMap.getDouble(map,"FQty"));//销售数量
  633. formData.put("textField_mfqf1fjh", UtilMap.getBoolean(map,"FIsFree") ? "是" : "否");//是否赠品
  634. formData.put("textField_mfqf1fjj", UtilMap.getString(map,"FStockID.FName"));//出货仓库
  635. String FHGZBDayFNumber = UtilMap.getString(map, "FHGZBDay.FNumber");
  636. String FHGZBDay = "";
  637. switch (FHGZBDayFNumber){
  638. case "01": FHGZBDay = "1年";break;
  639. case "02": FHGZBDay = "2年";break;
  640. case "03": FHGZBDay = "3年";break;
  641. case "04": FHGZBDay = "4年";break;
  642. case "05": FHGZBDay = "5年";break;
  643. case "06": FHGZBDay = "15";break;
  644. case "07": FHGZBDay = "27";break;
  645. default:break;
  646. }
  647. formData.put("textField_mfqhmwpv", FHGZBDay);//质保期
  648. formData.put("textField_mfqithiv",getWeekOfMonth(localDateTime));//所属周
  649. ydClient.operateData(YDParam.builder()
  650. .formUuid("FORM-F7DB6FC6E47949A98BDD3DC344B3CBC1V7HY")
  651. .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mfqf1fj5, textField_mfqf1fjm",fBillNo,fEntityFEntryID)))
  652. .formDataJson(JSONObject.toJSONString(formData))
  653. .build(), YDConf.FORM_OPERATION.upsert);
  654. }
  655. }
  656. public static int getWeekOfMonth(LocalDateTime dateTime) {
  657. LocalDateTime date = dateTime.toLocalDate().atStartOfDay();
  658. // 获取当月第一天
  659. LocalDateTime firstDayOfMonth = date.with(TemporalAdjusters.firstDayOfMonth());
  660. // 获取当月第一天是星期几(1-7,周一到周日)
  661. int firstDayOfWeek = firstDayOfMonth.getDayOfWeek().getValue();
  662. // 计算当前日期是当月的第几天
  663. int dayOfMonth = date.getDayOfMonth();
  664. // 计算周数(ISO标准,周一为一周开始)
  665. // 第一周从1号开始,即使1号不是周一
  666. int week = ((dayOfMonth + firstDayOfWeek - 2) / 7) + 1;
  667. return week;
  668. }
  669. //发送工作通知
  670. public void sendDdMsg(String access_token,Number agent_id, String userid_list, String content){
  671. if (Objects.nonNull(userid_list)){
  672. Map param2 = new HashMap();
  673. param2.put("access_token",access_token);
  674. Map body3 = new HashMap();
  675. body3.put("agent_id",agent_id);
  676. body3.put("userid_list",userid_list);
  677. Map msg = new HashMap();
  678. msg.put("msgtype","text");
  679. //获取当前时间 精确到秒
  680. String time = DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss");
  681. msg.put("text", UtilMap.map("content",content));
  682. body3.put("msg",msg);
  683. UtilHttp.doPost("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2",null,param2,body3);
  684. }
  685. }
  686. private IdentifyInfo initIden(){
  687. //注意 1:此处不再使用参数形式传入用户名及密码等敏感信息,改为在登录配置文件中设置。
  688. //注意 2:必须先配置第三方系统登录授权信息后,再进行业务操作,详情参考各语言版本SDK介绍中的登录配置文件说明。
  689. //读取配置,初始化SDK
  690. IdentifyInfo iden = new IdentifyInfo();
  691. iden.setUserName(kdWebApiConf.getXKDApiUserName());
  692. iden.setAppId(kdWebApiConf.getXKDApiAppID());
  693. iden.setdCID(kdWebApiConf.getXKDApiAcctID());
  694. iden.setAppSecret(kdWebApiConf.getXKDApiAppSec());
  695. iden.setServerUrl(kdWebApiConf.getXKDApiServerUrl());
  696. return iden;
  697. }
  698. private boolean isTrue(RepoRet repoRet){
  699. Gson gson = new Gson();
  700. if (repoRet.getResult().getResponseStatus().isIsSuccess()) {
  701. System.out.printf("接口返回结果: %s%n", gson.toJson(repoRet.getResult()));
  702. return true;
  703. } else {
  704. fail("接口返回结果: " + gson.toJson(repoRet.getResult().getResponseStatus()));
  705. return false;
  706. }
  707. }
  708. private String getMultiLanguageTextName(Object object){
  709. if (Objects.nonNull(object)){
  710. Map map = (Map) object;
  711. List<Map> multiLanguageText = (List<Map>) map.get("MultiLanguageText");
  712. String value = UtilMap.getString(multiLanguageText.get(0),"Name");
  713. return value;
  714. }
  715. return null;
  716. }
  717. private String getMultiLanguageTextSpecification(Object object){
  718. if (Objects.nonNull(object)){
  719. Map map = (Map) object;
  720. List<Map> multiLanguageText = (List<Map>) map.get("MultiLanguageText");
  721. String value = UtilMap.getString(multiLanguageText.get(0),"Specification");
  722. return value;
  723. }
  724. return null;
  725. }
  726. private String getNumber(Object object){
  727. if (Objects.nonNull(object)){
  728. Map map = (Map) object;
  729. String value = UtilMap.getString(map,"Number");
  730. return value;
  731. }
  732. return null;
  733. }
  734. }