package com.zy.asrs.task.kingdee.handler; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.core.common.DateUtils; import com.core.common.SnowflakeIdWorker; import com.core.exception.CoolException; import com.zy.asrs.entity.*; import com.zy.asrs.service.*; import com.zy.asrs.service.impl.ErpSecretServiceImpl; import com.zy.asrs.task.AbstractHandler; import com.zy.asrs.task.core.ReturnT; import com.zy.asrs.utils.OrderInAndOutUtil; import com.zy.erp.kingdee.entity.param.MatLoadParam; import com.zy.erp.kingdee.enums.KingDeeUtilType; import com.zy.common.utils.HttpHandler; import com.zy.erp.kingdee.utils.KingDeeUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.List; @Service @Slf4j public class InboundOrderHandler extends AbstractHandler { @Value("${erp.address.URL}") //端口 private String URL; @Value("${erp.address.inaddress}") //单据,商品档案地址 private String inaddress; @Autowired private ApiLogService apiLogService; @Autowired private LoginAuthenticationHandler loginAuthenticationHandler; @Autowired private MatService matService; @Autowired private TagService tagService; @Autowired private DocTypeService docTypeService; @Autowired private OrderService orderService; @Autowired private OrderDetlService orderDetlService; @Autowired private SnowflakeIdWorker snowflakeIdWorker; @Autowired private LocOwnerService locOwnerService; @Autowired private ErpSecretServiceImpl erpSecretService; @Value("${erp.login.accountId}") private String accountId; @Value("${erp.login.xAcfwIdentity}") private String xAcfwIdentity; @Transactional public synchronized ReturnT start() { SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat sdf2=new SimpleDateFormat("yyyy-MM-dd"); //读取token ErpSecret erpSecret = erpSecretService.selectOne(new EntityWrapper().eq("account_id", accountId)); for(KingDeeUtilType kingDeeUtilType : KingDeeUtilType.values()) { MatLoadParam matLoadParam = new MatLoadParam(); DocType docType = docTypeService.selectOne(new EntityWrapper().eq("doc_name", kingDeeUtilType.desc)); if (Cools.isEmpty(docType) && !kingDeeUtilType.formId.equals("BD_MATERIAL")){ docType = docTypeService.selectOrAdd(kingDeeUtilType.desc, kingDeeUtilType.pakIn.equals(1)); } String FDocumentStatus=null; //条件和需要获得的结果拼接 JSONObject jsonObject = new JSONObject(); //物料档案查询 if(kingDeeUtilType.formId.equals("BD_MATERIAL")){ Tag tag = tagService.selectByName("全部", 1); jsonObject.put("id", null);//id jsonObject.put("number", null);//编码 jsonObject.put("createorg_number", null);//创建组织 jsonObject.put("start_createtime", "2025-01-01 00:00:00");//创建起始 jsonObject.put("end_createtime", sdf1.format(new Date()));//创建截止 jsonObject.put("start_modifytime", "2025-01-01 00:00:00");//更新起始 jsonObject.put("end_modifytime", sdf1.format(new Date()));//更新截止 jsonObject.put("start_approvedate", "2025-01-01");//审核起始 jsonObject.put("end_approvedate", sdf2.format(new Date()));//审核截止 jsonObject.put("status", Arrays.asList("B", "C"));//数据状态 [A:暂存, B:已提交, C:已审核] }else{ //获取最新时间 //单据状态 FDocumentStatus="B"; jsonObject.put("FilterString", "FCreateDate>'"+sdf1.format(docType.getCreateTime())+"'"+" and FStockId.Fname='立库'"+" and FDocumentStatus='"+FDocumentStatus+"'"); jsonObject.put("FieldKeys", "FBillNo,FCreateDate,FMaterialId.FNumber,FMaterialId.FName,FMaterialId.FSpecification,"+kingDeeUtilType.anfme+",FDocumentStatus"); // FBillNo :单据编号; // FCreateDate :单据创建时间; // FMaterialId.FNumber : 物料编码; // FMaterialName :物料名称; // FMaterialId.FSpecification:物料规格 // anfme : 物料数量 // FDocumentStatus :单据状态; } JSONObject jsonObject1 = new JSONObject(); jsonObject1.put("data", jsonObject); jsonObject1.put("pageSize", 10); jsonObject1.put("pageNo", 1); String add = jsonObject1.toJSONString(); //上报 String response = ""; boolean success = false; try { //获取Cookie值 HashMap headers = new HashMap<>(); headers.put("accesstoken", erpSecret.getAccessToken()); headers.put("x-acgw-identity", xAcfwIdentity); // 自定义请求头 response = new HttpHandler.Builder() .setHeaders(headers) .setUri(URL) .setPath(inaddress) .setJson(add) .build() .doPost(); JSONObject jsonResponse = JSON.parseObject(response); if(jsonResponse.getString("errorCode").equals("401")){ log.error("检索失败错误信息:{}", jsonResponse.getString("message")); loginAuthenticationHandler.start(); continue; } JSONArray data = jsonResponse.getJSONObject("data").getJSONArray("rows"); if(data.size()<=0) continue; //商品档案同步 if (kingDeeUtilType.formId.equals("BD_MATERIAL")) { Tag tag = tagService.selectByName("全部", 1); // 处理分页:根据返回的totalCount和pageSize计算页数 int pageSize = jsonResponse.getJSONObject("data").getIntValue("pageSize"); int totalCount = jsonResponse.getJSONObject("data").getIntValue("totalCount"); int totalPages = (int) Math.ceil((double) totalCount / pageSize); for (int page = 1; page <= totalPages; page++) { jsonObject1.put("pageNo", page); add = jsonObject1.toJSONString(); // 重新发起请求以获取该页的数据 response = new HttpHandler.Builder() .setHeaders(headers) .setUri(URL) .setPath(inaddress) .setJson(add) .build() .doPost(); jsonResponse = JSON.parseObject(response); data = jsonResponse.getJSONObject("data").getJSONArray("rows"); for (int j = 0; j < data.size(); j++) { JSONObject jsonObjectNew = data.getJSONObject(j); Date modifyTime = sdf1.parse(jsonObjectNew.get("modifytime").toString()); String matnr = jsonObjectNew.get("number").toString(); String name = jsonObjectNew.get("name").toString(); String createtime = jsonObjectNew.get("createtime").toString(); Double grossweight = jsonObjectNew.get("grossweight") != null ? new BigDecimal(jsonObjectNew.get("grossweight").toString()).doubleValue() : 0.0; Double height = jsonObjectNew.get("height") != null ? new BigDecimal(jsonObjectNew.get("height").toString()).doubleValue() : 0.0; Double width = jsonObjectNew.get("width") != null ? new BigDecimal(jsonObjectNew.get("width").toString()).doubleValue() : 0.0; Double length = jsonObjectNew.get("length") != null ? new BigDecimal(jsonObjectNew.get("length").toString()).doubleValue() : 0.0; // 生成商品档案 Mat mat = matService.selectByMatnr(matnr); if (mat == null) { mat = new Mat(); mat.setMatnr(matnr); mat.setMaktx(name); mat.setTagId(tag.getId()); mat.setWeight(grossweight); mat.setManLength(length); mat.setHeight(height); mat.setWidth(width); mat.setCreateTime(sdf1.parse(createtime)); mat.setUpdateTime(modifyTime); mat.setStatus(1); if (!matService.insert(mat)) { callApiLogSaveMat(mat, kingDeeUtilType, "同步新物料出错!" + mat, false); log.info("同步新物料出错!参数:[{}]、[{}]", mat, jsonObjectNew); } else { callApiLogSaveMat(mat, kingDeeUtilType, "同步新物料成功!", true); } } else { boolean isUpdated = false; if (mat.getUpdateTime().compareTo(modifyTime) != 0) { // 更新字段 if (!mat.getMaktx().equals(name)) mat.setMaktx(name); if (mat.getWeight().compareTo(grossweight) != 0) mat.setWeight(grossweight); if (mat.getManLength().compareTo(length) != 0) mat.setManLength(length); if (mat.getHeight().compareTo(height) != 0) mat.setHeight(height); if (mat.getWidth().compareTo(width) != 0) mat.setWidth(width); if (mat.getCreateTime().compareTo(sdf1.parse(createtime)) != 0) mat.setCreateTime(sdf1.parse(createtime)); mat.setUpdateTime(modifyTime); isUpdated = true; } // 执行更新操作 if (isUpdated) { mat.setUpdateTime(new Date()); if (!matService.updateById(mat)) { callApiLogSaveMat(mat, kingDeeUtilType, "更新物料出错!" + mat, false); log.info("更新物料[商品编号:{}], 更新失败!", mat.getMatnr()); } else { callApiLogSaveMat(mat, kingDeeUtilType, "更新物料成功!", true); log.info("更新物料[商品编号:{}]", mat.getMatnr()); } } } } } }else if(kingDeeUtilType.formId.equals("BD_RRGANIZATION")){ } else { for (int j = 0; j < data.size(); j++) { JSONArray jsonArray = data.getJSONArray(j); //最新抓取时间 Date jsonDate = KingDeeUtil.KingDeeDate(jsonArray.get(1).toString()); docType.setCreateTime(jsonDate); Order order = OrderInAndOutUtil.selectByNo(kingDeeUtilType.pakIn == 1, jsonArray.get(0).toString()); // Order order = orderService.selectByNo(jsonArray.get(0).toString()); LocOwner locOwner = null; if (!Cools.isEmpty(1)) { locOwner = locOwnerService.selectById(1); } else { locOwner = locOwnerService.selectById(1); } if (Cools.isEmpty(order)) { Date now = new Date(); // 单据主档 order = new Order( String.valueOf(snowflakeIdWorker.nextId()), // 编号[非空] jsonArray.get(0).toString(), // 订单编号 DateUtils.convert(now), // 单据日期 docType.getDocId(), // 单据类型 null, // 项目编号 "1", //项目名称 客户PO号 null, // 调拨项目编号 null, // 初始票据号 null, // 票据号 locOwner.getOwnerUuid(), // 客户编号 locOwner.getOwner(), // 客户 null, // 联系方式 null, // 操作人员 null, // 合计金额 null, // 优惠率 null, // 优惠金额 null, // 销售或采购费用合计 null, // 实付金额 null, // 付款类型 null, // 业务员 null, // 结算天数 null, // 邮费支付类型 null, // 邮费 null, // 付款时间 null, // 发货时间 null, // 物流名称 null, // 物流单号 1L, // 订单状态 1, // 状态 9527L, // 添加人员 now, // 添加时间 9527L, // 修改人员 now, // 修改时间 null // 备注 ); OrderInAndOutUtil.insertOrder(kingDeeUtilType.pakIn == 1, order); // if (!orderService.insert(order)) { // if (!jsonDate.equals(docType.getCreateTime())){ // callApiLogSaveOrder(order,kingDeeUtilType, "生成单据主档失败,请联系管理员"+order, false); // } // continue; //// throw new CoolException("生成单据主档失败,请联系管理员"); // } } //物料编码 Mat mat = matService.selectByMatnr(jsonArray.get(2).toString()); if (Cools.isEmpty(mat)) { if (!jsonDate.equals(docType.getCreateTime())){ callApiLogSaveOrder(order,kingDeeUtilType, "编号商品检索失败,请先添加商品"+jsonArray.get(2).toString(), false); } continue; } // OrderDetl orderDetl1 = orderDetlService.selectOne(new EntityWrapper().eq("order_no", jsonArray.get(0).toString()).eq("matnr", jsonArray.get(2).toString())); // if (!Cools.isEmpty(orderDetl1)) { // continue; // } Order order1 = OrderInAndOutUtil.selectByNo(kingDeeUtilType.pakIn == 1, jsonArray.get(0).toString()); List orderDetls = OrderInAndOutUtil.selectByOrderId(kingDeeUtilType.pakIn == 1, order1.getId()); boolean sign = false; for (OrderDetl orderDetl : orderDetls){ if (orderDetl.getMatnr().equals( jsonArray.get(2).toString())){ sign = true; break; } } if (sign){ continue; } OrderDetl orderDetl = new OrderDetl(); orderDetl.sync(mat); orderDetl.setBatch(null); orderDetl.setAnfme(Double.parseDouble(jsonArray.get(5).toString())); orderDetl.setOrderId(order.getId()); orderDetl.setOrderNo(order.getOrderNo()); orderDetl.setCreateBy(9527L); orderDetl.setCreateTime(new Date()); orderDetl.setUpdateBy(9527L); orderDetl.setUpdateTime(new Date()); orderDetl.setStatus(1); orderDetl.setQty(0.0D); // if (!orderDetlService.insert(orderDetl)) { // callApiLogSaveOrder(order,kingDeeUtilType, "生成单据明细失败,请联系管理员!订单号:"+order.getOrderNo(), false); //// throw new CoolException("生成单据明细失败,请联系管理员"); // } OrderInAndOutUtil.insertOrderDetl(kingDeeUtilType.pakIn == 1,order,orderDetl); } docTypeService.updateById(docType); } } catch (Exception e) { log.error("fail", e); // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return FAIL.setMsg(e.getMessage()); } finally { // try { // // 保存接口日志 // apiLogService.save( // "轮询数据", // URL + inaddress, // null, // "127.0.0.1", // add, // response, // success // ); // } catch (Exception e) { // log.error("", e); // } } } return SUCCESS; } public void callApiLogSaveMat(Mat mat, KingDeeUtilType kingDeeUtilType, String response, Boolean bool) { apiLogService.save("获取"+kingDeeUtilType.desc, kingDeeUtilType.formId, "null", URL, "物料编号:" + mat.getMatnr() + "、物料名称:" + mat.getName() + "、类型:" + mat.getTagId$() + "、状态:" + mat.getStatus$(), response, bool); } public void callApiLogSaveOrder(Order order, KingDeeUtilType kingDeeUtilType, String response, Boolean bool) { apiLogService.save("获取"+kingDeeUtilType.desc, kingDeeUtilType.formId, "null", URL, "单据编号:" + order.getId() + "、状态:" + order.getStatus$(), response, bool); } }