package com.vincent.rsf.server.ai.tool; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.common.utils.FieldsUtils; import com.vincent.rsf.server.manager.entity.DeviceSite; import com.vincent.rsf.server.manager.entity.LocItem; import com.vincent.rsf.server.manager.enums.LocStsType; import com.vincent.rsf.server.manager.service.DeviceSiteService; import com.vincent.rsf.server.manager.service.LocItemService; import lombok.RequiredArgsConstructor; import org.springframework.ai.tool.annotation.Tool; import org.springframework.ai.tool.annotation.ToolParam; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; @Component @RequiredArgsConstructor public class RsfWmsStockTools { private final LocItemService locItemService; private final DeviceSiteService deviceSiteService; @Tool(name = "rsf_query_available_inventory", description = "根据物料编码或物料名称查询当前在库且可用于出库的库存明细。") public List> queryAvailableInventory( @ToolParam(description = "物料编码,优先使用") String matnr, @ToolParam(description = "物料名称,当没有物料编码时使用") String maktx) { if (!StringUtils.hasText(matnr) && !StringUtils.hasText(maktx)) { throw new CoolException("物料编码或物料名称至少需要提供一个"); } LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); if (StringUtils.hasText(matnr)) { queryWrapper.eq(LocItem::getMatnrCode, matnr); } else { queryWrapper.eq(LocItem::getMaktx, maktx); } queryWrapper.apply( "EXISTS (SELECT 1 FROM man_loc ml WHERE ml.use_status = {0} AND ml.id = man_loc_item.loc_id)", LocStsType.LOC_STS_TYPE_F.type ); List locItems = locItemService.list(queryWrapper); List> result = new ArrayList<>(); for (LocItem locItem : locItems) { if (!Objects.isNull(locItem.getFieldsIndex())) { locItem.setExtendFields(FieldsUtils.getFields(locItem.getFieldsIndex())); } Map item = new LinkedHashMap<>(); item.put("id", locItem.getId()); item.put("locId", locItem.getLocId()); item.put("locCode", locItem.getLocCode()); item.put("matnrCode", locItem.getMatnrCode()); item.put("maktx", locItem.getMaktx()); item.put("trackCode", locItem.getTrackCode()); item.put("batch", locItem.getBatch()); item.put("spec", locItem.getSpec()); item.put("model", locItem.getModel()); item.put("unit", locItem.getUnit()); item.put("anfme", locItem.getAnfme()); item.put("status", locItem.getStatus()); item.put("extendFields", locItem.getExtendFields()); result.add(item); } return result; } @Tool(name = "rsf_query_station_list", description = "根据作业类型列表查询可用站点,返回站点编号、名称、目标位置和状态等信息。") public List> queryStationList( @ToolParam(required = true, description = "作业类型列表") List types) { if (types == null || types.isEmpty()) { throw new CoolException("站点类型列表不能为空"); } List sites = deviceSiteService.list(new LambdaQueryWrapper() .in(DeviceSite::getType, types)); List> result = new ArrayList<>(); for (DeviceSite site : sites) { Map item = new LinkedHashMap<>(); item.put("id", site.getId()); item.put("type", site.getType()); item.put("site", site.getSite()); item.put("name", site.getName()); item.put("target", site.getTarget()); item.put("label", site.getLabel()); item.put("device", site.getDevice()); item.put("deviceCode", site.getDeviceCode()); item.put("deviceSite", site.getDeviceSite()); item.put("channel", site.getChannel()); item.put("status", site.getStatus()); result.add(item); } return result; } }