zhou zhou
12 小时以前 5e40dee0e0a4e4cff4a1aafca2444f61c39cbf32
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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<Map<String, Object>> queryAvailableInventory(
            @ToolParam(description = "物料编码,优先使用") String matnr,
            @ToolParam(description = "物料名称,当没有物料编码时使用") String maktx) {
        if (!StringUtils.hasText(matnr) && !StringUtils.hasText(maktx)) {
            throw new CoolException("物料编码或物料名称至少需要提供一个");
        }
        LambdaQueryWrapper<LocItem> 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<LocItem> locItems = locItemService.list(queryWrapper);
        List<Map<String, Object>> result = new ArrayList<>();
        for (LocItem locItem : locItems) {
            if (!Objects.isNull(locItem.getFieldsIndex())) {
                locItem.setExtendFields(FieldsUtils.getFields(locItem.getFieldsIndex()));
            }
            Map<String, Object> 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<Map<String, Object>> queryStationList(
            @ToolParam(required = true, description = "作业类型列表") List<String> types) {
        if (types == null || types.isEmpty()) {
            throw new CoolException("站点类型列表不能为空");
        }
        List<DeviceSite> sites = deviceSiteService.list(new LambdaQueryWrapper<DeviceSite>()
                .in(DeviceSite::getType, types));
        List<Map<String, Object>> result = new ArrayList<>();
        for (DeviceSite site : sites) {
            Map<String, Object> 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;
    }
}