JianhuiServiceImpl.java 66 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391
  1. package com.malk.jianhui.service.impl;
  2. import cn.hutool.core.date.DateUtil;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.google.gson.Gson;
  5. import com.kingdee.bos.webapi.entity.IdentifyInfo;
  6. import com.kingdee.bos.webapi.entity.RepoRet;
  7. import com.malk.jianhui.config.KDWebApiConf;
  8. import com.malk.jianhui.entity.*;
  9. import com.malk.jianhui.service.JianhuiService;
  10. import com.malk.server.aliwork.YDConf;
  11. import com.malk.server.aliwork.YDParam;
  12. import com.malk.server.common.McR;
  13. import com.malk.server.dingtalk.DDConf;
  14. import com.malk.server.dingtalk.DDR_New;
  15. import com.malk.service.aliwork.YDClient;
  16. import com.malk.service.dingtalk.DDClient;
  17. import com.malk.utils.UtilHttp;
  18. import com.malk.utils.UtilMap;
  19. import lombok.extern.slf4j.Slf4j;
  20. import org.apache.logging.log4j.util.Strings;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.scheduling.annotation.Async;
  23. import org.springframework.stereotype.Service;
  24. import com.kingdee.bos.webapi.sdk.K3CloudApi;
  25. import java.math.BigDecimal;
  26. import java.text.SimpleDateFormat;
  27. import java.time.LocalDateTime;
  28. import java.time.ZoneId;
  29. import java.time.ZonedDateTime;
  30. import java.time.format.DateTimeFormatter;
  31. import java.util.*;
  32. import static org.junit.Assert.fail;
  33. @Slf4j
  34. @Service
  35. public class JianhuiServiceImpl implements JianhuiService {
  36. @Autowired
  37. private KDWebApiConf kdWebApiConf;
  38. @Autowired
  39. private YDClient ydClient;
  40. @Autowired
  41. private DDClient ddClient;
  42. @Autowired
  43. private DDConf ddConf;
  44. //单据状态
  45. private static final Map<String,String> FDOCUMENTSTATUS = new HashMap<>();
  46. static{
  47. FDOCUMENTSTATUS.put("Z","暂存");
  48. FDOCUMENTSTATUS.put("A","创建");
  49. FDOCUMENTSTATUS.put("B","审核中");
  50. FDOCUMENTSTATUS.put("C","已审核");
  51. FDOCUMENTSTATUS.put("D","重新审核");
  52. }
  53. //整单状态
  54. private static final Map<String,String> AUDITSTATUS = new HashMap<>();
  55. static{
  56. AUDITSTATUS.put("U","未审核");
  57. AUDITSTATUS.put("A","已审核");
  58. AUDITSTATUS.put("I","审核中");
  59. AUDITSTATUS.put("P","部分审核");
  60. AUDITSTATUS.put("R","重新审核");
  61. }
  62. //禁用状态
  63. private static final Map<String,String> FFORBIDSTATUS = new HashMap<>();
  64. static{
  65. FFORBIDSTATUS.put("A","否");
  66. FFORBIDSTATUS.put("B","是");
  67. }
  68. private static final Map<String,String> FFORBIDDENSTATUS = new HashMap<>();
  69. static{
  70. FFORBIDDENSTATUS.put("0","否");
  71. FFORBIDDENSTATUS.put("1","是");
  72. }
  73. private static final Map<String,String> FERPCLSID = new HashMap<>();
  74. static {
  75. FERPCLSID.put("10","资产");
  76. FERPCLSID.put("9","配置");
  77. FERPCLSID.put("2","自制");
  78. FERPCLSID.put("11","费用");
  79. FERPCLSID.put("12","模型");
  80. FERPCLSID.put("5","虚拟");
  81. FERPCLSID.put("7","一次性");
  82. FERPCLSID.put("13","产品系列");
  83. FERPCLSID.put("3","委外");
  84. FERPCLSID.put("4","特征");
  85. FERPCLSID.put("6","服务");
  86. FERPCLSID.put("1","外购");
  87. }
  88. private static final Map<String,String> BUSINESS_TYPE = new HashMap<>();
  89. static {
  90. BUSINESS_TYPE.put("8","发货检验");
  91. BUSINESS_TYPE.put("25","生产退料检验");
  92. BUSINESS_TYPE.put("26","委外退料检验");
  93. BUSINESS_TYPE.put("3","产品检验");
  94. BUSINESS_TYPE.put("20","其他检验");
  95. BUSINESS_TYPE.put("6","委外工序");
  96. BUSINESS_TYPE.put("10","受托材料检验");
  97. BUSINESS_TYPE.put("2","委外检验");
  98. BUSINESS_TYPE.put("21","工序巡检");
  99. BUSINESS_TYPE.put("7","退货检验");
  100. BUSINESS_TYPE.put("9","生产线检验");
  101. BUSINESS_TYPE.put("1","采购检验");
  102. BUSINESS_TYPE.put("4","库存检验");
  103. BUSINESS_TYPE.put("5","工序自制");
  104. }
  105. private static final Map<String,String> INSPECT_RESULT = new HashMap<>();
  106. static {
  107. INSPECT_RESULT.put("1","合格");
  108. INSPECT_RESULT.put("2","不合格");
  109. INSPECT_RESULT.put("3","保留");
  110. }
  111. private IdentifyInfo initIden(){
  112. //注意 1:此处不再使用参数形式传入用户名及密码等敏感信息,改为在登录配置文件中设置。
  113. //注意 2:必须先配置第三方系统登录授权信息后,再进行业务操作,详情参考各语言版本SDK介绍中的登录配置文件说明。
  114. //读取配置,初始化SDK
  115. IdentifyInfo iden = new IdentifyInfo();
  116. iden.setUserName(kdWebApiConf.getXKDApiUserName());
  117. iden.setAppId(kdWebApiConf.getXKDApiAppID());
  118. iden.setdCID(kdWebApiConf.getXKDApiAcctID());
  119. iden.setAppSecret(kdWebApiConf.getXKDApiAppSec());
  120. iden.setServerUrl(kdWebApiConf.getXKDApiServerUrl());
  121. return iden;
  122. }
  123. @Override
  124. //保存销售订单
  125. public McR saveSaleOrder(Map map) {
  126. String formInstId = getString(map.get("formInstId"));
  127. Map formData = ydClient.queryData(YDParam.builder()
  128. .formInstId(formInstId)
  129. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  130. List<Map> details = (List<Map>) formData.get("tableField_m65t6bm5");
  131. //将时间戳转化为字符串 年月日时分秒格式
  132. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  133. SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
  134. //请求参数,要求为json字符串
  135. Save save = new Save();
  136. Model model = new Model();
  137. //基本信息
  138. BillTypeID FBillTypeID = new BillTypeID(getString(formData.get("textField_m6t5hgw2")));//单据类型
  139. FNumber FSaleOrgId = new FNumber(getString(formData.get("textField_m6sqw8k1")));//销售组织
  140. FNumber FCustId = new FNumber(getString(formData.get("textField_m6ahh22d")));//客户
  141. // FNumber FReceiveId = new FNumber(getString(formData.get("textField_m6ahh22d")));//收货方
  142. // FNumber FSaleDeptId = new FNumber(getString(formData.get("textField_m6ahct6n")));//销售部门
  143. FNumber FSalerId = new FNumber(getString(formData.get("textField_m6t5xxrm")));//销售员
  144. // FNumber FSettleId = new FNumber(getString(formData.get("textField_m6ahh22d")));//结算方
  145. // FNumber FChargeId = new FNumber(getString(formData.get("textField_m6ahh22d")));//付款方
  146. //财务信息
  147. SaleOrderFinance saleOrderFinance = new SaleOrderFinance();
  148. saleOrderFinance.setFSettleCurrId(new FNumber(getString(formData.get("textField_m6ahh22i"))));//结算币别
  149. // saleOrderFinance.setFExchangeTypeId(new FNumber(getString(formData.get("textField_m6t6ay5x"))));//汇率类型
  150. saleOrderFinance.setFIsIncludedTax(getString(formData.get("radioField_m6a8ekan")).equals("是"));//是否含税
  151. saleOrderFinance.setFIsPriceExcludeTax(getString(formData.get("radioField_m6ahh22s")).equals("是"));//价外税
  152. /*saleOrderFinance.setFMarginLevel(0);//保证金比例(%)
  153. saleOrderFinance.setFMargin(0);//保证金
  154. saleOrderFinance.setFOverOrgTransDirect(false);//寄售生成跨组织调拨
  155. saleOrderFinance.setFAllDisCount(0);//整单折扣额
  156. saleOrderFinance.setFXPKID_F(0);//变更单主键*/
  157. //明细信息
  158. List<SaleOrderEntry> FSaleOrderEntry = new ArrayList<>();
  159. for (Map detail : details) {
  160. SaleOrderEntry saleOrderEntry = new SaleOrderEntry();
  161. // FNumber FStockOrgId = new FNumber(getString(detail.get("textField_m6sqw8js")));//库存组织
  162. // FNumber FSettleOrgIds = new FNumber(getString(detail.get("textField_m6sqw8jw")));//结算组织
  163. // FNumber FOwnerId = new FNumber(getString(detail.get("textField_m65t6bm9")));//货主
  164. saleOrderEntry.setFMaterialId(new FNumber(getString(detail.get("textField_m6sqw8jq"))));//物料编码
  165. saleOrderEntry.setFUnitID(new FNumber(getString(detail.get("textField_m6sqw8jz"))));//销售单位
  166. saleOrderEntry.setFPriceUnitId(new FNumber(getString(detail.get("textField_m6sqw8jz"))));//计量单位
  167. // saleOrderEntry.setFStockFNumber(FStockOrgId);
  168. // saleOrderEntry.setFSettleOrgIds(FSettleOrgIds);
  169. // saleOrderEntry.setFOwnerId(FOwnerId);
  170. saleOrderEntry.setFQty(new BigDecimal(getString(detail.get("numberField_m65t6bmb"))).doubleValue());//销售数量
  171. // saleOrderEntry.setFPriceUnitQty((int)detail.get("numberField_m65t6bmb"));//计价数量
  172. saleOrderEntry.setFIsFree(getString(detail.get("radioField_m6t6roed")).equals("是"));//是否赠品
  173. if (!getString(detail.get("radioField_m6t6roed")).equals("是")){
  174. // saleOrderEntry.setFPrice(new BigDecimal(getString(detail.get("numberField_m65t6bmd"))).doubleValue());//单价
  175. saleOrderEntry.setFTaxPrice(new BigDecimal(getString(detail.get("numberField_m65t6bme"))).doubleValue());//含税单价
  176. if (Objects.nonNull(detail.get("numberField_m65t6bmf"))){
  177. saleOrderEntry.setFEntryTaxRate(new BigDecimal(getString(detail.get("numberField_m65t6bmf"))).doubleValue());//税率(%)
  178. // saleOrderEntry.setFTaxAmount_LC(new BigDecimal(getString(detail.get("numberField_m65t6bmg"))).doubleValue());//税额(本位币)
  179. }
  180. /* if (Objects.nonNull(detail.get("numberField_m65t6bmh"))){
  181. saleOrderEntry.setFAmount_LC(new BigDecimal(getString(detail.get("numberField_m65t6bmh"))).doubleValue());//金额(本位币)
  182. }
  183. saleOrderEntry.setFAllAmount_LC(new BigDecimal(getString(detail.get("numberField_m65t6bmi"))).doubleValue());//价税合计(本位币)*/
  184. }
  185. saleOrderEntry.setFDeliveryDate(sdf.format(new Date((long) detail.get("dateField_m65t6bmj"))));//要货日期
  186. // saleOrderEntry.setFOwnerTypeId("BD_OwnerOrg");//货主类型
  187. saleOrderEntry.setFEntryNote(getString(detail.get("textareaField_m6t6roeg")));//备注
  188. // saleOrderEntry.setF_WMVJ_Decimal(39913500);//方数
  189. // saleOrderEntry.setF_WMVJ_Amount(111);//金额(配件)
  190. // saleOrderEntry.setF_WMVJ_Qty(12);//即时库存
  191. // saleOrderEntry.setF_WMVJ_CheckBox(getString(detail.get("radioField_m6t6roef")).equals("是"));//是否生产
  192. FSaleOrderEntry.add(saleOrderEntry);
  193. }
  194. // model.setFID(0);//实体主键
  195. model.setFBillTypeID(FBillTypeID);//单据类型
  196. model.setFDate(sdf.format(new Date((long) formData.get("dateField_m65t6bkv"))));//日期
  197. model.setFSaleOrgId(FSaleOrgId);//销售组织
  198. model.setFCustId(FCustId);//客户
  199. // model.setFReceiveId(FReceiveId);//收货方
  200. // model.setFSaleDeptId(FSaleDeptId);//销售部门
  201. model.setFSalerId(FSalerId);//销售员
  202. model.setFNote(getString(formData.get("textareaField_m6sqw8jo")));//备注
  203. // model.setFSettleId(FSettleId);//结算方
  204. // model.setFChargeId(FChargeId);//付款方
  205. // model.setFNetOrderBillId(0);//移动销售订单ID
  206. // model.setFOppID(0);//商机内码
  207. // model.setFISINIT(false);//是否期初单据
  208. // model.setFIsMobile(false);//来自移动(弃用)
  209. // model.setFContractId(0);//销售合同内码
  210. // model.setFIsUseOEMBomPush(false);//生成受托加工材料清单
  211. // model.setFXPKID_H(0);//变更单主键
  212. // model.setFIsUseDrpSalePOPush(false);//生成分销采购订单
  213. // model.setFIsCreateStraightOutIN(false);//生成直运出入库
  214. model.setFSaleOrderFinance(saleOrderFinance);//财务信息
  215. model.setFSaleOrderEntry(FSaleOrderEntry);//订单明细
  216. save.setModel(model);
  217. Gson gson2 = new Gson();
  218. String jsonData = gson2.toJson(save);
  219. // String jsonData = JSONObject.toJSONString(save);
  220. // String jsonData = "{\"Model\":{\"FBillTypeID\":{\"FNUMBER\":\"XSDD01_SYS\"},\"FDate\":\"2025-02-27\",\"FSaleOrgId\":{\"FNumber\":\"100\"},\"FCustId\":{\"FNumber\":\"C0615\"},\"FSalerId\":{\"FNumber\":\"0118_0012_1\"},\"FNote\":\"\",\"FSaleOrderFinance\":{\"FSettleCurrId\":{\"FNumber\":\"PRE001\"},\"FIsIncludedTax\":\"false\"},\"FSaleOrderEntry\":[{\"FMaterialId\":{\"FNumber\":\"C2070502\"},\"FUnitID\":{\"FNumber\":\"Pcs\"},\"FQty\":1,\"FPriceUnitId\":{\"FNumber\":\"Pcs\"},\"FTaxPrice\":115,\"FIsFree\":false,\"FEntryNote\":\"\",\"FEntryTaxRate\":0,\"FDeliveryDate\":\"2025-02-28\",\"FSettleOrgIds\":{\"FNumber\":\"100\"}}]}}";
  221. log.info(jsonData);
  222. try{
  223. K3CloudApi client = new K3CloudApi(initIden());
  224. //业务对象标识
  225. String formId = "SAL_SaleOrder";
  226. //调用接口
  227. String resultJson = client.save(formId,jsonData);
  228. //用于记录结果
  229. Gson gson = new Gson();
  230. //对返回结果进行解析和校验
  231. RepoRet repoRet = gson.fromJson(resultJson, RepoRet.class);
  232. if (isTrue(repoRet)){
  233. String id = repoRet.getResult().getId();
  234. Submit submit = new Submit();
  235. submit.setIds(id);
  236. //提交销售订单
  237. String resultJson2 = client.submit(formId, JSONObject.toJSONString(submit));
  238. RepoRet repoRet2 = gson.fromJson(resultJson2, RepoRet.class);
  239. isTrue(repoRet2);
  240. String orderCode = repoRet2.getResult().getResponseStatus().getSuccessEntitys().get(0).getNumber();
  241. ydClient.operateData(YDParam.builder()
  242. .formInstId(formInstId)
  243. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_m6a8ekal",orderCode)))
  244. .build(), YDConf.FORM_OPERATION.update);
  245. if (isTrue(repoRet2)){
  246. Audit audit = new Audit();
  247. audit.setNumbers(Arrays.asList(orderCode));
  248. //审核销售订单
  249. String resultJson3 = client.audit(formId,JSONObject.toJSONString(audit));
  250. RepoRet repoRet3 = gson.fromJson(resultJson3, RepoRet.class);
  251. isTrue(repoRet3);
  252. }
  253. }
  254. } catch (Exception e) {
  255. fail(e.getMessage());
  256. }
  257. return McR.success();
  258. }
  259. private String getString(Object object){
  260. return object == null ? "" : object.toString();
  261. }
  262. @Override
  263. public McR syncCustomers() {
  264. try {
  265. K3CloudApi client = new K3CloudApi(initIden());
  266. List<Map> result = new ArrayList<>();
  267. List<Map> customerList = new ArrayList<>();
  268. int startRow = 0;
  269. int limit = 2000;
  270. BillQuery billQuery = new BillQuery();
  271. billQuery.setFormId("BD_Customer");
  272. billQuery.setFieldKeys("FNumber,FName,FShortName,FDocumentStatus,FForbidStatus,FUseOrgId,FAPPROVERID,FAPPROVEDATE,FGroup");
  273. List<Map> filterString = new ArrayList<>();
  274. //修改时间为昨天到今天
  275. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FModifyDate","265","1","","","0"));
  276. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FModifyDate","39","2025-03-06 00:00:00","","","0"));
  277. billQuery.setFilterString(filterString);
  278. billQuery.setLimit(limit);
  279. do {
  280. billQuery.setStartRow(startRow);
  281. String s = client.billQuery(JSONObject.toJSONString(billQuery));
  282. result = (List<Map>)JSONObject.parse(s);
  283. customerList.addAll(result);
  284. startRow += limit;
  285. }while (result.size() == limit);
  286. for (Map customer : customerList) {
  287. Map formData = new HashMap();
  288. formData.put("textField_m67c6m6f",customer.get("FNumber"));//客户编码
  289. formData.put("textField_m67c6m6e",customer.get("FName"));//客户名称
  290. formData.put("textField_m67c6m6g",customer.get("FShortName"));//简称
  291. formData.put("textField_m67c6m6h",FDOCUMENTSTATUS.get(customer.get("FDocumentStatus").toString()));//单据状态
  292. formData.put("textField_m67c6m6i",FFORBIDSTATUS.get(customer.get("FForbidStatus").toString()));//禁用状态
  293. formData.put("textField_m67c6m6j",customer.get("FUseOrgId"));//使用组织
  294. formData.put("textField_m67c6m6k",customer.get("FAPPROVERID"));//审核人
  295. formData.put("textField_m67c6m6l",customer.get("FAPPROVEDATE"));//审核日期
  296. formData.put("textField_m67c6m6m",customer.get("FGroup"));//客户分组
  297. ydClient.operateData(YDParam.builder()
  298. .formUuid("FORM-C3E9A165EEAB4232BD2F04F536E195D1WINH")
  299. .searchFieldJson(JSONObject.toJSONString(UtilMap.map("textField_m67c6m6f",customer.get("FNumber"))))
  300. .formDataJson(JSONObject.toJSONString(formData))
  301. .build(), YDConf.FORM_OPERATION.upsert);
  302. }
  303. }catch (Exception e){
  304. fail(e.getMessage());
  305. }
  306. return McR.success();
  307. }
  308. @Override
  309. public McR syncSalesman() {
  310. try {
  311. K3CloudApi client = new K3CloudApi(initIden());
  312. int startRow = 0;
  313. int limit = 2000;
  314. BillQuery billQuery = new BillQuery();
  315. billQuery.setLimit(limit);
  316. billQuery.setFormId("BD_OPERATOR");
  317. billQuery.setFieldKeys("FNumber,FName,FForbiddenStatus,FBizOrgId");
  318. List<Map> filterString = new ArrayList<>();
  319. //修改时间为昨天到今天
  320. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FModifyDate","265","1","","","0"));
  321. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FModifyDate","39","2025-03-06 00:00:00","","","0"));
  322. billQuery.setFilterString(filterString);
  323. List<Map> result = new ArrayList<>();
  324. List<Map> operatorList = new ArrayList<>();
  325. do {
  326. billQuery.setStartRow(startRow);
  327. String s = client.billQuery(JSONObject.toJSONString(billQuery));
  328. result = (List<Map>)JSONObject.parse(s);
  329. operatorList.addAll(result);
  330. startRow += limit;
  331. }while (result.size() == limit);
  332. for (Map operator : operatorList) {
  333. Map formData = new HashMap();
  334. formData.put("textField_m67pb4tl",operator.get("FName"));//业务员名称
  335. formData.put("textField_m67pb4tn",operator.get("FNumber"));//业务员编码
  336. formData.put("textField_m67pb4tm",operator.get("FBizOrgId"));//业务组织
  337. formData.put("textField_m67pb4tk",FFORBIDDENSTATUS.get(operator.get("FForbiddenStatus").toString()));//禁用状态
  338. String FNumber = operator.get("FNumber").toString();
  339. //查找员工任岗信息
  340. View view = new View();
  341. view.setNumber(FNumber);
  342. String resultJson = client.view("BD_NEWSTAFF", JSONObject.toJSONString(view));
  343. Gson gson = new Gson();
  344. RepoRet repoRet = gson.fromJson(resultJson, RepoRet.class);
  345. if (isTrue(repoRet)){
  346. Map positionInfo = (Map) repoRet.getResult().getResult();
  347. Map position = (Map) positionInfo.get("Position");
  348. String positionValue = ((List<Map>) position.get("Name")).get(0).get("Value").toString();
  349. Map dept = (Map) position.get("FDept");
  350. String deptValue = ((List<Map>) dept.get("Name")).get(0).get("Value").toString();
  351. formData.put("textField_m67pb4td",positionValue);//岗位
  352. formData.put("textField_m67pb4tb",deptValue);//部门
  353. }
  354. ydClient.operateData(YDParam.builder()
  355. .formUuid("FORM-250CD995257D4CB08F99786E47D8D51BCUDP")
  356. .searchFieldJson(JSONObject.toJSONString(UtilMap.map("textField_m67pb4tn",operator.get("FNumber"))))
  357. .formDataJson(JSONObject.toJSONString(formData))
  358. .build(), YDConf.FORM_OPERATION.upsert);
  359. }
  360. }catch (Exception e){
  361. fail(e.getMessage());
  362. }
  363. return McR.success();
  364. }
  365. @Override
  366. public McR syncMaterial() {
  367. try {
  368. K3CloudApi client = new K3CloudApi(initIden());
  369. List<Map> result = new ArrayList<>();
  370. List<Map> materialList = new ArrayList<>();
  371. int startRow = 0;
  372. int limit = 2000;
  373. BillQuery billQuery = new BillQuery();
  374. billQuery.setFormId("BD_MATERIAL");
  375. billQuery.setFieldKeys("FUseOrgId,FNumber,FName,FSpecification,FDocumentStatus,FForbidStatus,FErpClsID,FBaseUnitId,FRefStatus");
  376. List<Map> filterString = new ArrayList<>();
  377. //修改时间或审核日期为昨天到今天
  378. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FModifyDate","265","1","","","1"));
  379. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","265","1","","","0"));
  380. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FModifyDate","39","2025-03-12 00:00:00","","","0"));//修改日期大于等于xx
  381. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FModifyDate","16","2025-03-14 00:00:00","","","0"));//修改日期小于等于xx
  382. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FCreateDate","39","2025-03-12 00:00:00","","","0"));//创建日期大于等于xx
  383. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FCreateDate","39","2025-03-14 00:00:00","","","0"));//创建日期大于等于xx
  384. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","39","2025-03-14 00:00:00","","","0"));//审核日期大于等于xx
  385. billQuery.setFilterString(filterString);
  386. billQuery.setLimit(limit);
  387. do {
  388. billQuery.setStartRow(startRow);
  389. String s = client.billQuery(JSONObject.toJSONString(billQuery));
  390. result = (List<Map>)JSONObject.parse(s);
  391. materialList.addAll(result);
  392. startRow += limit;
  393. }while (result.size() == limit);
  394. for (Map material : materialList) {
  395. Map formData = new HashMap();
  396. formData.put("textField_m6ak640p",material.get("FUseOrgId"));//使用组织
  397. formData.put("textField_m6ak640v",material.get("FNumber"));//编码
  398. formData.put("selectField_m83u6et1",getString(material.get("FNumber")).substring(0,1).equals("C") ? "成品" : "配件");
  399. formData.put("textField_m6ak640w",material.get("FName"));//名称
  400. formData.put("textField_m6ak640x",material.get("FSpecification"));//规格型号
  401. formData.put("textField_m6ak6413",FDOCUMENTSTATUS.get(material.get("FDocumentStatus").toString()));//单据状态
  402. formData.put("textField_m6ak6414",FFORBIDSTATUS.get(material.get("FForbidStatus").toString()));//禁用状态
  403. formData.put("textField_m6ak6415",FERPCLSID.get(material.get("FErpClsID").toString()));//物料属性
  404. formData.put("textField_m6ak641c",material.get("FRefStatus"));//已使用
  405. //查找计量单位信息
  406. String FBaseUnitId = material.get("FBaseUnitId").toString();
  407. View view = new View();
  408. view.setId(FBaseUnitId);
  409. String resultJson = client.view("BD_UNIT", JSONObject.toJSONString(view));
  410. Gson gson = new Gson();
  411. RepoRet repoRet = gson.fromJson(resultJson, RepoRet.class);
  412. if (isTrue(repoRet)){
  413. Map unitInfo = (Map) repoRet.getResult().getResult();
  414. String unitName = ((List<Map>) unitInfo.get("Name")).get(0).get("Value").toString();
  415. String unitCode = unitInfo.get("Number").toString();
  416. formData.put("textField_m6ak6416",unitName);//基本单位
  417. formData.put("textField_m6ak641d",unitCode);//单位编码
  418. }
  419. ydClient.operateData(YDParam.builder()
  420. .formUuid("FORM-2A5CAB7EB91D493AAFC90D8C7479A7F5KPR7")
  421. .searchFieldJson(JSONObject.toJSONString(UtilMap.map("textField_m6ak640v",material.get("FNumber"))))
  422. .formDataJson(JSONObject.toJSONString(formData))
  423. .build(), YDConf.FORM_OPERATION.upsert);
  424. }
  425. }catch (Exception e){
  426. fail(e.getMessage());
  427. }
  428. return McR.success();
  429. }
  430. @Override
  431. public McR saveForecastOrder(Map map) {
  432. String formInstId = getString(map.get("formInstId"));
  433. Map formData = ydClient.queryData(YDParam.builder()
  434. .formInstId(formInstId)
  435. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  436. //将时间戳转化为字符串 年月日时分秒格式
  437. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  438. Save save = new Save();
  439. Model model = new Model();
  440. model.setFForeOrgId(new FNumber(getString(formData.get("textField_m6yh6qcs"))));//预测组织
  441. model.setFBillTypeID(new BillTypeID(getString(formData.get("textField_m6yh6qcr"))));//单据类型
  442. model.setFDate(sdf.format(new Date((long)formData.get("dateField_m65vi32c"))));//单据日期
  443. model.setFDescription(getString(formData.get("textareaField_m6yh6qck")));//备注
  444. model.setF_WMVJ_Date_qtr(sdf.format(new Date((long)formData.get("dateField_m7lqobzp"))));//要货日期
  445. List<Map> details = (List<Map>) formData.get("tableField_m65vi32k");
  446. List<Object> FEntity = new ArrayList<>();
  447. for (Map detail : details) {
  448. ForecastEntity forecastEntity = new ForecastEntity();
  449. forecastEntity.setFCustID(new FNumber(getString(detail.get("textField_m6yh6qcu"))));//客户
  450. // forecastEntity.setFProductType("0");
  451. forecastEntity.setFMaterialID(new FNumber(getString(detail.get("textField_m65vi32o"))));//物料
  452. forecastEntity.setFUnitID(new FNumber(getString(detail.get("textField_m6yh6qcx"))));//单位
  453. forecastEntity.setFQty(new BigDecimal(getString(detail.get("numberField_m65vi32s"))).doubleValue());//数量
  454. forecastEntity.setFStartDate(sdf.format(new Date((long) detail.get("dateField_m65vi32t"))));//预测开始日期
  455. forecastEntity.setFEndDate(sdf.format(new Date((long) detail.get("dateField_m65vi32u"))));//预测结束日期
  456. //均化类型 W:周,M:月,D:日,N:不均化
  457. String FAVERATYPE = getString(detail.get("selectField_m65vi32v"));
  458. switch (FAVERATYPE){
  459. case "不均化" : forecastEntity.setFAVERATYPE("N");break;
  460. case "日" : forecastEntity.setFAVERATYPE("D");break;
  461. case "周" : forecastEntity.setFAVERATYPE("W");break;
  462. case "月" : forecastEntity.setFAVERATYPE("M");break;
  463. default : break;
  464. }
  465. //均化周期
  466. if (Objects.nonNull(detail.get("numberField_m65vi32w"))){
  467. forecastEntity.setFAveraCycle((int) detail.get("numberField_m65vi32w"));
  468. }
  469. //预留类型 1:弱预留,3:强预留
  470. String FReserveType = getString(detail.get("selectField_m65vi32z"));
  471. switch (FReserveType){
  472. case "强预留" : forecastEntity.setFReserveType("3");
  473. case "弱预留" : forecastEntity.setFReserveType("1");
  474. }
  475. //需求优先级
  476. if (Objects.nonNull(detail.get("numberField_m6yh6qcy"))){
  477. forecastEntity.setFPriority((int) detail.get("numberField_m6yh6qcy"));
  478. }
  479. forecastEntity.setFRemark(getString(detail.get("textField_m65vi330")));//备注
  480. // forecastEntity.setFChangeFlag("0");//变更标志
  481. FEntity.add(forecastEntity);
  482. }
  483. model.setFEntity(FEntity);
  484. save.setModel(model);
  485. try{
  486. K3CloudApi client = new K3CloudApi(initIden());
  487. //业务对象标识
  488. String formId = "PLN_FORECAST";
  489. //调用接口
  490. String resultJson = client.save(formId,JSONObject.toJSONString(save));
  491. //用于记录结果
  492. Gson gson = new Gson();
  493. //对返回结果进行解析和校验
  494. RepoRet repoRet = gson.fromJson(resultJson, RepoRet.class);
  495. if (isTrue(repoRet)){
  496. String id = repoRet.getResult().getId();
  497. Submit submit = new Submit();
  498. submit.setIds(id);
  499. //提交
  500. String resultJson2 = client.submit(formId, JSONObject.toJSONString(submit));
  501. RepoRet repoRet2 = gson.fromJson(resultJson2, RepoRet.class);
  502. isTrue(repoRet2);
  503. String orderCode = repoRet2.getResult().getResponseStatus().getSuccessEntitys().get(0).getNumber();
  504. ydClient.operateData(YDParam.builder()
  505. .formInstId(formInstId)
  506. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_m6ydmllb",orderCode)))
  507. .build(), YDConf.FORM_OPERATION.update);
  508. if (isTrue(repoRet2)){
  509. Audit audit = new Audit();
  510. audit.setIds(id);
  511. //审核
  512. String resultJson3 = client.audit(formId,JSONObject.toJSONString(audit));
  513. RepoRet repoRet3 = gson.fromJson(resultJson3, RepoRet.class);
  514. isTrue(repoRet3);
  515. }
  516. }
  517. } catch (Exception e) {
  518. fail(e.getMessage());
  519. }
  520. return McR.success();
  521. }
  522. @Override
  523. public McR saveDefectiveOrder(Map map) {
  524. String formInstId = getString(map.get("formInstId"));
  525. Map formData = ydClient.queryData(YDParam.builder()
  526. .formInstId(formInstId)
  527. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  528. //将时间戳转化为字符串 年月日时分秒格式
  529. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  530. Save save = new Save();
  531. Model model = new Model();
  532. model.setFBillTypeID(new BillTypeID(getString(formData.get("textField_m6yntxn9"))));//单据类型
  533. //业务类型 1:采购检验 2:委外检验 3:来料不良
  534. String FBusinessType = getString(formData.get("selectField_m64pw0gf"));
  535. switch (FBusinessType){
  536. case "采购检验": model.setFBusinessType("1");break;
  537. case "委外检验": model.setFBusinessType("2");break;
  538. case "来料不良": model.setFBusinessType("3");break;
  539. default:break;
  540. }
  541. model.setFDate(sdf.format(new Date((long) formData.get("dateField_m64pw0gk"))));//日期
  542. model.setFSourceOrgId(new FNumber(getString(formData.get("textField_m6yntxn7"))));//来源组织
  543. model.setFInspectOrgId(new FNumber(getString(formData.get("textField_m6yntxnl"))));//质检组织
  544. model.setFInspectDepId(new FNumber(getString(formData.get("textField_m6yntxnc"))));//质检部门
  545. model.setFDescription(getString(formData.get("textareaField_m6yntxnh")));//备注
  546. List<Object> FEntity = new ArrayList<>();
  547. List<Map> details = (List<Map>) formData.get("tableField_m64pw0gm");
  548. for (Map detail : details) {
  549. DefectEntity defectEntity = new DefectEntity();
  550. defectEntity.setFMateridlId(new FNumber(getString(detail.get("textField_m64pw0go"))));//物料
  551. defectEntity.setFSupplierId(new FNumber(getString(detail.get("textField_m6yumh8w"))));//供应商
  552. defectEntity.setFUnitID(new FNumber(getString(detail.get("textField_m6yntxnj"))));//单位
  553. defectEntity.setFUsePolicy("F");//检验单使用决策 F:判退
  554. defectEntity.setFInspectDefectQty((int) detail.get("numberField_m82qkv1u"));//检验不良数量
  555. //不良处理 A:接收 B:让步接收 F:判退
  556. String FDefProcess = getString(detail.get("selectField_m64pw0gt"));
  557. switch (FDefProcess){
  558. case "接收": defectEntity.setFDefProcess("A");break;
  559. case "让步接收": defectEntity.setFDefProcess("B");break;
  560. case "判退": defectEntity.setFDefProcess("F");break;
  561. default:break;
  562. }
  563. defectEntity.setFDefectiveQty((int) detail.get("numberField_m64pw0gu"));//不良数量
  564. //关联检验单
  565. List<Object> linkEntity = new ArrayList<>();
  566. Map link = new HashMap();
  567. HashMap<String, Object> detailLink = new HashMap<>();
  568. // link.put("FEntity_Link_FFlowId", "");//业务流程图
  569. // link.put("FEntity_Link_FFlowLineId", "");//推进路线
  570. link.put("FEntity_Link_FRuleId","QM_Inspect2DefProecess");//转换规则
  571. // link.put("FEntity_Link_FSTableId", "");//源单表内码
  572. link.put("FEntity_Link_FSTableName","T_QM_INSPECTBILLENTRY");//源单表
  573. link.put("FEntity_Link_FSBillId",formData.get("numberField_m86nq0a5"));//源单内码
  574. link.put("FEntity_Link_FSId", detail.get("numberField_m873a1q2"));//源单分录内码
  575. linkEntity.add(link);
  576. defectEntity.setFEntity_Link(linkEntity);
  577. FEntity.add(defectEntity);
  578. }
  579. model.setFEntity(FEntity);
  580. save.setModel(model);
  581. try{
  582. K3CloudApi client = new K3CloudApi(initIden());
  583. //业务对象标识
  584. String formId = "QM_DefectProcessBill";
  585. //调用接口
  586. String resultJson = client.save(formId,JSONObject.toJSONString(save));
  587. //用于记录结果
  588. Gson gson = new Gson();
  589. //对返回结果进行解析和校验
  590. RepoRet repoRet = gson.fromJson(resultJson, RepoRet.class);
  591. if (isTrue(repoRet)){
  592. String id = repoRet.getResult().getId();
  593. Submit submit = new Submit();
  594. submit.setIds(id);
  595. //提交
  596. String resultJson2 = client.submit(formId, JSONObject.toJSONString(submit));
  597. RepoRet repoRet2 = gson.fromJson(resultJson2, RepoRet.class);
  598. if (isTrue(repoRet2)){
  599. String orderCode = repoRet2.getResult().getResponseStatus().getSuccessEntitys().get(0).getNumber();
  600. ydClient.operateData(YDParam.builder()
  601. .formInstId(formInstId)
  602. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_m6yntxmz",orderCode)))
  603. .build(), YDConf.FORM_OPERATION.update);
  604. Audit audit = new Audit();
  605. audit.setIds(id);
  606. //审核
  607. String resultJson3 = client.audit(formId,JSONObject.toJSONString(audit));
  608. RepoRet repoRet3 = gson.fromJson(resultJson3, RepoRet.class);
  609. if (isTrue(repoRet3)){
  610. //更新检验单使用决策
  611. String formId2 = "QM_InspectBill";
  612. Save save2 = new Save();
  613. Model model2 = new Model();
  614. model2.setFID((int)formData.get("numberField_m86nq0a5"));//检验单id
  615. List<Object> FEntityList = new ArrayList<>();
  616. for (Map detail : details) {
  617. Map FEntity2 = new HashMap();
  618. FEntity2.put("FEntryID",detail.get("numberField_m873a1q2"));//分录明细id
  619. List<Map> FPolicyDetailList = new ArrayList<>();
  620. Map FPolicyDetail = new HashMap();
  621. FPolicyDetail.put("FDetailID",detail.get("numberField_m8fkgsvo"));//使用决策id
  622. //不良处理 A:接收 B:让步接收 F:判退
  623. String FDefProcess = getString(detail.get("selectField_m64pw0gt"));
  624. switch (FDefProcess){
  625. case "接收": FPolicyDetail.put("FUsePolicy","A");break;
  626. case "让步接收": FPolicyDetail.put("FUsePolicy","B");break;
  627. case "判退": FPolicyDetail.put("FUsePolicy","F");break;
  628. default:break;
  629. }
  630. FPolicyDetailList.add(FPolicyDetail);
  631. FEntity2.put("FPolicyDetail",FPolicyDetailList);
  632. FEntityList.add(FEntity2);
  633. }
  634. model2.setFEntity(FEntityList);
  635. save2.setModel(model2);
  636. String resultJson4 = client.save(formId2,JSONObject.toJSONString(save2));
  637. RepoRet repoRet4 = gson.fromJson(resultJson4, RepoRet.class);
  638. isTrue(repoRet4);
  639. }
  640. }
  641. }
  642. } catch (Exception e) {
  643. McR.errorUnknown(e.getMessage());
  644. }
  645. return McR.success();
  646. }
  647. @Override
  648. public McR syncSupplier() {
  649. try {
  650. K3CloudApi client = new K3CloudApi(initIden());
  651. int startRow = 0;
  652. int limit = 2000;
  653. BillQuery billQuery = new BillQuery();
  654. billQuery.setLimit(limit);
  655. billQuery.setFormId("BD_Supplier");
  656. billQuery.setFieldKeys("FNumber,FUseOrgId,FName,FShortName,FGroup,FAuditorId,FAuditDate,FDocumentStatus,FForbidStatus");
  657. List<Map> filterString = new ArrayList<>();
  658. //修改时间为昨天到今天
  659. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FModifyDate","265","1","","","0"));
  660. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FModifyDate","39","2025-03-06 00:00:00","","","0"));
  661. billQuery.setFilterString(filterString);
  662. List<Map> result = new ArrayList<>();
  663. List<Map> operatorList = new ArrayList<>();
  664. do {
  665. billQuery.setStartRow(startRow);
  666. String s = client.billQuery(JSONObject.toJSONString(billQuery));
  667. result = (List<Map>)JSONObject.parse(s);
  668. operatorList.addAll(result);
  669. startRow += limit;
  670. }while (result.size() == limit);
  671. for (Map operator : operatorList) {
  672. Map formData = new HashMap();
  673. formData.put("textField_m6yuw4j2",operator.get("FName"));//名称
  674. formData.put("textField_m6yuw4j3",operator.get("FShortName"));//简称
  675. formData.put("textField_m6yuw4iw",operator.get("FNumber"));//编码
  676. formData.put("textField_m6yuw4j4",operator.get("FUseOrgId"));//组织
  677. if ((int) operator.get("FGroup") == 204305){
  678. formData.put("textField_m6yuw4ja","宁波健辉供应商");//供应商分组
  679. }
  680. formData.put("textField_m6yuw4jb",operator.get("FAuditorId"));//审核人
  681. formData.put("textField_m6yuw4jc",operator.get("FAuditDate"));//审核日期
  682. formData.put("textField_m6yuw4jd",FDOCUMENTSTATUS.get(getString(operator.get("FDocumentStatus"))));//数据状态
  683. formData.put("textField_m67pb4tk",FFORBIDSTATUS.get(getString(operator.get("FForbiddenStatus"))));//禁用状态
  684. ydClient.operateData(YDParam.builder()
  685. .formUuid("FORM-1DAEA1675CAE47F49BE1F86A034D695191W1")
  686. .searchFieldJson(JSONObject.toJSONString(UtilMap.map("textField_m6yuw4iw",operator.get("FNumber"))))
  687. .formDataJson(JSONObject.toJSONString(formData))
  688. .build(), YDConf.FORM_OPERATION.upsert);
  689. }
  690. }catch (Exception e){
  691. fail(e.getMessage());
  692. }
  693. return McR.success();
  694. }
  695. @Override
  696. public McR syncPurchaseOrder() {
  697. try {
  698. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
  699. //业务对象标识
  700. String formId = "PUR_PurchaseOrder";
  701. K3CloudApi client = new K3CloudApi(initIden());
  702. Gson gson = new Gson();
  703. //查询当天审核中数据
  704. BillQuery billQuery = new BillQuery();
  705. billQuery.setFormId(formId);
  706. billQuery.setFieldKeys("FBillNo");
  707. billQuery.setStartRow(0);
  708. billQuery.setLimit(100);
  709. List<Map> filterString = new ArrayList<>();
  710. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FDocumentStatus","105","B","","","0"));
  711. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FCreateDate","13","","","","0"));
  712. billQuery.setFilterString(filterString);
  713. String resultJson = client.billQuery(JSONObject.toJSONString(billQuery));
  714. List<Map> list = (List<Map>) JSONObject.parse(resultJson);
  715. for (Map map : list) {
  716. String fBillNo = getString(map.get("FBillNo"));
  717. //查询宜搭中是否已添加该采购订单
  718. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  719. .formUuid("FORM-050FE2BED20644318C2521F9C7B8D9D1FIFO")
  720. .searchFieldJson(JSONObject.toJSONString(UtilMap.map("textField_m703yqyb", fBillNo)))
  721. .build(), YDConf.FORM_QUERY.retrieve_list).getData();
  722. //没有则新增
  723. if (data.isEmpty()){
  724. View view = new View();
  725. view.setNumber(fBillNo);
  726. String resultJson2 = client.view(formId,JSONObject.toJSONString(view));
  727. RepoRet repoRet = gson.fromJson(resultJson2, RepoRet.class);
  728. if (isTrue(repoRet)){
  729. Map result = (Map) repoRet.getResult().getResult();
  730. Map formData = new HashMap();
  731. formData.put("selectField_m65wv53k",getMultiLanguageTextName(result.get("BillTypeId")));//单据类型
  732. formData.put("selectField_m65wv53w",getMultiLanguageTextName(result.get("SupplierId")));//供应商
  733. //业务类型
  734. String businessType = getString(result.get("BusinessType"));
  735. switch (businessType){
  736. case "CG":formData.put("selectField_m65wv53r","标准采购");break;
  737. case "WW":formData.put("selectField_m65wv53r","标准委外");break;
  738. case "ZCCG":formData.put("selectField_m65wv53r","资产采购");break;
  739. case "ZYCG":formData.put("selectField_m65wv53r","直运采购");break;
  740. case "FYCG":formData.put("selectField_m65wv53r","费用采购");break;
  741. case "VMICG":formData.put("selectField_m65wv53r","VMI采购");break;
  742. case "cscg":formData.put("selectField_m65wv53r","测试采购");break;
  743. case "DRPCG":formData.put("selectField_m65wv53r","分销购销");break;
  744. default:;break;
  745. }
  746. formData.put("selectField_m65wv542",getMultiLanguageTextName(result.get("PurchaseOrgId")));//采购组织
  747. formData.put("selectField_m65wv543",getMultiLanguageTextName(result.get("PurchaseDeptId")));//采购部门
  748. formData.put("textField_m703yqyb",getString(result.get("BillNo")));//单据编号
  749. // 解析字符串为 LocalDateTime
  750. LocalDateTime localDateTime = LocalDateTime.parse(getString(result.get("Date")), formatter);
  751. // 将 LocalDateTime 转换为 ZonedDateTime
  752. ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault());
  753. formData.put("dateField_m65wv548",zonedDateTime.toInstant().toEpochMilli());//采购日期
  754. //验收方式
  755. String facctype = getString(result.get("FACCTYPE"));
  756. switch (facctype){
  757. case "A":formData.put("selectField_m703yqyc","金额验收");break;
  758. case "Q":formData.put("selectField_m703yqyc","数量验收");break;
  759. case "R":formData.put("selectField_m703yqyc","比例验收");break;
  760. default:break;
  761. }
  762. Map SupplierId = (Map) result.get("SupplierId");
  763. Map supplierBusiness = ((List<Map>) SupplierId.get("SupplierBusiness")).get(0);
  764. if (Objects.nonNull(supplierBusiness)){
  765. formData.put("selectField_m65wv54f",getMultiLanguageTextName(supplierBusiness.get("ProviderId")));//供货方
  766. formData.put("textField_m65wv54g",getMultiLanguageTextName(supplierBusiness.get("ProviderContactId")));//供货方联系人
  767. }
  768. formData.put("textField_m65wv54m",getString(result.get("ProviderEMail")));//邮箱
  769. Map supplierFinance = ((List<Map>) SupplierId.get("SupplierFinance")).get(0);
  770. if (Objects.nonNull(supplierFinance)){
  771. formData.put("selectField_m65wv54r",getMultiLanguageTextName(supplierFinance.get("SettleId")));//结算方
  772. formData.put("selectField_m65wv54s",getMultiLanguageTextName(supplierFinance.get("ChargeId")));//收款方
  773. }
  774. List<Map> details = new ArrayList<>();
  775. List<Map> poOrderEntry = (List<Map>) result.get("POOrderEntry");
  776. for (Map po : poOrderEntry) {
  777. Map detail = new HashMap();
  778. // detail.put("textField_m703yqyj",getString(po.get("ProductType")));//委外产品类型
  779. detail.put("textField_m703yqyk",getEntryNumber(po.get("MaterialId")));//物料编码
  780. detail.put("textField_m65wv551",getMultiLanguageTextName(po.get("MaterialId")));//物料名称
  781. detail.put("textField_m65wv552",getMultiLanguageTextSpecification(po.get("MaterialId")));//物料规格
  782. detail.put("textField_m65wv553",getMultiLanguageTextName(po.get("UnitId")));//采购单位
  783. detail.put("numberField_m65wv554",po.get("Qty"));//采购数量
  784. detail.put("textField_m65wv556",getMultiLanguageTextName(po.get("PriceUnitId")));//计价单位
  785. detail.put("textField_m65wv555",po.get("PriceUnitQty"));//计价数量
  786. if (Objects.nonNull(po.get("DeliveryDate"))){
  787. // 解析字符串为 LocalDateTime
  788. localDateTime = LocalDateTime.parse(getString(po.get("DeliveryDate")).substring(0,19), formatter);
  789. // 将 LocalDateTime 转换为 ZonedDateTime
  790. zonedDateTime = localDateTime.atZone(ZoneId.systemDefault());
  791. detail.put("dateField_m65wv557",zonedDateTime.toInstant().toEpochMilli());//交货日期
  792. }
  793. if (Objects.nonNull(po.get("Price"))){
  794. detail.put("numberField_m65wv558",new BigDecimal(getString(po.get("Price"))).doubleValue());//单价
  795. detail.put("numberField_m65wv559",new BigDecimal(getString(po.get("TaxNetPrice"))).doubleValue());//含税单价
  796. }
  797. if (Objects.nonNull(po.get("DiscountRate"))){
  798. detail.put("numberField_m65wv55a",new BigDecimal(getString(po.get("DiscountRate"))).doubleValue());//折扣率
  799. detail.put("numberField_m65wv55b",new BigDecimal(getString(po.get("Discount"))).doubleValue());//折扣率
  800. }
  801. if (Objects.nonNull(po.get("TaxRate"))){
  802. detail.put("numberField_m65wv55c",new BigDecimal(getString(po.get("TaxRate"))).doubleValue());//税率
  803. detail.put("numberField_m65wv55d",new BigDecimal(getString(po.get("TaxAmount"))).doubleValue());//税额
  804. }
  805. detail.put("numberField_m65wv55e",new BigDecimal(getString(po.get("AllAmount"))).doubleValue());//价税合计
  806. detail.put("numberField_m65wv55f",new BigDecimal(getString(po.get("Amount"))).doubleValue());//金额
  807. details.add(detail);
  808. }
  809. formData.put("tableField_m65wv54z",details);
  810. //新增数据
  811. ydClient.operateData(YDParam.builder()
  812. .formUuid("FORM-050FE2BED20644318C2521F9C7B8D9D1FIFO")
  813. .formDataJson(JSONObject.toJSONString(formData))
  814. .processCode("TPROC--MN866991XW7SZ5CI7GWSFB064DIQ2LEFUW56M1")
  815. .build(), YDConf.FORM_OPERATION.start);
  816. }
  817. }
  818. }
  819. }catch (Exception e){
  820. fail(e.getMessage());
  821. }
  822. return McR.success();
  823. }
  824. @Override
  825. public McR auditPurchaseOrder(Map map) {
  826. String code = getString(map.get("code"));
  827. try {
  828. K3CloudApi client = new K3CloudApi(initIden());
  829. String formId = "PUR_PurchaseOrder";
  830. Gson gson = new Gson();
  831. Audit audit = new Audit();
  832. audit.setNumbers(Collections.singletonList(code));
  833. //审核
  834. String resultJson = client.audit(formId,JSONObject.toJSONString(audit));
  835. RepoRet repoRet = gson.fromJson(resultJson, RepoRet.class);
  836. isTrue(repoRet);
  837. }catch (Exception e){
  838. fail(e.getMessage());
  839. }
  840. return McR.success();
  841. }
  842. @Override
  843. public McR syncSalePrice() {
  844. try {
  845. K3CloudApi client = new K3CloudApi(initIden());
  846. Gson gson = new Gson();
  847. String formId = "BD_SAL_PriceList";
  848. int startRow = 0;
  849. int limit = 2000;
  850. BillQuery billQuery = new BillQuery();
  851. billQuery.setLimit(limit);
  852. billQuery.setFormId(formId);
  853. billQuery.setFieldKeys("FNumber");
  854. List<Map> filterString = new ArrayList<>();
  855. //修改时间为昨天到今天
  856. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FModifyDate","265","1","","","0"));
  857. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FModifyDate","39","2025-03-06 00:00:00","","","0"));
  858. billQuery.setFilterString(filterString);
  859. List<Map> result = new ArrayList<>();
  860. List<Map> operatorList = new ArrayList<>();
  861. do {
  862. billQuery.setStartRow(startRow);
  863. String s = client.billQuery(JSONObject.toJSONString(billQuery));
  864. result = (List<Map>)JSONObject.parse(s);
  865. operatorList.addAll(result);
  866. startRow += limit;
  867. }while (result.size() == limit);
  868. for (Map operator : operatorList) {
  869. String fNumber = getString(operator.get("FNumber"));
  870. View view = new View();
  871. view.setNumber(fNumber);
  872. String resultJson2 = client.view(formId,JSONObject.toJSONString(view));
  873. RepoRet repoRet = gson.fromJson(resultJson2, RepoRet.class);
  874. if (isTrue(repoRet)) {
  875. Map result2 = (Map) repoRet.getResult().getResult();
  876. Map formData = new HashMap();
  877. formData.put("textField_m7k2tk3u",getString(((List<Map>)result2.get("Name")).get(0).get("Value")));//名称
  878. formData.put("textField_m7k2tk3t",getString(result2.get("Number")));//编号
  879. formData.put("textField_m7k2tk3v",getMultiLanguageTextName(result2.get("CurrencyId")));//币别
  880. formData.put("textField_m7lhqd0y",getEntryNumber(result2.get("CurrencyId")));//币别编码
  881. Map salApplycustomer = ((List<Map>) result2.get("SAL_APPLYCUSTOMER")).get(0);
  882. formData.put("textField_m7k314sr",getMultiLanguageTextName(salApplycustomer.get("CustID")));//客户名称
  883. formData.put("textField_m7k314ss",getEntryNumber(salApplycustomer.get("CustID")));//客户编码
  884. formData.put("textField_m7k2tk3z",(boolean) result2.get("IsIncludedTax") ? "是" : "否");//含税
  885. List<Map> salPricelistentry = (List<Map>) result2.get("SAL_PRICELISTENTRY");
  886. for (Map salPriceEntry : salPricelistentry) {
  887. formData.put("textField_m7k2tk3x",getMultiLanguageTextName(salPriceEntry.get("MaterialId")));//物料名称
  888. formData.put("textField_m7k2tk3w",getEntryNumber(salPriceEntry.get("MaterialId")));//物料编码
  889. formData.put("textField_m7k2tk3y",getMultiLanguageTextName(salPriceEntry.get("PriceUnitId")));//计价单位
  890. formData.put("textField_m7k314st",getEntryNumber(salPriceEntry.get("PriceUnitId")));//单位编码
  891. formData.put("numberField_m7k2tk41",new BigDecimal(getString(salPriceEntry.get("Price"))));//价格
  892. formData.put("textField_m7k2tk42",AUDITSTATUS.get(getString(salPriceEntry.get("RowAuditStatus"))));//审核状态
  893. formData.put("textField_m7u4x3hr",FFORBIDSTATUS.get(getString(salPriceEntry.get("ForbidStatus"))));//失效
  894. //新增数据
  895. ydClient.operateData(YDParam.builder()
  896. .formUuid("FORM-3B1E5298BA4644C1B994B81A4D986886YRA5")
  897. .formDataJson(JSONObject.toJSONString(formData))
  898. .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_m7k2tk3t, textField_m7k2tk3w",getString(result2.get("Number")),getEntryNumber(salPriceEntry.get("MaterialId")))))
  899. .useLatestVersion(true)
  900. .build(), YDConf.FORM_OPERATION.upsert);
  901. }
  902. }
  903. }
  904. }catch (Exception e){
  905. fail(e.getMessage());
  906. }
  907. return McR.success();
  908. }
  909. @Override
  910. public McR syncInspectionOrder() {
  911. try {
  912. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
  913. //业务对象标识
  914. String formId = "QM_InspectBill";
  915. K3CloudApi client = new K3CloudApi(initIden());
  916. Gson gson = new Gson();
  917. //查询当天已审核且审核结果为不合格的数据
  918. BillQuery billQuery = new BillQuery();
  919. billQuery.setFormId(formId);
  920. billQuery.setFieldKeys("FBillNo");
  921. billQuery.setStartRow(0);
  922. billQuery.setLimit(2000);
  923. List<Map> filterString = new ArrayList<>();
  924. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FInspectResult","29","2","","","0"));
  925. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FDocumentStatus","105","C","","","0"));
  926. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","13","","","","0"));//审核日期为今天
  927. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","39","2025-03-10 00:00:00","","","0"));//审核日期大于2025-03-10 00:00:00
  928. billQuery.setFilterString(filterString);
  929. String resultJson = client.billQuery(JSONObject.toJSONString(billQuery));
  930. List<Map> list = (List<Map>) JSONObject.parse(resultJson);
  931. Set<String> fBillNoSet = new HashSet<>();
  932. for (Map map : list) {
  933. String fBillNo = getString(map.get("FBillNo"));
  934. if (!fBillNoSet.contains(fBillNo)){
  935. fBillNoSet.add(fBillNo);
  936. }else {
  937. continue;
  938. }
  939. //查询宜搭中是否已添加该检验单
  940. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  941. .formUuid("FORM-959B1CB0AF9F41A091DFDE1203D0C7B2FQBO")
  942. .searchFieldJson(JSONObject.toJSONString(UtilMap.map("textField_m82j5zsd", fBillNo)))
  943. .build(), YDConf.FORM_QUERY.retrieve_list).getData();
  944. if (data.isEmpty()){
  945. View view = new View();
  946. view.setNumber(fBillNo);
  947. String resultJson2 = client.view(formId,JSONObject.toJSONString(view));
  948. RepoRet repoRet = gson.fromJson(resultJson2, RepoRet.class);
  949. if (isTrue(repoRet)){
  950. Map result = (Map) repoRet.getResult().getResult();
  951. Map formData = new HashMap();
  952. formData.put("textField_m82j5zsd",fBillNo);//单据编号
  953. formData.put("numberField_m86nmon3",result.get("Id"));//id
  954. formData.put("textField_m82j5zse",getMultiLanguageTextName(result.get("FBillTypeID")));//单据类型
  955. formData.put("textField_m82j5zsf",BUSINESS_TYPE.get(getString(result.get("BusinessType"))));//业务类型
  956. // 解析字符串为 LocalDateTime
  957. LocalDateTime localDateTime = LocalDateTime.parse(getString(result.get("FDate")), formatter);
  958. // 将 LocalDateTime 转换为 ZonedDateTime
  959. ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault());
  960. formData.put("dateField_m82j5zsk",zonedDateTime.toInstant().toEpochMilli());//单据日期
  961. formData.put("textField_m82j5zsl",FDOCUMENTSTATUS.get(getString(result.get("DocumentStatus"))));//单据状态
  962. if (!((List<Map>)result.get("Description")).isEmpty()){
  963. formData.put("textareaField_m82j5zsm",((List<Map>)result.get("Description")).get(0).get("Value"));//描述
  964. }
  965. List<Map> entityList = (List<Map>) result.get("Entity");
  966. List<Map> detailList = new ArrayList<>();
  967. for (Map entity : entityList) {
  968. Map detail = new HashMap();
  969. detail.put("textField_m82j5zsp",getEntryNumber(entity.get("MaterialId")));//物料编码
  970. detail.put("textField_m82j5zsr",getMultiLanguageTextSpecification(entity.get("MaterialId")));//规格型号
  971. detail.put("textField_m82j5zsq",getMultiLanguageTextName(entity.get("MaterialId")));//物料名称
  972. detail.put("textField_m82og859",getMultiLanguageTextName(entity.get("UnitId")));//单位
  973. detail.put("textField_m82og85a",getEntryNumber(entity.get("UnitId")));//单位编码
  974. detail.put("textField_m82qhpm0",getMultiLanguageTextName(entity.get("SupplierId")));//供应商
  975. detail.put("textField_m82qhpm1",getEntryNumber(entity.get("SupplierId")));//供应商编码
  976. detail.put("numberField_m82j5zst",entity.get("InspectQty"));//检验数量
  977. detail.put("numberField_m82j5zsu",entity.get("QualifiedQty"));//合格数
  978. detail.put("numberField_m82j5zsv",entity.get("UnqualifiedQty"));//不合格数
  979. detail.put("textField_m82j5zsx",INSPECT_RESULT.get(getString(entity.get("InspectResult"))));//检验结果
  980. detail.put("numberField_m873a1q2",entity.get("Id"));//分录明细id
  981. if (!((List<Map>)entity.get("Memo")).isEmpty()){
  982. detail.put("textField_m82j5zsz",((List<Map>)entity.get("Memo")).get(0).get("Value"));//不良原因
  983. }
  984. List<Map> policyDetail = (List<Map>) entity.get("PolicyDetail");
  985. if (!policyDetail.isEmpty()){
  986. detail.put("numberField_m8fkgsvo",policyDetail.get(0).get("Id"));//使用决策id
  987. }
  988. detailList.add(detail);
  989. }
  990. formData.put("tableField_m82j5zso",detailList);
  991. //新增数据
  992. ydClient.operateData(YDParam.builder()
  993. .formUuid("FORM-959B1CB0AF9F41A091DFDE1203D0C7B2FQBO")
  994. .formDataJson(JSONObject.toJSONString(formData))
  995. .build(), YDConf.FORM_OPERATION.create);
  996. }
  997. /*else {
  998. //更新数据
  999. ydClient.operateData(YDParam.builder()
  1000. .formInstId(getString(data.get(0).get("formInstanceId")))
  1001. .updateFormDataJson(JSONObject.toJSONString(formData))
  1002. .useLatestVersion(true).build(), YDConf.FORM_OPERATION.update);
  1003. }*/
  1004. }
  1005. }
  1006. }catch (Exception e){
  1007. return McR.errorUnknown(e.getMessage());
  1008. }
  1009. return McR.success();
  1010. }
  1011. @Override
  1012. public McR syncData() {
  1013. syncCustomers();//同步客户
  1014. syncSalesman();//同步业务员
  1015. syncSupplier();//同步供应商
  1016. syncSalePrice();//同步销售价目表
  1017. syncMaterial();//同步物料
  1018. //新增数据底表更新时间
  1019. ydClient.operateData(YDParam.builder()
  1020. .formUuid("FORM-5BAA6A050AC449438568D5A50FE2D2684RBN")
  1021. .formDataJson(JSONObject.toJSONString(UtilMap.map("dateField_m8sdk1ny", new Date().getTime())))
  1022. .build(), YDConf.FORM_OPERATION.create);
  1023. return McR.success();
  1024. }
  1025. @Async
  1026. @Override
  1027. public void manualSyncData(String userId) {
  1028. //发送工作通知
  1029. if (Strings.isNotBlank(userId)){
  1030. Map param2 = new HashMap();
  1031. param2.put("access_token",ddClient.getAccessToken());
  1032. Map body3 = new HashMap();
  1033. body3.put("agent_id",ddConf.getAgentId());
  1034. body3.put("userid_list",userId);
  1035. Map msg = new HashMap();
  1036. msg.put("msgtype","text");
  1037. //获取当前时间 精确到秒
  1038. String time = DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss");
  1039. msg.put("text", UtilMap.map("content","开始同步金蝶业务数据 时间:" + time));
  1040. body3.put("msg",msg);
  1041. UtilHttp.doPost("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2",null,param2,body3);
  1042. }
  1043. syncData();
  1044. //发送工作通知
  1045. if (Strings.isNotBlank(userId)){
  1046. Map param2 = new HashMap();
  1047. param2.put("access_token",ddClient.getAccessToken());
  1048. Map body3 = new HashMap();
  1049. body3.put("agent_id",ddConf.getAgentId());
  1050. body3.put("userid_list",userId);
  1051. Map msg = new HashMap();
  1052. msg.put("msgtype","text");
  1053. //获取当前时间 精确到秒
  1054. String time = DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss");
  1055. msg.put("text", UtilMap.map("content","金蝶业务数据已更新 时间:" + time));
  1056. body3.put("msg",msg);
  1057. UtilHttp.doPost("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2",null,param2,body3);
  1058. }
  1059. }
  1060. private String getMultiLanguageTextName(Object object){
  1061. if (Objects.nonNull(object)){
  1062. Map map = (Map) object;
  1063. List<Map> multiLanguageText = (List<Map>) map.get("MultiLanguageText");
  1064. String value = getString(multiLanguageText.get(0).get("Name"));
  1065. return value;
  1066. }
  1067. return null;
  1068. }
  1069. private String getMultiLanguageTextSpecification(Object object){
  1070. if (Objects.nonNull(object)){
  1071. Map map = (Map) object;
  1072. List<Map> multiLanguageText = (List<Map>) map.get("MultiLanguageText");
  1073. String value = getString(multiLanguageText.get(0).get("Specification"));
  1074. return value;
  1075. }
  1076. return null;
  1077. }
  1078. private String getEntryNumber(Object object){
  1079. if (Objects.nonNull(object)){
  1080. Map map = (Map) object;
  1081. String value = getString(map.get("Number"));
  1082. return value;
  1083. }
  1084. return null;
  1085. }
  1086. private boolean isTrue(RepoRet repoRet){
  1087. Gson gson = new Gson();
  1088. if (repoRet.getResult().getResponseStatus().isIsSuccess()) {
  1089. System.out.printf("接口返回结果: %s%n", gson.toJson(repoRet.getResult()));
  1090. return true;
  1091. } else {
  1092. fail("接口返回结果: " + gson.toJson(repoRet.getResult().getResponseStatus()));
  1093. return false;
  1094. }
  1095. }
  1096. private List<Map> getYdFormDataList(String formUuid, String searchCondition, YDConf.FORM_QUERY formQuery) {
  1097. List<Map> list = new ArrayList<>();
  1098. DDR_New ddrNew = new DDR_New();
  1099. int pageNumber = 1;
  1100. int pageSize = 100;
  1101. do {
  1102. ddrNew = ydClient.queryData(YDParam.builder().formUuid(formUuid)
  1103. .searchCondition(searchCondition)
  1104. .pageNumber(pageNumber)
  1105. .pageSize(pageSize).build(), formQuery);
  1106. list.addAll((List<Map>) ddrNew.getData());
  1107. pageNumber++;
  1108. }while (ddrNew.getTotalCount() > ddrNew.getPageNumber() * pageSize);
  1109. return list;
  1110. }
  1111. }