1
昨天 b71ca6faa130dbd9baed68d1402365ccc63e79c2
lsh#
5个文件已修改
97 ■■■■ 已修改文件
asrs-schedule/src/main/java/com/vincent/rsf/schedule/api/entity/constant/RcsConstant.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
asrs-schedule/src/main/java/com/vincent/rsf/schedule/api/service/impl/ReportMsgServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
asrs-schedule/src/main/java/com/vincent/rsf/schedule/api/entity/constant/RcsConstant.java
@@ -10,6 +10,7 @@
    //上报订单信息
    public static String REPORT_ORDERS = "/rsf-open-api/erp/report/order";
    public static String REPORT_ORDERS_NEW = "/rsf-open-api/erp/report/order/new";
    public static String REPORT_TASKS = "/rsf-open-api/mes/reportTaskExecute";
asrs-schedule/src/main/java/com/vincent/rsf/schedule/api/service/impl/ReportMsgServiceImpl.java
@@ -193,7 +193,7 @@
            throw new CoolException("参数不能为空!!");
        }
        /**WMS基础配置链接*/
        String rcsUrl = rcsApi.getHost() + ":" + rcsApi.getPort() + RcsConstant.REPORT_ORDERS;
        String rcsUrl = rcsApi.getHost() + ":" + rcsApi.getPort() + RcsConstant.REPORT_ORDERS_NEW;
        log.info("上报已完成订单:{}, 请求参数: {}", rcsUrl, JSONObject.toJSONString(params));
        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Type", "application/json");
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java
@@ -301,6 +301,7 @@
                            .setSourceId(item.getLocId())
                            .setSourceCode(item.getLocCode());
                }
                taskItem.setId(null);
                taskItems.add(taskItem);
                Double qty = Math.round((item.getWorkQty() + item.getOutQty()) * 10000) / 10000.0;
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java
@@ -66,8 +66,9 @@
        if (Objects.isNull(itemParams) || itemParams.isEmpty()) {
            throw new CoolException("参数不能为空!!");
        }
        String waveId = map.get("wave").toString();
        Wave waves = this.getById(Long.parseLong(waveId));
//        Wave waveId = (Wave) map.get("wave");
        Wave wave = JSON.parseObject(JSON.toJSONString(map.get("wave")), Wave.class);
        Wave waves = this.getById(wave.getId());
        if (Objects.isNull(waves)) {
            throw new CoolException("波次数据不存在!!");
        }
