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.mataddress}") //商品档案地址 private String matAddress; @Value("${erp.address.orgaddress}") //货主档案地址 private String orgAddress; @Value("${erp.address.impurreceivebilladdress}") //收料单查询 private String imPurreceiveBillAddress; @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(); String path = null; Date now = new Date(); //物料档案查询 if(kingDeeUtilType.formId.equals("BD_MATERIAL")){ // Mat latestMat = matService.selectLatest(); String latestUpdateTime = sdf1.format(docType.getUpdateTime()); // 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(now));//创建截止 jsonObject.put("start_modifytime", latestUpdateTime);//更新起始 jsonObject.put("end_modifytime", sdf1.format(now));//更新截止 jsonObject.put("start_approvedate", "2025-01-01");//审核起始 jsonObject.put("end_approvedate", sdf2.format(now));//审核截止 jsonObject.put("status", Arrays.asList("B", "C"));//数据状态 [A:暂存, B:已提交, C:已审核] path = matAddress; } else if(kingDeeUtilType.formId.equals("BD_RRGANIZATION")){ jsonObject.put("start_createtime", "2025-01-01 00:00:00");//id jsonObject.put("end_createtime", sdf1.format(now)); jsonObject.put("id", null); jsonObject.put("number", null); jsonObject.put("createorg_number", null); jsonObject.put("status", Arrays.asList("B", "C"));//数据状态 [A:暂存, B:已提交, C:已审核] path = orgAddress; } else if(kingDeeUtilType.formId.equals("PUR_RECEIVEBIll")){ jsonObject.put("start_biztime", "2025-01-01 00:00:00");//业务起始日期 jsonObject.put("end_biztime", sdf1.format(now));//业务结束日期 jsonObject.put("billno", null); jsonObject.put("billstatus", Arrays.asList("C"));//数据状态 [A:暂存, B:已提交, C:已审核] jsonObject.put("start_auditdate",null);//id jsonObject.put("end_auditdate", null); jsonObject.put("org_number", null); jsonObject.put("supplier_number", null); path = imPurreceiveBillAddress; } JSONObject jsonObject1 = new JSONObject(); jsonObject1.put("data", jsonObject); jsonObject1.put("pageSize", 20); 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(path) .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(path) .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); success = 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) { if (!matService.updateById(mat)) { callApiLogSaveMat(mat, kingDeeUtilType, "更新物料出错!" + mat, false); log.info("更新物料[商品编号:{}], 更新失败!", mat.getMatnr()); } else { callApiLogSaveMat(mat, kingDeeUtilType, "更新物料成功!", true); success = true; log.info("更新物料[商品编号:{}]", mat.getMatnr()); } } } } } if(success){ docType.setUpdateTime(now); docTypeService.updateById(docType); } } else if(kingDeeUtilType.formId.equals("BD_RRGANIZATION")){//货主同步 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(path) .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 updateTime = sdf1.parse(jsonObjectNew.get("modifytime").toString()); String ownerUuid = jsonObjectNew.get("number").toString(); String owner = jsonObjectNew.get("name").toString(); Date createTime = sdf1.parse(jsonObjectNew.get("createtime").toString()); // 生成商品档案 LocOwner locOwner = locOwnerService.selectByUuid(ownerUuid); if (locOwner == null) { locOwner = new LocOwner(); locOwner.setOwner(owner); locOwner.setOwnerUuid(ownerUuid); locOwner.setCreateTime(createTime); locOwner.setUpdateTime(updateTime); if (!locOwnerService.insert(locOwner)) { callApiLogSaveOwner(locOwner, kingDeeUtilType, "同步新货主出错!" + locOwner, false); log.info("同步新货主出错!参数:[{}]、[{}]", locOwner, jsonObjectNew); } else { callApiLogSaveOwner(locOwner, kingDeeUtilType, "同步新货主成功!", true); success = true; } } else { boolean isUpdated = false; if (locOwner.getUpdateTime().compareTo(updateTime) != 0) { // 更新字段 if (!locOwner.getOwner().equals(owner)) locOwner.setOwner(owner); if (!locOwner.getOwnerUuid().equals(ownerUuid)) locOwner.setOwnerUuid(ownerUuid); if (locOwner.getCreateTime().compareTo(createTime) != 0) locOwner.setCreateTime(createTime); locOwner.setUpdateTime(updateTime); isUpdated = true; } // 执行更新操作 if (isUpdated) { if (!locOwnerService.updateById(locOwner)) { callApiLogSaveOwner(locOwner, kingDeeUtilType, "更新物料出错!" + locOwner, false); log.info("更新货主[货主编号:{}], 更新失败!", locOwner.getOwnerUuid()); } else { callApiLogSaveOwner(locOwner, kingDeeUtilType, "更新物料成功!", true); success = true; log.info("更新货主[货主编号:{}]", locOwner.getOwnerUuid()); } } } } } } // else { // 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(path) // .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 updateTime = sdf1.parse(jsonObjectNew.get("modifytime").toString()); // String ownerUuid = jsonObjectNew.get("number").toString(); // String owner = jsonObjectNew.get("name").toString(); // Date createTime = sdf1.parse(jsonObjectNew.get("createtime").toString()); // String billNo = jsonObjectNew.get("billno").toString(); // // Order order = OrderInAndOutUtil.selectByNo(kingDeeUtilType.pakIn == 1, billNo); //// 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)) { // // 单据主档 // order = new Order( // String.valueOf(snowflakeIdWorker.nextId()), // 编号[非空] // billNo, // 订单编号 // createTime, // 单据日期 // docType.getDocId(), // 单据类型 // null, // 项目编号 // "1", //项目名称 客户PO号 // null, // 调拨项目编号 // null, // 初始票据号 // null, // 票据号 // null, // 客户编号 // 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 { } } return SUCCESS; } public void callApiLogSaveMat(Mat mat, KingDeeUtilType kingDeeUtilType, String response, Boolean bool) { apiLogService.save("获取"+kingDeeUtilType.desc, kingDeeUtilType.formId, "null", URL, "物料编号:" + mat.getMatnr() + "、物料名称:" + mat.getMaktx() + "、毛重:" + mat.getWeight() + "、长:" + mat.getManLength() + "、宽:" + mat.getWidth() + "、高:" + mat.getHeight() + "、状态:" + mat.getStatus$(), response, bool); } public void callApiLogSaveOwner(LocOwner locOwner, KingDeeUtilType kingDeeUtilType, String response, Boolean bool) { apiLogService.save("获取"+kingDeeUtilType.desc, kingDeeUtilType.formId, "null", URL, "货主编号:" + locOwner.getOwnerUuid() + "、货主名称:" + locOwner.getOwner(), 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); } }