自动化立体仓库 - WMS系统
lty
2 天以前 264a479aa1ad16818110e9f9d833bbf02e298f47
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -6,25 +6,34 @@
import com.core.common.SnowflakeIdWorker;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.OpenOrderCompleteParam;
import com.zy.asrs.entity.param.OpenOrderPakinParam;
import com.zy.asrs.entity.param.OpenOrderPakoutParam;
import com.zy.asrs.entity.param.PackParam;
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
@@ -51,7 +60,16 @@
    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) {
@@ -438,4 +456,640 @@
        }
    }
    @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<Mat>().eq("matnr",matParam.getMatnr()))) {
                    throw new CoolException("更新已存在商品信息失败,请联系管理员");
                }
            }
        }
    }
    @Override
    @Transactional
    public void syncErpMat(List<Map<String, Object>> body) {
        if (Cools.isEmpty(body)) {
            return;
        }
        int count = 0;
        for (Map<String, Object> 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<MatSyncParam.MatParam> 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<String, Object> 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<String, Object> addErpOrder(List<OrderDto> orders) {
        if (Cools.isEmpty(orders)) {
            Map<String, Object> 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<String> successOrders = new ArrayList<>();
        List<Map<String, Object>> 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<ErpOrderDetl> 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<String, Object> fail = new HashMap<>();
                fail.put("orderNo", orderNo);
                fail.put("msg", e.getMessage());
                failOrders.add(fail);
            }
        }
        Map<String, Object> 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<Map<String, Object>> mesInventoryDetails(Map<String, Object> param) throws IOException {
        String wareHouseId = param != null ? String.valueOf(param.get("wareHouseId")) : null;
        if ("null".equalsIgnoreCase(wareHouseId)) wareHouseId = null;
        List<String> whIds = new ArrayList<>();
        if (Cools.isEmpty(wareHouseId)) {
            whIds.add("WH01");
            whIds.add("WH02");
            whIds.add("WH03");
        } else {
            whIds.add(wareHouseId);
        }
        List<Map<String, Object>> result = new ArrayList<>();
        for (String whId : whIds) {
            String baseUrl = getWarehouseBaseUrl(whId);
            if (Cools.isEmpty(baseUrl)) {
                throw new CoolException("未找到对应仓库编号");
            }
            Map<String, Object> payload = param == null ? new HashMap<>() : new HashMap<>(param);
            payload.put("wareHouseId", whId);
            List<Map<String, Object>> data = callMesInventoryApi(baseUrl, "/lfdwms/open/asrs/MES/inventory/details", payload);
            if (!Cools.isEmpty(data)) {
                result.addAll(data);
            }
        }
        return result;
    }
    @Override
    public List<Map<String, Object>> mesInventorySummary(Map<String, Object> param) throws IOException {
        String wareHouseId = param != null ? String.valueOf(param.get("wareHouseId")) : null;
        if ("null".equalsIgnoreCase(wareHouseId)) wareHouseId = null;
        List<String> whIds = new ArrayList<>();
        if (Cools.isEmpty(wareHouseId)) {
            whIds.add("WH01");
            whIds.add("WH02");
            whIds.add("WH03");
        } else {
            whIds.add(wareHouseId);
        }
        List<Map<String, Object>> result = new ArrayList<>();
        for (String whId : whIds) {
            String baseUrl = getWarehouseBaseUrl(whId);
            if (Cools.isEmpty(baseUrl)) {
                throw new CoolException("未找到对应仓库编号");
            }
            Map<String, Object> payload = param == null ? new HashMap<>() : new HashMap<>(param);
            payload.put("wareHouseId", whId);
            List<Map<String, Object>> 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<Map<String, Object>> callMesInventoryApi(String baseUrl, String path, Map<String, Object> payload) throws IOException {
        String json = JSON.toJSONString(payload == null ? new HashMap<>() : payload);
        Map<String, Object> 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<Map<String, Object>> list = new ArrayList<>();
            Map<String, Object> 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<ErpOrderDetl> 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<ErpOrderDetl> 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<ErpOrderDetl> 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<ErpOrderDetl> 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<DetlDto> 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<DetlDto> 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<String, Object> 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
        );
    }
}