skyouc
8 天以前 0696db2f8a83d32d8c00ba55967694ed1a76f4d0
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java
@@ -17,6 +17,7 @@
import com.vincent.rsf.server.common.utils.CommonUtil;
import com.vincent.rsf.server.common.utils.FieldsUtils;
import com.vincent.rsf.server.common.utils.JwtUtil;
import com.vincent.rsf.server.manager.controller.params.GenerateTaskParams;
import com.vincent.rsf.server.manager.controller.params.IsptItemsParams;
import com.vincent.rsf.server.manager.controller.params.WaitPakinParam;
import com.vincent.rsf.server.manager.entity.*;
@@ -36,6 +37,7 @@
import com.vincent.rsf.server.system.service.UserLoginService;
import com.vincent.rsf.server.system.service.UserService;
import com.vincent.rsf.server.system.utils.SerialRuleUtils;
import org.apache.commons.codec.digest.Md5Crypt;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -45,6 +47,8 @@
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;
@@ -123,12 +127,14 @@
    private LocAreaRelaMapper locAreaRelaMapper;
    @Autowired
    private LocAreaMapper locAreaMapper;
    @Autowired
    private DeviceSiteMapper deviceSiteMapper;
    /**
     * @return
     * @author Ryan
     * @description 手持PDA登录接口
     * @params LoginParam param, HttpServletRequest request
     * @return
     * @time 2025/3/10 15:36
     */
    @Override
@@ -160,10 +166,10 @@
    }
    /**
     * @author Ryan
     * @description 扫码获取收货明细
     * @param barcode
     * @return
     * @author Ryan
     * @description 扫码获取收货明细
     * @time 2025/3/10 15:37
     */
    @Override
@@ -171,7 +177,10 @@
        if (StringUtils.isBlank(barcode)) {
            return R.error("标签码不能为空!!");
        }
        List<AsnOrderItem> asnOrderItem = asnOrderItemMapper.selectList(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getTrackCode, barcode));
        List<AsnOrderItem> asnOrderItem = asnOrderItemMapper.selectList(new LambdaQueryWrapper<AsnOrderItem>()
                .eq(AsnOrderItem::getTrackCode, barcode));
        if (Objects.isNull(asnOrderItem)) {
            throw new CoolException("单据明细不存在!!");
        }
