package com.zy.asrs.task.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.zy.asrs.entity.DocType; import com.zy.asrs.entity.Order; import com.zy.asrs.entity.OrderDetl; import com.zy.asrs.service.ApiLogService; import com.zy.asrs.service.DocTypeService; import com.zy.asrs.service.OrderDetlService; import com.zy.asrs.service.OrderService; import com.zy.asrs.task.AbstractHandler; import com.zy.asrs.task.core.ReturnT; import com.zy.asrs.task.kingdee.handler.LoginAuthenticationHandler; import com.zy.common.utils.HttpHandler; import com.zy.erp.kingdee.enums.KingDeeUtilType; 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 java.text.SimpleDateFormat; import java.util.*; @Service @Slf4j public class OrderReportHander extends AbstractHandler { @Value("${erp.address.URL}") //端口 private String URL; // @Value("${erp.address.inaddressSave}") // //上报入库地址 // private String inaddressSave; @Value("${erp.address.outaddressSave}") //上报出入库地址 private String outaddressSave; @Autowired private OrderService orderService; @Autowired private OrderDetlService orderDetlService; @Autowired private ApiLogService apiLogService; @Autowired private DocTypeService docTypeService; @Autowired private LoginAuthenticationHandler loginAuthenticationHandler; public ReturnT startPakIn() { // 查出所有数据入库单 List orderList = orderService.selectList(new EntityWrapper().eq("doc_type", 34)); for(Order order : orderList){ List orderMemoList = orderDetlService.selectList(new EntityWrapper() .isNull("memo") .eq("order_No", order.getOrderNo()));//memo为空表示仍未上报 List toReportList = new ArrayList<>(); // 循环判断 anfme 和 qty 是否相等,相等则表示已完成入库 for (OrderDetl orderDetl : orderMemoList) { if (orderDetl.getAnfme() != null && orderDetl.getQty() != null && orderDetl.getAnfme().doubleValue() == orderDetl.getQty().doubleValue()) { toReportList.add(orderDetl); } } // 如果有符合条件的数据,执行上报 if (!toReportList.isEmpty()) { boolean flag = reportPakIn(toReportList); if(flag){ for (OrderDetl detl : toReportList) { detl.setMemo("1"); orderDetlService.updateById(detl); log.info("已完成单据上报 =====> " + detl); } } else { log.warn("入库上报失败,未更新明细 memo上报 标志"); } } } return SUCCESS; } private boolean reportPakIn(List orderDetls) { Date now = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 构建主单 JSON 数据 JSONObject requestBody = new JSONObject(); requestBody.put("billType", "入库单"); // 从第一个明细中提取订单号等信息 if (!orderDetls.isEmpty()) { OrderDetl first = orderDetls.get(0); requestBody.put("orderNo", first.getOrderNo()); } requestBody.put("createTime", sdf.format(now)); // 构建物料列表 JSONArray matList = new JSONArray(); for (OrderDetl detl : orderDetls) { JSONObject mat = new JSONObject(); mat.put("matnr", detl.getMatnr()); mat.put("maktx", detl.getMaktx()); mat.put("batch", detl.getBatch()); mat.put("qty", detl.getQty()); mat.put("anfme", detl.getAnfme()); mat.put("units", detl.getUnits()); matList.add(mat); } requestBody.put("matList", matList); // 发送 POST 请求 String response = ""; boolean success = false; try { HashMap headers = new HashMap<>(); // cookie headers.put("Cookie", loginAuthenticationHandler.start().getContent()); response = new HttpHandler.Builder() .setHeaders(headers) .setUri(URL) .setPath(outaddressSave) // 设置你的接口路径 .setJson(requestBody.toJSONString()) .build() .doPost(); JSONObject data = JSON.parseObject(response); Object isSuccess = findValueByKey(data, "IsSuccess"); String bool = isSuccess != null ? isSuccess.toString() : "false"; if ("true".equals(bool)) { success = true; } } catch (Exception e) { log.error("上报ERP失败", e); } finally { try { apiLogService.save( "入库上报", URL + outaddressSave, null, "127.0.0.1", requestBody.toJSONString(), response, success ); } catch (Exception e) { log.error("日志保存失败", e); } } return success; } public ReturnT startPakOut() { // 所有数据出库单 List orderList = orderService.selectList(new EntityWrapper().eq("doc_type", 33)); for(Order order : orderList){ List orderMemoList = orderDetlService.selectList(new EntityWrapper() .isNull("memo") .eq("order_No", order.getOrderNo())); List toReportList = new ArrayList<>(); // 循环判断 anfme 和 qty 是否相等 for (OrderDetl orderDetl : orderMemoList) { if (orderDetl.getAnfme() != null && orderDetl.getQty() != null && orderDetl.getAnfme().doubleValue() == orderDetl.getQty().doubleValue()) { toReportList.add(orderDetl); } } // 如果有符合条件的数据,执行上报 if (!toReportList.isEmpty()) { boolean flag = reportPakOut(toReportList); if(flag){ for (OrderDetl detl : toReportList) { detl.setMemo("1"); orderDetlService.updateById(detl); log.info("已完成单据上报 =====> " + detl); } } else { log.warn("出库上报失败,未更新明细 memo 标志"); } } } return SUCCESS; } private boolean reportPakOut(List orderDetls) { Date now = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 构建主单 JSON 数据 JSONObject requestBody = new JSONObject(); requestBody.put("billType", "出库单"); // 从第一个明细中提取订单号等信息 if (!orderDetls.isEmpty()) { OrderDetl first = orderDetls.get(0); requestBody.put("orderNo", first.getOrderNo()); } requestBody.put("createTime", sdf.format(now)); // 构建物料列表 JSONArray matList = new JSONArray(); for (OrderDetl detl : orderDetls) { JSONObject mat = new JSONObject(); mat.put("matnr", detl.getMatnr()); mat.put("maktx", detl.getMaktx()); mat.put("batch", detl.getBatch()); mat.put("qty", detl.getQty()); mat.put("anfme", detl.getAnfme()); mat.put("units", detl.getUnits()); matList.add(mat); } requestBody.put("matList", matList); // 发送 POST 请求 String response = ""; boolean success = false; try { HashMap headers = new HashMap<>(); //cookie headers.put("Cookie", loginAuthenticationHandler.start().getContent()); response = new HttpHandler.Builder() .setHeaders(headers) .setUri(URL) .setPath(outaddressSave) // 设置你的接口路径 .setJson(requestBody.toJSONString()) .build() .doPost(); JSONObject data = JSON.parseObject(response); Object isSuccess = findValueByKey(data, "IsSuccess"); String bool = isSuccess != null ? isSuccess.toString() : "false"; if ("true".equals(bool)) { success = true; } } catch (Exception e) { log.error("上报ERP失败", e); } finally { try { apiLogService.save( "出库上报", URL + outaddressSave, null, "127.0.0.1", requestBody.toJSONString(), response, success ); } catch (Exception e) { log.error("日志保存失败", e); } } return success; } public static Object findValueByKey(JSONObject json, String key) { Set keySet = json.keySet(); for (String k : keySet) { Object v = json.get(k); if (k.equals(key)) { return v; } else if (v instanceof JSONArray) { int size = ((JSONArray) v).size(); for (int i = 0; i <= size - 1; i++) { Object result = findValueByKey((JSONObject) ((JSONArray) v).get(i), key); if (result != null){ return result; } } } else if (v instanceof JSONObject){ Object result = findValueByKey((JSONObject) v, key); if (result != null){ return result; } } } return null; } }