@@ -390,13 +391,18 @@
    private List<WaveItem> getLocs(List<WaveItem> waveItems) throws Exception {
        //TODO  根据物料编码,批次,动态字段 查询符合的库位,再根据库位中物料的数量选择最适合的库位
        waveItems.forEach(waveItem -> {
            List<LocItem> locItems = locItemService.list(new QueryWrapper<LocItem>()
            LambdaQueryWrapper<LocItem> locItemLambdaQueryWrapper = new QueryWrapper<LocItem>()
                    .select("id", "loc_id", "loc_code", "order_id", "SUM(anfme) anfme", "SUM(qty) qty", "SUM(work_qty) work_qty", "splr_batch", "fields_index", "matnr_code")
                    .lambda()
                    .eq(LocItem::getMatnrCode, waveItem.getMatnrCode())
                    .eq(LocItem::getSplrBatch, waveItem.getSplrBatch())
                    .eq(StringUtils.isNotBlank(waveItem.getFieldsIndex()), LocItem::getFieldsIndex, waveItem.getFieldsIndex())
                    .groupBy(LocItem::getMatnrCode, LocItem::getSplrBatch, LocItem::getFieldsIndex, LocItem::getId));
                    .eq(StringUtils.isNotBlank(waveItem.getFieldsIndex()), LocItem::getFieldsIndex, waveItem.getFieldsIndex());
            Wave wave = this.getById(waveItem.getWaveId());
            if (!Cools.isEmpty(wave.getLocCode())) {
                locItemLambdaQueryWrapper.eq(LocItem::getLocCode, wave.getLocCode());
            }
            locItemLambdaQueryWrapper.groupBy(LocItem::getMatnrCode, LocItem::getSplrBatch, LocItem::getFieldsIndex, LocItem::getId);
            List<LocItem> locItems = locItemService.list(locItemLambdaQueryWrapper);
            List<Double> doubles1 = locItems.stream().map(LocItem::getAnfme).collect(Collectors.toList());
            double[] doubles = doubles1.stream().mapToDouble(Double::doubleValue).toArray();
rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java
@@ -124,6 +124,39 @@
        return locItems;
    }
    /**
     * 出库策略:--〈效率优化〉
     *
     * @param matnrCode
     * @param splrBatch
     * @param anfme
     * @return
     */
    public static List<LocItem> getEfficiencyFirstItemList(String matnrCode, String splrBatch, Double anfme,String locCode) {
        LambdaQueryWrapper<LocItem> locItemQueryWrapper = new LambdaQueryWrapper<>();
        locItemQueryWrapper.eq(LocItem::getMatnrCode, matnrCode);
        if (!Cools.isEmpty(locCode)){
            locItemQueryWrapper.eq(LocItem::getLocCode, locCode);
        }
        locItemQueryWrapper.eq(StringUtils.isNotBlank(splrBatch), LocItem::getBatch, splrBatch);
        String applySql = String.format(
                "EXISTS (SELECT 1 FROM man_loc ml " +
                        "WHERE ml.use_status = '%s'" +
                        "AND ml.id = man_loc_item.loc_id " +
                        ")",
                LocStsType.LOC_STS_TYPE_F.type
        );
        locItemQueryWrapper.apply(applySql);
        LocItemService locItemService = SpringUtils.getBean(LocItemService.class);
        List<LocItem> locItems = locItemService.list(locItemQueryWrapper);
        locItems.sort(Comparator.comparing((LocItem item) -> !LocUtils.isShallowLoc(item.getLocCode())));
        List<LocItem> locsSet = locItems.stream().filter(locItem -> locItem.getAnfme().compareTo(anfme) == 0.0).collect(Collectors.toList());
        if (!locsSet.isEmpty()) {
            return locsSet;
        }
        return locItems;
    }
    /**
     * 出库策略:--<先进先出>
@@ -136,6 +169,41 @@
    public static List<LocItem> getFirstInFirstOutItemList(String matnrCode, String splrBatch, Double anfme) {
        LambdaQueryWrapper<LocItem> locItemQueryWrapper = new LambdaQueryWrapper<>();
        locItemQueryWrapper.eq(LocItem::getMatnrCode, matnrCode);
        locItemQueryWrapper.eq(StringUtils.isNotEmpty(splrBatch), LocItem::getBatch, splrBatch);
        //如果批次不为空,按批次先后出库
        if (StringUtils.isNotBlank(splrBatch)) {
            locItemQueryWrapper.orderByAsc(LocItem::getBatch);
        } else {
            locItemQueryWrapper.orderByAsc(LocItem::getCreateTime);
        }
        String applySql = String.format(
                "EXISTS (SELECT 1 FROM man_loc ml " +
                        "WHERE ml.use_status = '%s'" +
                        "AND ml.id = man_loc_item.loc_id " +
                        ")",
                LocStsType.LOC_STS_TYPE_F.type
        );
        locItemQueryWrapper.apply(applySql);
        LocItemService locItemService = SpringUtils.getBean(LocItemService.class);
        List<LocItem> locItems = locItemService.list(locItemQueryWrapper);
        return locItems;
    }
    /**
     * 出库策略:--<先进先出>
     *
     * @param matnrCode
     * @param splrBatch
     * @param anfme
     * @return
     */
    public static List<LocItem> getFirstInFirstOutItemList(String matnrCode, String splrBatch, Double anfme,String locCode) {
        LambdaQueryWrapper<LocItem> locItemQueryWrapper = new LambdaQueryWrapper<>();
        locItemQueryWrapper.eq(LocItem::getMatnrCode, matnrCode);
        if (!Cools.isEmpty(locCode)){
            locItemQueryWrapper.eq(LocItem::getLocCode, locCode);
        }
        locItemQueryWrapper.eq(StringUtils.isNotEmpty(splrBatch), LocItem::getBatch, splrBatch);
        //如果批次不为空,按批次先后出库
        if (StringUtils.isNotBlank(splrBatch)) {
@@ -180,14 +248,14 @@
            }
            List<LocItem> locItems;
            if (Objects.isNull(waveRule)) {
                locItems = LocManageUtil.getFirstInFirstOutItemList(item.getMatnrCode(), item.getBatch(), item.getAnfme());
                locItems = LocManageUtil.getFirstInFirstOutItemList(item.getMatnrCode(), item.getBatch(), item.getAnfme(),locCode);
            } else {
                if (WaveRuleType.Efficiency_First.type.equals(waveRule.getType())) {
                    locItems = LocManageUtil.getEfficiencyFirstItemList(item.getMatnrCode(), item.getBatch(), item.getAnfme());
                    locItems = LocManageUtil.getEfficiencyFirstItemList(item.getMatnrCode(), item.getBatch(), item.getAnfme(),locCode);
                } else if (WaveRuleType.First_In_First_Out.type.equals(waveRule.getType())) {
                    locItems = LocManageUtil.getFirstInFirstOutItemList(item.getMatnrCode(), item.getBatch(), item.getAnfme());
                    locItems = LocManageUtil.getFirstInFirstOutItemList(item.getMatnrCode(), item.getBatch(), item.getAnfme(),locCode);
                } else {
                    locItems = LocManageUtil.getFirstInFirstOutItemList(item.getMatnrCode(), item.getBatch(), item.getAnfme());
                    locItems = LocManageUtil.getFirstInFirstOutItemList(item.getMatnrCode(), item.getBatch(), item.getAnfme(),locCode);
                }
            }
            for (LocItem locItem : locItems) {
@@ -233,6 +301,7 @@
                                .apply("cross_zone_area != '[]'")  // 不是空数组
                                .apply("container_type != '[]'")
                                .apply("station_alias != '[]'")
                                .apply("station_alias_sta_no != '[]'")
                                .apply("JSON_CONTAINS(cross_zone_area, {0}) = 1", loc.getAreaId().toString())//可执行库区区区域id
                                .apply("JSON_CONTAINS(container_type, {0}) = 1", containerType.getContainerType().toString())//容器类型
                                .eq(BasStationArea::getDeleted, 0));