@@ -180,15 +189,16 @@
    }
    /**
     * @param params
     * @param loginUserId
     * @return
     * @author Ryan
     * @description 收货至收货区
     * @param  params
     * @return
     * @time 2025/3/10 15:41
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R receiptToWarehouse(Map<String, Object> params) {
    public synchronized R receiptToWarehouse(Map<String, Object> params, Long loginUserId) {
        if (Objects.isNull(params)) {
            throw new CoolException("参数不能为空!!");
        }
@@ -207,7 +217,6 @@
        }
        List<ReceiptDetlsDto> receipts = receiptParam.getReceipts();
        List<WarehouseAreasItem> allOrders = new ArrayList<>();
        Double receiptQty = receipts.stream().mapToDouble(ReceiptDetlsDto::getReceiptQty).sum();
@@ -231,7 +240,9 @@
        }
        List<Map<String, Object>> receipts1 = (List<Map<String, Object>>) params.get("receipts");
        for (Map<String, Object> rcpt : receipts1) {
            if (Objects.isNull(rcpt)) {continue;}
            if (null == rcpt || Objects.isNull(rcpt)) {
                continue;
            }
            ReceiptDetlsDto dto = JSONObject.parseObject(JSONObject.toJSONString(rcpt), ReceiptDetlsDto.class);
            Matnr matnr = matnrMapper.selectById(dto.getMatnrId());
            if (Objects.isNull(matnr)) {
@@ -245,16 +256,18 @@
//            }
            AsnOrderItem orderItem = asnOrderItemMapper.selectOne(new LambdaQueryWrapper<AsnOrderItem>()
                    .eq(AsnOrderItem::getAsnCode, asnCode)
                    .eq(AsnOrderItem::getTrackCode, dto.getBarcode())
                    .eq(AsnOrderItem::getMatnrId, dto.getMatnrId()));
            if (Objects.isNull(orderItem)) {
                throw new CoolException("通知单明细不存在!!");
            }
            if (Objects.isNull(dto.getReceiptQty()) || Double.compare(dto.getReceiptQty(), 0.0) == 0) {
                throw new CoolException("物料:" + dto.getMaktx() +  "收货数量不能为零!!");
                throw new CoolException("物料:" + dto.getMaktx() + "收货数量不能为零!!");
            }
            Double itemRcptQty = dto.getReceiptQty() + orderItem.getQty();
            orderItem.setQty(itemRcptQty)
                    .setSplrBatch(dto.getSplrBatch())
//                    .setSplrBatch(dto.getSplrBatch())
                    .setUpdateBy(loginUserId)
                    .setStockUnit(dto.getStockUnit())
                    .setProdTime(dto.getProdTime());
@@ -262,7 +275,7 @@
                try {
                    if (Objects.isNull(rcpt.get("fieldsindex")) || StringUtils.isBlank(rcpt.get("fieldsindex").toString())) {
                        //获取16位uuid
                        String uuid16 = CommonUtil.randomUUID16();
                        String uuid16 = Cools.md5(dto.getBarcode());
                        rcpt.put("index", uuid16);
                        orderItem.setFieldsIndex(uuid16);
                    }
@@ -291,45 +304,52 @@
                    .setAsnId(asnOrder.getId())
                    .setProdTime(dto.getProdTime())
                    .setWeight(dto.getWeigth())
                    .setStockUnit(dto.getStockUnit())
                    .setBatch(SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_RECEIPT_BATCH, dto))
                    //库存单位为最小单位
                    .setUnit(orderItem.getStockUnit())
                    .setStockUnit(orderItem.getStockUnit())
                    .setBatch(StringUtils.isBlank(orderItem.getBatch()) ? SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_RECEIPT_BATCH, dto) : orderItem.getBatch())
                    .setAnfme(dto.getReceiptQty())
                    .setSplrBatch(dto.getSplrBatch())
                    .setMatnrCode(matnr.getCode())
                    .setUpdateBy(loginUserId)
                    .setCreateBy(loginUserId)
                    .setMatnrId(matnr.getId())
                    .setMaktx(matnr.getName())
                    //库存单位为最小单位
                    .setUnit(dto.getStockUnit())
                    .setStockUnit(dto.getStockUnit())
                    .setWeight(matnr.getWeight())
                    .setFieldsIndex(orderItem.getFieldsIndex())
                    .setShipperId(matnr.getShipperId());
            //TODO 供应商标识未设置,标识由PO单供应商编码转换
            allOrders.add(item);
            WarehouseAreasItem serviceOne = warehouseAreasItemService.getOne(new LambdaQueryWrapper<WarehouseAreasItem>()
                    .eq(WarehouseAreasItem::getAsnItemId, item.getAsnItemId())
                    .eq(WarehouseAreasItem::getTrackCode, item.getTrackCode())
                    .eq(StringUtils.isNotBlank(item.getSplrBatch()), WarehouseAreasItem::getSplrBatch, item.getSplrBatch()));
            if (!Objects.isNull(serviceOne)) {
                item.setAnfme(item.getAnfme() + serviceOne.getAnfme());
                item.setId(serviceOne.getId());
            }
            if (!warehouseAreasItemService.saveOrUpdate(item)) {
                throw new CoolException("收货失败!!");
            }
        }
        if (!warehouseAreasItemService.saveBatch(allOrders)) {
            throw new CoolException("收货失败!!");
        AsnOrder order = asnOrderMapper.getOne(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getCode, asnCode));
        if (order.getQty().compareTo(order.getAnfme()) >= 0.00) {
            order.setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_RECEIPT_DONE.val).setRleStatus(Short.valueOf("1"));
            if (!asnOrderMapper.updateById(order)) {
                throw new CoolException("订单状态修改失败!!");
            }
        }
//        //获取采购数量
//        double purQty = receipts.stream().mapToDouble(ReceiptDetlsDto::getPurQty).sum();
//
//        BigDecimal subtract = BigDecimal.valueOf(receiptQty).subtract(BigDecimal.valueOf(purQty));
//        //判断已收货数量是否小于等于采购数量
//        if (subtract.compareTo(new BigDecimal("0.0")) <= 0) {
//            asnOrder.setRleStatus(Short.valueOf("1"));
//            //日志表操作
//            operateOrderLogs(asnOrder);
//        }
        return R.ok(asnOrder);
        return R.ok("收货成功!!");
    }
    /**
     * @author Ryan
     * @description 其它收货
     * @param params
     * @return
     * @author Ryan
     * @description 其它收货
     */
    @Override
    public R otherReceipt(OtherReceiptParams params) {
@@ -338,20 +358,28 @@
        }
        List<AsnOrderItem> asnOrderItem = asnOrderItemMapper.selectList(new LambdaQueryWrapper<AsnOrderItem>()
                .eq(AsnOrderItem::getAsnCode, params.getAsnCode())
                .eq(!Objects.isNull(params.getTrackCode()) ,AsnOrderItem::getTrackCode, params.getTrackCode()));
                .eq(!Objects.isNull(params.getTrackCode()), AsnOrderItem::getTrackCode, params.getTrackCode()));
        if (Objects.isNull(asnOrderItem)) {
            throw new CoolException("单据明细不存在!!");
        }
        List<Short> shorts = Arrays.asList(AsnExceStatus.ASN_EXCE_STATUS_TASK_CANCEL.val, AsnExceStatus.ASN_EXCE_STATUS_TASK_CLOSE
                .val, AsnExceStatus.ASN_EXCE_STATUS_TASK_DONE.val);
        AsnOrder order = asnOrderMapper.getOne(new LambdaQueryWrapper<AsnOrder>()
                .notIn(AsnOrder::getExceStatus, shorts)
                .eq(AsnOrder::getCode, params.getAsnCode()));
        if (Objects.isNull(order)) {
            throw new CoolException("请检查订单状态是否已完成或已取消!!");
        }
       return getAsnOrderItem(asnOrderItem);
        return getAsnOrderItem(asnOrderItem);
    }
    /**
     * @return
     * @author Ryan
     * @description 获取所有通知单
     * @return
     */
    @Override
    public List<AsnOrder> getAllAsnOrders() {
@@ -360,10 +388,10 @@
    }
    /**
     * @author Ryan
     * @description 获取收货区
     * @param
     * @return
     * @author Ryan
     * @description 获取收货区
     * @time 2025/3/11 10:12
     */
    @Override
