HeiHuOrderServiceImpl.java 116 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048
  1. package com.malk.fenggefushi.service.Impl;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import com.alibaba.fastjson.JSON;
  4. import com.alibaba.fastjson.JSONArray;
  5. import com.alibaba.fastjson.JSONObject;
  6. import com.fasterxml.jackson.core.JacksonException;
  7. import com.fasterxml.jackson.core.JsonParser;
  8. import com.fasterxml.jackson.core.JsonProcessingException;
  9. import com.fasterxml.jackson.databind.JsonNode;
  10. import com.fasterxml.jackson.databind.ObjectMapper;
  11. import com.malk.fenggefushi.entity.Order;
  12. import com.malk.fenggefushi.service.HeiHuOrderService;
  13. import com.malk.fenggefushi.test.test;
  14. import com.malk.server.aliwork.YDConf;
  15. import com.malk.server.aliwork.YDParam;
  16. import com.malk.server.aliwork.YDSearch;
  17. import com.malk.server.common.McR;
  18. import com.malk.server.dingtalk.DDConf;
  19. import com.malk.service.aliwork.YDClient;
  20. import com.malk.service.aliwork.YDService;
  21. import com.malk.utils.UtilHttp;
  22. import com.malk.utils.UtilMap;
  23. import lombok.SneakyThrows;
  24. import lombok.extern.slf4j.Slf4j;
  25. import org.checkerframework.checker.fenum.qual.SwingBoxOrientation;
  26. import org.springframework.beans.factory.annotation.Autowired;
  27. import org.springframework.stereotype.Service;
  28. import java.time.Instant;
  29. import java.time.LocalDate;
  30. import java.time.LocalDateTime;
  31. import java.time.ZoneId;
  32. import java.time.format.DateTimeFormatter;
  33. import java.time.temporal.ChronoUnit;
  34. import java.util.*;
  35. import java.util.stream.Collectors;
  36. @Slf4j
  37. @Service
  38. public class HeiHuOrderServiceImpl implements HeiHuOrderService {
  39. @Autowired
  40. private YDClient ydClient;
  41. @Autowired
  42. private YDConf ydConf;
  43. @Autowired
  44. private YDService ydService;
  45. @Autowired
  46. private DDConf ddConf;
  47. /*登录获取黑湖登录token*/
  48. @Override
  49. public McR HeiHuAccessToken() throws JacksonException {
  50. HashMap body = new HashMap();
  51. body.put("type",1);//type=1,登录方式为工厂代号+账号+密码
  52. body.put("code","648910");//工厂代号
  53. body.put("username","FGJK");//账号
  54. body.put("password","b715db070346a8a59e0eba5da27f8e4938536bb7867e09592326fde2");//密码加密
  55. HashMap header = new HashMap();
  56. header.put("X-CLIENT","lite-web");//固定
  57. header.put("Content-Type","application/json");
  58. String s = UtilHttp.doPost("https://liteweb.blacklake.cn/api/user/v1/users/_login", header, null, body);
  59. String data = new ObjectMapper().readTree(s).get("data").asText();
  60. return McR.success(data);
  61. }
  62. /*抓取黑湖工单发起宜搭审批流程*/
  63. @Override
  64. public McR StartYidaAproval(String OrderNo,String fromUuid) throws JacksonException {
  65. HashMap header = new HashMap();
  66. header.put("X-AUTH",HeiHuAccessToken().getData().toString());
  67. header.put("Content-Type","application/json");
  68. HashMap body = new HashMap();
  69. body.put("orderNo",OrderNo);//订单编码
  70. /*TODO:对json进行处理*/
  71. String jsonString = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/saleOrder/queryList2", header, null, body);
  72. JSONObject jsonObject = JSONObject.parseObject(jsonString);
  73. JSONArray dataArray = jsonObject.getJSONArray("data");
  74. //基础信息字段
  75. String orderNo = ""; String customerName = "";Long orderTime = null;Long arrivalPlanTime = null;String contractNo = "";
  76. String operatorName = "";double orderDiscount = 0;String customerCode = "";
  77. // 提取自定义字段
  78. String productPhoto = "";//产品照片:182852
  79. String sampleType = "";//样品类型:69230
  80. String processType = "";//工艺类型:47768
  81. String productType = "";//产品类型:47770
  82. String orderType = "";//订单类型:47771
  83. String department = "";//部门:47777
  84. String season = "";//季节:47778
  85. String expectedOrderQty = "";//预计下单量:59314
  86. double estimatedUnitPrice = 0;//辅料预估单价:161769
  87. String purchaseOrderNumber = "";//对应预采购单号:113495
  88. String qualityConfirmation = "";//品质确认:113119
  89. String materialCycle = "";//物料周期:113086
  90. //产品详情字段
  91. String productCode = "";String productName = "";String productSpec = "";int productStockQty;int qty;
  92. String productUnitName = "";double unitPrice;double amount;double discount;double taxInclusiveAmount;
  93. double taxRate;String productArrivalPlanTime = "";String productOriginType = "";
  94. //其他信息
  95. String contactName = "";String contactNumbers = "";String contactAddress = "";
  96. for (int i = 0; i < dataArray.size(); i++) {
  97. JSONObject data = dataArray.getJSONObject(i);
  98. // 提取订单基本信息
  99. orderNo = data.getString("orderNo");//订单编号:orderNo
  100. customerName = data.getString("customerName");//客户:customerName
  101. orderTime = data.getLong("orderTime");//下单日期:orderTime
  102. arrivalPlanTime = data.getLong("arrivalPlanTime");//计划交货日期:arrivalPlanTime
  103. contractNo = data.getString("contractNo");//合同号:contractNo
  104. operatorName = data.getString("operatorName");//业务员:operatorName
  105. orderDiscount = data.getDoubleValue("orderDiscount")*100;//整单折扣:orderDiscount
  106. customerCode = data.getString("customerCode");//客户名称:customerCode
  107. //提取其他信息
  108. contactName = data.getString("contactName");//联系人
  109. contactNumbers = data.getString("contactNumbers");//联系电话
  110. contactAddress = data.getString("contactAddress");//联系地址
  111. JSONArray customFields = data.getJSONArray("customFieldValues");
  112. if (customFields != null) {
  113. for (int j = 0; j < customFields.size(); j++) {
  114. JSONObject field = customFields.getJSONObject(j);
  115. long fieldId = field.getLongValue("fieldId");
  116. String value = field.getString("value");
  117. switch ((int)fieldId) {
  118. case 70931: productPhoto = value; break;
  119. case 69230: sampleType = value; break;
  120. case 47768: processType = value; break;
  121. case 47770: productType = value; break;
  122. case 47771: orderType = value; break;
  123. case 47777: department = value; break;
  124. case 47778: season = value; break;
  125. case 59314: expectedOrderQty = value;break;
  126. case 161769: estimatedUnitPrice = Double.parseDouble(value);break;
  127. case 113495:purchaseOrderNumber = value;break;
  128. case 113119:qualityConfirmation = value;break;
  129. case 113086:materialCycle = value;break;
  130. }
  131. }
  132. }
  133. }
  134. /*判断订单类型来封装数据*/
  135. HashMap formdata = new HashMap();
  136. /*主表*/
  137. formdata.put("textField_mfqgmwcw",orderNo);
  138. formdata.put("textField_mfqgmwcx",customerName);
  139. formdata.put("dateField_mfqgmwcy",orderTime);
  140. formdata.put("dateField_mfqgmwcz",arrivalPlanTime);
  141. formdata.put("textField_mfqgmwd5",contractNo);
  142. formdata.put("textField_mgc0kc5u",operatorName);
  143. formdata.put("numberField_mfqgmwd7",orderDiscount);
  144. formdata.put("selectField_mg5y3rcr",orderType);
  145. formdata.put("textField_mfqgmwdn",processType);
  146. formdata.put("textField_mfqgmwdo",productType);
  147. formdata.put("textField_mg5y3rda",department);
  148. formdata.put("textField_mfqgmwdx",season);
  149. formdata.put("textField_mfqi6ui8",contactName);
  150. formdata.put("textField_mfqi6ui9",contactNumbers);
  151. formdata.put("textField_mfqi6uia",contactAddress);
  152. List<Map<String, Object>> imageAttachments = new ArrayList<>();
  153. //处理多照片
  154. if(productPhoto != null && productPhoto.contains(",")){
  155. String[] photoUrls = productPhoto.split(",");
  156. for (String url : photoUrls){
  157. String trimmedUrl = url.trim();
  158. if(!trimmedUrl.isEmpty()){
  159. Map<String, Object> imageInfo = new HashMap<>();
  160. imageInfo.put("name",productType);
  161. imageInfo.put("downloadUrl",trimmedUrl);
  162. imageInfo.put("previewUrl",trimmedUrl);
  163. imageInfo.put("url",trimmedUrl);
  164. imageInfo.put("ext","png");
  165. imageAttachments.add(imageInfo);
  166. }
  167. }
  168. }else {
  169. HashMap<String,Object> imageInfo = new HashMap();
  170. imageInfo.put("name",productType);
  171. imageInfo.put("downloadUrl",productPhoto);
  172. imageInfo.put("previewUrl",productPhoto);
  173. imageInfo.put("url",productPhoto);
  174. imageInfo.put("ext","png");
  175. imageAttachments.add(imageInfo);
  176. }
  177. formdata.put("imageField_mfqgmwde",imageAttachments);
  178. if(orderType.equals("样品订单")){
  179. formdata.put("textField_mfqgmwdh",customerCode);
  180. formdata.put("textField_mg5y3rdd",sampleType);
  181. formdata.put("textField_mgc1xl62",expectedOrderQty);
  182. }else if(orderType.equals("贸易公司订单")){
  183. formdata.put("numberField_mg5y3rcx",estimatedUnitPrice);
  184. formdata.put("textField_mg5y3rcy",purchaseOrderNumber);
  185. formdata.put("textField_mg5y3rcz",qualityConfirmation);
  186. formdata.put("textField_mg5y3rd0",materialCycle);
  187. formdata.put("textField_mfqgmwdh",customerCode);
  188. }else{
  189. formdata.put("textField_mfqgmwdh",customerCode);
  190. }
  191. /*子表*/
  192. JSONArray products = jsonObject.getJSONArray("data").getJSONObject(0).getJSONArray("saleManageOrderDetailRowApiVOList");
  193. List<Map<String,Object>> tableData = new ArrayList();
  194. if (products != null) {
  195. for (int i = 0; i < products.size(); i++) {
  196. JSONObject detail = products.getJSONObject(i);
  197. HashMap row = new HashMap();
  198. //
  199. String color = "";
  200. JSONArray array1 = detail.getJSONArray("customFieldValues");
  201. color = array1.stream()
  202. .map(obj -> (JSONObject) obj)
  203. .filter(item -> item.getIntValue("fieldId") == 82259)
  204. .map(item -> item.getString("value"))
  205. .findFirst()
  206. .orElse(null);
  207. ArrayList colorList = new ArrayList();
  208. colorList.add(color);
  209. String color_AAA = getProductColor(colorList);
  210. row.put("textField_mk0jz9i1",color_AAA);//中文颜色
  211. row.put("textField_mfqgmwe1",detail.getString("productCode"));//产品编号
  212. row.put("textField_mfqgmwe2",detail.getString("productName"));//产品名称
  213. row.put("textField_mfqgmwe3",detail.getString("productSpec"));//产品规格
  214. row.put("textField_mfqgmwe4","0".equals(detail.getString("productOriginType")) ? "自制" : "其它");//产品属性
  215. row.put("numberField_mfqgmwe5",detail.getIntValue("productStockQty"));//库存数量
  216. row.put("numberField_mfqgmwe6",detail.getIntValue("qty"));//数量
  217. row.put("textField_mfqgmwe7",detail.getString("productUnitName"));//单位
  218. row.put("numberField_mfqgmwe8",detail.getDoubleValue("unitPrice"));//单价
  219. row.put("numberField_mfqgmwe9",detail.getDoubleValue("amount"));//报价金额
  220. row.put("numberField_mfqgmwea",detail.getDoubleValue("discount")*100);//折扣
  221. row.put("numberField_mfqgmweb",detail.getDoubleValue("taxInclusiveAmount"));//折扣
  222. row.put("numberField_mfqgmwec",detail.getDoubleValue("taxRate"));//税率
  223. row.put("dateField_mfqgmwed",detail.getLong("arrivalPlanTime"));//产品交货日期
  224. tableData.add(row);
  225. }
  226. }
  227. formdata.put("tableField_mfqgmwe0",tableData);
  228. System.out.println(formdata);
  229. /*发起流程*/
  230. String userid = getDDToken(operatorName);
  231. String dd = ydClient.operateData(YDParam.builder()
  232. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  233. .formUuid(fromUuid)
  234. .userId(userid)
  235. .formDataJson(JSON.toJSONString(formdata))
  236. .build(), YDConf.FORM_OPERATION.start).toString();
  237. log.info("----------【销售订单】已发起----------");
  238. return McR.success(dd);
  239. }
  240. @Override
  241. public String getDDToken(String Name) {
  242. HashMap body = new HashMap();
  243. body.put("appKey","dingie28nalt6tcnzizl");
  244. body.put("appSecret","Ss7na86M_BWPEXhKffiQDA-8jXvuBhBklfD8C-ot7xGwiDKfFMIf9y00mXYutfCB");
  245. String s = UtilHttp.doPost("https://api.dingtalk.com/v1.0/oauth2/accessToken", null, null, body);
  246. String accessToken = JSONObject.parseObject(s).getString("accessToken");
  247. HashMap header = new HashMap();
  248. header.put("x-acs-dingtalk-access-token",accessToken);
  249. HashMap bodyy = new HashMap();
  250. bodyy.put("queryWord", Name);
  251. bodyy.put("offset",0);
  252. bodyy.put("size",10);
  253. String s1 = UtilHttp.doPost("https://api.dingtalk.com/v1.0/contact/users/search", header, null, bodyy);
  254. List<String> list = JSONObject.parseObject(s1).getJSONArray("list").toJavaList(String.class);
  255. String userId = "";
  256. if(list!= null && !list.isEmpty()){
  257. userId = list.get(0);
  258. }
  259. return userId;
  260. }
  261. @SneakyThrows
  262. @Override
  263. public McR startYidaProcurementAproval(String OrderNo,String FormUuType) throws JsonProcessingException {
  264. HashMap header = new HashMap();
  265. header.put("X-AUTH",HeiHuAccessToken().getData().toString());
  266. header.put("Content-Type","application/json");
  267. HashMap body = new HashMap();
  268. body.put("orderCode",OrderNo);//订单编号
  269. String jsonString = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/queryList2", header, null, body);//todo:查询采购订单
  270. JSONArray dataArray = JSONObject.parseObject(jsonString).getJSONArray("data");
  271. //基础信息字段
  272. String orderCode = "";String shortName = "";Long purchaseTime = null;Long planArrivalTime = null;String purchaserName = "";
  273. String gysnumber = "";
  274. double orderDiscount = 0;
  275. //自定义信息
  276. String department = "";//部门:186341
  277. String add = "";//地址:32869
  278. String SalesOrderNumber = "";//销售订单号:59332
  279. String PaymentStatus = "";//付款情况:55674
  280. String PortOfShipment = "";//出运地:42003
  281. String ShippingStatus = "";//出运状态:42002
  282. //产品详情字段
  283. String productCode = "";String productName = "";String productSpec = "";int purchaseNum;
  284. String unitName = "";double purchasePrice;double purchaseAmount;double discount;double taxInclusiveAmount;
  285. double taxRate;Long productArrivalPlanTime = null;
  286. //其他信息
  287. String contactName = "";String contactNumber = "";String contactAddress = "";
  288. for (int i=0;i<dataArray.size();i++){
  289. JSONObject data = dataArray.getJSONObject(i);
  290. //提取订单基本信息
  291. orderCode = data.getString("orderCode");//订单编号:orderCode
  292. shortName = data.getString("shortName");//供应商:shortName
  293. gysnumber = data.getString("vendorCode");//供应商编码:gysnumber
  294. purchaseTime = data.getLong("purchaseTime");//采购日期:purchaseTime
  295. planArrivalTime = data.getLong("planArrivalTime");//计划到货日期:planArrivalTime
  296. purchaserName = data.getString("purchaserName");//采购员:purchaserName
  297. orderDiscount = data.getDouble("orderDiscount");//整单折扣:orderDiscount
  298. //其他信息
  299. contactName = data.getString("contactName");//联系人
  300. contactNumber = data.getString("contactNumber");//联系电话
  301. contactAddress = data.getString("contactAddress");//联系地址
  302. //自定义信息
  303. JSONArray customFields = data.getJSONArray("customFieldValues");
  304. if(customFields != null){
  305. for (int j = 0; j < customFields.size(); j++) {
  306. JSONObject field = customFields.getJSONObject(j);
  307. long fieldId = field.getLongValue("fieldId");
  308. String value = field.getString("value");
  309. switch ((int)fieldId){
  310. case 186341: department = value;break;
  311. case 59391:
  312. JSONObject associatedDetail = field.getJSONObject("associatedObjectValueDetail");
  313. if(associatedDetail != null && !associatedDetail.isEmpty()) {
  314. add = associatedDetail.getString("vendorContactAddress");
  315. }
  316. break;
  317. case 59332: SalesOrderNumber = value;break;
  318. case 55674: PaymentStatus = value;break;
  319. case 42003: PortOfShipment = value;break;
  320. case 42002: ShippingStatus = value;break;
  321. }
  322. }
  323. }
  324. }
  325. /*开始封装数据*/
  326. //采购订单-基础信息
  327. HashMap formdata = new HashMap();
  328. formdata.put("textField_mfqia327",orderCode);
  329. formdata.put("textField_mfqia328",shortName);
  330. formdata.put("textField_mkaudmn6",gysnumber);
  331. formdata.put("dateField_mfqia329",purchaseTime);
  332. formdata.put("dateField_mfqia32a",planArrivalTime);
  333. formdata.put("employeeField_mfqia32g",getDDToken(purchaserName));
  334. formdata.put("numberField_mfqia32h",orderDiscount*100);
  335. //采购订单-自定义
  336. formdata.put("textField_mfqia32o",department);
  337. formdata.put("textField_mfqia32q",add);
  338. formdata.put("textField_mfqia32r",SalesOrderNumber);
  339. formdata.put("textField_mfqia32x",PaymentStatus);
  340. formdata.put("textField_mfqia32y",PortOfShipment);
  341. formdata.put("textField_mfqia32z",ShippingStatus);
  342. //采购订单-其他信息
  343. formdata.put("textField_mg4gqve0",contactName);
  344. formdata.put("textField_mg4gqve1",contactNumber);
  345. formdata.put("textareaField_mg4gqve2",contactAddress);
  346. //采购订单-子表
  347. JSONArray products = JSONObject.parseObject(jsonString).getJSONArray("data").getJSONObject(0).getJSONArray("purchaseSubOrderVOS");
  348. ArrayList<Map<String,Object>> tableData = new ArrayList();
  349. if(products != null){
  350. for (int i = 0; i < products.size(); i++) {
  351. JSONObject detail = products.getJSONObject(i);
  352. HashMap row = new HashMap();
  353. row.put("textField_mfqia332",detail.getString("productCode"));//产品编码
  354. row.put("textField_mfqia333",detail.getString("productName"));//产品名称
  355. row.put("textField_mfqia334",detail.getString("productSpec"));//产品规格
  356. row.put("numberField_mfqia335",detail.getInteger("purchaseNum"));//采购数量
  357. row.put("textField_mfqia336",detail.getString("unitName"));//单位
  358. row.put("numberField_mfqia337",detail.getDouble("purchasePrice"));//单价
  359. row.put("numberField_mg4gqvdm",detail.getDouble("purchaseAmount"));//报价金额
  360. row.put("numberField_mg4gqvdn",detail.getDouble("discount"));//折扣
  361. row.put("numberField_mg4gqvdo",detail.getDouble("taxInclusiveAmount"));//含税金额
  362. row.put("numberField_mg4gqvdp",detail.getDouble("taxRate"));//税率
  363. row.put("dateField_mg4gqvdq",detail.getLong("productArrivalTime"));//产品到货日期
  364. tableData.add(row);
  365. }
  366. }
  367. /*todo:新版栏目:客户、订单号、款号、产品描述、颜色、数量、销售单价、销售金额、币别、生产工厂、采购单价、采购金额、利润率、美金汇率、辅料预估成本*/
  368. String customerName = "",styleNumber = "",productDescription = "",color = "",currency = "";
  369. Double number,unitPrice,salesAmount;
  370. Double rate = 1.00;Double saletotalAmount = 0.00;Double procuretotalAmount = 0.00;Double saletotalnum =0.00;
  371. Double estimatedtotalAmount = 0.00;Double estimatedPrice = 0.00;
  372. Double USDrate = 0.00;Double flygcb = 0.00;
  373. ObjectMapper objectMapper = new ObjectMapper();
  374. JsonNode rootNode = objectMapper.readTree(jsonString);
  375. JsonNode dataNode = rootNode.get("data");
  376. String orderNumber = "";//销售订单编号
  377. if(dataNode != null && dataNode.isArray()){
  378. for(JsonNode item : dataNode){
  379. JsonNode orderNoNode = item.get("orderCode");
  380. JsonNode saleOrders = item.get("relationSaleOrders");
  381. if(saleOrders != null && saleOrders.isArray() && saleOrders.size() > 0){
  382. orderNumber = saleOrders.get(0).asText();
  383. }
  384. }
  385. }
  386. HashMap body_A = new HashMap();
  387. body_A.put("orderNo",orderNumber);
  388. String jsonString2 = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/saleOrder/queryList2", header, null, body_A);//todo:查询销售订单,获取客户、订单号、款号、产品描述、颜色、数量、销售单价、销售金额、币别
  389. JSONArray array = JSONObject.parseObject(jsonString2).getJSONArray("data");//主表数据
  390. for(int i=0;i<array.size();i++){
  391. JSONObject data = array.getJSONObject(i);
  392. customerName = data.getString("customerCode");//客户名称
  393. }
  394. ObjectMapper objectMapper2 = new ObjectMapper();
  395. JsonNode dataNode2 = objectMapper2.readTree(jsonString2).get("data");//主表数据
  396. for (JsonNode item : dataNode2){
  397. JsonNode customFieldValues = item.get("customFieldValues");
  398. for (JsonNode field : customFieldValues){
  399. JsonNode fieldIdNode = field.get("fieldId");
  400. if(fieldIdNode != null && fieldIdNode.asInt() == 161769){
  401. JsonNode valueNode = field.get("value");
  402. if(valueNode != null){
  403. estimatedPrice = valueNode.asDouble();//辅料预估单价
  404. break;
  405. }
  406. }
  407. }
  408. }
  409. JSONArray products_A = JSONObject.parseObject(jsonString2).getJSONArray("data").getJSONObject(0).getJSONArray("saleManageOrderDetailRowApiVOList");//销售订单明细数据
  410. List<Map<String,String>> tabledata = new ArrayList();
  411. if(products_A != null){
  412. for (int i=0;i<products_A.size();i++){
  413. JSONObject detail = products_A.getJSONObject(i);
  414. HashMap row = new HashMap();
  415. row.put("textField_mhsj6gtn",customerName);//todo:客户
  416. row.put("textField_mhsj6gto",orderNumber);//todo:订单号
  417. styleNumber = detail.getString("productCode");//款号
  418. row.put("textField_mhsj6gtp",styleNumber);//todo:款号
  419. productDescription = detail.getString("productName");//产品描述
  420. row.put("textField_mhsj6gtq",productDescription);//todo:产品描述
  421. JSONArray array1 = detail.getJSONArray("customFieldValues");
  422. color = array1.stream()
  423. .map(obj -> (JSONObject) obj)
  424. .filter(item -> item.getIntValue("fieldId") == 82259)
  425. .map(item -> item.getString("value"))
  426. .findFirst()
  427. .orElse(null);
  428. ArrayList colorList = new ArrayList();
  429. colorList.add(color);
  430. String color_AAA = getProductColor(colorList);
  431. row.put("textField_mhsj6gtr",color_AAA);//todo:颜色
  432. number = detail.getDoubleValue("qty");//数量
  433. row.put("numberField_mhsj6gts",number);//todo:数量
  434. saletotalnum = saletotalnum + number;
  435. unitPrice = detail.getDoubleValue("unitPrice");//销售单价
  436. row.put("numberField_mhsj6gtt",unitPrice);//todo:销售单价
  437. salesAmount = number * unitPrice;//销售金额
  438. row.put("numberField_mhsj6gtu",salesAmount);//todo:销售金额
  439. String customFieldValues = detail.getString("customFieldValues");
  440. ObjectMapper mapper = new ObjectMapper();
  441. JsonNode jsonarray = mapper.readTree(customFieldValues);
  442. for (JsonNode node : jsonarray){
  443. if(node.get("fieldId").asInt() == 47919){
  444. currency = node.get("value").asText();
  445. }else if (node.get("fieldId").asInt() == 165251){
  446. rate = node.get("value").asDouble();
  447. USDrate = rate;
  448. }else if (node.get("fieldId").asInt() == 161783) {
  449. flygcb = node.get("value").asDouble();
  450. }
  451. }
  452. row.put("textField_mhtxft3p",currency);//todo:币别
  453. row.put("numberField_ml85btkc",USDrate);//todo:美金汇率
  454. row.put("numberField_ml85btkd",flygcb);//todo:辅料预估成本
  455. //下面是采购订单的明细数据
  456. row.put("textField_mhsj6gtv",shortName);//todo:生产工厂
  457. for(int j=0;j<products.size();j++){
  458. if(styleNumber.equals(products.getJSONObject(j).getString("productCode"))){
  459. //找到对应的采购一行数据
  460. row.put("numberField_mhsj6gtw",products.getJSONObject(j).getDouble("purchasePrice"));//todo:采购单价
  461. row.put("numberField_mhtxft3q",products.getJSONObject(j).getDouble("purchaseNum"));//todo:采购数量
  462. row.put("numberField_mhsj6gtx",products.getJSONObject(j).getDouble("purchasePrice") * products.getJSONObject(j).getDouble("purchaseNum"));//todo:采购金额
  463. }
  464. }
  465. //销售总金额 币别:人民币 数量*单价 美元:数量*单价*美元汇率
  466. saletotalAmount = (currency.equals("CNY") ? number*unitPrice : number*unitPrice*rate) + saletotalAmount;
  467. //采购订单总金额 均为人民币不存在汇率
  468. procuretotalAmount = products.getJSONObject(i).getDouble("purchasePrice") * products.getJSONObject(i).getDouble("purchaseNum") + procuretotalAmount;
  469. tabledata.add(row);
  470. }
  471. }
  472. //预估辅料总成本 订单总数量*辅料预估单价
  473. estimatedtotalAmount = saletotalnum * estimatedPrice;
  474. //毛利率 (销售总金额-采购订单总金额-辅料预估总成本)/(销售总金额)
  475. double margin = (saletotalAmount - procuretotalAmount - estimatedtotalAmount) / saletotalAmount;
  476. formdata.put("numberField_mhvp9qy0",margin);
  477. formdata.put("tableField_mhsj6gtm",tabledata);
  478. System.out.println(formdata);
  479. /*发起流程*/
  480. String userId = getDDToken(purchaserName);
  481. String dd = ydClient.operateData(YDParam.builder()
  482. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  483. .formUuid(FormUuType)
  484. .userId(userId)
  485. .formDataJson(JSON.toJSONString(formdata))
  486. .build(), YDConf.FORM_OPERATION.start).toString();
  487. log.info("------------【采购订单】审批已发起-----------");
  488. return McR.success(dd);
  489. }
  490. @SneakyThrows
  491. @Override
  492. public McR SyncOrderStatus(String formInstanceId,String Approvalresult) throws JsonProcessingException {
  493. HashMap header = new HashMap();
  494. header.put("X-AUTH",HeiHuAccessToken().getData().toString());
  495. header.put("Content-Type","application/json");
  496. Map formdata = ydClient.queryData(YDParam.builder().formInstId(formInstanceId)
  497. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  498. .userId(ddConf.getOperator()).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  499. HashMap body = new HashMap();
  500. body.put("orderNo",formdata.get("textField_mfqgmwcw"));//订单编号
  501. body.put("customerCode",formdata.get("textField_mfqgmwdh"));//客户编号(名称)
  502. String aa = formdata.get("dateField_mfqgmwcy").toString();
  503. String xdrq = Instant.ofEpochMilli(Long.parseLong(aa))
  504. .atZone(ZoneId.of("Asia/Shanghai"))
  505. .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  506. body.put("orderTime",xdrq);//下单日期
  507. String bb = formdata.get("dateField_mfqgmwcz").toString();
  508. String jhjfrq = Instant.ofEpochMilli(Long.parseLong(bb))
  509. .atZone(ZoneId.of("Asia/Shanghai"))
  510. .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  511. body.put("arrivalPlanTime",jhjfrq);//计划交付日期
  512. body.put("operatorName",formdata.get("textField_mgc0kc5u"));//业务人员名称
  513. ArrayList<Map<String,String>> customFiled = new ArrayList();
  514. HashMap field = new HashMap();
  515. field.put("name","销售订单钉钉审批状态");
  516. field.put("value",Approvalresult);//审批状态
  517. customFiled.add(field);
  518. body.put("saleOrderCustomFieldsValue",customFiled);//订单状态明细
  519. String dd = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/saleOrder/update", header, null, body);
  520. log.info("---------【回传销售订单状态完成】----------");
  521. return McR.success(dd);
  522. }
  523. @SneakyThrows
  524. @Override
  525. public McR SyncPurchaseOrderStatus(String formInstanceId,String Approvalresult) throws JsonProcessingException {
  526. HashMap header = new HashMap();
  527. header.put("X-AUTH",HeiHuAccessToken().getData().toString());
  528. header.put("Content-Type","application/json");
  529. Map formdata = ydClient.queryData(YDParam.builder().formInstId(formInstanceId)
  530. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  531. .userId(ddConf.getOperator()).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  532. String jsonString = formdata.get("tableField_ml7ch2pj").toString();
  533. JSONArray tableField_ml7ch2pj = JSON.parseArray(jsonString);
  534. for (int i=0;i<tableField_ml7ch2pj.size();i++){
  535. String poNumber = tableField_ml7ch2pj.getJSONObject(i).getString("textField_ml7ch2pk");//拿到采购订单号
  536. HashMap body = new HashMap();
  537. body.put("orderCode",poNumber);//订单编号
  538. String jsonString2 = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/queryList2", header, null, body);//todo:查询采购订单
  539. JSONArray dataArray = JSONObject.parseObject(jsonString2).getJSONArray("data");
  540. for (int k=0;k<dataArray.size();k++) {
  541. JSONObject data = dataArray.getJSONObject(k);
  542. //提取订单基本信息 并赋值
  543. HashMap body1 = new HashMap();
  544. body1.put("orderCode",data.getString("orderCode"));//订单编号:orderCode
  545. body1.put("vendorCode",data.getString("vendorCode"));//供应商编码:gysnumber
  546. String aa = data.getLong("purchaseTime").toString();
  547. String purchaseTime = Instant.ofEpochMilli(Long.parseLong(aa))
  548. .atZone(ZoneId.of("Asia/Shanghai"))
  549. .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  550. body1.put("purchaseTime",purchaseTime);//采购日期:purchaseTime
  551. String bb = data.getLong("planArrivalTime").toString();
  552. String planArrivalTime = Instant.ofEpochMilli(Long.parseLong(bb))
  553. .atZone(ZoneId.of("Asia/Shanghai"))
  554. .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  555. body1.put("planArrivalTime",planArrivalTime);//计划到货日期:planArrivalTime
  556. ArrayList<Map<String,String>> customFiled = new ArrayList();
  557. HashMap field = new HashMap();
  558. field.put("name","采购订单钉钉审批状态");
  559. field.put("value",Approvalresult);//审批状态
  560. customFiled.add(field);
  561. body1.put("purchaseOrderCustomFieldsValue",customFiled);
  562. UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/update", header, null, body1);
  563. log.info("---------【回传,{},采购订单状态完成】-----------",data.getString("orderCode"));
  564. }
  565. }
  566. return McR.success();
  567. }
  568. @Override
  569. @SneakyThrows
  570. public McR salesAproval(Map body) throws JacksonException {
  571. StartYidaAproval(body.get("order").toString(),"FORM-472F0C1BD8DF41FA965A0B4525779B67S421");//todo:发起销售订单流程档案
  572. HashMap formdata = new HashMap();
  573. formdata.put("textField_mgq90lwf",body.get("order").toString());
  574. Instant now = Instant.now();
  575. long timestampMillis = now.toEpochMilli();
  576. formdata.put("dateField_mgq90lwg",timestampMillis);
  577. ydClient.operateData(YDParam.builder()
  578. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  579. .formUuid("FORM-1693380A673E498C827CD0A4C2D8214CIK90")
  580. .userId("3320511511-1158713155")
  581. .formDataJson(JSON.toJSONString(formdata))
  582. .build(), YDConf.FORM_OPERATION.create).toString();//todo:销售合同档案
  583. log.info("[销售订单流程发起,销售汇总表已同步]");
  584. return McR.success();
  585. }
  586. @Override
  587. @SneakyThrows
  588. public McR Procurement(Map body_new) throws JacksonException {
  589. //1、每次创建的时候才去查询宜搭采购订单底表
  590. log.info("【开始查询宜搭采购订单汇总】");
  591. String formUuid = "FORM-56E11C4FAB6E4FB594169BB779736FF0ZG91";
  592. YDParam ydParam = YDParam.builder().formUuid(formUuid).build();
  593. ydParam.setPageSize(1);
  594. long totalCount = ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_search_form).getTotalCount();
  595. List<Map> dataList = new ArrayList<>();
  596. ydParam.setCurrentPage(1);
  597. ydParam.setPageSize(100);
  598. int totalPages = (int) Math.ceil((double) totalCount / ydParam.getPageSize());
  599. for (int page = 1; page <= totalPages; page++) {
  600. ydParam.setCurrentPage(page);
  601. dataList.addAll((List<Map>) ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_search_form).getData());
  602. }
  603. int i =0;
  604. String jsonStr = "";
  605. ArrayList<String> procureList = new ArrayList();//采购订单汇总-订单号
  606. for (Map li : dataList) {
  607. i++;
  608. jsonStr = li.get("formData").toString();
  609. String orderNumber = new ObjectMapper().readTree(jsonStr).get("textField_mgq932hi").asText();
  610. procureList.add(orderNumber);
  611. }
  612. //2、其次就是在查询下黑湖工单,时间为当前时间
  613. HashMap header = new HashMap();
  614. header.put("X-AUTH",HeiHuAccessToken().getData().toString());
  615. header.put("Content-Type","application/json");
  616. HashMap body = new HashMap();
  617. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  618. LocalDateTime todayMidnight = LocalDate.now().atStartOfDay();
  619. String formattedToday = todayMidnight.format(formatter);
  620. body.put("createdAtGte",formattedToday);//创建时间大于等于
  621. /*TODO:对json进行处理*/
  622. String jsonString = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/queryList2", header, null, body);//TODO:查询采购订单
  623. List<String> orderNoList = new ArrayList<>();//存在这个orderList里面
  624. ObjectMapper objectMapper = new ObjectMapper();
  625. JsonNode rootNode = objectMapper.readTree(jsonString);
  626. JsonNode dataNode = rootNode.get("data");
  627. String orderNumber = "";//销售订单编号
  628. List<String> orderNumberList = new ArrayList<>();//todo:存在关联多个销售订单
  629. String purchaseOrderNo = "";//采购订单编号
  630. String orderType = "";//销售订单类型
  631. if (dataNode != null && dataNode.isArray()) {
  632. for (JsonNode item : dataNode) {
  633. JsonNode orderNoNode = item.get("orderCode");
  634. if (orderNoNode != null) {
  635. purchaseOrderNo = orderNoNode.asText();
  636. }
  637. JsonNode saleOrders = item.get("relationSaleOrders");
  638. if (saleOrders != null && saleOrders.isArray() && saleOrders.size() > 0) {
  639. for (int j = 0; j < saleOrders.size(); j++) {
  640. orderNumberList.add(saleOrders.get(j).asText());
  641. }
  642. orderNumber = saleOrders.get(0).asText();
  643. }
  644. //每次查询下是否为“样品订单”推过来的采购订单
  645. HashMap body2 = new HashMap();
  646. body2.put("orderNo",orderNumber);
  647. String jsonString2 = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/saleOrder/queryList2", header, null, body2);//TODO: 查询销售订单
  648. ObjectMapper objectMapper2 = new ObjectMapper();
  649. JsonNode dataNode2 = objectMapper2.readTree(jsonString2).get("data");
  650. if(dataNode2 != null && dataNode2.isArray()){
  651. for (JsonNode item2 : dataNode2){
  652. JsonNode customFieldValues = item2.get("customFieldValues");
  653. if (customFieldValues != null && customFieldValues.isArray()) {
  654. for (JsonNode field : customFieldValues) {
  655. JsonNode fieldIdNode = field.get("fieldId");
  656. // 查找fieldId为47771的字段:订单类型
  657. if (fieldIdNode != null && fieldIdNode.asInt() == 47771) {
  658. JsonNode valueNode = field.get("value");
  659. if (valueNode != null) {
  660. orderType = valueNode.asText();
  661. break;
  662. }
  663. }
  664. }
  665. }
  666. }
  667. }
  668. if (orderNoNode != null && !orderType.equals("样品订单") ) {
  669. orderNoList.add(orderNoNode.asText());
  670. }
  671. }
  672. }
  673. //3、两者比较[procureList\orderList],差别的一个发起审批流程,排除订单类型为“样品订单”外
  674. Set<String> orderNoSet = new HashSet<>(orderNoList);
  675. Set<String> procureSet = new HashSet<>(procureList);
  676. List<String> onlyInSalesList = new ArrayList<>();
  677. for (String item : procureList) {
  678. if (!orderNoSet.contains(item)) {
  679. onlyInSalesList.add(item);
  680. }
  681. }
  682. List<String> onlyInOrderNoList = new ArrayList<>();
  683. for (String item : orderNoList) {
  684. if (!procureSet.contains(item)) {
  685. onlyInOrderNoList.add(item);
  686. }
  687. }
  688. System.out.println("要发起的采购订单: " + onlyInOrderNoList);//这里的orderNoList中的元素可能为[],为空的话就不发起流程
  689. //4、非样品订单发起宜搭审批流程
  690. if(orderType.equals("样品订单")){
  691. HashMap formdata2 = new HashMap();
  692. formdata2.put("textField_mgq932hi",purchaseOrderNo);
  693. formdata2.put("textField_mhyh7ues",orderNumber);
  694. Instant now = Instant.now();
  695. long timestampMillis = now.toEpochMilli();
  696. formdata2.put("dateField_mgq932hj",timestampMillis);
  697. ydClient.operateData(YDParam.builder()
  698. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  699. .formUuid("FORM-56E11C4FAB6E4FB594169BB779736FF0ZG91")
  700. .userId("3320511511-1158713155")
  701. .formDataJson(JSON.toJSONString(formdata2))
  702. .build(),YDConf.FORM_OPERATION.create).toString();
  703. log.info("[样品订单流程不发起,采购汇总表已同步]");
  704. }
  705. for (int j=0;j< onlyInOrderNoList.size();j++){
  706. String orderNo = onlyInOrderNoList.get(j);
  707. startYidaProcurementAproval(orderNo,"FORM-5BD5B7F6C8B249A5ADD6E1C82DEAA2C086FY");
  708. //5、发起流程写入采购订单汇总表
  709. HashMap formdata = new HashMap();
  710. formdata.put("textField_mgq932hi",orderNo);
  711. formdata.put("textField_mhyh7ues",orderNumber);
  712. Instant now = Instant.now();
  713. long timestampMillis = now.toEpochMilli();
  714. formdata.put("dateField_mgq932hj",timestampMillis);
  715. ydClient.operateData(YDParam.builder()
  716. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  717. .formUuid("FORM-56E11C4FAB6E4FB594169BB779736FF0ZG91")
  718. .userId("3320511511-1158713155")
  719. .formDataJson(JSON.toJSONString(formdata))
  720. .build(), YDConf.FORM_OPERATION.create).toString();
  721. log.info("[采购订单流程发起,采购汇总表已同步]");
  722. }
  723. //6、样品订单也要写入采购订单汇总表内
  724. if(orderType.equals("样品订单")){
  725. HashMap formdata2 = new HashMap();
  726. formdata2.put("textField_mgq932hi",purchaseOrderNo);
  727. formdata2.put("textField_mhyh7ues",orderNumber);
  728. Instant now = Instant.now();
  729. long timestampMillis = now.toEpochMilli();
  730. formdata2.put("dateField_mgq932hj",timestampMillis);
  731. ydClient.operateData(YDParam.builder()
  732. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  733. .formUuid("FORM-56E11C4FAB6E4FB594169BB779736FF0ZG91")
  734. .userId("3320511511-1158713155")
  735. .formDataJson(JSON.toJSONString(formdata2))
  736. .build(),YDConf.FORM_OPERATION.create).toString();
  737. log.info("[样品订单流程不发起,采购汇总表已同步]");
  738. }
  739. return McR.success();
  740. }
  741. // 定义核心字段KEY数组
  742. private static final List<String> CORE_KEY_LIST=Arrays.asList("numberField_mfqgmwe6","numberField_mfqgmwe8","textField_mk0jz9i1");//数量 单价 中文颜色
  743. private static final String MATCH_KEY = "textField_mhsj6gtp";
  744. @Override
  745. public McR salesUpdate(Map body_new) throws JacksonException {
  746. /*todo:1、修改销售明细的颜色、数量、单价(已实现) 2、修改计划交货日期(进行中)*/
  747. // 查询销售订单明细
  748. HashMap head = new HashMap();
  749. head.put("X-AUTH",HeiHuAccessToken().getData().toString());
  750. head.put("Content-Type","application/json");
  751. HashMap bodyy = new HashMap();
  752. bodyy.put("orderNo",body_new.get("order").toString());
  753. String saleDetails = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/saleOrder/queryList2", head, null, bodyy);
  754. JSONArray datas = JSONObject.parseObject(saleDetails).getJSONArray("data");
  755. JSONArray prods = JSONObject.parseObject(saleDetails).getJSONArray("data").getJSONObject(0).getJSONArray("saleManageOrderDetailRowApiVOList");
  756. List<Map<String,Object>> tabledata = new ArrayList();
  757. String customerCode = "";String orderNo = "";
  758. String arrivalPlanTime_New = "";
  759. for (int b=0;b< datas.size();b++){
  760. JSONObject object = datas.getJSONObject(b);
  761. customerCode = object.getString("customerCode");//客户
  762. orderNo = object.getString("orderNo");//订单号
  763. arrivalPlanTime_New = object.getString("arrivalPlanTime");//计划交货日期
  764. }
  765. for (int a=0;a< prods.size();a++){
  766. JSONObject detail = prods.getJSONObject(a);
  767. HashMap row = new HashMap();
  768. String productCode = detail.getString("productCode");//款号
  769. String productName = detail.getString("productName");//产品描述
  770. Double qty = detail.getDouble("qty");//数量
  771. Double unitPrice = detail.getDouble("unitPrice");//单价
  772. double saleamount = detail.getDouble("qty") * detail.getDouble("unitPrice");//销售金额
  773. String color = "";
  774. JSONArray array1 = detail.getJSONArray("customFieldValues");
  775. color = array1.stream()
  776. .map(obj -> (JSONObject) obj)
  777. .filter(item -> item.getIntValue("fieldId") == 82259)
  778. .map(item -> item.getString("value"))
  779. .findFirst()
  780. .orElse(null);
  781. String currency = "";
  782. currency = array1.stream()
  783. .map(obj -> (JSONObject) obj)
  784. .filter(item -> item.getIntValue("fieldId") == 47919)
  785. .map(item -> item.getString("value"))
  786. .findFirst()
  787. .orElse(null); //币别
  788. ArrayList colorList = new ArrayList();
  789. colorList.add(color);
  790. String color_AAA = getProductColor(colorList);//颜色
  791. row.put("textField_mhsj6gtn",customerCode);
  792. row.put("textField_mhsj6gto",orderNo);
  793. row.put("textField_mhsj6gtp",productCode);
  794. row.put("textField_mhsj6gtq",productName);
  795. row.put("textField_mk4rrk35",color_AAA);//
  796. row.put("numberField_mk4rrk3b",qty);//
  797. row.put("numberField_mk4rrk3d",unitPrice);//
  798. row.put("numberField_mk4rrk3e",saleamount);//
  799. row.put("textField_mhtxft3p",currency);
  800. tabledata.add(row);
  801. }
  802. // 销售订单明细转换为宜搭表单字段的 formData
  803. HashMap fromdata = new HashMap();
  804. fromdata.put("tableField_mhsj6gtm",tabledata);
  805. log.info("[修改后的销售明细值],{}",tabledata);
  806. // 查询修改前的宜搭数据 formData
  807. List<Map<String,Object>> tabledata_yida = new ArrayList();
  808. List<Map> list = (List<Map>) ydClient.queryData(YDParam.builder()
  809. .formUuid("FORM-472F0C1BD8DF41FA965A0B4525779B67S421")
  810. .searchCondition(JSONObject.toJSONString(Arrays.asList(new YDSearch(
  811. "textField_mfqgmwcw", orderNo, "订单编号", YDSearch.Type.TEXT_FIELD, YDSearch.Operator.EQ))))
  812. .build()
  813. ,YDConf.FORM_QUERY.retrieve_list).getData();
  814. String formInstanceId = (String) list.get(0).get("formInstanceId");
  815. Map data = (Map) ydClient.queryData(YDParam.builder().formInstId(formInstanceId)
  816. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  817. .userId(ddConf.getOperator()).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  818. String arrivalPlanTime_Old = data.get("dateField_mfqgmwcz").toString();
  819. List<Map<String, Object>> table = (List<Map<String, Object>>) data.get("tableField_mfqgmwe0");
  820. for (Map<String, Object> row : table) {
  821. HashMap row_yida = new HashMap();
  822. row_yida.put("textField_mhsj6gtn",data.get("textField_mfqgmwcx"));
  823. row_yida.put("textField_mhsj6gto",data.get("textField_mfqgmwcw"));
  824. row_yida.put("textField_mhsj6gtp",row.get("textField_mfqgmwe1"));
  825. row_yida.put("textField_mhsj6gtq",row.get("textField_mfqgmwe2"));
  826. row_yida.put("textField_mk4rrk35",row.get("textField_mk0jz9i1"));
  827. row_yida.put("numberField_mk4rrk3b",row.get("numberField_mfqgmwe6"));
  828. row_yida.put("numberField_mk4rrk3d",row.get("numberField_mfqgmwe8"));
  829. row_yida.put("numberField_mk4rrk3e",row.get("numberField_mfqgmweb"));
  830. row_yida.put("textField_mhtxft3p",row.get("textField_mk0xio3b"));
  831. tabledata_yida.add(row_yida);
  832. }
  833. HashMap fromdata_yida = new HashMap();
  834. fromdata_yida.put("tableField_mhsj6gtm",tabledata_yida);
  835. log.info("[修改前的销售明细值],{}",tabledata_yida);
  836. // 对比获取变更的KEY列表 AI
  837. List<Map<String, Object>> result = compareAndGetChanges(tabledata_yida, tabledata);
  838. log.info("[变更的值],{}",result);
  839. // 包含 发起宜搭审批
  840. StartYidaAproval(orderNo,"FORM-9A44F1DA0F5B4D319A6D06692767564CFHDS");
  841. //查找销售订单变更审批的实例id
  842. List<Map> lis = (List<Map>) ydClient.queryData(YDParam.builder()
  843. .formUuid("FORM-9A44F1DA0F5B4D319A6D06692767564CFHDS")
  844. .searchCondition(JSONObject.toJSONString(Arrays.asList(new YDSearch(
  845. "textField_mfqgmwcw", orderNo, "订单编号", YDSearch.Type.TEXT_FIELD, YDSearch.Operator.EQ))))
  846. .build()
  847. ,YDConf.FORM_QUERY.retrieve_list).getData();
  848. String instanceId = (String) lis.get(0).get("formInstanceId");
  849. log.info("[销售订单审批变更的实例id],{}",instanceId);
  850. //把变更的数据整理去走operateData方法
  851. Map<String, List<Map<String, Object>>> grouped = result.stream()
  852. .collect(Collectors.groupingBy(m -> (String) m.get("billNo")));
  853. List<Map<String, Object>> ret = new ArrayList<>();
  854. for (List<Map<String, Object>> group : grouped.values()) {
  855. Map<String, Object> merged = new LinkedHashMap<>(); // 保持插入顺序(可选)
  856. for (Map<String, Object> item : group) {
  857. String field = (String) item.get("field");
  858. Object oldValue = item.get("oldValue");
  859. merged.put(field, oldValue);
  860. }
  861. ret.add(merged);
  862. }
  863. System.out.println("即将插入的数据" + ret);
  864. Map formdata = new HashMap();
  865. if(!arrivalPlanTime_New.equals(arrivalPlanTime_Old)){
  866. formdata.put("textareaField_mjghnmvv",AAAA(arrivalPlanTime_Old));
  867. }
  868. formdata.put("tableField_mk4rrk3k",ret);
  869. ydClient.operateData(YDParam.builder()
  870. .formInstanceId(instanceId)
  871. .updateFormDataJson(JSONObject.toJSONString(formdata))
  872. .build(),YDConf.FORM_OPERATION.update);
  873. return McR.success();
  874. }
  875. /**
  876. * 对比新旧列表,返回所有变更项(Java 8 兼容)
  877. *
  878. * 返回格式:List<Map<String, Object>>
  879. * 每个 Map 包含:
  880. * - "billNo": 单号(textField_mhsj6gtp 的值)
  881. * - "field": 变更的字段名
  882. * - "oldValue": 旧值
  883. * - "newValue": 新值
  884. */
  885. public static List<Map<String, Object>> compareAndGetChanges(
  886. List<Map<String, Object>> oldList,
  887. List<Map<String, Object>> newList) {
  888. Map<String, Map<String, Object>> oldIndex = toIndex(oldList);
  889. Map<String, Map<String, Object>> newIndex = toIndex(newList);
  890. List<Map<String, Object>> changes = new ArrayList<>();
  891. for (String billNo : oldIndex.keySet()) {
  892. Map<String, Object> oldRow = oldIndex.get(billNo);
  893. Map<String, Object> newRow = newIndex.get(billNo);
  894. if (newRow == null) {
  895. continue;
  896. }
  897. for (Map.Entry<String, Object> entry : oldRow.entrySet()) {
  898. String field = entry.getKey();
  899. Object oldValue = entry.getValue();
  900. Object newValue = newRow.get(field);
  901. if (!Objects.equals(oldValue, newValue)) {
  902. Map<String, Object> change = new HashMap<>();
  903. change.put("billNo", billNo);
  904. change.put("field", field);
  905. change.put("oldValue", oldValue);
  906. change.put("newValue", newValue);
  907. changes.add(change);
  908. }
  909. }
  910. }
  911. return changes;
  912. }
  913. // 构建以 textField_mhsj6gtp 为 key 的索引
  914. private static Map<String, Map<String, Object>> toIndex(List<Map<String, Object>> list) {
  915. Map<String, Map<String, Object>> index = new HashMap<>();
  916. for (Map<String, Object> row : list) {
  917. if (row.containsKey(MATCH_KEY)) {
  918. String key = String.valueOf(row.get(MATCH_KEY));
  919. // 避免重复 key 覆盖(保留第一个)
  920. if (!index.containsKey(key)) {
  921. index.put(key, row);
  922. }
  923. }
  924. }
  925. return index;
  926. }
  927. /*返回备注信息*/
  928. public static String AAAA(String ccc){
  929. String aa = "";
  930. String dd = Instant.ofEpochMilli(Long.parseLong(ccc))
  931. .atZone(ZoneId.of("Asia/Shanghai"))
  932. .format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
  933. aa = "{\"dateField_mfqgmwcz\":\"<article class=\\\"4ever-xarticle\\\"><p style=\\\"text-align:left;text-indent:0;margin-left:0;margin-top:0;margin-bottom:0\\\"><span style=\\\"color:#FE0300\\\">" + dd +"</span></p></article>\"}";
  934. return aa;
  935. }
  936. @Override
  937. public String getProductColor(List list) throws JacksonException {
  938. HashMap header = new HashMap();
  939. header.put("X-AUTH",HeiHuAccessToken().getData().toString());
  940. header.put("Content-Type","application/json");
  941. HashMap body = new HashMap();
  942. body.put("type","PRODUCT");
  943. body.put("ids",list);
  944. String doPost = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/customField/associatedBusinessObject/entity/queryList", header, null, body);
  945. JSONObject jsonObject = JSONObject.parseObject(doPost);
  946. JSONArray dataArray = jsonObject.getJSONArray("data");
  947. System.out.println(dataArray);
  948. /* String productName = "";
  949. for (int i = 0; i < dataArray.size(); i++) {
  950. JSONObject data = dataArray.getJSONObject(i);
  951. productName = data.getString("productName");
  952. }*/
  953. String colorValue = "";
  954. if (dataArray != null && dataArray.size() > 0) {
  955. JSONObject data = dataArray.getJSONObject(0);
  956. JSONObject customFieldValues = data.getJSONObject("customFieldValues");
  957. if (customFieldValues != null) {
  958. // 直接获取指定字段的值
  959. colorValue = customFieldValues.getString("product1741831360685211");
  960. }
  961. }
  962. return colorValue;
  963. }
  964. @Override
  965. public McR purchaseSchedule() throws JacksonException {
  966. HashMap header = new HashMap();
  967. header.put("X-AUTH", HeiHuAccessToken().getData().toString());
  968. header.put("Content-Type", "application/json");
  969. String targetValue = "合同确认,提交审批";
  970. // String targetValue1 = "合同修改,修改审批";
  971. Map<String, List<String>> purchaserOrderCodes = new HashMap<>();
  972. int pageNum = 1;
  973. int pageSize = 100;
  974. boolean hasMoreData = true;
  975. while (hasMoreData) {
  976. HashMap body = new HashMap();
  977. Map<String, Integer> page = new HashMap<>();
  978. page.put("pageNum", pageNum);
  979. page.put("pageSize", pageSize);
  980. List<Integer> status = Arrays.asList(1);
  981. body.put("page", page);
  982. body.put("status", status);
  983. String doPost = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/queryList2", header, null, body);//查询采购订单
  984. ObjectMapper mapper = new ObjectMapper();
  985. Map<String, Object> response = mapper.readValue(doPost, Map.class);
  986. if (!"01000000".equals(response.get("code"))) {
  987. System.out.println("请求失败: " + response.get("msg"));
  988. break;
  989. }
  990. List<Map<String, Object>> dataList = (List<Map<String, Object>>) response.get("data");
  991. if (dataList != null) {
  992. for (Map<String, Object> item : dataList) {
  993. String purchaserName = (String) item.get("purchaserName");
  994. if (purchaserName == null) purchaserName = "未知";
  995. boolean hasTargetStatus = false;
  996. List<Map<String, Object>> customFieldValues = (List<Map<String, Object>>) item.get("customFieldValues");
  997. if (customFieldValues != null) {
  998. for (Map<String, Object> field : customFieldValues) {
  999. // if (targetValue.equals(field.get("value") ) || targetValue1.equals(field.get("value"))) {
  1000. if (targetValue.equals(field.get("value"))) {
  1001. hasTargetStatus = true;
  1002. break;
  1003. }
  1004. }
  1005. }
  1006. if (hasTargetStatus) {
  1007. String orderCode = (String) item.get("orderCode");
  1008. if (orderCode != null) {
  1009. purchaserOrderCodes.computeIfAbsent(purchaserName, k -> new ArrayList<>()).add(orderCode);
  1010. }
  1011. }
  1012. }
  1013. hasMoreData = dataList.size() >= pageSize;
  1014. } else {
  1015. hasMoreData = false;
  1016. }
  1017. pageNum++;
  1018. try {
  1019. Thread.sleep(200);
  1020. } catch (InterruptedException e) {
  1021. e.printStackTrace();
  1022. }
  1023. }
  1024. // 输出所有采购员的待审批订单
  1025. System.out.println("========== 所有采购员的待审批订单统计 ==========");
  1026. if (purchaserOrderCodes.isEmpty()) {
  1027. System.out.println("没有找到钉钉审批状态为'" + targetValue + "'的订单");
  1028. } else {
  1029. int totalPurchasers = purchaserOrderCodes.size();
  1030. int totalOrders = purchaserOrderCodes.values().stream().mapToInt(List::size).sum();
  1031. System.out.println("共找到 " + totalOrders + " 个待审批订单");
  1032. System.out.println("涉及 " + totalPurchasers + " 位采购员");
  1033. System.out.println();
  1034. // 输出每个采购员的情况
  1035. for (Map.Entry<String, List<String>> entry : purchaserOrderCodes.entrySet()) {
  1036. String purchaserName = entry.getKey();
  1037. List<String> orderCodes = entry.getValue();
  1038. int orderCount = orderCodes.size();
  1039. System.out.println("采购员: " + purchaserName);
  1040. System.out.println("待审批订单数量: " + orderCount);
  1041. if (orderCount > 1) {
  1042. System.out.println("⚠️ 注意:该采购员有 " + orderCount + " 个待审批订单");
  1043. }
  1044. System.out.println("订单编号: " + String.join(", ", orderCodes));
  1045. System.out.println();
  1046. }
  1047. // 按订单数量排序输出
  1048. System.out.println("========== 按待审批订单数量排序 ==========");
  1049. purchaserOrderCodes.entrySet().stream()
  1050. .sorted((e1, e2) -> Integer.compare(e2.getValue().size(), e1.getValue().size()))
  1051. .forEach(entry -> {
  1052. String purchaserName = entry.getKey();
  1053. List<String> orderCodes = entry.getValue();
  1054. System.out.println(purchaserName + " (" + orderCodes.size() + "个): " +
  1055. String.join(", ", orderCodes));
  1056. // ========== 修改点1:声明两个列表分别存储不同毛利率的订单数据 ==========
  1057. // 针对同一个采购员,遍历下面的订单编号
  1058. System.out.println("开始处理采购员 " + purchaserName + " 的 " + orderCodes.size() + " 个待审批订单");
  1059. // 高毛利率表单数据 (mlv >= 0.15)
  1060. HashMap formdataHigh = new HashMap();
  1061. List<Map<String,String>> tabledataHigh = new ArrayList();
  1062. // 低毛利率表单数据 (mlv < 0.15)
  1063. HashMap formdataLow = new HashMap();
  1064. List<Map<String,String>> tabledataLow = new ArrayList();
  1065. // ========== 修改点2:为每个订单创建临时存储列表 ==========
  1066. // 用于暂存每个订单的明细数据,等计算出毛利率后再决定添加到哪个列表
  1067. Map<String, List<Map<String, String>>> tempOrderDataMap = new HashMap<>();
  1068. // 用于存储每个订单的汇总数据,用于计算毛利率
  1069. Map<String, Map<String, Double>> orderSummaryForMlv = new HashMap<>();
  1070. for (String orderCode : orderCodes) {
  1071. System.out.println("正在处理订单: " + orderCode);
  1072. // ========== 修改点3:为当前订单创建临时数据存储 ==========
  1073. List<Map<String, String>> currentOrderRows = new ArrayList<>();
  1074. double orderTotalSalesAmount = 0.0;
  1075. double orderTotalPurchaseAmount = 0.0;
  1076. double orderTotalFlygcb = 0.0;
  1077. //todo:查询订单的销售订单 | 客户 销售订单号 款式 产品描述 颜色 | 数量 销售单价 销售金额 | 币别 美金汇率 辅料预估成本 销售总金额
  1078. String customerName = "",orderNumber ="",styleNumber ="",productDescription = "",color = "";
  1079. Double number,unitPrice,salesAmount;
  1080. String currency = ""; Double USDrate = 0.00; Double flygcb = 0.00; Double saletotalAmount = 0.00;
  1081. Double estimatedPrice = 0.00;//辅料预估单价
  1082. HashMap body = new HashMap();
  1083. body.put("orderCode",orderCode);//订单编号
  1084. String jsonString = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/queryList2", header, null, body);
  1085. //todo:查询采购订单 生产工厂(供应商)
  1086. String shortName = "";
  1087. JSONArray dataArray = JSONObject.parseObject(jsonString).getJSONArray("data");
  1088. for (int i=0;i<dataArray.size();i++) {
  1089. JSONObject data = dataArray.getJSONObject(i);
  1090. shortName = data.getString("shortName");//供应商:shortName
  1091. }
  1092. JSONArray products = JSONObject.parseObject(jsonString).getJSONArray("data").getJSONObject(0).getJSONArray("purchaseSubOrderVOS");
  1093. ObjectMapper objectMapper = new ObjectMapper();
  1094. JsonNode rootNode = null;
  1095. try {
  1096. rootNode = objectMapper.readTree(jsonString);
  1097. } catch (JsonProcessingException e) {
  1098. throw new RuntimeException(e);
  1099. }
  1100. JsonNode dataNode = rootNode.get("data");
  1101. if(dataNode != null && dataNode.isArray()){
  1102. for(JsonNode item : dataNode){
  1103. JsonNode orderNoNode = item.get("orderCode");
  1104. JsonNode saleOrders = item.get("relationSaleOrders");
  1105. if(saleOrders != null && saleOrders.isArray() && saleOrders.size() > 0){
  1106. orderNumber = saleOrders.get(0).asText();//销售订单号
  1107. }
  1108. }
  1109. }
  1110. HashMap body_A = new HashMap();
  1111. body_A.put("orderNo",orderNumber);
  1112. String jsonString2 = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/saleOrder/queryList2", header, null, body_A);//todo:查询销售订单,获取客户、订单号、款号、产品描述、颜色、数量、销售单价、销售金额、币别
  1113. JSONArray array = JSONObject.parseObject(jsonString2).getJSONArray("data");//主表数据
  1114. for(int i=0;i<array.size();i++){
  1115. JSONObject data = array.getJSONObject(i);
  1116. customerName = data.getString("customerCode");//客户
  1117. }
  1118. ObjectMapper objectMapper2 = new ObjectMapper();
  1119. JsonNode dataNode2 = null;//主表数据
  1120. try {
  1121. dataNode2 = objectMapper2.readTree(jsonString2).get("data");
  1122. } catch (JsonProcessingException e) {
  1123. throw new RuntimeException(e);
  1124. }
  1125. for (JsonNode item : dataNode2){
  1126. JsonNode customFieldValues = item.get("customFieldValues");
  1127. for (JsonNode field : customFieldValues){
  1128. JsonNode fieldIdNode = field.get("fieldId");
  1129. if(fieldIdNode != null && fieldIdNode.asInt() == 161769){
  1130. JsonNode valueNode = field.get("value");
  1131. if(valueNode != null){
  1132. estimatedPrice = valueNode.asDouble();//辅料预估单价
  1133. break;
  1134. }
  1135. }
  1136. }
  1137. }
  1138. JSONArray products_A = JSONObject.parseObject(jsonString2).getJSONArray("data").getJSONObject(0).getJSONArray("saleManageOrderDetailRowApiVOList");//销售订单明细数据
  1139. if(products_A != null) {
  1140. for (int i = 0; i < products_A.size(); i++) {
  1141. JSONObject detail = products_A.getJSONObject(i);
  1142. HashMap row = new HashMap();
  1143. row.put("textField_mm2t71jm",orderCode);//todo:采购订单单号
  1144. row.put("textField_ml6g7k5e", customerName);//todo:客户
  1145. row.put("textField_ml6g7k5f", orderNumber);//todo:订单号
  1146. styleNumber = detail.getString("productCode");//款号
  1147. row.put("textField_ml7c3yhq", styleNumber);//todo:款号
  1148. productDescription = detail.getString("productName");//产品描述
  1149. row.put("textField_ml7c3yhr", productDescription);//todo:产品描述
  1150. JSONArray array1 = detail.getJSONArray("customFieldValues");
  1151. color = array1.stream()
  1152. .map(obj -> (JSONObject) obj)
  1153. .filter(item -> item.getIntValue("fieldId") == 82259)
  1154. .map(item -> item.getString("value"))
  1155. .findFirst()
  1156. .orElse(null);
  1157. ArrayList colorList = new ArrayList();
  1158. colorList.add(color);
  1159. String color_AAA = null;
  1160. try {
  1161. color_AAA = getProductColor(colorList);
  1162. } catch (JacksonException e) {
  1163. throw new RuntimeException(e);
  1164. }
  1165. row.put("textField_ml7c3yhs", color_AAA);//todo:颜色
  1166. number = detail.getDoubleValue("qty");//数量
  1167. row.put("numberField_ml7c3yht", number);//todo:数量
  1168. unitPrice = detail.getDoubleValue("unitPrice");//销售单价
  1169. row.put("numberField_ml7c3yhu", unitPrice);//todo:销售单价
  1170. salesAmount = number * unitPrice;//销售金额
  1171. row.put("numberField_ml7c3yhv", salesAmount);//todo:销售金额
  1172. String customFieldValues = detail.getString("customFieldValues");
  1173. ObjectMapper mapper = new ObjectMapper();
  1174. JsonNode jsonarray = null;
  1175. try {
  1176. jsonarray = mapper.readTree(customFieldValues);
  1177. } catch (JsonProcessingException e) {
  1178. throw new RuntimeException(e);
  1179. }
  1180. for (JsonNode node : jsonarray) {
  1181. if (node.get("fieldId").asInt() == 47919) {
  1182. currency = node.get("value").asText();
  1183. } else if (node.get("fieldId").asInt() == 165251) {
  1184. USDrate = node.get("value").asDouble();
  1185. } else if (node.get("fieldId").asInt() == 161783) {
  1186. flygcb = node.get("value").asDouble();
  1187. }
  1188. }
  1189. row.put("textField_ml7c3yhw", currency);//todo:币别
  1190. row.put("numberField_ml86221y", USDrate);//todo:美金汇率
  1191. row.put("numberField_ml86221z", flygcb);//todo:辅料预估成本
  1192. if(currency.equals("USD")){
  1193. saletotalAmount = salesAmount * USDrate;
  1194. }else {
  1195. saletotalAmount = salesAmount;
  1196. }
  1197. row.put("numberField_ml862220",saletotalAmount);
  1198. //下面是采购订单的明细数据
  1199. row.put("textField_ml7c3yhx",shortName);//todo:生产工厂
  1200. for(int j=0;j<products.size();j++){
  1201. if(styleNumber.equals(products.getJSONObject(j).getString("productCode"))){
  1202. //找到对应的采购一行数据
  1203. row.put("numberField_ml7c3yhy",products.getJSONObject(j).getDouble("purchasePrice"));//todo:采购单价
  1204. row.put("numberField_ml7c3yhz",products.getJSONObject(j).getDouble("purchaseNum"));//todo:采购数量
  1205. row.put("numberField_ml7c3yi0",products.getJSONObject(j).getDouble("purchasePrice") * products.getJSONObject(j).getDouble("purchaseNum"));//todo:采购金额
  1206. }
  1207. }
  1208. // ========== 修改点4:将当前行转换为Map<String,String>并暂存 ==========
  1209. Map<String, String> rowMap = new HashMap<>();
  1210. for (Object key : row.keySet()) {
  1211. Object value = row.get(key);
  1212. rowMap.put(key.toString(), value != null ? value.toString() : "");
  1213. }
  1214. currentOrderRows.add(rowMap);
  1215. // ========== 修改点5:累加当前订单的汇总数据用于计算毛利率 ==========
  1216. orderTotalSalesAmount += saletotalAmount;
  1217. orderTotalPurchaseAmount += (Double)row.get("numberField_ml7c3yi0");
  1218. orderTotalFlygcb += flygcb;
  1219. }
  1220. }
  1221. // ========== 修改点6:计算当前订单的毛利率 ==========
  1222. double mlv = 0.0;
  1223. if (orderTotalSalesAmount > 0) {
  1224. mlv = (orderTotalSalesAmount - orderTotalPurchaseAmount - orderTotalFlygcb) / orderTotalSalesAmount;
  1225. }
  1226. System.out.println("订单 " + orderCode + " 毛利率: " + String.format("%.2f%%", mlv * 100));
  1227. // ========== 修改点7:根据毛利率决定添加到哪个列表 ==========
  1228. if (mlv >= 0.15) {
  1229. // 高毛利率订单
  1230. tabledataHigh.addAll(currentOrderRows);
  1231. System.out.println("订单 " + orderCode + " 归类到高毛利率审批(>=15%)");
  1232. } else {
  1233. // 低毛利率订单
  1234. tabledataLow.addAll(currentOrderRows);
  1235. System.out.println("订单 " + orderCode + " 归类到低毛利率审批(<15%)");
  1236. }
  1237. }
  1238. // ========== 修改点8:分别处理高低毛利率的审批 ==========
  1239. // 处理高毛利率的审批 (mlv >= 0.15)
  1240. if (!tabledataHigh.isEmpty()) {
  1241. System.out.println("\n========== 开始处理高毛利率审批(>=15%),共 " + tabledataHigh.size() + " 条明细 ==========");
  1242. //组装数据塞到采购明细表
  1243. formdataHigh.put("tableField_ml6g7k5d", tabledataHigh);
  1244. //组装数据塞到采购审批单号明细
  1245. List<Map<String, String>> orderSummaryListHigh = calculateOrderSummary(tabledataHigh);
  1246. formdataHigh.put("tableField_ml7ch2pj", orderSummaryListHigh);
  1247. //数值统计毛利率
  1248. int szHigh = 0;
  1249. for (Map map : orderSummaryListHigh) {
  1250. Object numberFieldMm2t71jo = map.get("numberField_mm2t71jo");
  1251. log.info((String) numberFieldMm2t71jo);
  1252. szHigh += Integer.parseInt((String) numberFieldMm2t71jo);
  1253. }
  1254. formdataHigh.put("numberField_mm2t71jp", szHigh);
  1255. /*发起流程 - 高毛利率审批*/
  1256. String userId = getDDToken(purchaserName);
  1257. ydClient.operateData(YDParam.builder()
  1258. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  1259. .formUuid("FORM-3A54B12BE3D241218A75242B935F2987YWV2") // 高毛利率使用原表单
  1260. .userId(userId)
  1261. .formDataJson(JSON.toJSONString(formdataHigh))
  1262. .build(), YDConf.FORM_OPERATION.start).toString();
  1263. /*修改采购订单为审批中*/
  1264. for (Map map : orderSummaryListHigh) {
  1265. String textFieldMl7ch2pk = (String) map.get("textField_ml7ch2pk");
  1266. callback(textFieldMl7ch2pk);
  1267. }
  1268. System.out.println("高毛利率审批流程发起完成");
  1269. }
  1270. // 处理低毛利率的审批 (mlv < 0.15)
  1271. if (!tabledataLow.isEmpty()) {
  1272. System.out.println("\n========== 开始处理低毛利率审批(<15%),共 " + tabledataLow.size() + " 条明细 ==========");
  1273. //组装数据塞到采购明细表
  1274. formdataLow.put("tableField_ml6g7k5d", tabledataLow);
  1275. //组装数据塞到采购审批单号明细
  1276. List<Map<String, String>> orderSummaryListLow = calculateOrderSummary(tabledataLow);
  1277. formdataLow.put("tableField_ml7ch2pj", orderSummaryListLow);
  1278. //数值统计毛利率
  1279. int szLow = 0;
  1280. for (Map map : orderSummaryListLow) {
  1281. Object numberFieldMm2t71jo = map.get("numberField_mm2t71jo");
  1282. log.info((String) numberFieldMm2t71jo);
  1283. szLow += Integer.parseInt((String) numberFieldMm2t71jo);
  1284. }
  1285. formdataLow.put("numberField_mm2t71jp", szLow);
  1286. /*发起流程 - 低毛利率审批*/
  1287. String userId = getDDToken(purchaserName);
  1288. // ========== 修改点9:如果低毛利率需要不同表单,可以在这里修改formUuid ==========
  1289. ydClient.operateData(YDParam.builder()
  1290. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  1291. .formUuid("FORM-3A54B12BE3D241218A75242B935F2987YWV2") // 如果需要不同流程,替换这里的UUID
  1292. .userId(userId)
  1293. .formDataJson(JSON.toJSONString(formdataLow))
  1294. .build(), YDConf.FORM_OPERATION.start).toString();
  1295. /*修改采购订单为审批中*/
  1296. for (Map map : orderSummaryListLow) {
  1297. String textFieldMl7ch2pk = (String) map.get("textField_ml7ch2pk");
  1298. callback(textFieldMl7ch2pk);
  1299. }
  1300. System.out.println("低毛利率审批流程发起完成");
  1301. }
  1302. });
  1303. }
  1304. return null;
  1305. }
  1306. @Override
  1307. public McR purchaseUpdateSchedule() throws JacksonException {
  1308. HashMap header = new HashMap();
  1309. header.put("X-AUTH", HeiHuAccessToken().getData().toString());
  1310. header.put("Content-Type", "application/json");
  1311. String targetValue = "合同修改,修改审批";
  1312. Map<String, List<String>> purchaserOrderCodes = new HashMap<>();
  1313. int pageNum = 1;
  1314. int pageSize = 100;
  1315. boolean hasMoreData = true;
  1316. boolean isUpdate = false;
  1317. while (hasMoreData) {
  1318. HashMap body = new HashMap();
  1319. Map<String, Integer> page = new HashMap<>();
  1320. page.put("pageNum", pageNum);
  1321. page.put("pageSize", pageSize);
  1322. List<Integer> status = Arrays.asList(1);
  1323. body.put("page", page);
  1324. body.put("status", status);
  1325. String doPost = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/queryList2", header, null, body);//查询采购订单
  1326. ObjectMapper mapper = new ObjectMapper();
  1327. Map<String, Object> response = mapper.readValue(doPost, Map.class);
  1328. if (!"01000000".equals(response.get("code"))) {
  1329. System.out.println("请求失败: " + response.get("msg"));
  1330. break;
  1331. }
  1332. List<Map<String, Object>> dataList = (List<Map<String, Object>>) response.get("data");
  1333. if (dataList != null) {
  1334. for (Map<String, Object> item : dataList) {
  1335. String purchaserName = (String) item.get("purchaserName");
  1336. if (purchaserName == null) purchaserName = "未知";
  1337. boolean hasTargetStatus = false;
  1338. List<Map<String, Object>> customFieldValues = (List<Map<String, Object>>) item.get("customFieldValues");
  1339. if (customFieldValues != null) {
  1340. for (Map<String, Object> field : customFieldValues) {
  1341. if (targetValue.equals(field.get("value"))) {
  1342. hasTargetStatus = true;
  1343. break;
  1344. }
  1345. }
  1346. }
  1347. if (hasTargetStatus) {
  1348. String orderCode = (String) item.get("orderCode");
  1349. if (orderCode != null) {
  1350. purchaserOrderCodes.computeIfAbsent(purchaserName, k -> new ArrayList<>()).add(orderCode);
  1351. }
  1352. }
  1353. }
  1354. hasMoreData = dataList.size() >= pageSize;
  1355. } else {
  1356. hasMoreData = false;
  1357. }
  1358. pageNum++;
  1359. try {
  1360. Thread.sleep(200);
  1361. } catch (InterruptedException e) {
  1362. e.printStackTrace();
  1363. }
  1364. }
  1365. // 输出所有采购员的待审批订单
  1366. System.out.println("========== 所有采购员的待审批订单统计 ==========");
  1367. if (purchaserOrderCodes.isEmpty()) {
  1368. System.out.println("没有找到钉钉审批状态为'" + targetValue + "'的订单");
  1369. } else {
  1370. int totalPurchasers = purchaserOrderCodes.size();
  1371. int totalOrders = purchaserOrderCodes.values().stream().mapToInt(List::size).sum();
  1372. System.out.println("共找到 " + totalOrders + " 个待审批订单");
  1373. System.out.println("涉及 " + totalPurchasers + " 位采购员");
  1374. System.out.println();
  1375. // 输出每个采购员的情况
  1376. for (Map.Entry<String, List<String>> entry : purchaserOrderCodes.entrySet()) {
  1377. String purchaserName = entry.getKey();
  1378. List<String> orderCodes = entry.getValue();
  1379. int orderCount = orderCodes.size();
  1380. System.out.println("采购员: " + purchaserName);
  1381. System.out.println("待审批订单数量: " + orderCount);
  1382. if (orderCount > 1) {
  1383. System.out.println("⚠️ 注意:该采购员有 " + orderCount + " 个待审批订单");
  1384. }
  1385. System.out.println("订单编号: " + String.join(", ", orderCodes));
  1386. System.out.println();
  1387. }
  1388. // 按订单数量排序输出
  1389. System.out.println("========== 按待审批订单数量排序 ==========");
  1390. purchaserOrderCodes.entrySet().stream()
  1391. .sorted((e1, e2) -> Integer.compare(e2.getValue().size(), e1.getValue().size()))
  1392. .forEach(entry -> {
  1393. String purchaserName = entry.getKey();
  1394. List<String> orderCodes = entry.getValue();
  1395. System.out.println(purchaserName + " (" + orderCodes.size() + "个): " +
  1396. String.join(", ", orderCodes));
  1397. // ========== 修改点1:声明两个列表分别存储不同毛利率的订单数据 ==========
  1398. // 针对同一个采购员,遍历下面的订单编号
  1399. System.out.println("开始处理采购员 " + purchaserName + " 的 " + orderCodes.size() + " 个待审批订单");
  1400. // 高毛利率表单数据 (mlv >= 0.15)
  1401. HashMap formdataHigh = new HashMap();
  1402. List<Map<String,String>> tabledataHigh = new ArrayList();
  1403. // 低毛利率表单数据 (mlv < 0.15)
  1404. HashMap formdataLow = new HashMap();
  1405. List<Map<String,String>> tabledataLow = new ArrayList();
  1406. // ========== 修改点2:为每个订单创建临时存储列表 ==========
  1407. // 用于暂存每个订单的明细数据,等计算出毛利率后再决定添加到哪个列表
  1408. Map<String, List<Map<String, String>>> tempOrderDataMap = new HashMap<>();
  1409. // 用于存储每个订单的汇总数据,用于计算毛利率
  1410. Map<String, Map<String, Double>> orderSummaryForMlv = new HashMap<>();
  1411. List<String> oldHighIds = new ArrayList<>();
  1412. List<String> oldLowIds = new ArrayList<>();
  1413. for (String orderCode : orderCodes) {
  1414. System.out.println("正在处理订单: " + orderCode);
  1415. // ========== 修改点3:为当前订单创建临时数据存储 ==========
  1416. List<Map<String, String>> currentOrderRows = new ArrayList<>();
  1417. double orderTotalSalesAmount = 0.0;
  1418. double orderTotalPurchaseAmount = 0.0;
  1419. double orderTotalFlygcb = 0.0;
  1420. //todo:查询订单的销售订单 | 客户 销售订单号 款式 产品描述 颜色 | 数量 销售单价 销售金额 | 币别 美金汇率 辅料预估成本 销售总金额
  1421. String customerName = "",orderNumber ="",styleNumber ="",productDescription = "",color = "";
  1422. Double number,unitPrice,salesAmount;
  1423. String currency = ""; Double USDrate = 0.00; Double flygcb = 0.00; Double saletotalAmount = 0.00;
  1424. Double estimatedPrice = 0.00;//辅料预估单价
  1425. HashMap body = new HashMap();
  1426. body.put("orderCode",orderCode);//订单编号
  1427. String jsonString = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/queryList2", header, null, body);
  1428. //todo:查询采购订单 生产工厂(供应商)
  1429. String shortName = "";
  1430. JSONArray dataArray = JSONObject.parseObject(jsonString).getJSONArray("data");
  1431. for (int i=0;i<dataArray.size();i++) {
  1432. JSONObject data = dataArray.getJSONObject(i);
  1433. shortName = data.getString("shortName");//供应商:shortName
  1434. }
  1435. JSONArray products = JSONObject.parseObject(jsonString).getJSONArray("data").getJSONObject(0).getJSONArray("purchaseSubOrderVOS");
  1436. ObjectMapper objectMapper = new ObjectMapper();
  1437. JsonNode rootNode = null;
  1438. try {
  1439. rootNode = objectMapper.readTree(jsonString);
  1440. } catch (JsonProcessingException e) {
  1441. throw new RuntimeException(e);
  1442. }
  1443. JsonNode dataNode = rootNode.get("data");
  1444. if(dataNode != null && dataNode.isArray()){
  1445. for(JsonNode item : dataNode){
  1446. JsonNode orderNoNode = item.get("orderCode");
  1447. JsonNode saleOrders = item.get("relationSaleOrders");
  1448. if(saleOrders != null && saleOrders.isArray() && saleOrders.size() > 0){
  1449. orderNumber = saleOrders.get(0).asText();//销售订单号
  1450. }
  1451. }
  1452. }
  1453. HashMap body_A = new HashMap();
  1454. body_A.put("orderNo",orderNumber);
  1455. String jsonString2 = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/saleOrder/queryList2", header, null, body_A);//todo:查询销售订单,获取客户、订单号、款号、产品描述、颜色、数量、销售单价、销售金额、币别
  1456. JSONArray array = JSONObject.parseObject(jsonString2).getJSONArray("data");//主表数据
  1457. for(int i=0;i<array.size();i++){
  1458. JSONObject data = array.getJSONObject(i);
  1459. customerName = data.getString("customerCode");//客户
  1460. }
  1461. ObjectMapper objectMapper2 = new ObjectMapper();
  1462. JsonNode dataNode2 = null;//主表数据
  1463. try {
  1464. dataNode2 = objectMapper2.readTree(jsonString2).get("data");
  1465. } catch (JsonProcessingException e) {
  1466. throw new RuntimeException(e);
  1467. }
  1468. for (JsonNode item : dataNode2){
  1469. JsonNode customFieldValues = item.get("customFieldValues");
  1470. for (JsonNode field : customFieldValues){
  1471. JsonNode fieldIdNode = field.get("fieldId");
  1472. if(fieldIdNode != null && fieldIdNode.asInt() == 161769){
  1473. JsonNode valueNode = field.get("value");
  1474. if(valueNode != null){
  1475. estimatedPrice = valueNode.asDouble();//辅料预估单价
  1476. break;
  1477. }
  1478. }
  1479. }
  1480. }
  1481. JSONArray products_A = JSONObject.parseObject(jsonString2).getJSONArray("data").getJSONObject(0).getJSONArray("saleManageOrderDetailRowApiVOList");//销售订单明细数据
  1482. if(products_A != null) {
  1483. for (int i = 0; i < products_A.size(); i++) {
  1484. JSONObject detail = products_A.getJSONObject(i);
  1485. HashMap row = new HashMap();
  1486. row.put("textField_mm2t71jm",orderCode);//todo:采购订单单号
  1487. row.put("textField_ml6g7k5e", customerName);//todo:客户
  1488. row.put("textField_ml6g7k5f", orderNumber);//todo:订单号
  1489. styleNumber = detail.getString("productCode");//款号
  1490. row.put("textField_ml7c3yhq", styleNumber);//todo:款号
  1491. productDescription = detail.getString("productName");//产品描述
  1492. row.put("textField_ml7c3yhr", productDescription);//todo:产品描述
  1493. JSONArray array1 = detail.getJSONArray("customFieldValues");
  1494. color = array1.stream()
  1495. .map(obj -> (JSONObject) obj)
  1496. .filter(item -> item.getIntValue("fieldId") == 82259)
  1497. .map(item -> item.getString("value"))
  1498. .findFirst()
  1499. .orElse(null);
  1500. ArrayList colorList = new ArrayList();
  1501. colorList.add(color);
  1502. String color_AAA = null;
  1503. try {
  1504. color_AAA = getProductColor(colorList);
  1505. } catch (JacksonException e) {
  1506. throw new RuntimeException(e);
  1507. }
  1508. row.put("textField_ml7c3yhs", color_AAA);//todo:颜色
  1509. number = detail.getDoubleValue("qty");//数量
  1510. row.put("numberField_ml7c3yht", number);//todo:数量
  1511. unitPrice = detail.getDoubleValue("unitPrice");//销售单价
  1512. row.put("numberField_ml7c3yhu", unitPrice);//todo:销售单价
  1513. salesAmount = number * unitPrice;//销售金额
  1514. row.put("numberField_ml7c3yhv", salesAmount);//todo:销售金额
  1515. String customFieldValues = detail.getString("customFieldValues");
  1516. ObjectMapper mapper = new ObjectMapper();
  1517. JsonNode jsonarray = null;
  1518. try {
  1519. jsonarray = mapper.readTree(customFieldValues);
  1520. } catch (JsonProcessingException e) {
  1521. throw new RuntimeException(e);
  1522. }
  1523. for (JsonNode node : jsonarray) {
  1524. if (node.get("fieldId").asInt() == 47919) {
  1525. currency = node.get("value").asText();
  1526. } else if (node.get("fieldId").asInt() == 165251) {
  1527. USDrate = node.get("value").asDouble();
  1528. } else if (node.get("fieldId").asInt() == 161783) {
  1529. flygcb = node.get("value").asDouble();
  1530. }
  1531. }
  1532. row.put("textField_ml7c3yhw", currency);//todo:币别
  1533. row.put("numberField_ml86221y", USDrate);//todo:美金汇率
  1534. row.put("numberField_ml86221z", flygcb);//todo:辅料预估成本
  1535. if(currency.equals("USD")){
  1536. saletotalAmount = salesAmount * USDrate;
  1537. }else {
  1538. saletotalAmount = salesAmount;
  1539. }
  1540. row.put("numberField_ml862220",saletotalAmount);
  1541. //下面是采购订单的明细数据
  1542. row.put("textField_ml7c3yhx",shortName);//todo:生产工厂
  1543. for(int j=0;j<products.size();j++){
  1544. if(styleNumber.equals(products.getJSONObject(j).getString("productCode"))){
  1545. //找到对应的采购一行数据
  1546. row.put("numberField_ml7c3yhy",products.getJSONObject(j).getDouble("purchasePrice"));//todo:采购单价
  1547. row.put("numberField_ml7c3yhz",products.getJSONObject(j).getDouble("purchaseNum"));//todo:采购数量
  1548. row.put("numberField_ml7c3yi0",products.getJSONObject(j).getDouble("purchasePrice") * products.getJSONObject(j).getDouble("purchaseNum"));//todo:采购金额
  1549. }
  1550. }
  1551. // ========== 修改点4:将当前行转换为Map<String,String>并暂存 ==========
  1552. Map<String, String> rowMap = new HashMap<>();
  1553. for (Object key : row.keySet()) {
  1554. Object value = row.get(key);
  1555. rowMap.put(key.toString(), value != null ? value.toString() : "");
  1556. }
  1557. currentOrderRows.add(rowMap);
  1558. // ========== 修改点5:累加当前订单的汇总数据用于计算毛利率 ==========
  1559. orderTotalSalesAmount += saletotalAmount;
  1560. orderTotalPurchaseAmount += (Double)row.get("numberField_ml7c3yi0");
  1561. orderTotalFlygcb += flygcb;
  1562. }
  1563. }
  1564. // ========== 修改点6:计算当前订单的毛利率 ==========
  1565. double mlv = 0.0;
  1566. if (orderTotalSalesAmount > 0) {
  1567. mlv = (orderTotalSalesAmount - orderTotalPurchaseAmount - orderTotalFlygcb) / orderTotalSalesAmount;
  1568. }
  1569. System.out.println("订单 " + orderCode + " 毛利率: " + String.format("%.2f%%", mlv * 100));
  1570. // ========== 修改点7:根据毛利率决定添加到哪个列表 ==========
  1571. if (mlv >= 0.15) {
  1572. // 高毛利率订单
  1573. tabledataHigh.addAll(currentOrderRows);
  1574. oldHighIds.add(orderCode);
  1575. System.out.println("订单 " + orderCode + " 归类到高毛利率审批(>=15%)");
  1576. } else {
  1577. // 低毛利率订单
  1578. tabledataLow.addAll(currentOrderRows);
  1579. oldLowIds.add(orderCode);
  1580. System.out.println("订单 " + orderCode + " 归类到低毛利率审批(<15%)");
  1581. }
  1582. }
  1583. // ========== 修改点8:分别处理高低毛利率的审批 ==========
  1584. // 处理高毛利率的审批 (mlv >= 0.15)
  1585. if (!tabledataHigh.isEmpty()) {
  1586. System.out.println("\n========== 开始处理高毛利率审批(>=15%),共 " + tabledataHigh.size() + " 条明细 ==========");
  1587. List<Map<String, Object>> oldList = new ArrayList<>();
  1588. oldHighIds.forEach(h->{
  1589. List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
  1590. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  1591. .formUuid("FORM-278D56A5065641F8AC95BCA0A8CE8447D8QY")
  1592. .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_mmx9gyct", h)))
  1593. .build());
  1594. if (ObjectUtil.isNotNull(dataList) && dataList.size()>0){
  1595. List<Map> sonList = ydService.queryDetails(YDParam.builder()
  1596. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  1597. .formInstanceId(UtilMap.getString(dataList.get(0),"textField_mmx9gycu"))
  1598. .formUuid("FORM-3A54B12BE3D241218A75242B935F2987YWV2")
  1599. .tableFieldId("tableField_ml6g7k5d")
  1600. .build());
  1601. if (ObjectUtil.isNotNull(sonList) && sonList.size() > 0){
  1602. sonList.forEach(s->{
  1603. Map<String, Object> map = new HashMap<>();
  1604. TABLEFIELD_ENUM.forEach((k,v)->{
  1605. map.put(v,UtilMap.getString(s,k));
  1606. });
  1607. oldList.add(map);
  1608. });
  1609. }
  1610. }
  1611. });
  1612. //组装数据塞到采购明细表
  1613. formdataHigh.put("tableField_ml6g7k5d", tabledataHigh);
  1614. formdataHigh.put("tableField_mmx6gata", oldList);
  1615. //组装数据塞到采购审批单号明细
  1616. List<Map<String, String>> orderSummaryListHigh = calculateOrderSummary(tabledataHigh);
  1617. formdataHigh.put("tableField_ml7ch2pj", orderSummaryListHigh);
  1618. //数值统计毛利率
  1619. int szHigh = 0;
  1620. for (Map map : orderSummaryListHigh) {
  1621. Object numberFieldMm2t71jo = map.get("numberField_mm2t71jo");
  1622. log.info((String) numberFieldMm2t71jo);
  1623. szHigh += Integer.parseInt((String) numberFieldMm2t71jo);
  1624. }
  1625. formdataHigh.put("numberField_mm2t71jp", szHigh);
  1626. /*发起流程 - 高毛利率审批*/
  1627. String userId = getDDToken(purchaserName);
  1628. ydClient.operateData(YDParam.builder()
  1629. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  1630. .formUuid("FORM-3A54B12BE3D241218A75242B935F2987YWV2") // 高毛利率使用原表单
  1631. .userId(userId)
  1632. .formDataJson(JSON.toJSONString(formdataHigh))
  1633. .build(), YDConf.FORM_OPERATION.start).toString();
  1634. /*修改采购订单为审批中*/
  1635. for (Map map : orderSummaryListHigh) {
  1636. String textFieldMl7ch2pk = (String) map.get("textField_ml7ch2pk");
  1637. callback(textFieldMl7ch2pk);
  1638. }
  1639. System.out.println("高毛利率审批流程发起完成");
  1640. }
  1641. // 处理低毛利率的审批 (mlv < 0.15)
  1642. if (!tabledataLow.isEmpty()) {
  1643. System.out.println("\n========== 开始处理低毛利率审批(<15%),共 " + tabledataLow.size() + " 条明细 ==========");
  1644. List<Map<String, Object>> oldList = new ArrayList<>();
  1645. oldLowIds.forEach(h->{
  1646. List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
  1647. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  1648. .formUuid("FORM-278D56A5065641F8AC95BCA0A8CE8447D8QY")
  1649. .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_mmx9gyct", h)))
  1650. .build());
  1651. if (ObjectUtil.isNotNull(dataList) && dataList.size()>0){
  1652. List<Map> sonList = ydService.queryDetails(YDParam.builder()
  1653. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  1654. .formInstanceId(UtilMap.getString(dataList.get(0),"textField_mmx9gycu"))
  1655. .formUuid("FORM-3A54B12BE3D241218A75242B935F2987YWV2")
  1656. .tableFieldId("tableField_ml6g7k5d")
  1657. .build());
  1658. if (ObjectUtil.isNotNull(sonList) && sonList.size() > 0){
  1659. sonList.forEach(s->{
  1660. Map<String, Object> map = new HashMap<>();
  1661. TABLEFIELD_ENUM.forEach((k,v)->{
  1662. map.put(v,UtilMap.getString(s,k));
  1663. });
  1664. oldList.add(map);
  1665. });
  1666. }
  1667. }
  1668. });
  1669. //组装数据塞到采购明细表
  1670. formdataHigh.put("tableField_mmx6gata", oldList);
  1671. //组装数据塞到采购明细表
  1672. formdataLow.put("tableField_ml6g7k5d", tabledataLow);
  1673. //组装数据塞到采购审批单号明细
  1674. List<Map<String, String>> orderSummaryListLow = calculateOrderSummary(tabledataLow);
  1675. formdataLow.put("tableField_ml7ch2pj", orderSummaryListLow);
  1676. //数值统计毛利率
  1677. int szLow = 0;
  1678. for (Map map : orderSummaryListLow) {
  1679. Object numberFieldMm2t71jo = map.get("numberField_mm2t71jo");
  1680. log.info((String) numberFieldMm2t71jo);
  1681. szLow += Integer.parseInt((String) numberFieldMm2t71jo);
  1682. }
  1683. formdataLow.put("numberField_mm2t71jp", szLow);
  1684. /*发起流程 - 低毛利率审批*/
  1685. String userId = getDDToken(purchaserName);
  1686. // ========== 修改点9:如果低毛利率需要不同表单,可以在这里修改formUuid ==========
  1687. ydClient.operateData(YDParam.builder()
  1688. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  1689. .formUuid("FORM-3A54B12BE3D241218A75242B935F2987YWV2") // 如果需要不同流程,替换这里的UUID
  1690. .userId(userId)
  1691. .formDataJson(JSON.toJSONString(formdataLow))
  1692. .build(), YDConf.FORM_OPERATION.start).toString();
  1693. /*修改采购订单为审批中*/
  1694. for (Map map : orderSummaryListLow) {
  1695. String textFieldMl7ch2pk = (String) map.get("textField_ml7ch2pk");
  1696. callback(textFieldMl7ch2pk);
  1697. }
  1698. System.out.println("低毛利率审批流程发起完成");
  1699. }
  1700. });
  1701. }
  1702. return null;
  1703. }
  1704. private static final Map<String,String> TABLEFIELD_ENUM =new HashMap<>();
  1705. static {
  1706. TABLEFIELD_ENUM.put("textField_mm2t71jm","textField_mmx6gast");
  1707. TABLEFIELD_ENUM.put("textField_ml6g7k5e","textField_mmx6gasu");
  1708. TABLEFIELD_ENUM.put("textField_ml6g7k5f","textField_mmx6gasv");
  1709. TABLEFIELD_ENUM.put("textField_ml7c3yhq","textField_mmx6gasw");
  1710. TABLEFIELD_ENUM.put("textField_ml7c3yhr","textField_mmx6gasx");
  1711. TABLEFIELD_ENUM.put("textField_ml7c3yhs","textField_mmx6gasy");
  1712. TABLEFIELD_ENUM.put("numberField_ml7c3yht","numberField_mmx6gasz");
  1713. TABLEFIELD_ENUM.put("numberField_ml7c3yhu","numberField_mmx6gat0");
  1714. TABLEFIELD_ENUM.put("numberField_ml7c3yhv","numberField_mmx6gat1");
  1715. TABLEFIELD_ENUM.put("textField_ml7c3yhw","textField_mmx6gat2");
  1716. TABLEFIELD_ENUM.put("numberField_ml86221y","numberField_mmx6gat3");
  1717. TABLEFIELD_ENUM.put("numberField_ml86221z","numberField_mmx6gat4");
  1718. TABLEFIELD_ENUM.put("numberField_ml862220","numberField_mmx6gat5");
  1719. TABLEFIELD_ENUM.put("textField_ml7c3yhx","textField_mmx6gat6");
  1720. TABLEFIELD_ENUM.put("numberField_ml7c3yhy","numberField_mmx6gat7");
  1721. TABLEFIELD_ENUM.put("numberField_ml7c3yhz","numberField_mmx6gat8");
  1722. TABLEFIELD_ENUM.put("numberField_ml7c3yi0","numberField_mmx6gat9");
  1723. }
  1724. /**
  1725. * 根据orderCode对tabledata进行分类求和
  1726. * @param tableData 原始明细数据
  1727. * @return 按orderCode汇总后的数据列表(只包含求和结果)
  1728. */
  1729. private List<Map<String, String>> calculateOrderSummary(List<Map<String, String>> tableData) {
  1730. // 使用Map暂存每个orderCode的汇总数据
  1731. Map<String, Map<String, Double>> summaryMap = new LinkedHashMap<>();
  1732. for (Map<String, String> row : tableData) {
  1733. String orderCode = row.get("textField_mm2t71jm"); // 采购订单号
  1734. if (orderCode == null || orderCode.isEmpty()) {
  1735. continue;
  1736. }
  1737. // 获取或创建该订单的汇总Map
  1738. Map<String, Double> orderSum = summaryMap.computeIfAbsent(orderCode,
  1739. k -> {
  1740. Map<String, Double> newMap = new HashMap<>();
  1741. newMap.put("salesAmount", 0.0); // 销售金额总和
  1742. newMap.put("purchaseAmount", 0.0); // 采购金额总和
  1743. newMap.put("flygcb", 0.0); // 辅料预估成本总和
  1744. return newMap;
  1745. });
  1746. // 累加各项金额
  1747. String salesAmountStr = UtilMap.getString(row,"numberField_ml862220");
  1748. String purchaseAmountStr = UtilMap.getString(row,"numberField_ml7c3yi0");
  1749. String flygcbStr = UtilMap.getString(row,"numberField_ml86221z");
  1750. try {
  1751. if (salesAmountStr != null && !salesAmountStr.isEmpty()) {
  1752. orderSum.put("salesAmount",
  1753. orderSum.get("salesAmount") + Double.parseDouble(salesAmountStr));
  1754. }
  1755. if (purchaseAmountStr != null && !purchaseAmountStr.isEmpty()) {
  1756. orderSum.put("purchaseAmount",
  1757. orderSum.get("purchaseAmount") + Double.parseDouble(purchaseAmountStr));
  1758. }
  1759. if (flygcbStr != null && !flygcbStr.isEmpty()) {
  1760. orderSum.put("flygcb",
  1761. orderSum.get("flygcb") + Double.parseDouble(flygcbStr));
  1762. }
  1763. } catch (NumberFormatException e) {
  1764. System.err.println("数字格式错误: " + e.getMessage());
  1765. }
  1766. }
  1767. // 转换为最终的List<Map<String, String>>
  1768. List<Map<String, String>> result = new ArrayList<>();
  1769. for (Map.Entry<String, Map<String, Double>> entry : summaryMap.entrySet()) {
  1770. String orderCode = entry.getKey();
  1771. Map<String, Double> sums = entry.getValue();
  1772. double salesAmount = sums.get("salesAmount");
  1773. double purchaseAmount = sums.get("purchaseAmount");
  1774. double flygcb = sums.get("flygcb");
  1775. // 构建结果行
  1776. Map<String, String> summaryRow = new LinkedHashMap<>();
  1777. summaryRow.put("textField_ml7ch2pk", orderCode);//orderCode:采购审批单单号
  1778. summaryRow.put("numberField_ml862225", formatNumber(salesAmount));//salesAmount:销售总金额
  1779. summaryRow.put("numberField_ml862226", formatNumber(purchaseAmount));//purchaseAmount:采购订单总金额
  1780. summaryRow.put("numberField_ml862228", formatNumber(flygcb));//flygcb:辅料预估总成本
  1781. summaryRow.put("numberField_ml86222d",formatNumber((salesAmount - purchaseAmount - flygcb) / salesAmount));//毛利率
  1782. Double mlv = (salesAmount - purchaseAmount - flygcb) / salesAmount;
  1783. if(mlv >= 0.15){
  1784. summaryRow.put("numberField_mm2t71jo", String.valueOf(1));
  1785. }else {
  1786. summaryRow.put("numberField_mm2t71jo", String.valueOf(0));
  1787. }
  1788. result.add(summaryRow);
  1789. }
  1790. return result;
  1791. }
  1792. /**
  1793. * 格式化数字,去除多余的.0
  1794. */
  1795. private String formatNumber(double number) {
  1796. if (Math.abs(number - Math.round(number)) < 0.000001) {
  1797. return String.valueOf((long) number);
  1798. } else {
  1799. return String.format("%.2f", number);
  1800. }
  1801. }
  1802. /*采购订单发起更新状态*/
  1803. @SneakyThrows
  1804. public McR callback(String orderNum){
  1805. HashMap header = new HashMap();
  1806. header.put("X-AUTH",HeiHuAccessToken().getData().toString());
  1807. header.put("Content-Type","application/json");
  1808. HashMap body = new HashMap();
  1809. body.put("orderCode",orderNum);//订单编号
  1810. String jsonString2 = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/queryList2", header, null, body);//todo:查询采购订单
  1811. JSONArray dataArray = JSONObject.parseObject(jsonString2).getJSONArray("data");
  1812. for (int k=0;k<dataArray.size();k++) {
  1813. JSONObject data = dataArray.getJSONObject(k);
  1814. //提取订单基本信息 并赋值
  1815. HashMap body1 = new HashMap();
  1816. body1.put("orderCode",data.getString("orderCode"));//订单编号:orderCode
  1817. body1.put("vendorCode",data.getString("vendorCode"));//供应商编码:gysnumber
  1818. String aa = data.getLong("purchaseTime").toString();
  1819. String purchaseTime = Instant.ofEpochMilli(Long.parseLong(aa))
  1820. .atZone(ZoneId.of("Asia/Shanghai"))
  1821. .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  1822. body1.put("purchaseTime",purchaseTime);//采购日期:purchaseTime
  1823. String bb = data.getLong("planArrivalTime").toString();
  1824. String planArrivalTime = Instant.ofEpochMilli(Long.parseLong(bb))
  1825. .atZone(ZoneId.of("Asia/Shanghai"))
  1826. .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  1827. body1.put("planArrivalTime",planArrivalTime);//计划到货日期:planArrivalTime
  1828. ArrayList<Map<String,String>> customFiled = new ArrayList();
  1829. HashMap field = new HashMap();
  1830. field.put("name","采购订单钉钉审批状态");
  1831. field.put("value","审批中");//审批状态
  1832. customFiled.add(field);
  1833. body1.put("purchaseOrderCustomFieldsValue",customFiled);
  1834. UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/update", header, null, body1);
  1835. }
  1836. return McR.success();
  1837. }
  1838. /*获取宜搭采购订单汇总*/
  1839. @SneakyThrows
  1840. McR getPurchaseList(){
  1841. log.info("开始查询宜搭采购订单汇总表");
  1842. String formUuid = "FORM-56E11C4FAB6E4FB594169BB779736FF0ZG91";
  1843. YDParam ydParam = YDParam.builder().formUuid(formUuid).build();
  1844. ydParam.setPageSize(1);
  1845. long totalCount = ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_search_form).getTotalCount();
  1846. List<Map> datalist = new ArrayList<>();
  1847. ydParam.setCurrentPage(1);
  1848. ydParam.setPageSize(100);
  1849. int totalPages = (int)Math.ceil((double) totalCount / ydParam.getPageSize());
  1850. for (int page = 1;page <= totalPages;page++){
  1851. ydParam.setCurrentPage(page);
  1852. datalist.addAll((List<Map>) ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_search_form).getData());
  1853. }
  1854. int i =0;
  1855. String jsonStr = "";
  1856. Map<String, String> orderMap = new HashMap<>();//格式:采购订单/关联销售订单
  1857. for(Map li : datalist){
  1858. i++;
  1859. // log.info("{}/{}",i,datalist.size());
  1860. jsonStr = li.get("formData").toString();
  1861. String orderNum = new ObjectMapper().readTree(jsonStr).get("textField_mgq932hi").asText();
  1862. String relatedOrderNum = new ObjectMapper().readTree(jsonStr).get("textField_mhyh7ues").asText();
  1863. orderMap.put(orderNum, relatedOrderNum);
  1864. }
  1865. return McR.success(orderMap);
  1866. }
  1867. }