package com.zy.asrs.service.impl; 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.entity.param.*; import com.zy.asrs.entity.result.OpenOrderCompeteResult; import com.zy.asrs.entity.result.StockVo; import com.zy.asrs.mapper.TagMapper; import com.zy.asrs.service.*; import com.zy.asrs.service.ErpMatService; import com.zy.asrs.service.ErpOrderService; import com.zy.asrs.service.ErpOrderDetlService; import com.zy.asrs.utils.MatUtils; import com.zy.common.model.DetlDto; import com.zy.common.utils.HttpHandler; import com.zy.common.utils.NodeUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.TransactionTemplate; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Created by vincent on 2022/4/9 */ @Slf4j @Service public class OpenServiceImpl implements OpenService { @Autowired private OrderService orderService; @Autowired private OrderDetlService orderDetlService; @Autowired private SnowflakeIdWorker snowflakeIdWorker; @Autowired private DocTypeService docTypeService; @Autowired private MatService matService; @Autowired private LocDetlService locDetlService; @Autowired private PackService packService; @Autowired private TagService tagService; @Autowired private TagMapper tagMapper; @Autowired private ErpMatService erpMatService; @Autowired private ErpOrderService erpOrderService; @Autowired private ErpOrderDetlService erpOrderDetlService; @Autowired private ApiLogService apiLogService; @Autowired private PlatformTransactionManager transactionManager; @Override @Transactional public void pakinOrderCreate(OpenOrderPakinParam param) { Order order = orderService.selectByNo(param.getOrderNo()); if (!Cools.isEmpty(order)) { throw new CoolException(param.getOrderNo() + "单据已存在,请勿重复提交"); } DocType docType = docTypeService.selectOrAdd(param.getOrderType(), Boolean.TRUE); Date now = new Date(); // 单据主档 order = new Order( String.valueOf(snowflakeIdWorker.nextId()), // 编号[非空] param.getOrderNo(), // 订单编号 DateUtils.convert(now), // 单据日期 docType.getDocId(), // 单据类型 null, // 项目编号 null, // null, // 调拨项目编号 null, // 初始票据号 null, // 票据号 null, // 客户编号 null, // 客户 null, // 联系方式 null, // 操作人员 null, // 合计金额 null, // 优惠率 null, // 优惠金额 null, // 销售或采购费用合计 null, // 实付金额 null, // 付款类型 null, // 业务员 null, // 结算天数 null, // 邮费支付类型 null, // 邮费 null, // 付款时间 null, // 发货时间 null, // 物流名称 null, // 物流单号 1L, // 订单状态 1, // 状态 9527L, // 添加人员 now, // 添加时间 9527L, // 修改人员 now, // 修改时间 null // 备注 ); if (!orderService.insert(order)) { throw new CoolException("生成单据主档失败,请联系管理员"); } // 单据明细档 List list = new ArrayList<>(); List orderDetails = param.getOrderDetails(); for (DetlDto detail : orderDetails) { DetlDto dto = new DetlDto(detail.getMatnr(), detail.getBatch(), detail.getAnfme()); if (DetlDto.has(list, dto)) { DetlDto detlDto = DetlDto.find(list, dto.getMatnr(), dto.getBatch()); assert detlDto != null; detlDto.setAnfme(detlDto.getAnfme() + detail.getAnfme()); } else { list.add(dto); } } for (DetlDto detlDto : list) { Mat mat = matService.selectByMatnr(detlDto.getMatnr()); if (Cools.isEmpty(mat)) { throw new CoolException(detlDto.getMatnr() + "编号商品检索失败,请先添加商品"); } OrderDetl orderDetl = new OrderDetl(); orderDetl.sync(mat); orderDetl.setBatch(detlDto.getBatch()); orderDetl.setAnfme(detlDto.getAnfme()); orderDetl.setOrderId(order.getId()); orderDetl.setOrderNo(order.getOrderNo()); orderDetl.setCreateBy(9527L); orderDetl.setCreateTime(now); orderDetl.setUpdateBy(9527L); orderDetl.setUpdateTime(now); orderDetl.setStatus(1); orderDetl.setQty(0.0D); if (!orderDetlService.insert(orderDetl)) { throw new CoolException("生成单据明细失败,请联系管理员"); } } } @Override @Transactional public List pakinOrderComplete(OpenOrderCompleteParam param) { List results = new ArrayList<>(); if (!Cools.isEmpty(param) && !Cools.isEmpty(param.getOrderNo())) { // 指定订单 Order order = orderService.selectByNo(param.getOrderNo()); if (null != order) { OpenOrderCompeteResult result = new OpenOrderCompeteResult(); results.add(result); result.setOrderNo(order.getOrderNo()); result.setOrderTime(order.getOrderTime()); result.setOrderType(order.getDocType$()); List orderDetls = orderDetlService.selectByOrderId(order.getId()); for (OrderDetl orderDetl : orderDetls) { result.getOrderDetails().add(new DetlDto(orderDetl.getOrderNo(), orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getQty())); } if (order.getSettle() == 4L) { // 修改订单状态 4.完成 ===>> 6.已上报 if (!orderService.updateSettle(order.getId(), 6L, null)) { throw new CoolException("服务器内部错误,请联系管理员"); } } } } else { // 所有订单 List orders = orderService.selectList(new EntityWrapper().eq("settle", 4L)); for (Order order : orders) { OpenOrderCompeteResult result = new OpenOrderCompeteResult(); results.add(result); result.setOrderNo(order.getOrderNo()); result.setOrderTime(order.getOrderTime()); result.setOrderType(order.getDocType$()); List orderDetls = orderDetlService.selectByOrderId(order.getId()); for (OrderDetl orderDetl : orderDetls) { result.getOrderDetails().add(new DetlDto(orderDetl.getOrderNo(), orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getQty())); } // 修改订单状态 4.完成 ===>> 6.已上报 if (!orderService.updateSettle(order.getId(), 6L, null)) { throw new CoolException("服务器内部错误,请联系管理员"); } } } return results; } @Override @Transactional public void pakoutOrderCreate(OpenOrderPakoutParam param) { Order order = orderService.selectByNo(param.getOrderNo()); // 如果单据不存在则添加;如果单据存在,作业中无法修改,反之则修改单据 if (!Cools.isEmpty(order)) { if (order.getSettle() > 1L) { throw new CoolException(param.getOrderNo() + "正在出库,无法修改单据"); } orderService.remove(order.getId()); } DocType docType = docTypeService.selectOrAdd(param.getOrderType(), Boolean.FALSE); Date now = new Date(); // 单据主档 order = new Order( String.valueOf(snowflakeIdWorker.nextId()), // 编号[非空] param.getOrderNo(), // 订单编号 DateUtils.convert(now), // 单据日期 docType.getDocId(), // 单据类型 null, // 项目编号 null, // null, // 调拨项目编号 null, // 初始票据号 null, // 票据号 null, // 客户编号 null, // 客户 null, // 联系方式 null, // 操作人员 null, // 合计金额 null, // 优惠率 null, // 优惠金额 null, // 销售或采购费用合计 null, // 实付金额 null, // 付款类型 null, // 业务员 null, // 结算天数 null, // 邮费支付类型 null, // 邮费 null, // 付款时间 null, // 发货时间 null, // 物流名称 null, // 物流单号 1L, // 订单状态 1, // 状态 9527L, // 添加人员 now, // 添加时间 9527L, // 修改人员 now, // 修改时间 null // 备注 ); if (!orderService.insert(order)) { throw new CoolException("生成单据主档失败,请联系管理员"); } // 单据明细档 List list = new ArrayList<>(); List orderDetails = param.getOrderDetails(); for (DetlDto detail : orderDetails) { DetlDto dto = new DetlDto(detail.getMatnr(), detail.getBatch(), detail.getAnfme()); if (DetlDto.has(list, dto)) { DetlDto detlDto = DetlDto.find(list, dto.getMatnr(), dto.getBatch()); assert detlDto != null; detlDto.setAnfme(detlDto.getAnfme() + detail.getAnfme()); } else { list.add(dto); } } for (DetlDto detlDto : list) { Mat mat = matService.selectByMatnr(detlDto.getMatnr()); if (Cools.isEmpty(mat)) { throw new CoolException(detlDto.getMatnr() + "编号商品检索失败,请先添加商品"); } OrderDetl orderDetl = new OrderDetl(); orderDetl.sync(mat); orderDetl.setBatch(detlDto.getBatch()); orderDetl.setAnfme(detlDto.getAnfme()); orderDetl.setOrderId(order.getId()); orderDetl.setOrderNo(order.getOrderNo()); orderDetl.setCreateBy(9527L); orderDetl.setCreateTime(now); orderDetl.setUpdateBy(9527L); orderDetl.setUpdateTime(now); orderDetl.setStatus(1); orderDetl.setQty(0.0D); if (!orderDetlService.insert(orderDetl)) { throw new CoolException("生成单据明细失败,请联系管理员"); } } } @Override public List pakoutOrderComplete(OpenOrderCompleteParam param) { List results = new ArrayList<>(); if (!Cools.isEmpty(param) && !Cools.isEmpty(param.getOrderNo())) { // 指定订单 Order order = orderService.selectByNo(param.getOrderNo()); if (null != order) { OpenOrderCompeteResult result = new OpenOrderCompeteResult(); results.add(result); result.setOrderNo(order.getOrderNo()); result.setOrderTime(order.getOrderTime()); result.setOrderType(order.getDocType$()); List orderDetls = orderDetlService.selectByOrderId(order.getId()); for (OrderDetl orderDetl : orderDetls) { result.getOrderDetails().add(new DetlDto(orderDetl.getOrderNo(), orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getQty())); } if (order.getSettle() == 4L) { // 修改订单状态 4.完成 ===>> 6.已上报 if (!orderService.updateSettle(order.getId(), 6L, null)) { throw new CoolException("服务器内部错误,请联系管理员"); } } } } else { // 所有订单 List orders = orderService.selectList(new EntityWrapper().eq("settle", 4L)); for (Order order : orders) { OpenOrderCompeteResult result = new OpenOrderCompeteResult(); results.add(result); result.setOrderNo(order.getOrderNo()); result.setOrderTime(order.getOrderTime()); result.setOrderType(order.getDocType$()); List orderDetls = orderDetlService.selectByOrderId(order.getId()); for (OrderDetl orderDetl : orderDetls) { result.getOrderDetails().add(new DetlDto(orderDetl.getOrderNo(), orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getQty())); } // 修改订单状态 4.完成 ===>> 6.已上报 if (!orderService.updateSettle(order.getId(), 6L, null)) { throw new CoolException("服务器内部错误,请联系管理员"); } } } return results; } @Override @Transactional public List queryStock() { return locDetlService.queryStockTotal(); } @Override @Transactional public void packageUp(PackParam param) { if (Cools.isEmpty(param.getBarcode())) { throw new CoolException("barcode不能为空"); } Mat analyse = MatUtils.analyseMat(param.getBarcode()); Pack pack = packService.selectByBarcode(param.getBarcode()); if (null != pack) { throw new CoolException(param.getBarcode() + "重复提交"); } Date now = new Date(); pack = new Pack( param.getBarcode(), // 条码[非空] analyse.getMatnr(), // 商品编号 analyse.getBarcode(), // 序列码 1L, // 订单状态 1, // 状态 now, // 添加时间 null, // 添加人员 now, // 修改时间 null, // 修改人员 null // 备注 ); if (!packService.insert(pack)) { throw new CoolException("服务器内部错误,请联系管理员"); } Mat mat = matService.selectByMatnr(analyse.getMatnr()); if (mat == null) { mat = new Mat(); // 分类 Long tagId; // 一级分类 if (!Cools.isEmpty(param.getGroupCode()) && !Cools.isEmpty(param.getGroupName())) { Tag priTag = tagService.selectByName(param.getGroupCode(), 2); if (priTag == null) { Tag top = tagService.getTop(); NodeUtils nodeUtils = new NodeUtils(); nodeUtils.executePath(top.getId()); priTag = new Tag( null, // 编号 param.getGroupCode(), // 名称 top.getId(), // 父级 top.getName(), // 父级名称 nodeUtils.path.toString(), // 关联路径 nodeUtils.pathName.toString(), // 关联路径名 0, // 类型 null, // 负责人 null, // 图片 null, // 简要描述 null, // 数量 2, // 等级 null, // 排序 1, // 状态 now, // 添加时间 null, // 添加人员 now, // 修改时间 null, // 修改人员 null // 备注 ); if (tagMapper.insert(priTag) == 0) { throw new CoolException("服务器内部错误,请联系管理员"); } } // 二级分类 Tag secTag = tagService.selectByName(param.getGroupName(), 3); if (secTag == null) { NodeUtils nodeUtils = new NodeUtils(); nodeUtils.executePath(priTag.getId()); secTag = new Tag( null, // 编号 param.getGroupName(), // 名称 priTag.getId(), // 父级 priTag.getName(), // 父级名称 nodeUtils.path.toString(), // 关联路径 nodeUtils.pathName.toString(), // 关联路径名 0, // 类型 null, // 负责人 null, // 图片 null, // 简要描述 null, // 数量 3, // 等级 null, // 排序 1, // 状态 now, // 添加时间 null, // 添加人员 now, // 修改时间 null, // 修改人员 null // 备注 ); if (tagMapper.insert(secTag) == 0) { throw new CoolException("服务器内部错误,请联系管理员"); } } tagId = secTag.getId(); } else { tagId = tagService.getTop().getId(); } mat.setTagId(tagId); mat.setMatnr(analyse.getMatnr()); mat.setMaktx(param.getMaterialName()); mat.setSpecs(param.getConfigureDesc()); mat.setModel(analyse.getModel()); mat.setStatus(1); mat.setCreateTime(now); mat.setUpdateTime(now); if (!matService.insert(mat)) { throw new CoolException("服务器内部错误,请联系管理员"); } else { log.info("打包上线添加新物料[商品编号:{}]", mat.getMatnr()); } } } @Override @Transactional public void syncMat(MatSyncParam param) { if (Cools.isEmpty(param.getMatDetails()) || param.getMatDetails().size() <=0 ) { throw new CoolException("商品数据为空"); } for(MatSyncParam.MatParam matParam : param.getMatDetails()){ if(Cools.isEmpty(matParam.getMatnr())){ throw new CoolException("商品编码不能为空"); } Date now = new Date(); Mat mat = matService.selectByMatnr(matParam.getMatnr()); if (mat == null) { mat = new Mat(); // 分类 Long tagId; // 一级分类 if (!Cools.isEmpty(matParam.getGroupCode()) && !Cools.isEmpty(matParam.getGroupName())) { Tag priTag = tagService.selectByName(matParam.getGroupCode(), 2); if (priTag == null) { Tag top = tagService.getTop(); NodeUtils nodeUtils = new NodeUtils(); nodeUtils.executePath(top.getId()); priTag = new Tag( null, // 编号 matParam.getGroupCode(), // 名称 top.getId(), // 父级 top.getName(), // 父级名称 nodeUtils.path.toString(), // 关联路径 nodeUtils.pathName.toString(), // 关联路径名 0, // 类型 null, // 负责人 null, // 图片 null, // 简要描述 null, // 数量 2, // 等级 null, // 排序 1, // 状态 now, // 添加时间 null, // 添加人员 now, // 修改时间 null, // 修改人员 null // 备注 ); if (tagMapper.insert(priTag) == 0) { throw new CoolException("服务器内部错误,请联系管理员"); } } // 二级分类 Tag secTag = tagService.selectByName(matParam.getGroupName(), 3); if (secTag == null) { NodeUtils nodeUtils = new NodeUtils(); nodeUtils.executePath(priTag.getId()); secTag = new Tag( null, // 编号 matParam.getGroupName(), // 名称 priTag.getId(), // 父级 priTag.getName(), // 父级名称 nodeUtils.path.toString(), // 关联路径 nodeUtils.pathName.toString(), // 关联路径名 0, // 类型 null, // 负责人 null, // 图片 null, // 简要描述 null, // 数量 3, // 等级 null, // 排序 1, // 状态 now, // 添加时间 null, // 添加人员 now, // 修改时间 null, // 修改人员 null // 备注 ); if (tagMapper.insert(secTag) == 0) { throw new CoolException("服务器内部错误,请联系管理员"); } } tagId = secTag.getId(); } else { tagId = tagService.getTop().getId(); } mat.sync(matParam); // mat.setMatnr(param.getMatnr()); // mat.setMaktx(param.getMaktx()); // mat.setSpecs(param.getSpecs()); // mat.setModel(param.getModel()); mat.setTagId(tagId); mat.setStatus(1); mat.setCreateTime(now); mat.setUpdateTime(now); if (!matService.insert(mat)) { throw new CoolException("服务器内部错误,请联系管理员"); } else { log.info("同步新物料[商品编号:{}]", mat.getMatnr()); } } else { mat.sync(matParam); if (!matService.update(mat, new EntityWrapper().eq("matnr",matParam.getMatnr()))) { throw new CoolException("更新已存在商品信息失败,请联系管理员"); } } } } @Override @Transactional public void syncErpMat(List> body) { if (Cools.isEmpty(body)) { return; } int count = 0; for (Map m : body) { Object matNrObj = m.get("matNr"); Object makTxObj = m.get("makTx"); if (Cools.isEmpty(matNrObj) || Cools.isEmpty(makTxObj)) { continue; } ErpMat erpMat = new ErpMat(); erpMat.setMatNr(String.valueOf(matNrObj)); erpMat.setMakTx(String.valueOf(makTxObj)); Object groupIdObj = m.get("groupId"); if (!Cools.isEmpty(groupIdObj)) { erpMat.setGroupId(String.valueOf(groupIdObj)); } Object groupNameObj = m.get("groupName"); if (!Cools.isEmpty(groupNameObj)) { erpMat.setGroupName(String.valueOf(groupNameObj)); } Object specObj = m.get("spec"); if (!Cools.isEmpty(specObj)) { erpMat.setSpec(String.valueOf(specObj)); } Object modelObj = m.get("model"); if (!Cools.isEmpty(modelObj)) { erpMat.setModel(String.valueOf(modelObj)); } Object weightObj = m.get("weight"); if (!Cools.isEmpty(weightObj)) { Double w = null; if (weightObj instanceof Number) { w = ((Number) weightObj).doubleValue(); } else { try { w = Double.valueOf(String.valueOf(weightObj)); } catch (Exception ignored) {} } erpMat.setWeight(w); } Object colorObj = m.get("color"); if (!Cools.isEmpty(colorObj)) { erpMat.setColor(String.valueOf(colorObj)); } Object sizeObj = m.get("size"); if (!Cools.isEmpty(sizeObj)) { erpMat.setSize(String.valueOf(sizeObj)); } Object unitObj = m.get("unit"); if (!Cools.isEmpty(unitObj)) { erpMat.setUnit(String.valueOf(unitObj)); } Object describleObj = m.get("describle"); if (!Cools.isEmpty(describleObj)) { erpMat.setDescribe(String.valueOf(describleObj)); } Object wareHouseIdObj = m.get("wareHouseId"); if (!Cools.isEmpty(wareHouseIdObj)) { erpMat.setWareHouseId(String.valueOf(wareHouseIdObj)); } // 调用外部接口校验 String syncError = null; String whId = erpMat.getWareHouseId(); if (!Cools.isEmpty(whId)) { if ("WH01".equals(whId)) { syncError = syncToWarehouse1(erpMat); } else if ("WH2".equals(whId)) { syncError = syncToWarehouse2(erpMat); } else if ("WH3".equals(whId)) { syncError = syncToWarehouse3(erpMat); } else { callApiLogSave(null, null, "未找到对应仓库编码!!", true); throw new CoolException("同步外部接口失败,仓库ID:" + whId + ",错误信息:未找到对应仓库编号" ); } } if (syncError != null) { // 如果同步失败,则不插入数据库,抛异常回滚或者跳过(当前逻辑为抛异常,因为是事务整体) // 若要部分成功,需要调整事务策略。这里假设要求全部成功。 throw new CoolException("同步外部接口失败,仓库ID:" + whId + ",物料:" + erpMat.getMatNr() + ",错误信息:" + syncError); } Object operateTypeObj = m.get("operateType"); if (!Cools.isEmpty(operateTypeObj)) { Integer ot = null; if (operateTypeObj instanceof Number) { ot = ((Number) operateTypeObj).intValue(); } else { try { ot = Integer.valueOf(String.valueOf(operateTypeObj)); } catch (Exception ignored) {} } erpMat.setOperateType(ot); } erpMat.setSendStatus(1); boolean ok = erpMatService.insert(erpMat); if (ok) { count++; } } if (count <= 0) { throw new CoolException("同步物料失败,无有效数据插入"); } } // 模拟调用仓库1接口 private String syncToWarehouse1(ErpMat mat) { log.info("Calling Warehouse 1 API for mat: {}", mat.getMatNr()); return callMatSyncApi(mat, "http://localhost:8081"); } // 模拟调用仓库2接口 private String syncToWarehouse2(ErpMat mat) { log.info("Calling Warehouse 2 API for mat: {}", mat.getMatNr()); return callMatSyncApi(mat, "http://localhost:8080"); } // 模拟调用仓库3接口 private String syncToWarehouse3(ErpMat mat) { log.info("Calling Warehouse 3 API for mat: {}", mat.getMatNr()); return callMatSyncApi(mat, "http://localhost:8080"); } private String callMatSyncApi(ErpMat mat, String baseUrl) { try { // 构造请求参数 MatSyncParam param = new MatSyncParam(); List list = new ArrayList<>(); MatSyncParam.MatParam matParam = new MatSyncParam.MatParam(); Date now = new Date(); // 字段映射 matParam.setMatnr(mat.getMatNr()); matParam.setMaktx(mat.getMakTx()); matParam.setSpecs(mat.getSpec()); matParam.setModel(mat.getModel()); matParam.setWeight(mat.getWeight()); matParam.setColor(mat.getColor()); matParam.setUnit(mat.getUnit()); matParam.setMemo(mat.getDescribe()); matParam.setGroupCode(mat.getGroupId()); matParam.setGroupName(mat.getGroupName()); list.add(matParam); param.setMatDetails(list); param.setCreateTime(String.valueOf(now)); String path = "/lfdwms/open/asrs/order/matSync/default/v1"; String json = JSON.toJSONString(param); Map headers = new HashMap<>(); headers.put("appkey", "ea1f0459efc02a79f046f982767939ae"); // headers.put("x-acgw-identity", "your_identity"); String response = new HttpHandler.Builder() .setHeaders(headers) .setUri(baseUrl) .setPath(path) .setJson(json) .build() .doPost(); if (Cools.isEmpty(response)) { return "接口无响应"; } JSONObject jsonResponse = JSON.parseObject(response); if (jsonResponse == null) { return "接口响应格式错误"; } // 根据实际返回结构判断成功失败 // 假设 code == 0 或 200 为成功 Integer code = jsonResponse.getInteger("code"); if (code != null && (code == 0 || code == 200)) { return null; // 成功返回 null } else { return jsonResponse.getString("msg") != null ? jsonResponse.getString("msg") : "未知错误,code=" + code; } } catch (Exception e) { log.error("Call sync api error", e); return "接口调用异常:" + e.getMessage(); } } @Override public Map addErpOrder(List orders) { if (Cools.isEmpty(orders)) { Map res = new HashMap<>(); res.put("result", "FAIL"); res.put("successOrders", new ArrayList<>()); res.put("failOrders", new ArrayList<>()); res.put("successCount", 0); res.put("failCount", 0); return res; } TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); List successOrders = new ArrayList<>(); List> failOrders = new ArrayList<>(); for (OrderDto dto : orders) { String orderNo = dto != null ? dto.getOrderNo() : null; try { transactionTemplate.execute(status -> { if (dto == null) { throw new CoolException("订单参数不完整"); } ErpOrder order = new ErpOrder(); order.setOrderNo(dto.getOrderNo()); order.setOrderType(dto.getOrderType()); order.setWkType(dto.getWkType()); order.setBusinessTime(dto.getBusinessTime()); order.setCreateTime(dto.getCreateTime()); order.setWarehouseId(dto.getWareHouseId()); order.setOperateType(dto.getOperateType()); order.setSendStatus(dto.getSendStatus() != null ? dto.getSendStatus() : 0); List detls = dto.getOrderItems(); if (Cools.isEmpty(order.getOrderNo()) || order.getOrderType() == null || Cools.isEmpty(order.getWkType()) || order.getBusinessTime() == null || order.getCreateTime() == null || Cools.isEmpty(order.getWarehouseId())) { throw new CoolException("订单参数不完整"); } if (Cools.isEmpty(detls)) { throw new CoolException("订单明细为空"); } String syncError = null; String whId = order.getWarehouseId(); Integer orderType = order.getOrderType(); if (!Cools.isEmpty(whId)) { if ("WH01".equals(whId)) { syncError = syncOrderToWarehouse1(order, detls, orderType); } else if ("WH2".equals(whId)) { syncError = syncOrderToWarehouse2(order, detls, orderType); } else if ("WH3".equals(whId)) { syncError = syncOrderToWarehouse3(order, detls, orderType); } else { throw new CoolException("未找到对应仓库编号"); } } if (syncError != null) { throw new CoolException(syncError); } if (!erpOrderService.insert(order)) { throw new CoolException("订单插入失败"); } if (order.getId() == null) { throw new CoolException("订单插入失败,未返回orderId"); } for (ErpOrderDetl detl : detls) { if (detl == null || Cools.isEmpty(detl.getLineId()) || Cools.isEmpty(detl.getMatNr()) || Cools.isEmpty(detl.getMakTx()) || detl.getAnfme() == null) { throw new CoolException("明细参数不完整"); } detl.setOrderId(order.getId()); if (!erpOrderDetlService.insert(detl)) { throw new CoolException("订单明细插入失败"); } } return null; }); successOrders.add(orderNo); } catch (Exception e) { Map fail = new HashMap<>(); fail.put("orderNo", orderNo); fail.put("msg", e.getMessage()); failOrders.add(fail); } } Map res = new HashMap<>(); res.put("successOrders", successOrders); res.put("failOrders", failOrders); res.put("successCount", successOrders.size()); res.put("failCount", failOrders.size()); res.put("result", failOrders.isEmpty() ? "SUCCESS" : (successOrders.isEmpty() ? "FAIL" : "PART_SUCCESS")); return res; } @Override public List> mesInventoryDetails(Map param) throws IOException { String wareHouseId = param != null ? String.valueOf(param.get("wareHouseId")) : null; if ("null".equalsIgnoreCase(wareHouseId)) wareHouseId = null; List whIds = new ArrayList<>(); if (Cools.isEmpty(wareHouseId)) { whIds.add("WH01"); whIds.add("WH02"); whIds.add("WH03"); } else { whIds.add(wareHouseId); } List> result = new ArrayList<>(); for (String whId : whIds) { String baseUrl = getWarehouseBaseUrl(whId); if (Cools.isEmpty(baseUrl)) { throw new CoolException("未找到对应仓库编号"); } Map payload = param == null ? new HashMap<>() : new HashMap<>(param); payload.put("wareHouseId", whId); List> data = callMesInventoryApi(baseUrl, "/lfdwms/open/asrs/MES/inventory/details", payload); if (!Cools.isEmpty(data)) { result.addAll(data); } } return result; } @Override public List> mesInventorySummary(Map param) throws IOException { String wareHouseId = param != null ? String.valueOf(param.get("wareHouseId")) : null; if ("null".equalsIgnoreCase(wareHouseId)) wareHouseId = null; List whIds = new ArrayList<>(); if (Cools.isEmpty(wareHouseId)) { whIds.add("WH01"); whIds.add("WH02"); whIds.add("WH03"); } else { whIds.add(wareHouseId); } List> result = new ArrayList<>(); for (String whId : whIds) { String baseUrl = getWarehouseBaseUrl(whId); if (Cools.isEmpty(baseUrl)) { throw new CoolException("未找到对应仓库编号"); } Map payload = param == null ? new HashMap<>() : new HashMap<>(param); payload.put("wareHouseId", whId); List> data = callMesInventoryApi(baseUrl, "/lfdwms/open/asrs/MES/inventory/summary", payload); if (!Cools.isEmpty(data)) { result.addAll(data); } } return result; } private String getWarehouseBaseUrl(String wareHouseId) { if (Cools.isEmpty(wareHouseId)) { return null; } String wh = wareHouseId.trim(); if ("WH01".equalsIgnoreCase(wh) || "WH1".equalsIgnoreCase(wh)) { return "http://localhost:8081"; } if ("WH02".equalsIgnoreCase(wh) || "WH2".equalsIgnoreCase(wh)) { return "http://localhost:8080"; } if ("WH03".equalsIgnoreCase(wh) || "WH3".equalsIgnoreCase(wh)) { return "http://localhost:8080"; } return null; } private List> callMesInventoryApi(String baseUrl, String path, Map payload) throws IOException { String json = JSON.toJSONString(payload == null ? new HashMap<>() : payload); Map headers = new HashMap<>(); headers.put("appkey", "ea1f0459efc02a79f046f982767939ae"); String response = new HttpHandler.Builder() .setHeaders(headers) .setUri(baseUrl) .setPath(path) .setJson(json) .build() .doPost(); if (Cools.isEmpty(response)) { throw new CoolException("接口无响应"); } JSONObject jsonResponse = JSON.parseObject(response); if (jsonResponse == null) { throw new CoolException("接口响应格式错误"); } Integer code = jsonResponse.getInteger("code"); if (code != null && (code == 0 || code == 200)) { Object data = jsonResponse.get("data"); if (data == null) { return new ArrayList<>(); } if (data instanceof List) { return JSON.parseObject(JSON.toJSONString(data), List.class); } List> list = new ArrayList<>(); Map one = JSON.parseObject(JSON.toJSONString(data), Map.class); if (one != null) { list.add(one); } return list; } String msg = jsonResponse.getString("msg"); throw new CoolException(!Cools.isEmpty(msg) ? msg : "未知错误,code=" + code); } // 模拟调用仓库1接口 private String syncOrderToWarehouse1(ErpOrder order, List details, Integer orderType) { log.info("Calling Warehouse 1 API for order: {}", order.getOrderNo()); return callOrderSyncApi(order, details, orderType, "http://localhost:8081"); } // 模拟调用仓库2接口 private String syncOrderToWarehouse2(ErpOrder order, List details, Integer orderType) { log.info("Calling Warehouse 2 API for order: {}", order.getOrderNo()); return callOrderSyncApi(order, details, orderType, "http://localhost:8080"); } // 模拟调用仓库3接口 private String syncOrderToWarehouse3(ErpOrder order, List details, Integer orderType) { log.info("Calling Warehouse 3 API for order: {}", order.getOrderNo()); return callOrderSyncApi(order, details, orderType, "http://localhost:8080"); } private String callOrderSyncApi(ErpOrder order, List details, Integer orderType, String baseUrl) { try { // 根据 orderType 判断接口路径 // 假设 1=出库,2=入库(请根据实际业务调整,这里按用户描述逻辑实现) // 用户描述:若是入库单则调用order/pakin/default/v1,若是出库order/pakout/default/v1 // 假设 orderType 2 为入库,1 或 3 为出库(需确认 3 调拨单属于哪类,暂归为出库或不处理) String path; String json; if (orderType == 2) { // 入库单 path = "/lfdwms/open/asrs/order/pakin/default/v1"; OpenOrderPakinParam param = new OpenOrderPakinParam(); param.setOrderNo(order.getOrderNo()); // 这里可能需要映射 wkType 到 orderType 字符串,或者直接用 param.setOrderType(order.getWkType()); param.setOrderTime(DateUtils.convert(new Date(order.getBusinessTime()))); List detlDtos = new ArrayList<>(); if (!Cools.isEmpty(details)) { for (ErpOrderDetl d : details) { DetlDto dto = new DetlDto(); dto.setMatnr(d.getMatNr()); // 如果有 batch 字段则设置,OpenOrderPakinParam 的 DetlDto 可能需要确认字段 dto.setBatch(d.getBatch()); dto.setAnfme(d.getAnfme() != null ? d.getAnfme().doubleValue() : 0.0); // 其他字段映射... detlDtos.add(dto); } } param.setOrderDetails(detlDtos); json = JSON.toJSONString(param); } else if (orderType == 1 || orderType == 3) { // 出库单 path = "/lfdwms/open/asrs/order/pakout/default/v1"; OpenOrderPakoutParam param = new OpenOrderPakoutParam(); param.setOrderNo(order.getOrderNo()); param.setOrderType(order.getWkType()); param.setOrderTime(DateUtils.convert(new Date(order.getBusinessTime()))); param.setLgort("5006"); // 必填校验要求 List detlDtos = new ArrayList<>(); if (!Cools.isEmpty(details)) { for (ErpOrderDetl d : details) { DetlDto dto = new DetlDto(); dto.setMatnr(d.getMatNr()); dto.setBatch(d.getBatch()); dto.setAnfme(d.getAnfme() != null ? d.getAnfme().doubleValue() : 0.0); detlDtos.add(dto); } } param.setOrderDetails(detlDtos); json = JSON.toJSONString(param); } else { return "未知的订单类型:" + orderType; } Map headers = new HashMap<>(); headers.put("appkey", "ea1f0459efc02a79f046f982767939ae"); String response = new HttpHandler.Builder() .setHeaders(headers) .setUri(baseUrl) .setPath(path) .setJson(json) .build() .doPost(); if (Cools.isEmpty(response)) { return "接口无响应"; } JSONObject jsonResponse = JSON.parseObject(response); if (jsonResponse == null) { return "接口响应格式错误"; } Integer code = jsonResponse.getInteger("code"); if (code != null && (code == 0 || code == 200)) { return null; } else { return jsonResponse.getString("msg") != null ? jsonResponse.getString("msg") : "未知错误,code=" + code; } } catch (Exception e) { log.error("Call order sync api error", e); return "接口调用异常:" + e.getMessage(); } } public void callApiLogSave(Mat mat, String url, String response, Boolean bool) { apiLogService.save( "ERP同步物料信息", url, null, null, "物料编号:" + (mat != null ? mat.getMatnr() : null) + "、物料名称:" + (mat != null ? mat.getMaktx() : null), response, bool ); } }