@@ -373,10 +401,10 @@
    }
    /**
     * @author Ryan
     * @description 获取所有启用动态字段
     * @param
     * @return
     * @author Ryan
     * @description 获取所有启用动态字段
     * @time 2025/3/12 09:23
     */
    @Override
@@ -385,20 +413,26 @@
    }
    /**
     * @author Ryan
     * @description 获取组盘明细
     * @param
     * @return
     * @author Ryan
     * @description 获取组盘明细
     * @time 2025/4/7 16:58
     */
    @Override
    public R getDeltByCode(String code) {
    public R getDeltByCode(Map<String, Object> params ) {
        String code = params.get("code").toString();
        String batch = null;
        if (!Objects.isNull(params.get("batch"))) {
            batch = params.get("batch").toString();
        }
        //TODO 后续需根据策略配置,获取组拖数据。如:混装,按批次混装等
        LambdaQueryWrapper<WarehouseAreasItem> queryWrapper = new QueryWrapper<WarehouseAreasItem>()
                .select("SUM(anfme) as anfme, track_code, asn_code, id, splr_batch, ispt_result, plat_item_id, batch, qty, work_qty, matnr_code, matnr_id, maktx").lambda()
                .eq(WarehouseAreasItem::getTrackCode, code)
                .select("SUM(anfme) as anfme, track_code, asn_code, id, splr_batch, ispt_result, plat_item_id, batch,unit, stock_unit,  qty, work_qty, matnr_code, matnr_id, maktx").lambda()
                .eq(StringUtils.isNotBlank(code), WarehouseAreasItem::getTrackCode, code)
                .eq(StringUtils.isNotBlank(batch), WarehouseAreasItem::getSplrBatch, batch)
                .groupBy(WarehouseAreasItem::getSplrBatch, WarehouseAreasItem::getAsnId, WarehouseAreasItem::getAreaId, WarehouseAreasItem::getMatnrId);
        return R.ok(warehouseAreasItemService.getOne(queryWrapper));
        return R.ok(warehouseAreasItemService.getOne(queryWrapper, false));
    }
    /**
@@ -415,10 +449,10 @@
    }
    /**
     * @author Ryan
     * @description 解绑
     * @param param
     * @return
     * @author Ryan
     * @description 解绑
     */
    @Override
    public WaitPakin unBind(WaitPakinParam param) {
@@ -427,6 +461,7 @@
    /**
     * 报检功能
     *
     * @param code
     * @param loginUserId
     * @return
@@ -467,10 +502,10 @@
    }
    /**
     * @author Ryan
     * @description 提交报检
     * @param
     * @return
     * @author Ryan
     * @description 提交报检
     * @time 2025/4/1 16:47
     */
    @Override
@@ -485,14 +520,15 @@
        List<AsnOrder> orders = new ArrayList<>();
        orders.add(asnOrder);
        if (asnOrderMapper.notifyInspect(orders)) {
           return R.ok("上报成功!!");
        }else {
            return R.ok("上报成功!!");
        } else {
            return R.error("上报失败!!");
        }
    }
    /**
     * 通过物料,质检单获取需要质检单据
     *
     * @param params
     * @return
     */
@@ -503,7 +539,7 @@
        }
        List<Short> asList = Arrays.asList(QlyIsptStatus.QLY_ISPT_STAS_DONE.val, QlyIsptStatus.QLY_ISPT_STAS_CLOSE.val);
        QlyInspect inspect = qlyInspectMapper.selectOne(new LambdaQueryWrapper<QlyInspect>()
                        .notIn(QlyInspect::getIsptStatus, asList)
                .notIn(QlyInspect::getIsptStatus, asList)
                .eq(QlyInspect::getCode, params.getIsptCode()));
        if (Objects.isNull(inspect)) {
            throw new CoolException("质检单据不存在!!");
@@ -538,6 +574,7 @@
    /**
     * 快速质检
     *
     * @param params
     * @return
     */
@@ -556,12 +593,12 @@
    }
    /**
    * @author Ryan
    * @description 人工上架
    * @param
    * @return
    * @time 2025/4/2 16:33
    */
     * @param
     * @return
     * @author Ryan
     * @description 人工上架
     * @time 2025/4/2 16:33
     */
    @Override
    public R operateToStock(OpStockParams params) {
        if (org.apache.commons.lang3.StringUtils.isBlank(params.getBarcode())) {
@@ -605,7 +642,7 @@
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R publicToStock(PublicToStockParams params, Long loginUserId) {
    public synchronized R publicToStock(PublicToStockParams params, Long loginUserId) {
        if (Objects.isNull(params.getLocCode()) || StringUtils.isBlank(params.getLocCode())) {
            throw new CoolException("库位不能为空!!");
        }
@@ -618,7 +655,7 @@
                .eq(AsnOrder::getId, OrderId)
                .eq(AsnOrder::getType, OrderType.ORDER_PLAT_IN.type));
        if (Objects.isNull(order)) {
            throw new CoolException("单据不存在!!");
            throw new CoolException("非平库单据不可执行人工上架!!");
        }
        Stock stock = new Stock();
//        if (!Objects.isNull(order.getPoCode()) && StringUtils.isNotBlank(order.getPoCode())) {
@@ -650,7 +687,9 @@
        itemList.forEach(asnOrderItem -> {
            LocItem item = new LocItem();
            BeanUtils.copyProperties(asnOrderItem, item);
            item.setId(loc.getId())
            item.setLocId(loc.getId())
                    .setId(null)
                    .setLocCode(loc.getCode())
                    .setOrderId(order.getId())
                    .setOrderItemId(asnOrderItem.getId())
                    .setWkType(Short.parseShort(order.getWkType()))
@@ -683,6 +722,7 @@
    /**
     * 获取任务信息
     *
     * @param code
     * @return
     */
@@ -727,14 +767,14 @@
    }
    /**
     * @Author Ryan
     * @param code
     * @desc  任务上架
     * @return
     * @Author Ryan
     * @desc 任务上架
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R taskGetLocs(String code) throws Exception {
    public synchronized R taskGetLocs(String code) throws Exception {
        if (StringUtils.isBlank(code)) {
            throw new CoolException("拖盘码不能为空!!");
        }
@@ -756,14 +796,14 @@
    @Override
    public R completeOrder(Long id, Long loginUserId) {
      return  asnOrderMapper.completeOrder(id, loginUserId);
        return asnOrderMapper.completeOrder(id, loginUserId);
    }
    /**
     * @author Ryan
     * @description 通过容器获取组拖物料
     * @param
     * @return
     * @author Ryan
     * @description 通过容器获取组拖物料
     * @time 2025/4/9 16:57
     */
    @Override
@@ -776,7 +816,7 @@
        }
        WaitPakin waitPakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>()
                .eq(WaitPakin::getBarcode, params.get("barcode").toString())
                        .eq(WaitPakin::getFlagDefect, flagDefect)
                .eq(WaitPakin::getFlagDefect, flagDefect)
                .in(WaitPakin::getIoStatus, asList));
        if (Objects.isNull(waitPakin)) {
            return R.ok(new ArrayList<>());
@@ -809,16 +849,81 @@
    }
    /**
     * @author Ryan
     * @description 不良标签
     * @param
     * @return
     * @author Ryan
     * @description 不良标签
     * @time 2025/4/12 08:12
     */
    @Override
    public R defectProducts(String trackCode) {
        AsnOrderItem orderItem = asnOrderItemMapper.selectOne(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getTrackCode, trackCode));
        return R.ok(orderItem);
    }
    /**
     * @param barcode
     * @return
     * @author Ryan
     * @description 获取入库组拖信息
     */
    @Override
    public R getPakinInStock(String barcode) {
        WaitPakin waitPakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getBarcode, barcode));
        if (Objects.isNull(waitPakin)) {
            throw new CoolException("组拖单据不存在!!");
        }
        List<WaitPakinItem> pakinItems = waitPakinItemService.list(new LambdaQueryWrapper<WaitPakinItem>().eq(WaitPakinItem::getPakinId, waitPakin.getId()));
        if (pakinItems.isEmpty()) {
            return R.ok(new ArrayList<>());
        }
        return R.ok(pakinItems);
    }
    /**
     * @return
     * @author Ryan
     * @description 获取库口站点信息
     */
    @Override
    public R getDeviceSites() {
        List<DeviceSite> sites = deviceSiteMapper.selectList(new LambdaQueryWrapper<DeviceSite>()
                .select(DeviceSite::getId, DeviceSite::getSite, DeviceSite::getName)
                .eq(DeviceSite::getStatus, 1)
                .groupBy(DeviceSite::getSite, DeviceSite::getId, DeviceSite::getName));
        return R.ok(sites);
    }
    /**
     * @return
     * @author Ryan
     * @description 获取推荐库位
     */
    @Override
    public R getRecommondLocs() {
        return R.ok(locService.list(new LambdaQueryWrapper<Loc>().last("limit 10")));
    }
    /**
     * @param map
     * @param loginUserId
     * @return
     * @author Ryan
     * @description 生成任务列表
     */
    @Override
    public synchronized R generateTask(Map<String, Object> map, Long loginUserId) {
        String barcode = map.get("barcode").toString();
        List<WaitPakin> waitPakins = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getBarcode, barcode));
        if (waitPakins.isEmpty()) {
            throw new CoolException("单据不存在 !!");
        }
        GenerateTaskParams taskParams = new GenerateTaskParams();
        taskParams.setWaitPakins(waitPakins)
                .setSiteId(Long.parseLong(map.get("site").toString()))
                .setLocCode(map.get("locCode").toString());
        return R.ok(taskService.generateTasks(taskParams, loginUserId));
    }
    /**
@@ -834,6 +939,8 @@
                    .setFieldsIndex(asnOrderItem.getFieldsIndex())
                    .setBarcode(asnOrderItem.getTrackCode())
                    .setQty(asnOrderItem.getQty())
                    .setStockUnit(asnOrderItem.getStockUnit())
                    .setPurUnit(asnOrderItem.getPurUnit())
                    .setPoCode(asnOrderItem.getPoCode())
                    .setAnfme(asnOrderItem.getAnfme())
                    .setPurQty(asnOrderItem.getPurQty())
@@ -845,8 +952,7 @@
            }
            //SET 物料最大存放数量
            detlsDto.setMaxQty(matnr.getMaxQty())
                    .setMatnrId(matnr.getId())
                    .setStockUnit(matnr.getStockUnit());
                    .setMatnrId(matnr.getId());
            QlyInspect inspect = qlyInspectMapper.selectOne(new LambdaQueryWrapper<QlyInspect>()
                    .eq(QlyInspect::getAsnId, asnOrderItem.getAsnId()));
            if (!Objects.isNull(inspect)) {
@@ -855,8 +961,9 @@
            }
            //获取当前库存信息
            LocItem stockItem = locItemService.getOne(new LambdaQueryWrapper<LocItem>()
                    .eq(LocItem::getOrderItemId, asnOrderItem.getId())
                    .eq(LocItem::getBatch, asnOrderItem.getBatch())
//                    .eq(LocItem::getOrderItemId, asnOrderItem.getId())
                    .eq(LocItem::getFieldsIndex, asnOrderItem.getFieldsIndex())
                    .eq(LocItem::getBatch, asnOrderItem.getSplrBatch())
                    .eq(LocItem::getMatnrId, asnOrderItem.getMatnrId()));
            //SET 当前库存数量
            if (Objects.isNull(stockItem)) {