skyouc
1 天以前 c96f6070a283df666a6560635f529a5fbf94182e
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaCheckOrderServiceImpl.java
@@ -1,30 +1,37 @@
package com.vincent.rsf.server.api.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.vincent.rsf.framework.common.Cools;
import com.vincent.rsf.framework.common.R;
import com.vincent.rsf.framework.exception.CoolException;
import com.vincent.rsf.server.api.controller.params.SaveCheckDiffParams;
import com.vincent.rsf.server.api.controller.erp.params.ReportDataParam;
import com.vincent.rsf.server.api.controller.erp.params.ReportParams;
import com.vincent.rsf.server.api.controller.erp.params.SaveCheckDiffParams;
import com.vincent.rsf.server.api.service.PdaCheckOrderService;
import com.vincent.rsf.server.api.service.ReportMsgService;
import com.vincent.rsf.server.common.utils.FieldsUtils;
import com.vincent.rsf.server.manager.entity.*;
import com.vincent.rsf.server.manager.enums.CheckDiffExceStatus;
import com.vincent.rsf.server.manager.enums.OrderType;
import com.vincent.rsf.server.manager.enums.OrderWorkType;
import com.vincent.rsf.server.manager.enums.TaskStsType;
import com.vincent.rsf.server.manager.enums.*;
import com.vincent.rsf.server.manager.service.*;
import com.vincent.rsf.server.system.constant.DictTypeCode;
import com.vincent.rsf.server.system.entity.DictData;
import com.vincent.rsf.server.system.entity.FieldsItem;
import com.vincent.rsf.server.system.entity.User;
import com.vincent.rsf.server.system.service.DictDataService;
import com.vincent.rsf.server.system.service.DictTypeService;
import com.vincent.rsf.server.system.service.FieldsItemService;
import com.vincent.rsf.server.system.service.UserService;
import com.vincent.rsf.server.system.service.impl.FieldsItemServiceImpl;
import com.vincent.rsf.server.system.service.impl.UserServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.*;
@Service
public class PdaCheckOrderServiceImpl implements PdaCheckOrderService {
@@ -46,6 +53,12 @@
    private DictDataService dictDataService;
    @Autowired
    private MatnrService matnrService;
    @Autowired
    private FieldsItemService fieldsItemService;
    @Autowired
    private ReportMsgService reportMsgService;
    @Autowired
    private UserService userService;
    @Override
@@ -62,6 +75,7 @@
        List<CheckDiffItem> checkDiffItems = checkDiffItemService.list(new LambdaQueryWrapper<CheckDiffItem>()
                .eq(CheckDiffItem::getBarcode, barcode)
                .eq(CheckDiffItem::getExceStatus, CheckDiffExceStatus.CHECK_DIFF_EXCE_STATUS_INIT.val)
                .eq(CheckDiffItem::getOrderCode, checkCode)
        );
        if (checkDiffItems.isEmpty()) {
@@ -76,8 +90,6 @@
        if (!task.getTaskStatus().equals(TaskStsType.AWAIT.id)) {
            return R.error("任务状态不是等待确认");
        }
        return R.ok(checkDiffItems);
    }
@@ -128,7 +140,7 @@
                        .setOrderType(OrderType.ORDER_CHECK.type)
                        .setSourceCode(diffItem.getOrderCode())
                        .setWkType(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_STOCK_CHECK.type))
                        .setAnfme(diffItem.getAnfme())
                        .setAnfme(diffItem.getCheckQty())
                        .setWorkQty(0.0)
                        .setBatch(diffItem.getBatch())
                        .setMaktx(matnr.getName())
@@ -151,7 +163,7 @@
                    throw new CoolException("新增盘点明细保存失败!!");
                }
                diffItem.setTaskItemId(taskItem.getId());
                diffItem.setTaskItemId(taskItem.getId()).setExceStatus(CheckDiffExceStatus.CHECK_DIFF_EXCE_STATUS_HOLD.val);
                if (!checkDiffItemService.updateById(diffItem)) {
                    throw new CoolException("明细修改失败!!");
@@ -161,17 +173,28 @@
                if (null == diffItem) {
                    return R.error("数据错误,未找到差异单明细");
                }
            }
                diffItem.setCheckQty(ckDiffItem.getCheckQty()).setReason(ckDiffItem.getReason()).setMemo(ckDiffItem.getMemo());
            diffItem.setExceStatus(CheckDiffExceStatus.CHECK_DIFF_EXCE_STATUS_HOLD.val);
            if (!checkDiffItemService.updateById(diffItem)) {
                throw new CoolException("更新差异单明细失败");
                diffItem.setExceStatus(CheckDiffExceStatus.CHECK_DIFF_EXCE_STATUS_HOLD.val);
                if (!checkDiffItemService.updateById(diffItem)) {
                    throw new CoolException("更新差异单明细失败");
                }
                if (!taskItemService.update(new LambdaUpdateWrapper<TaskItem>()
                        .set(TaskItem::getAnfme, diffItem.getCheckQty())
                        .eq(TaskItem::getId, diffItem.getTaskItemId()))) {
                    throw new CoolException("任务数量修改失败!!");
                }
            }
            Double checkQty = Math.round((checkDiff.getCheckQty() + diffItem.getCheckQty()) * 10000) / 10000.0;
            checkDiff.setCheckQty(checkQty);
        }
        checkDiff.setExceStatus(CheckDiffExceStatus.CHECK_DIFF_EXCE_STATUS_HOLD.val);
        List<CheckDiffItem> diffItems = checkDiffItemService.list(new LambdaQueryWrapper<CheckDiffItem>()
                .eq(CheckDiffItem::getCheckId, checkDiff.getId()));
        if (diffItems.isEmpty()) {
            throw new CoolException("盘点差异单明细不存在!!");
        }
        Double sum = diffItems.stream().mapToDouble(CheckDiffItem::getCheckQty).sum();
        checkDiff.setExceStatus(CheckDiffExceStatus.CHECK_DIFF_EXCE_STATUS_HOLD.val).setCheckQty(sum);
        if (!checkDiffService.updateById(checkDiff)) {
            throw new CoolException("更新差异单失败");
        }
