skyouc
2025-03-31 ff58bd6f018df0f760c8a262576a06105b902f4f
质检添加保存接口
质检添加新建接口
10个文件已修改
2个文件已添加
291 ■■■■■ 已修改文件
rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskType.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/QlyInspectController.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/IsptOrderParam.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/QlyInspect.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/QlyIsptItem.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/QlyInspectService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/QlyInspectServiceImpl.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/system/enums/LocStsType.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskType.java
@@ -8,21 +8,23 @@
 * @create 2025/3/29 17:02
 */
public enum TaskType {
    TASK_TYPE_EMPITY_IN(10L, "空板入库"),
    TASK_TYPE_LOC_MOVE(11L, "库格移载"),
    TASK_TYPE_PICK_IN(53L, "拣料再入库"),
    TASK_TYPE_MERGE_IN(54L, "并板再入库"),
    TASK_TYPE_CHECK_IN(57L, "盘点再入库"),
    TASK_TYPE_OUT(101L, "出库"),
    TASK_TYPE_PICK_AGAIN_IN(103L, "拣料入库"),
    TASK_TYPE_MERGE_OUT(104L, "并板出库"),
    TASK_TYPE_CHECK_OUT(107L, "盘点出库"),
    TASK_TYPE_EMPITY_OUT(110L, "空板出库"),
    TASK_TYPE_IN(1, "入库"),
    TASK_TYPE_EMPITY_IN(10, "空板入库"),
    TASK_TYPE_LOC_MOVE(11, "库格移载"),
    TASK_TYPE_PICK_IN(53, "拣料再入库"),
    TASK_TYPE_MERGE_IN(54, "并板再入库"),
    TASK_TYPE_CHECK_IN(57, "盘点再入库"),
    TASK_TYPE_OUT(101, "出库"),
    TASK_TYPE_PICK_AGAIN_IN(103, "拣料入库"),
    TASK_TYPE_MERGE_OUT(104, "并板出库"),
    TASK_TYPE_CHECK_OUT(107, "盘点出库"),
    TASK_TYPE_EMPITY_OUT(110, "空板出库"),
    ;
    public Long type;
    public Integer type;
    public String desc;
    TaskType(Long type, String desc) {
    TaskType(Integer type, String desc) {
        this.type = type;
        this.desc = desc;
    }
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/QlyInspectController.java
@@ -10,6 +10,7 @@
import com.vincent.rsf.server.common.domain.BaseParam;
import com.vincent.rsf.server.common.domain.KeyValVo;
import com.vincent.rsf.server.common.domain.PageParam;
import com.vincent.rsf.server.manager.controller.params.IsptOrderParam;
import com.vincent.rsf.server.manager.controller.params.QlyInspectAndItem;
import com.vincent.rsf.server.manager.entity.QlyInspect;
import com.vincent.rsf.server.manager.service.QlyInspectService;
@@ -58,6 +59,24 @@
        return R.ok(qlyInspectService.listByAsn(map));
    }
    @GetMapping("/qlyInspect/asn/list")
    @ApiOperation("获取待质检单")
    @PreAuthorize("hasAuthority('manager:qlyInspect:list')")
    public R getUnInspect() {
        return R.ok(qlyInspectService.getUnInspect());
    }
    @PostMapping("/qlyInspect/reports")
    @ApiOperation("选择质检单据")
    @PreAuthorize("hasAuthority('manager:qlyInspect:update')")
    public R selectedOrder(IsptOrderParam param) {
        if (Objects.isNull(param)) {
            throw new CoolException("参数不能为空!!");
        }
        return qlyInspectService.saveSelected(param);
    }
    @PreAuthorize("hasAuthority('manager:qlyInspect:list')")
    @PostMapping("/qlyInspect/list")
    public R list(@RequestBody Map<String, Object> map) {
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/IsptOrderParam.java
New file
@@ -0,0 +1,20 @@
package com.vincent.rsf.server.manager.controller.params;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import jdk.jpackage.internal.Log;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.List;
@Data
@Accessors(chain = true)
@ApiModel(value = "IsptOrderParam", description = "质检单参数")
public class IsptOrderParam implements Serializable {
    @ApiModelProperty("收货单ID")
    List<Long> ids;
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/QlyInspect.java
@@ -4,18 +4,26 @@
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.vincent.rsf.framework.common.Cools;
import com.vincent.rsf.framework.common.SpringUtils;
import com.vincent.rsf.server.system.constant.DictTypeCode;
import com.vincent.rsf.server.system.entity.DictData;
import com.vincent.rsf.server.system.entity.User;
import com.vincent.rsf.server.system.service.DictDataService;
import com.vincent.rsf.server.system.service.UserService;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import org.apache.commons.lang3.StringUtils;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@Data
@Accessors(chain = true)
@@ -37,9 +45,14 @@
    @ApiModelProperty(value= "编码")
    private String code;
    @ApiModelProperty("单据ID")
    private Long asnId;
    @ApiModelProperty("通知单明细ID")
    private Long asnItemId;
    @ApiModelProperty("单据编码")
    private String asnCode;
    @ApiModelProperty("质检状态")
    private String isptStatus;
    /**
     * 业务类型
@@ -158,6 +171,19 @@
//            null    // 备注
//    );
    public String getIsptStatus$() {
        if (null == this.isptStatus) {return  null;}
        DictDataService dictDataService = SpringUtils.getBean(DictDataService.class);
        DictData dictDatas = dictDataService.getOne(new LambdaQueryWrapper<DictData>()
                .eq(DictData::getDictTypeCode, DictTypeCode.DICT_SYS_TASK_TYPE)
                .eq(DictData::getValue, this.isptStatus));
        if (Objects.isNull(dictDatas) || Objects.isNull(dictDatas.getLabel())) {
            return null;
        }
        return dictDatas.getLabel();
    }
    public String getStatus$(){
        if (null == this.status){ return null; }
        switch (this.status){
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/QlyIsptItem.java
@@ -3,6 +3,8 @@
import com.baomidou.mybatisplus.annotation.TableLogic;
import java.text.SimpleDateFormat;
import java.util.Date;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import com.baomidou.mybatisplus.annotation.IdType;
@@ -17,6 +19,7 @@
import java.io.Serializable;
@Data
@Accessors(chain = true)
@TableName("man_qly_ispt_item")
public class QlyIsptItem implements Serializable {
@@ -34,6 +37,9 @@
     */
    @ApiModelProperty(value= "主单ID")
    private Long ispectId;
    @ApiModelProperty("单据明细ID")
    private Long asnItemId;
    /**
     * 编号
@@ -101,6 +107,9 @@
    @ApiModelProperty(value= "图片路径")
    private String picPath;
    @ApiModelProperty("质检结论")
    private String isptResult;
    /**
     * 状态 1: 正常  0: 冻结  
     */
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java
@@ -72,6 +72,18 @@
    private String targLoc;
    /**
     * 源站点
     */
    @ApiModelProperty("源站点")
    private String orgSite;
    /**
     * 目标站点
     */
    @ApiModelProperty("目标站点")
    private String targSite;
    /**
     * 托盘码
     */
    @ApiModelProperty(value= "托盘码")
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/QlyInspectService.java
@@ -2,7 +2,9 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.vincent.rsf.framework.common.R;
import com.vincent.rsf.server.manager.controller.params.IsptOrderParam;
import com.vincent.rsf.server.manager.controller.params.QlyInspectAndItem;
import com.vincent.rsf.server.manager.entity.AsnOrder;
import com.vincent.rsf.server.manager.entity.AsnOrderItem;
import com.vincent.rsf.server.manager.entity.QlyInspect;
@@ -14,4 +16,8 @@
    List<AsnOrderItem> listByAsn(Map<String, Object> map);
    R allSave(QlyInspectAndItem params);
    List<AsnOrder> getUnInspect();
    R saveSelected(IsptOrderParam param);
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/QlyInspectServiceImpl.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.vincent.rsf.framework.common.R;
import com.vincent.rsf.framework.exception.CoolException;
import com.vincent.rsf.server.manager.controller.params.IsptOrderParam;
import com.vincent.rsf.server.manager.controller.params.QlyInspectAndItem;
import com.vincent.rsf.server.manager.entity.AsnOrder;
import com.vincent.rsf.server.manager.entity.AsnOrderItem;
@@ -16,13 +17,17 @@
import com.vincent.rsf.server.manager.service.QlyIsptItemService;
import com.vincent.rsf.server.system.constant.SerialRuleCode;
import com.vincent.rsf.server.system.utils.SerialRuleUtils;
import org.apache.commons.lang3.StringUtils;
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.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
@Service("qlyInspectService")
public class QlyInspectServiceImpl extends ServiceImpl<QlyInspectMapper, QlyInspect> implements QlyInspectService {
@@ -65,7 +70,7 @@
        if (Objects.isNull(inspect.getWkType())) {
            throw new CoolException("业务类型不能为空!!");
        }
        String code = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_INSPECT_WK_TYPE, inspect);
        String code = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_INSPECT_CODE, inspect);
        inspect.setCode(code);
        if (!this.saveOrUpdate(inspect)) {
            throw new CoolException("质检单保存失败!!");
@@ -87,4 +92,71 @@
        }
        return R.ok("保存成功!!");
    }
    /**
    * @author Ryan
    * @description 获取未质检单据
    * @param
    * @return
    * @time 2025/3/31 10:12
    */
    @Override
    public List<AsnOrder> getUnInspect() {
        List<AsnOrder> asnOrders = asnOrderService.list(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getStatus, 1).eq(AsnOrder::getNtyStatus, 0));
        return asnOrders;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R saveSelected(IsptOrderParam param) {
        if (Objects.isNull(param.getIds()) || param.getIds().isEmpty()) {
            throw new CoolException("单据ID不能为空!!");
        }
        List<AsnOrder> asnOrders = asnOrderService.list(new LambdaQueryWrapper<AsnOrder>().in(AsnOrder::getId, param.getIds()).eq(AsnOrder::getNtyStatus, 1));
        if (asnOrders.isEmpty()) {
            throw new CoolException("单据不存在!!");
        }
        List<AsnOrderItem> orderItems = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>().in(AsnOrderItem::getAsnId, param.getIds()));
        if (orderItems.isEmpty()) {
            throw new CoolException("单据明细不存在!!");
        }
        Map<Long, List<AsnOrderItem>> listMap = orderItems.stream().collect(Collectors.groupingBy(AsnOrderItem::getAsnId));
        List<QlyInspect> qlyInspects = new ArrayList<>();
        for (AsnOrder asnOrder : asnOrders) {
            QlyInspect inspect = new QlyInspect();
            String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_INSPECT_CODE, null);
            if (StringUtils.isBlank(ruleCode)) {
                throw new CoolException("策略错误:请检查策略「" + SerialRuleCode.SYS_INSPECT_CODE + "」是否设置正确!!");
            }
            inspect.setCode(ruleCode).setWkType(asnOrder.getWkType()).setAsnId(asnOrder.getId()).setCode(asnOrder.getCode());
            /**获取单据明细*/
            List<AsnOrderItem> asnOrderItems = listMap.get(asnOrder.getId());
            if (Objects.isNull(asnOrderItems) || asnOrderItems.isEmpty()) {
                continue;
            }
            double rcptQty = asnOrderItems.stream().mapToDouble(AsnOrderItem::getQty).sum();
            double anfme = asnOrderItems.stream().mapToDouble(AsnOrderItem::getAnfme).sum();
            inspect.setRcptQty(rcptQty).setDlyQty(anfme);
            if (!this.save(inspect)) {
                throw new CoolException("单据" + asnOrder.getCode() + "保存失败!!");
            }
            List<QlyIsptItem> items = new ArrayList<>();
            for (AsnOrderItem orderItem : asnOrderItems) {
                QlyIsptItem isptItem = new QlyIsptItem();
                BeanUtils.copyProperties(orderItem, isptItem);
                isptItem.setAsnItemId(orderItem.getId())
                        .setRcptQty(orderItem.getQty())
                        .setDlyQty(orderItem.getAnfme());
                items.add(isptItem);
            }
            if (!qlyIsptItemService.saveBatch(items)) {
                throw new CoolException("明细保存失败!!");
            }
        }
        if (!this.saveBatch(qlyInspects)) {
            throw new CoolException("质检单保存失败!!");
        }
        return R.ok("保存成功!!");
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
@@ -1,22 +1,27 @@
package com.vincent.rsf.server.manager.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.vincent.rsf.framework.common.SpringUtils;
import com.vincent.rsf.server.api.entity.enums.TaskStsType;
import com.vincent.rsf.framework.common.R;
import com.vincent.rsf.framework.exception.CoolException;
import com.vincent.rsf.server.manager.entity.WaitPakin;
import com.vincent.rsf.server.manager.entity.WaitPakinItem;
import com.vincent.rsf.server.api.entity.enums.TaskType;
import com.vincent.rsf.server.manager.entity.*;
import com.vincent.rsf.server.manager.mapper.TaskMapper;
import com.vincent.rsf.server.manager.entity.Task;
import com.vincent.rsf.server.manager.service.LocService;
import com.vincent.rsf.server.manager.service.TaskService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.vincent.rsf.server.manager.service.WaitPakinItemService;
import com.vincent.rsf.server.manager.service.WaitPakinService;
import com.vincent.rsf.server.manager.utils.LocManageUtil;
import com.vincent.rsf.server.system.constant.SerialRuleCode;
import com.vincent.rsf.server.system.enums.LocStsType;
import com.vincent.rsf.server.system.utils.SerialRuleUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@@ -53,10 +58,37 @@
        if (waitPakinItems.isEmpty()) {
            throw new CoolException("数据错误:组拖明细不存在");
        }
        Task task = new Task();
        String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, null);
        task.setTaskCode(ruleCode).setTaskStatus(TaskStsType.GENERATE_IN.id.shortValue());
        if (StringUtils.isBlank(ruleCode)) {
            throw new CoolException("编码错误:请确认编码「SYS_TASK_CODE」是否已生成!!");
        }
        List<Task> tasks = new ArrayList<>();
        List<TaskItem> taskItems = new ArrayList<>();
        waitPakins.forEach(pakin -> {
            Task task = new Task();
            task.setTaskCode(ruleCode)
                    .setTaskStatus(TaskStsType.GENERATE_IN.id.shortValue())
                    .setTaskStatus(TaskType.TASK_TYPE_IN.type.shortValue())
                    .setTargLoc(LocManageUtil.getTargetLoc())
                    .setBarcode(pakin.getBarcode())
                    .setTargSite(LocManageUtil.getTargetSite());
            tasks.add(task);
        });
        if (!this.saveBatch(tasks)) {
            throw new CoolException("任务保存失败!!");
        }
        //TODO  保存任务档明细
        waitPakinItems.forEach(item -> {
            TaskItem taskItem = new TaskItem();
            taskItems.add(taskItem);
        });
        return null;
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java
New file
@@ -0,0 +1,47 @@
package com.vincent.rsf.server.manager.utils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.vincent.rsf.framework.common.SpringUtils;
import com.vincent.rsf.framework.exception.CoolException;
import com.vincent.rsf.server.manager.entity.DeviceSite;
import com.vincent.rsf.server.manager.entity.Loc;
import com.vincent.rsf.server.manager.service.DeviceSiteService;
import com.vincent.rsf.server.manager.service.LocService;
import com.vincent.rsf.server.system.enums.LocStsType;
import org.apache.commons.lang3.StringUtils;
import java.util.Objects;
public class LocManageUtil {
    /**
     * @author Ryan
     * @description  获取目标库位, 包含库位获取策略
     * @param
     * @return
     * @time 2025/3/31 08:50
     */
    public static String getTargetLoc() {
        //TODO 库位策略后续排期
        LocService locService = SpringUtils.getBean(LocService.class);
        Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_D.type), false);
        return Objects.isNull(loc) ? loc.getCode() : null;
    }
    /**
    * @author Ryan
    * @description 获取目标站点
    * @param
    * @return
    * @time 2025/3/31 09:49
    */
    public static String getTargetSite() {
        //TODO 站点策略后续排期
        DeviceSiteService deviceSite = SpringUtils.getBean(DeviceSiteService.class);
        DeviceSite loc = deviceSite.getOne(new LambdaQueryWrapper<DeviceSite>().eq(DeviceSite::getStatus, 1), false);
        return Objects.isNull(loc) ? loc.getSite() : null;
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java
@@ -32,7 +32,7 @@
    /**
     * 质检单业务类型
     */
    public final static String SYS_INSPECT_WK_TYPE = "sys_inspect_wk_type";
    public final static String SYS_INSPECT_CODE = "sys_inspect_code";
    /**
     * 物料编码生成规则
rsf-server/src/main/java/com/vincent/rsf/server/system/enums/LocStsType.java
@@ -17,9 +17,9 @@
    LOC_STS_TYPE_R("R", "出库预约"),
    ;
    private String type;
    public String type;
    private String desc;
    public String desc;
    LocStsType(String type, String desc) {
        this.type = type;