@@ -188,19 +211,241 @@
    @Override
    public R selectAddMatnr(Map<String, String> map) {
        String matnrCode = map.get("matnr");
        if (Cools.isEmpty(matnrCode)){
        if (Cools.isEmpty(matnrCode)) {
            return R.error("物料码为空");
        }
        Matnr matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>().eq(Matnr::getCode, matnrCode));
        if (null == matnr){
        if (null == matnr) {
            return R.error("未找到编码对应的明细");
        }
        CheckDiffItem checkDiffItem = new CheckDiffItem()
                .setMatnrCode(matnr.getCode())
                .setMaktx(matnr.getName())
                .setAnfme(0D)
                .setCheckQty(0D)
                ;
                .setCheckQty(0D);
        return R.ok(checkDiffItem);
    }
    @Override
    public R getCheckTaskItemList2(String barcode) {
        LambdaQueryWrapper<Task> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(Task::getBarcode, barcode);
        Task task = taskService.getOne(lambdaQueryWrapper);
        if (null == task) {
            throw new CoolException("未找到容器号对应任务");
        }
        if (!task.getTaskStatus().equals(TaskStsType.AWAIT.id)) {
            return R.error("任务状态不是等待确认");
        }
        List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId()));
        if (Cools.isEmpty(taskItems)) {
            throw new CoolException("未找到该容器码对应的任务明细");
        }
        String sourceCode = taskItems.stream().findFirst().map(TaskItem::getSourceCode).orElse(null);
        CheckDiff checkDiff = checkDiffService.getOne(new LambdaQueryWrapper<CheckDiff>().eq(CheckDiff::getOrderCode, sourceCode));
        if (null == checkDiff) {
            return R.error("未找到盘点差异单");
        }
        List<CheckDiffItem> checkDiffItems = checkDiffItemService.list(new LambdaQueryWrapper<CheckDiffItem>()
                .eq(CheckDiffItem::getBarcode, barcode)
                .eq(CheckDiffItem::getExceStatus, CheckDiffExceStatus.CHECK_DIFF_EXCE_STATUS_INIT.val)
                .eq(CheckDiffItem::getOrderCode, sourceCode)
        );
        if (checkDiffItems.isEmpty()) {
            throw new CoolException("此条码不在当前盘点单中");
        }
        return R.ok(Cools.add("checkDiffItems", checkDiffItems).add("checkDiff", checkDiff));
    }
    /**
     * @author Ryan
     * @date 2025/11/5
     * @description: 希日无单据临时盘点
     * @version 1.0
     */
    @Override
    public R tempCheckItem(String barcode) {
        if (Objects.isNull(barcode)) {
            throw new CoolException("搬盘码不能为空!!");
        }
        LambdaQueryWrapper<Task> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(Task::getBarcode, barcode);
        Task task = taskService.getOne(lambdaQueryWrapper);
        if (null == task) {
            throw new CoolException("未找到容器号对应任务");
        }
        if (!task.getTaskStatus().equals(TaskStsType.AWAIT.id)) {
            return R.error("任务状态不是等待确认");
        }
        List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId()));
        if (Cools.isEmpty(taskItems)) {
            throw new CoolException("未找到该容器码对应的任务明细");
        }
        taskItems.forEach(taskItem -> {
            if (!Objects.isNull(taskItem.getFieldsIndex())) {
                Map<String, String> fields = FieldsUtils.getFields(taskItem.getFieldsIndex());
                taskItem.setExtendFields(fields);
            }
        });
        return R.ok().add(taskItems);
    }
    /**
     * @author Ryan
     * @date 2025/11/5
     * @description: 盘点添加新物料
     * @version 1.0
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R confirmMatnr(Map<String, Object> map) {
        if (Objects.isNull(map)) {
            throw new CoolException("参数不能为空!!");
        }
        if (Objects.isNull(map.get("barcode"))) {
            throw new CoolException("托盘码不能为空!!");
        }
        if (Objects.isNull(map.get("matnrs"))) {
            throw new CoolException("新增物料不能为空!!");
        }
        String barcode = map.get("barcode").toString();
        LambdaQueryWrapper<Task> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(Task::getBarcode, barcode);
        Task task = taskService.getOne(lambdaQueryWrapper);
        if (null == task) {
            throw new CoolException("未找到容器号对应任务");
        }
        if (!task.getTaskStatus().equals(TaskStsType.AWAIT.id)) {
            return R.error("任务状态不是等待确认");
        }
        List<CheckDiffItem> items = JSONArray.parseArray(JSONArray.toJSONString(map.get("matnrs")), CheckDiffItem.class);
        List<TaskItem> taskItems = new ArrayList<>();
        TaskItem item1 = taskItemService.getOne(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId()).last("limit 1"));
        items.forEach(item -> {
            TaskItem taskItem = new TaskItem();
            if (!Objects.isNull(item1)) {
                BeanUtils.copyProperties(item1, taskItem);
            }
            Matnr matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>().eq(Matnr::getCode, item.getMatnrCode()));
            if (Objects.isNull(matnr)) {
                throw new CoolException("物料信息不存在 !!");
            }
            taskItem.setTaskId(task.getId())
                    .setId(null)
                    .setFieldsIndex(null)
                    .setMatnrId(matnr.getId())
                    .setMatnrCode(matnr.getCode())
                    .setMaktx(matnr.getName())
                    .setAnfme(item.getCheckQty());
            FieldsItem fieldsItem = fieldsItemService.getOne(new LambdaQueryWrapper<FieldsItem>().eq(FieldsItem::getValue, item.getFieldsIndex()).last("limit 1"));
            if (Objects.isNull(fieldsItem)) {
                throw new CoolException("当前票号不存在库存中,请拿出后重新入库!!");
            }
            taskItem.setFieldsIndex(fieldsItem.getUuid());
            taskItems.add(taskItem);
        });
        if (!taskItemService.saveBatch(taskItems)) {
            throw new CoolException("新增盘点物料失败!!");
        }
        return R.ok();
    }
    /**
     * @param map
     * @return com.vincent.rsf.framework.common.R
     * @author Ryan
     * 临时盘点提交ERP修改
     * @date 2025/11/5 20:49
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R tempCheckConfirm(Map<String, Object> map) {
        if (Objects.isNull(map)) {
            throw new CoolException("参数不能为空!!");
        }
        if (Objects.isNull(map.get("barcode"))) {
            throw new CoolException("托盘码不能为空!!");
        }
        if (Objects.isNull(map.get("matnrs"))) {
            throw new CoolException("新增物料不能为空!!");
        }
        String barcode = map.get("barcode").toString();
        LambdaQueryWrapper<Task> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(Task::getBarcode, barcode);
        Task task = taskService.getOne(lambdaQueryWrapper);
        if (null == task) {
            throw new CoolException("未找到容器号对应任务");
        }
        if (!task.getTaskStatus().equals(TaskStsType.AWAIT.id)) {
            return R.error("任务状态不是等待确认");
        }
        task.setTaskStatus(TaskStsType.GENERATE_IN.id)
                .setTargLoc(task.getOrgLoc())
                .setTaskType(TaskType.TASK_TYPE_CHECK_IN.type)
                .setUpdateTime(new Date());
        if (!taskService.updateById(task)) {
            throw new CoolException("任务状态修改失败!!");
        }
        uploadCheckResult(task);
        return R.ok("提交成功");
    }
    /**
     * 上传盘点结果
     * @author Ryan
     * @date 2025/11/5 21:50
     * @param task
     */
    public void uploadCheckResult(Task task) {
        if (Objects.isNull(task)) {
            throw new CoolException("任务不能为空!!");
        }
        ReportParams params = new ReportParams();
        List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId()));
        if (Objects.isNull(taskItems) || taskItems.isEmpty()) {
            throw new CoolException("托盘明细为空!1");
        }
        List<ReportDataParam> reportDataParams = new ArrayList<>();
        taskItems.forEach(taskItem -> {
            ReportDataParam dataParam = new ReportDataParam();
            User user = userService.getById(taskItem.getUpdateBy());
            String nickName = null;
            if (!Objects.isNull(user)) {
                nickName = user.getNickname();
            }
            //获取索引内容
            Map<String, String> fields = FieldsUtils.getFields(taskItem.getFieldsIndex());
            //设置通用参数
            dataParam.setItemCode(taskItem.getMatnrCode())
                    .setPDQty(taskItem.getAnfme())
                    .setEditUser(nickName)
                    .setEditDate(taskItem.getUpdateTime())
                    .setGoodsNO(fields.get("crushNo"))
                    .setIsBad(0 + "")
                    .setMemoDtl(taskItem.getMemo());
            reportDataParams.add(dataParam);
        });
        params.setOrderType("PD_stock").setAction("Update").setData(reportDataParams);
        reportMsgService.uploadCheckOrder(params);
    }
}