自动化立体仓库 - WMS系统
skyouc
1 天以前 30bb734c3c5de070ab9513128980bfdbe1880857
入库流程功能开发
13个文件已修改
13个文件已添加
1437 ■■■■ 已修改文件
pom.xml 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/controller/AgvScheduleController.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/controller/KopenApiController.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/entity/BaseRequstParam.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/entity/MatnrsParams.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/entity/OrderItemsParam.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/entity/OrderParams.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/entity/dto/BaseResponse.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/enums/LocAreaType.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/enums/MatType.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/enums/OrderWkType.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/service/AgvScheduleService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/service/KopenApiService.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/service/impl/AgvScheduleServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/service/impl/KopenApiServiceImpl.java 168 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/MobileController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/LocDetl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/OrderDetl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/enums/LocAreaType.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/enums/OrderSettle.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/MobileService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java 59 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/OrderSyncScheduler.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java 443 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/orderPakin/order.js 267 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/orderPakin/order.html 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -11,18 +11,22 @@
    <groupId>com.zy</groupId>
    <artifactId>asrs</artifactId>
    <version>1.1.1</version>
    <packaging>war</packaging>
    <packaging>jar</packaging>
    <properties>
        <java.version>1.8</java.version>
        <cool.version>3.4.0</cool.version>
        <cool.version>3.2.0</cool.version>
        <mysql-driver.version>5.1.47</mysql-driver.version>
        <mybatis-plus.version>2.3.2</mybatis-plus.version>
        <fastjson.version>1.2.58</fastjson.version>
        <springfox.version>2.7.0</springfox.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
@@ -40,10 +44,13 @@
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <!-- 使用本地 JAR 解决缺失的 cn.cool:framework:jar:3.2.0 -->
        <dependency>
            <groupId>cn.cool</groupId>
            <artifactId>framework</artifactId>
            <version>${cool.version}</version>
            <version>3.2.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/version/lib/framework-3.2.0.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.apache.tika</groupId>
src/main/java/com/zy/api/controller/AgvScheduleController.java
@@ -2,7 +2,6 @@
import com.core.common.R;
import com.zy.api.entity.CallAgvParams;
import com.zy.api.enums.OrderType;
import com.zy.api.service.AgvScheduleService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
@@ -33,8 +32,19 @@
            return R.error("参数不能为空!!");
        }
        if (Objects.isNull(params.getType())) {
            return R.ok("搬运类型不能为空!!");
            return R.error("搬运类型不能为空!!");
        }
        return agvScheduleService.callAgvCarry(params);
    }
    @ApiOperation("agv搬运结果回传")
    @PostMapping("/agv/result/callback")
    public R agvCarryCallBack(@RequestBody CallAgvParams params) {
        if (Objects.isNull(params)) {
            return R.error("参数不能为空!!");
        }
        return agvScheduleService.callback(params);
    }
}
src/main/java/com/zy/api/controller/KopenApiController.java
New file
@@ -0,0 +1,70 @@
package com.zy.api.controller;
import com.alibaba.fastjson.JSON;
import com.core.common.R;
import com.zy.api.entity.OrderParams;
import com.zy.api.service.KopenApiService;
import com.zy.asrs.entity.Mat;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@RestController
@RequestMapping("/kopen")
public class KopenApiController {
    @Autowired
    private KopenApiService kopenApiService;
    /**
     * 上游下发派工单
     *
     * @author Ryan
     * @date 2025/11/24 15:18
     * @param params
     * @return com.core.common.R
     */
    @ApiOperation("上架派工单")
    @PostMapping("/order/add")
    public R receiveOrders(@RequestBody OrderParams params) {
        if (Objects.isNull(params)) {
            return R.error("参数不能为空!!");
        }
        if (Objects.isNull(params.getType())) {
            return R.error("单据类型不能为空!");
        }
        return kopenApiService.receiveOrders(params);
    }
    /**
     * 上游下发零件数据变更
     * s
     * @author Ryan
     * @date 2025/11/24 15:19
     * @param params
     * @return com.core.common.R
     */
    @ApiOperation("零件信息数据更新")
    @PostMapping("/sync/mat")
    public R basMatUpdate(@RequestBody Map<String, String> params) {
        if (Objects.isNull(params.get("matnrs"))) {
            return R.error("参数不能为空!!");
        }
        if (params.get("matnrs").isEmpty()) {
            return R.error("变更零件明细不能为空!!");
        }
        List<Mat> mats = JSON.parseArray(params.get("matnrs"), Mat.class);
        return kopenApiService.basMatupdate(mats);
    }
}
src/main/java/com/zy/api/entity/BaseRequstParam.java
New file
@@ -0,0 +1,15 @@
package com.zy.api.entity;
import java.util.Map;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@ApiModel("基础请求参数")
@Accessors(chain = true)
public class BaseRequstParam {
    private Map<String, Object> root;
}
src/main/java/com/zy/api/entity/MatnrsParams.java
New file
@@ -0,0 +1,43 @@
package com.zy.api.entity;
import org.springframework.format.annotation.DateTimeFormat;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
@ApiModel(value = "MatnrsParams", description = "物料信息")
public class MatnrsParams {
    @ApiModelProperty("单据类型")
    private String pro_komcode;
    @ApiModelProperty("工单类型")
    private String pro_id;
    @ApiModelProperty("订单号")
    private String company_id;
    @ApiModelProperty("订单数量")
    private Double pro_name;
    @ApiModelProperty("操作人")
    private String pro_size;
    @ApiModelProperty("重量")
    private String pro_wet;
    @ApiModelProperty("零件类型")
    private String pro_type;
    @ApiModelProperty("更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private String update_time;
}
src/main/java/com/zy/api/entity/OrderItemsParam.java
New file
@@ -0,0 +1,34 @@
package com.zy.api.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@Accessors(chain = true)
@ApiModel(value = "OrderItemsParam", description = "订单明细参数")
public class OrderItemsParam implements Serializable {
    @ApiModelProperty("BS Code")
    private String total_serial;
    @ApiModelProperty("目标库区")
    private String target_location;
    @ApiModelProperty("零件类型")
    private String pro_type;
    @ApiModelProperty("零件代码")
    private String pro_komcode;
    @ApiModelProperty("供应商编码")
    private String pro_id;
    @ApiModelProperty("入库通知数量")
    private Double inv_qty;
}
src/main/java/com/zy/api/entity/OrderParams.java
New file
@@ -0,0 +1,44 @@
package com.zy.api.entity;
import java.io.Serializable;
import java.util.List;
import org.springframework.format.annotation.DateTimeFormat;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
@ApiModel(value = "OrderParams", description = "单据信息")
public class OrderParams implements Serializable {
    @ApiModelProperty("流水号(唯一)")
    private String kopen_id;
    @ApiModelProperty("派工单号")
    private String dispatch_no;
    @ApiModelProperty("公司ID")
    private String company_id;
    @ApiModelProperty("入库类型 1: 采购入库,2: 调拨入库,3: 销售退货入库,4: 套包入库")
    private String type;
    @ApiModelProperty("箱号")
    private String pm_tktid;
    @ApiModelProperty("入库通知单号")
    private String inv_no;
    @ApiModelProperty("入库物料列表")
    List<OrderItemsParam> details;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private String update_time;
}
src/main/java/com/zy/api/entity/dto/BaseResponse.java
New file
@@ -0,0 +1,30 @@
package com.zy.api.entity.dto;
import java.sql.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
@ApiModel(value = "BaseResponse", description = "基础响应")
public class BaseResponse {
    private String message;
    private Boolean success;
    private String returnMessage;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date timestamp;
}
src/main/java/com/zy/api/enums/LocAreaType.java
New file
@@ -0,0 +1,24 @@
package com.zy.api.enums;
/**
 * 库区类型
 */
public enum LocAreaType {
    /** 大库区 */
     AUTOMATED("1", "立库"),
    /** 中库区 */
    SO_HOLDING("2", "SO等待区"),
    /** 小件库区 */
    EO_HOLDING("3", "EO等待区");
    public String type;
    public String desc;
    LocAreaType(String type, String desc) {
        this.type = type;
        this.desc = desc;
    }
}
src/main/java/com/zy/api/enums/MatType.java
New file
@@ -0,0 +1,24 @@
package com.zy.api.enums;
/**
 * 物料类型
 */
public enum MatType {
    /** 滤芯 */
    LARGE("1", "滤芯"),
    /** 中件 */
    MIDDEL("2", "中件"),
    /** 小件 */
    SMALL("3", "小件");
    public String type;
    public String desc;
    MatType(String type, String desc) {
        this.type = type;
        this.desc = desc;
    }
}
src/main/java/com/zy/api/enums/OrderWkType.java
New file
@@ -0,0 +1,36 @@
package com.zy.api.enums;
public enum OrderWkType {
    // 订单类型
    ORDER_WK_PUR_IN("1", "采购入库"),
    ORDER_WK_TRANSFER_IN("2", "调拔入库"),
    ORDER_WK_SALE_IN("3", "销售退货入库"),
    ORDER_WK_BAG_IN("4", "套包入库"),
    ORDER_WK_ORDER_OUT("29", "备货单");
    OrderWkType(String val, String desc) {
        this.val = val;
        this.desc = desc;
    }
    public String val;
    public String desc;
    public static String getTypeVal(String val) {
        if (val.equals(OrderWkType.ORDER_WK_PUR_IN.val)) {
            return OrderType.ORDER_IN.type;
        } else if (val.equals(OrderWkType.ORDER_WK_TRANSFER_IN.val)) {
            return OrderType.ORDER_IN.type;
        } else if (val.equals(OrderWkType.ORDER_WK_SALE_IN.val)) {
            return OrderType.ORDER_IN.type;
        } else if (val.equals(OrderWkType.ORDER_WK_BAG_IN.val)) {
            return OrderType.ORDER_IN.type;
        } else if (val.equals(OrderWkType.ORDER_WK_ORDER_OUT.val)) {
            return OrderType.ORDER_OUT.type;
        } else {
            return OrderType.ORDER_OUT.type;
        }
    }
}
src/main/java/com/zy/api/service/AgvScheduleService.java
@@ -6,4 +6,6 @@
public interface AgvScheduleService {
    R callAgvCarry(CallAgvParams params);
    R callback(CallAgvParams params);
}
src/main/java/com/zy/api/service/KopenApiService.java
New file
@@ -0,0 +1,37 @@
package com.zy.api.service;
import com.core.common.R;
import com.zy.api.entity.OrderParams;
import com.zy.asrs.entity.Mat;
import java.util.List;
public interface KopenApiService {
    /**
     * 上架派工单下发
     * @author Ryan
     * @date 2025/11/24 14:42
     * @param params
     * @return com.core.common.R
     */
    R receiveOrders(OrderParams params);
    /**
     * 基础零件变更
     * @author Ryan
     * @date 2025/11/24 15:04
     * @param matnrs
     * @return com.core.common.R
     */
    R basMatupdate(List<Mat> matnrs);
    /**
     * 新增或修改单据信息
     * @author Ryan
     * @date 2025/11/24 15:33
     */
    void addOrUpdateOrders(OrderParams params, String type) ;
}
src/main/java/com/zy/api/service/impl/AgvScheduleServiceImpl.java
@@ -26,4 +26,10 @@
        }
        return R.ok();
    }
    @Override
    public R callback(CallAgvParams params) {
        //TODO 1. 搬运完成,修改
        return null;
    }
}
src/main/java/com/zy/api/service/impl/KopenApiServiceImpl.java
New file
@@ -0,0 +1,168 @@
package com.zy.api.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.DateUtils;
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.api.entity.OrderParams;
import com.zy.api.enums.OrderType;
import com.zy.api.enums.OrderWkType;
import com.zy.api.service.KopenApiService;
import com.zy.asrs.entity.Mat;
import com.zy.asrs.entity.Order;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.enums.CommonEnum;
import com.zy.asrs.enums.OrderSettle;
import com.zy.asrs.service.OrderDetlService;
import com.zy.asrs.service.OrderService;
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.Objects;
@Service("kopenApiServiceImpl")
public class KopenApiServiceImpl implements KopenApiService {
    @Autowired
    private OrderService orderService;
    @Autowired
    private OrderDetlService orderDetlService;
    /**
     * 接收下发订单信息
     *
     * @author Ryan
     * @date 2025/11/24 14:49
     * @param params
     * @return com.core.common.R
     */
    @Override
    public R receiveOrders(OrderParams params) {
        if (params.getType().equals(OrderWkType.getTypeVal(params.getType()))) {
            return R.error("当前类型不是上架派工单!!");
        }
        addOrUpdateOrders(params, "add");
        return R.ok("单据下发成功!!");
    }
    /**
     * 基础零件变更
     *
     * @author Ryan
     * @date 2025/11/24 15:05
     * @param matnrs
     * @return com.core.common.R
     */
    @Override
    public R basMatupdate(List<Mat> matnrs) {
        return null;
    }
    /**
     * 新增或修改订单信息
     *
     * @author Ryan
     * @date 2025/11/24 15:32
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void addOrUpdateOrders(OrderParams params, String type) {
        if (Objects.isNull(params)) {
            throw new CoolException("参数不能为空!!");
        }
        if (Objects.isNull(params.getType())) {
            throw new CoolException("订单类型不能为空!!");
        }
        OrderParams orderParams = JSONObject.parseObject(JSONObject.toJSONString(params), OrderParams.class);
        Order order = orderService.selectOne(new EntityWrapper<Order>().eq("order_no", orderParams.getInv_no()));
        if (type.equals("add") && !Objects.isNull(order)) {
            throw new CoolException("单据已存在, 不可重复添加!!");
        }
        // 判断订单是否存在
        if (Objects.isNull(order)) {
            /** 不存在,新增订单 */
            generateOrders(params);
        } else {
            /** 存在,删除老订单,更新插入新订单 */
            // 删除旧订单明细
            if (!orderDetlService.delete(new EntityWrapper<OrderDetl>().eq("order_id", order.getId()))) {
                throw new CoolException("订单明细删除失败!!");
            };
            if (!orderService.deleteById(order.getId())) {
                throw new CoolException("原单据删除失败!!");
            }
            generateOrders(params);
        }
    }
    public static String generateUUID(OrderParams params) {
        return java.util.UUID.randomUUID().toString();
    }
    /**
     * 生成订单信息
     * @param params
     */
    @Transactional(rollbackFor = Exception.class)
    public void generateOrders(OrderParams params) {
        // 将数据当新订单插入
        Order newOrder = new Order();
        if (OrderType.ORDER_IN.type.equals(OrderWkType.getTypeVal(params.getType()))) {
            // 入库
            newOrder.setPakinPakoutStatus(1);
        } else if (OrderType.ORDER_OUT.type.equals(OrderWkType.getTypeVal(params.getType()))) {
            // 出库
            newOrder.setPakinPakoutStatus(2);
        }
        newOrder.setDocType(Long.parseLong(params.getType()));
        newOrder.setOrderNo(params.getInv_no());
        newOrder.setUuid(generateUUID(params));
        // 流水号(唯一)
        newOrder.setDefNumber(params.getKopen_id());
        // 派工单号
        newOrder.setNumber(params.getDispatch_no());
        // 箱号
        newOrder.setItemName(params.getPm_tktid());
        newOrder.setSettle(OrderSettle.ORDER_SETTLE_INIT.type);
        newOrder.setStatus(CommonEnum.COMMON_ENUM_Y.type);
        // 订单时间
        newOrder.setOrderTime(DateUtils.convert(new Date(), "yyyy-MM-dd HH:mm:ss"));
        // 公司ID
        newOrder.setCstmrName(params.getCompany_id());
        newOrder.setCreateTime(new Date());
        newOrder.setUpdateTime(new Date());
        if (!orderService.insert(newOrder)) {
            throw new RuntimeException("新增订单失败!!");
        }
        if (!Objects.isNull(params.getDetails()) && !params.getDetails().isEmpty()) {
            params.getDetails().forEach(item -> {
                OrderDetl orderItem = new OrderDetl();
                BeanUtils.copyProperties(item, orderItem);
                orderItem.setOrderId(newOrder.getId());
                orderItem.setOrderNo(newOrder.getOrderNo());
                orderItem.setAnfme(Math.round(item.getInv_qty() * 10000) / 10000.0);
                orderItem.setMatnr(item.getPro_komcode());
                orderItem.setBatch(1 + "");
                orderItem.setStandby1(item.getPro_id());
                //关联上加派工单号+零件代码+供应商代码
                orderItem.setThreeCode(item.getTotal_serial());
                // 供应商代码
                orderItem.setSuppCode(item.getPro_id());
                orderItem.setCreateTime(new Date());
                orderItem.setUpdateTime(new Date());
                if (!orderDetlService.insert(orderItem)) {
                    throw new CoolException("订单明细新增失败!!");
                }
            });
        }
    }
}
src/main/java/com/zy/asrs/controller/MobileController.java
@@ -164,7 +164,7 @@
    @PostMapping("/cache/agv/call")
    @ApiOperation("呼叫AGV搬运")
    @ApiOperation("呼叫空车")
    @ManagerAuth
    public R callAgvMove(@RequestBody AgvCallParams params) {
        if (Objects.isNull(params)) {
@@ -174,6 +174,12 @@
    }
    /**
     * @author Ryan
     * @date 2025/11/3
     * @description: 呼叫AGV搬运缓存区/EO/SO
     * @version 1.0
     */
    @PostMapping("/cache/out/call")
    @ApiOperation("呼叫AGV搬运")
    @ManagerAuth
src/main/java/com/zy/asrs/entity/LocDetl.java
@@ -18,7 +18,6 @@
import com.zy.system.service.UserService;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.math.BigDecimal;
@@ -27,7 +26,6 @@
@Data
@TableName("asr_loc_detl")
@Accessors(chain = true)
@ExcelIgnoreUnannotated
public class LocDetl implements Serializable {
src/main/java/com/zy/asrs/entity/OrderDetl.java
@@ -10,7 +10,6 @@
import com.zy.asrs.service.BasProcessProceduresService;
import com.zy.asrs.service.BasQualityTestingService;
import com.zy.asrs.service.OrderService;
import com.zy.common.utils.Synchro;
import com.zy.system.entity.User;
import com.zy.system.service.UserService;
import io.swagger.annotations.ApiModelProperty;
src/main/java/com/zy/asrs/enums/LocAreaType.java
New file
@@ -0,0 +1,30 @@
package com.zy.asrs.enums;
/**
 * 库区类型
 * @author Ryan
 * @date 2025/12/3 9:59
 * @return null
 */
public enum LocAreaType {
    //入库缓存区
    LOC_AREA_TYPE_IN_CACHE("5", "入库缓存区"),
    //堆垛机
    LOC_AREA_TYPE_CRN("1", "立库区"),
    LOC_AREA_TYPE_SO("2", "出库SO区"),
    LOC_AREA_TYPE_EO("3", "出库EO区")
    ;
    public Long type;
    public String desc;
    LocAreaType(String type, String desc) {
        this.type = Long.valueOf(type);
        this.desc = desc;
    }
}
src/main/java/com/zy/asrs/enums/OrderSettle.java
New file
@@ -0,0 +1,48 @@
package com.zy.asrs.enums;
/**
 * 单据状态
 * @author Ryan
 * @date 2025/12/1 12:41
 * @return null
 */
public enum OrderSettle {
    //初始化
    ORDER_SETTLE_INIT("0", "初始化"),
    //待处理
    ORDER_SETTLE_HOLDING("1", "待处理"),
    ORDER_SETTLE_WORKING("2", "作业中"),
    ORDER_SETTLE_CANCEL("3", "已取消"),
    ORDER_SETTLE_DONE("4", "已完成"),
    ORDER_SETTLE_UN_CANCEL("5", "准备取消"),
    ORDER_SETTLE_REPORTED("6", "上报完成"),
    ORDER_SETTLE_DATA_EX("7", "数据异常"),
    ORDER_SETTLE_CHECKED("8", "审核完成"),
    ORDER_SETTLE_SUBMITED("8", "提交完成"),
    ORDER_SETTLE_SAVED("10", "保存完成"),
    ORDER_SETTLE_CHECKED_TASKED("11", "已生成盘点任务"),
    ORDER_SETTLE_SECTION_TASKED("12", "已生成部分任务"),
    ;
    public Long type;
    public String desc;
    OrderSettle(String type, String desc) {
        this.type = Long.valueOf(type);
        this.desc = desc;
    }
}
src/main/java/com/zy/asrs/service/MobileService.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson.JSONObject;
import com.core.common.R;
import com.zy.asrs.entity.BasDevp;
import com.zy.asrs.entity.LocCache;
import com.zy.asrs.entity.LocDetl;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.entity.param.*;
@@ -101,5 +102,13 @@
     */
    R OutCallAgv(AgvCallParams params, Long userId);
    /**
     * 生成立库出库任务
     * @author Ryan
     * @date 2025/12/3 8:07
     * @param locCaches
     */
    void generateCRNOutTask(LocCache locCaches);
    R callEmptyCar(AgvCallParams params);
}
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -11,7 +11,9 @@
import com.zy.asrs.entity.result.ForwardAGVTaskDTO;
import com.zy.asrs.entity.result.HIKApiDTO;
import com.zy.asrs.entity.result.HIKResultDTO;
import com.zy.asrs.enums.LocAreaType;
import com.zy.asrs.enums.LocStsType;
import com.zy.asrs.enums.OrderSettle;
import com.zy.asrs.mapper.LocMastMapper;
import com.zy.asrs.mapper.ManLocDetlMapper;
import com.zy.asrs.service.*;
@@ -117,6 +119,8 @@
    private BasStationService basStationService;
    @Autowired
    private BasContainerService basContainerService;
    @Autowired
    private BasAreasService basAreasService;
    @Override
    @Transactional
@@ -959,7 +963,6 @@
                        log.error("", e);
                    }
                }
            }
            // 生成入库单据
@@ -1187,13 +1190,12 @@
                .eq("frozen", 0)
                .ne("full_plt", "Y")
                .eq("loc_sts", LocStsType.LOC_STS_TYPE_O.type).orderAsc(Arrays.asList("row1"))));
    }
    /**
     * @author Ryan
     * @date 2025/9/22
     * @description: 呼叫AGV搬运
     * @description: 呼叫空车
     * @version 1.0
     */
    @Override
@@ -1255,6 +1257,7 @@
     */
    @Override
    public R OutCallAgv(AgvCallParams params, Long userId) {
        /**获取入库最早的一条数据**/
        LocCache locCaches = locCacheService.selectOne(new EntityWrapper<LocCache>()
                .eq("loc_sts", LocStsType.LOC_STS_TYPE_F.type)
                .eq("frozen", 0)
@@ -1270,14 +1273,17 @@
            throw new CoolException("站点正在执行任务!!");
        }
        generateOutTask(station, locCaches, userId);
        /**生成缓存区出库任务*/
        generateCacheOutTask(station, locCaches, userId);
        /**生成立库出库任务*/
        generateCRNOutTask(locCaches);
        return R.ok();
    }
    @Override
    public R callEmptyCar(AgvCallParams params) {
        List<LocCache> locSts = locCacheService.selectList(new EntityWrapper<LocCache>().eq("loc_sts", LocStsType.LOC_STS_TYPE_D.type));
        if (locSts.isEmpty()){
            throw new CoolException("暂无空板库位");
@@ -1301,13 +1307,48 @@
    }
    /**
     * 生成立库出库任务
     * @author Ryan
     * @date 2025/12/3 8:06
     * @param locCaches
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void generateCRNOutTask(LocCache locCaches) {
        if (Objects.isNull(locCaches)) {
            throw new CoolException("库位不能为空!!");
        }
        BasAreas basAreas = basAreasService.selectOne(new EntityWrapper<BasAreas>().eq("whs_type_id", LocAreaType.LOC_AREA_TYPE_IN_CACHE.type));
        if (Objects.isNull(basAreas)) {
            throw new CoolException("库区不存在!!");
        }
        List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>()
                .eq("area_id", basAreas.getAreaNo())
                .eq("loc_id", locCaches.getId()));
        if (Objects.isNull(locDetls)) {
            throw new CoolException("库存明细不存在!!");
        }
        //按物料编码分类
        Map<String, List<LocDetl>> listMap = locDetls.stream().collect(Collectors.groupingBy(LocDetl::getMatnr));
        listMap.forEach((key, detls) -> {
        });
        locDetls.forEach(locDetl -> {
        });
    }
    /**
     * @author Ryan
     * @date 2025/9/25
     * @description: 呼叫AGV生成出库任务
     * @version 1.0
     */
    @Transactional(rollbackFor = Exception.class)
    public void generateOutTask(BasStation station, LocCache loc, Long userId) {
    public void generateCacheOutTask(BasStation station, LocCache loc, Long userId) {
        // 获取工作号
        int workNo = commonService.getWorkNo(WorkNoType.PICK.type);
        // 保存工作档
@@ -1356,6 +1397,8 @@
                    .setModiUser(userId);
            taskDetls.add(wrkDetl);
        });
        //保存工作档明细
        if (!taskDetlService.insertBatch(taskDetls)) {
@@ -1446,8 +1489,8 @@
            throw new CoolException("保存工作档明细失败");
        }
        // 修改目标库位状态
        if (loc.getLocSts().equals("O")) {
            loc.setLocSts("S"); // S.入库预约
        if (loc.getLocSts().equals(LocStsType.LOC_STS_TYPE_O.type)) {
            loc.setLocSts(LocStsType.LOC_STS_TYPE_S.type); // S.入库预约
            loc.setModiTime(new Date());
            loc.setModiUser(userId);
            if (!locCacheService.updateById(loc)) {
src/main/java/com/zy/asrs/task/OrderSyncScheduler.java
@@ -81,7 +81,7 @@
//        }
    }
//    @Scheduled(cron = "0/5 * * * * ? ")
    @Scheduled(cron = "0/5 * * * * ? ")
    @Async("orderThreadPool")
    public void completeAndReportOrderInAndOutUtil() {
//        String erpReport = Parameter.get().getErpReport();
@@ -101,7 +101,7 @@
//        }
    }
//    @Scheduled(cron = "0/30 * * * * ? ")
    @Scheduled(cron = "0/30 * * * * ? ")
    @Async("orderThreadPool")
    public void completeAndReportOrderReport() {
        if (!ErpReportOld){
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -71,13 +71,13 @@
        return SUCCESS;
    }
    public ReturnT<String> doIn(WrkMast wrkMast) {
        Date now = new Date();
        LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
        try {
            if (null == locMast) {
//                exceptionHandle("工作档[workNo={0}]库位号错误[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                // exceptionHandle("工作档[workNo={0}]库位号错误[locNo={1}]", wrkMast.getWrkNo(),
                // wrkMast.getLocNo());
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                return FAIL.setMsg("工作档[workNo=" + wrkMast.getWrkNo() + "]库位号错误[locNo=" + wrkMast.getLocNo() + "]");
            }
@@ -94,37 +94,48 @@
                        locMast.setIoTime(now);
                        locMast.setModiTime(now);
                        if (!locMastService.updateById(locMast)) {
//                            exceptionHandle("空板入库 ===>> 修改库位状态失败;[workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                            // exceptionHandle("空板入库 ===>> 修改库位状态失败;[workNo={0}],[locNo={1}]",
                            // wrkMast.getWrkNo(), wrkMast.getLocNo());
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                            return FAIL.setMsg("空板入库 ===>> 修改库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                            return FAIL.setMsg("空板入库 ===>> 修改库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo="
                                    + wrkMast.getLocNo() + "]");
                        }
                    }
                    break;
                // 全板入库
                case 1:
                    // 清除所属库位之前的库存明细
                    List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", wrkMast.getLocNo()));
                    List<LocDetl> locDetls = locDetlService
                            .selectList(new EntityWrapper<LocDetl>().eq("loc_no", wrkMast.getLocNo()));
                    if (!locDetls.isEmpty()) {
                        locDetlService.delete(new EntityWrapper<LocDetl>().eq("loc_no", wrkMast.getLocNo()));
                    }
                    // 根据工作号,查询工作明细档
                    List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
                    List<WrkDetl> wrkDetls = wrkDetlService
                            .selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
                    if (wrkDetls.isEmpty()) {
//                        exceptionHandle("全板入库 ===>> 工作明细档不存在;[workNo={0}]", wrkMast.getWrkNo());
                        // exceptionHandle("全板入库 ===>> 工作明细档不存在;[workNo={0}]", wrkMast.getWrkNo());
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        return FAIL.setMsg("全板入库 ===>> 工作明细档不存在; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                        return FAIL.setMsg("全板入库 ===>> 工作明细档不存在; [workNo=" + wrkMast.getWrkNo() + "],[locNo="
                                + wrkMast.getLocNo() + "]");
                    }
                    // 遍历工作明细,更新库存明细和入库通知档
                    for (WrkDetl wrkDetl : wrkDetls) {
                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand()
                                , wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(), wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(),
                                wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(),
                                wrkDetl.getStandby3(), wrkDetl.getBoxType1(), wrkDetl.getBoxType2(),
                                wrkDetl.getBoxType3());
                        if (null != locDetl) {
                            if (!locDetlService.updateAnfme(wrkDetl.getAnfme(), wrkMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3()
                                    , wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3())) {
//                                exceptionHandle("全板入库 ===>> 更新库存明细失败;[workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                            if (!locDetlService.updateAnfme(wrkDetl.getAnfme(), wrkMast.getLocNo(), wrkDetl.getMatnr(),
                                    wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(),
                                    wrkDetl.getStandby2(), wrkDetl.getStandby3(), wrkDetl.getBoxType1(),
                                    wrkDetl.getBoxType2(), wrkDetl.getBoxType3())) {
                                // exceptionHandle("全板入库 ===>> 更新库存明细失败;[workNo={0}],[locNo={1}]",
                                // wrkMast.getWrkNo(), wrkMast.getLocNo());
                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                return FAIL.setMsg("全板入库 ===>> 更新库存明细失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                                return FAIL.setMsg("全板入库 ===>> 更新库存明细失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo="
                                        + wrkMast.getLocNo() + "]");
                            }
                        } else {
                            locDetl = new LocDetl();
@@ -135,31 +146,39 @@
                            locDetl.setModiTime(now);
                            locDetl.setAppeTime(now);
                            if (!locDetlService.insert(locDetl)) {
//                                exceptionHandle("全板入库 ===>> 添加库存明细失败;[workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                                // exceptionHandle("全板入库 ===>> 添加库存明细失败;[workNo={0}],[locNo={1}]",
                                // wrkMast.getWrkNo(), wrkMast.getLocNo());
                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                return FAIL.setMsg("全板入库 ===>> 添加库存明细失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                                return FAIL.setMsg("全板入库 ===>> 添加库存明细失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo="
                                        + wrkMast.getLocNo() + "]");
                            }
                        }
                        // 更新订单完成数量
                        OrderDetlPakin orderDetlPakin = orderDetlPakinService.selectItem
                                (wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                        wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                        OrderDetlPakin orderDetlPakin = orderDetlPakinService.selectItem(wrkDetl.getOrderNo(),
                                wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(),
                                wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                        if (orderDetlPakin == null) {
                            orderDetlPakin = orderDetlPakinService.selectItem
                                    (wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(),
                                            wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                            wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                            orderDetlPakin = orderDetlPakinService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(),
                                    wrkDetl.getBatch(),
                                    wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(),
                                    wrkDetl.getStandby3(),
                                    wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                        }
                        try {
                            if (!Cools.isEmpty(orderDetlPakin)) {
                                if (!orderDetlPakinService.increaseQtyByOrderNo(wrkDetl.getOrderNo(), wrkDetl.getMatnr(),
                                        orderDetlPakin.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                        wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3(), wrkDetl.getAnfme())) {
//                                    exceptionHandle("全板入库 ===>> 更新订单完成数量失败;[workNo={0}],[locNo={1}]",
//                                            wrkMast.getWrkNo(), wrkMast.getLocNo());
                                if (!orderDetlPakinService.increaseQtyByOrderNo(wrkDetl.getOrderNo(),
                                        wrkDetl.getMatnr(),
                                        orderDetlPakin.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(),
                                        wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                        wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3(),
                                        wrkDetl.getAnfme())) {
                                    // exceptionHandle("全板入库 ===>> 更新订单完成数量失败;[workNo={0}],[locNo={1}]",
                                    // wrkMast.getWrkNo(), wrkMast.getLocNo());
                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                    return FAIL.setMsg("全板入库 ===>> 更新订单完成数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                                    return FAIL.setMsg("全板入库 ===>> 更新订单完成数量失败; [workNo=" + wrkMast.getWrkNo()
                                            + "],[locNo=" + wrkMast.getLocNo() + "]");
                                }
                            }
                        } catch (Exception ignore) {
@@ -173,29 +192,38 @@
                        locMast.setIoTime(now);
                        locMast.setModiTime(now);
                        if (!locMastService.updateById(locMast)) {
//                            exceptionHandle("全板入库 ===>> 修改库位状态失败;[workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                            // exceptionHandle("全板入库 ===>> 修改库位状态失败;[workNo={0}],[locNo={1}]",
                            // wrkMast.getWrkNo(), wrkMast.getLocNo());
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                            return FAIL.setMsg("全板入库 ===>> 修改库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                            return FAIL.setMsg("全板入库 ===>> 修改库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo="
                                    + wrkMast.getLocNo() + "]");
                        }
                    }
                    break;
                // 拣料途中并板
                case 8:
                    // 根据工作号,查询工作明细档
                    List<WrkDetl> wrkDetls8 = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
                    List<WrkDetl> wrkDetls8 = wrkDetlService
                            .selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
                    if (wrkDetls8.isEmpty()) {
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        return FAIL.setMsg("拣料途中并板 ===>> 工作明细档不存在; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                        return FAIL.setMsg("拣料途中并板 ===>> 工作明细档不存在; [workNo=" + wrkMast.getWrkNo() + "],[locNo="
                                + wrkMast.getLocNo() + "]");
                    }
                    // 遍历工作明细,更新库存明细和入库通知档
                    for (WrkDetl wrkDetl : wrkDetls8) {
                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand()
                                , wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(), wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(),
                                wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(),
                                wrkDetl.getStandby3(), wrkDetl.getBoxType1(), wrkDetl.getBoxType2(),
                                wrkDetl.getBoxType3());
                        if (null != locDetl) {
                            if (!locDetlService.updateAnfme(wrkDetl.getAnfme() + locDetl.getAnfme(), wrkMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3()
                                    , wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3())) {
                            if (!locDetlService.updateAnfme(wrkDetl.getAnfme() + locDetl.getAnfme(), wrkMast.getLocNo(),
                                    wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(),
                                    wrkDetl.getStandby2(), wrkDetl.getStandby3(), wrkDetl.getBoxType1(),
                                    wrkDetl.getBoxType2(), wrkDetl.getBoxType3())) {
                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                return FAIL.setMsg("拣料途中并板 ===>> 更新库存明细失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                                return FAIL.setMsg("拣料途中并板 ===>> 更新库存明细失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo="
                                        + wrkMast.getLocNo() + "]");
                            }
                        } else {
                            locDetl = new LocDetl();
@@ -207,17 +235,21 @@
                            locDetl.setAppeTime(now);
                            if (!locDetlService.insert(locDetl)) {
                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                return FAIL.setMsg("拣料途中并板 ===>> 添加库存明细失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                                return FAIL.setMsg("拣料途中并板 ===>> 添加库存明细失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo="
                                        + wrkMast.getLocNo() + "]");
                            }
                        }
                        if (!Cools.isEmpty(wrkDetl.getOrderNo())) {
                            // 更新订单完成数量
                            if (!orderDetlPakinService.increaseQtyByOrderNo(wrkDetl.getOrderNo(), wrkDetl.getMatnr(),
                                    wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                    wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3(), wrkDetl.getAnfme())) {
                                    wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(),
                                    wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                    wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3(),
                                    wrkDetl.getAnfme())) {
                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                return FAIL.setMsg("拣料途中并板 ===>> 更新订单完成数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                                return FAIL.setMsg("拣料途中并板 ===>> 更新订单完成数量失败; [workNo=" + wrkMast.getWrkNo()
                                        + "],[locNo=" + wrkMast.getLocNo() + "]");
                            }
                        }
                    }
@@ -225,44 +257,57 @@
                // 拣料入库
                case 53:
                    // 根据工作号,查询工作明细档
                    List<WrkDetl> wrkDetls53 = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
                    List<WrkDetl> wrkDetls53 = wrkDetlService
                            .selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
                    if (wrkDetls53.isEmpty()) {
//                        exceptionHandle("拣料入库 ===>> 工作明细档为空;[workNo={0}]", wrkMast.getWrkNo());
                        // exceptionHandle("拣料入库 ===>> 工作明细档为空;[workNo={0}]", wrkMast.getWrkNo());
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        return FAIL.setMsg("拣料入库 ===>> 工作明细档为空; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                        return FAIL.setMsg("拣料入库 ===>> 工作明细档为空; [workNo=" + wrkMast.getWrkNo() + "],[locNo="
                                + wrkMast.getLocNo() + "]");
                    }
                    for (WrkDetl wrkDetl : wrkDetls53) {
                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand()
                                , wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(), wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(),
                                wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(),
                                wrkDetl.getStandby3(), wrkDetl.getBoxType1(), wrkDetl.getBoxType2(),
                                wrkDetl.getBoxType3());
                        if (null != locDetl) {
                            if (!locDetlService.updateAnfme(locDetl.getAnfme() - wrkDetl.getAnfme(), locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3()
                                    , wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3())) {
//                                exceptionHandle("拣料入库 ===>> 修改库存明细数量失败;[workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                            if (!locDetlService.updateAnfme(locDetl.getAnfme() - wrkDetl.getAnfme(), locMast.getLocNo(),
                                    wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(),
                                    wrkDetl.getStandby2(), wrkDetl.getStandby3(), wrkDetl.getBoxType1(),
                                    wrkDetl.getBoxType2(), wrkDetl.getBoxType3())) {
                                // exceptionHandle("拣料入库 ===>> 修改库存明细数量失败;[workNo={0}],[locNo={1}]",
                                // wrkMast.getWrkNo(), wrkMast.getLocNo());
                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                return FAIL.setMsg("拣料入库 ===>> 修改库存明细数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                                return FAIL.setMsg("拣料入库 ===>> 修改库存明细数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo="
                                        + wrkMast.getLocNo() + "]");
                            }
                        }
                        // 更新订单完成数量
                        OrderDetlPakin orderDetlPakin = orderDetlPakinService.selectItem
                                (wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(),
                                        wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                        wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                        OrderDetlPakin orderDetlPakin = orderDetlPakinService.selectItem(wrkDetl.getOrderNo(),
                                wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(),
                                wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                        if (orderDetlPakin == null) {
                            orderDetlPakin = orderDetlPakinService.selectItem
                                    (wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                            wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                            orderDetlPakin = orderDetlPakinService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(),
                                    wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(),
                                    wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                    wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                        }
                        try {
                            if (!Cools.isEmpty(orderDetlPakin)) {
                                if (!orderDetlPakinService.increaseQtyByOrderNo(wrkDetl.getOrderNo(), wrkDetl.getMatnr(),
                                        orderDetlPakin.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                        wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3(), wrkDetl.getAnfme())) {
//                                    exceptionHandle("拣料入库 ===>> 更新订单完成数量失败;[workNo={0}],[locNo={1}]",
//                                            wrkMast.getWrkNo(), wrkMast.getLocNo());
                                if (!orderDetlPakinService.increaseQtyByOrderNo(wrkDetl.getOrderNo(),
                                        wrkDetl.getMatnr(),
                                        orderDetlPakin.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(),
                                        wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                        wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3(),
                                        wrkDetl.getAnfme())) {
                                    // exceptionHandle("拣料入库 ===>> 更新订单完成数量失败;[workNo={0}],[locNo={1}]",
                                    // wrkMast.getWrkNo(), wrkMast.getLocNo());
                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                    return FAIL.setMsg("拣料入库 ===>> 更新订单完成数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                                    return FAIL.setMsg("拣料入库 ===>> 更新订单完成数量失败; [workNo=" + wrkMast.getWrkNo()
                                            + "],[locNo=" + wrkMast.getLocNo() + "]");
                                }
                            }
                        } catch (Exception ignore) {
@@ -276,32 +321,42 @@
                        locMast.setIoTime(now);
                        locMast.setModiTime(now);
                        if (!locMastService.updateById(locMast)) {
//                            exceptionHandle("拣料入库 ===>> 修改库位状态失败;[workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                            // exceptionHandle("拣料入库 ===>> 修改库位状态失败;[workNo={0}],[locNo={1}]",
                            // wrkMast.getWrkNo(), wrkMast.getLocNo());
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                            return FAIL.setMsg("拣料入库 ===>> 修改库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                            return FAIL.setMsg("拣料入库 ===>> 修改库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo="
                                    + wrkMast.getLocNo() + "]");
                        }
                    }
                    break;
                // 并板入库
                case 54:
                    // 根据工作号,查询工作明细档
                    List<WrkDetl> wrkDetls54 = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
                    List<WrkDetl> wrkDetls54 = wrkDetlService
                            .selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
                    if (wrkDetls54.isEmpty()) {
//                        exceptionHandle("并板入库 ===>> 工作明细档为空;[workNo={0}]", wrkMast.getWrkNo());
                        // exceptionHandle("并板入库 ===>> 工作明细档为空;[workNo={0}]", wrkMast.getWrkNo());
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        return FAIL.setMsg("并板入库 ===>> 工作明细档为空; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                        return FAIL.setMsg("并板入库 ===>> 工作明细档为空; [workNo=" + wrkMast.getWrkNo() + "],[locNo="
                                + wrkMast.getLocNo() + "]");
                    }
                    // 修改库存明细数量,如无库存,曾新增
                    for (WrkDetl wrkDetl : wrkDetls54) {
                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand()
                                , wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(), wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(),
                                wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(),
                                wrkDetl.getStandby3(), wrkDetl.getBoxType1(), wrkDetl.getBoxType2(),
                                wrkDetl.getBoxType3());
                        if (null != locDetl) {
                            if (!locDetlService.updateAnfme(wrkDetl.getAnfme(), locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3()
                                    , wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3())) {
//                                exceptionHandle("并板入库 ===>> 修改库存明细数量失败;[workNo={0}],[matnr={1}]", wrkMast.getWrkNo(), wrkDetl.getMatnr());
                            if (!locDetlService.updateAnfme(wrkDetl.getAnfme(), locMast.getLocNo(), wrkDetl.getMatnr(),
                                    wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(),
                                    wrkDetl.getStandby2(), wrkDetl.getStandby3(), wrkDetl.getBoxType1(),
                                    wrkDetl.getBoxType2(), wrkDetl.getBoxType3())) {
                                // exceptionHandle("并板入库 ===>> 修改库存明细数量失败;[workNo={0}],[matnr={1}]",
                                // wrkMast.getWrkNo(), wrkDetl.getMatnr());
                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                return FAIL.setMsg("并板入库 ===>> 修改库存明细数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                                return FAIL.setMsg("并板入库 ===>> 修改库存明细数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo="
                                        + wrkMast.getLocNo() + "]");
                            }
                        } else {
                            locDetl = new LocDetl();
@@ -313,19 +368,27 @@
                            locDetl.setAppeTime(now);
                            if (!locDetlService.insert(locDetl)) {
                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                return FAIL.setMsg("并板入库 ===>> 新增库存明细失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                                return FAIL.setMsg("并板入库 ===>> 新增库存明细失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo="
                                        + wrkMast.getLocNo() + "]");
                            }
                        }
                        // 更新订单完成数量
                        OrderDetlPakin orderDetlPakin = orderDetlPakinService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(), wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                        OrderDetlPakin orderDetlPakin = orderDetlPakinService.selectItem(wrkDetl.getOrderNo(),
                                wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(),
                                wrkDetl.getStandby2(), wrkDetl.getStandby3(), wrkDetl.getBoxType1(),
                                wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                        try {
                            if (!Cools.isEmpty(orderDetlPakin)) {
                                if (!orderDetlPakinService.increaseQtyByOrderNo(wrkDetl.getOrderNo(), wrkDetl.getMatnr(),
                                        orderDetlPakin.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                        wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3(), wrkDetl.getAnfme())) {
                                if (!orderDetlPakinService.increaseQtyByOrderNo(wrkDetl.getOrderNo(),
                                        wrkDetl.getMatnr(),
                                        orderDetlPakin.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(),
                                        wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                        wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3(),
                                        wrkDetl.getAnfme())) {
                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                    return FAIL.setMsg("并板入库 ===>> 更新订单完成数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                                    return FAIL.setMsg("并板入库 ===>> 更新订单完成数量失败; [workNo=" + wrkMast.getWrkNo()
                                            + "],[locNo=" + wrkMast.getLocNo() + "]");
                                }
                            }
                        } catch (Exception ignore) {
@@ -340,20 +403,24 @@
                        locMast.setIoTime(now);
                        locMast.setModiTime(now);
                        if (!locMastService.updateById(locMast)) {
//                            exceptionHandle("并板入库 ===>> 修改库位状态失败;[workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                            // exceptionHandle("并板入库 ===>> 修改库位状态失败;[workNo={0}],[locNo={1}]",
                            // wrkMast.getWrkNo(), wrkMast.getLocNo());
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                            return FAIL.setMsg("并板入库 ===>> 修改库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                            return FAIL.setMsg("并板入库 ===>> 修改库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo="
                                    + wrkMast.getLocNo() + "]");
                        }
                    }
                    break;
                // 盘点入库
                case 57:
                    // 根据工作号,查询工作明细档
                    List<WrkDetl> wrkDetls57 = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
                    List<WrkDetl> wrkDetls57 = wrkDetlService
                            .selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
                    if (wrkDetls57.isEmpty()) {
//                        exceptionHandle("盘点入库 ===>> 工作明细档为空;[workNo={0}]", wrkMast.getWrkNo());
                        // exceptionHandle("盘点入库 ===>> 工作明细档为空;[workNo={0}]", wrkMast.getWrkNo());
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        return FAIL.setMsg("盘点入库 ===>> 工作明细档为空; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                        return FAIL.setMsg("盘点入库 ===>> 工作明细档为空; [workNo=" + wrkMast.getWrkNo() + "],[locNo="
                                + wrkMast.getLocNo() + "]");
                    }
                    for (WrkDetl wrkDetl : wrkDetls57) {
                        if (!Cools.isEmpty(wrkDetl.getOrderNo())) {
@@ -362,15 +429,17 @@
                            LocDetl locDetl = locDetlService.selectById(checkOrderDetl.getLocDetlId());
                            BigDecimal oriAnfme = new BigDecimal(locDetl.getAnfme());
                            locDetl.setAnfme(checkOrderDetl.getDiffQty()
                                    .compareTo(BigDecimal.ZERO) == 0 || checkOrderDetl.getDiffQty()
                                    .compareTo(BigDecimal.ZERO) > 0
                                    ? oriAnfme.doubleValue()
                                    : oriAnfme.add(checkOrderDetl.getDiffQty()).doubleValue());
                                    .compareTo(BigDecimal.ZERO) == 0
                                    || checkOrderDetl.getDiffQty()
                                            .compareTo(BigDecimal.ZERO) > 0
                                                    ? oriAnfme.doubleValue()
                                                    : oriAnfme.add(checkOrderDetl.getDiffQty()).doubleValue());
                            locDetl.setBookQty(oriAnfme);
                            locDetl.setDiffQty(checkOrderDetl.getDiffQty());
                            if (!locDetlService.updateById(locDetl)){
                            if (!locDetlService.updateById(locDetl)) {
                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                return FAIL.setMsg("盘点入库 ===>> 修改库存差异数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                                return FAIL.setMsg("盘点入库 ===>> 修改库存差异数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo="
                                        + wrkMast.getLocNo() + "]");
                            }
                        }
@@ -382,9 +451,11 @@
                        locMast.setIoTime(now);
                        locMast.setModiTime(now);
                        if (!locMastService.updateById(locMast)) {
//                            exceptionHandle("盘点入库 ===>> 修改库位状态失败;[workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                            // exceptionHandle("盘点入库 ===>> 修改库位状态失败;[workNo={0}],[locNo={1}]",
                            // wrkMast.getWrkNo(), wrkMast.getLocNo());
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                            return FAIL.setMsg("盘点入库 ===>> 修改库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                            return FAIL.setMsg("盘点入库 ===>> 修改库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo="
                                    + wrkMast.getLocNo() + "]");
                        }
                    }
                    break;
@@ -397,9 +468,11 @@
                        locSts = "F";
                        // 转移库存明细数据: 库存号 由工作档源库位变为目标库位
                        if (!locDetlService.updateLocNo(wrkMast.getLocNo(), wrkMast.getSourceLocNo())) {
//                            exceptionHandle("库位移转 ===>> 转移库存明细数据失败;[源库位={0}],[目标库位={1}]", wrkMast.getSourceLocNo(), wrkMast.getLocNo());
                            // exceptionHandle("库位移转 ===>> 转移库存明细数据失败;[源库位={0}],[目标库位={1}]",
                            // wrkMast.getSourceLocNo(), wrkMast.getLocNo());
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                            return FAIL.setMsg("库位移转 ===>> 转移库存明细数据失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                            return FAIL.setMsg("库位移转 ===>> 转移库存明细数据失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo="
                                    + wrkMast.getLocNo() + "]");
                        }
                    }
                    // 修改源库位状态 ==> O
@@ -410,9 +483,11 @@
                        sourceLoc.setModiTime(now);
                        sourceLoc.setIoTime(now);
                        if (!locMastService.updateById(sourceLoc)) {
//                            exceptionHandle("库位移转 ===>> 修改源库位状态失败;[workNo={0}],[sourceLoc={1}]", wrkMast.getWrkNo(), wrkMast.getSourceLocNo());
                            // exceptionHandle("库位移转 ===>> 修改源库位状态失败;[workNo={0}],[sourceLoc={1}]",
                            // wrkMast.getWrkNo(), wrkMast.getSourceLocNo());
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                            return FAIL.setMsg("库位移转 ===>> 修改源库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                            return FAIL.setMsg("库位移转 ===>> 修改源库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo="
                                    + wrkMast.getLocNo() + "]");
                        }
                    }
                    // 修改目标库位状态 ==> .locSts
@@ -421,9 +496,11 @@
                    locMast.setIoTime(now);
                    locMast.setModiTime(now);
                    if (!locMastService.updateById(locMast)) {
//                        exceptionHandle("库位移转 ===>> 修改目标库位状态失败;[workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                        // exceptionHandle("库位移转 ===>> 修改目标库位状态失败;[workNo={0}],[locNo={1}]",
                        // wrkMast.getWrkNo(), wrkMast.getLocNo());
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        return FAIL.setMsg("库位移转 ===>> 修改目标库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                        return FAIL.setMsg("库位移转 ===>> 修改目标库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo="
                                + wrkMast.getLocNo() + "]");
                    }
                    break;
                default:
@@ -433,9 +510,10 @@
            wrkMast.setWrkSts(5L);
            wrkMast.setModiTime(now);
            if (!wrkMastService.updateById(wrkMast)) {
//                exceptionHandle("更新入库完成状态失败;[workNo={0}]", wrkMast.getWrkNo());
                // exceptionHandle("更新入库完成状态失败;[workNo={0}]", wrkMast.getWrkNo());
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                return FAIL.setMsg("更新入库完成状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                return FAIL
                        .setMsg("更新入库完成状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
            }
        } catch (Exception e) {
            log.error("fail", e);
@@ -452,7 +530,8 @@
        LocMast locMast = locMastService.selectById(wrkMast.getSourceLocNo());
        try {
            if (null == locMast) {
//                exceptionHandle("工作档[workNo={0}]库位号错误[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                // exceptionHandle("工作档[workNo={0}]库位号错误[locNo={1}]", wrkMast.getWrkNo(),
                // wrkMast.getLocNo());
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                return FAIL.setMsg("工作档库位号错误; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
            }
@@ -460,32 +539,42 @@
            switch (wrkMast.getIoType()) {
                // 全板出库
                case 101:
//                    // 出库确认信号位
//                    if (Cools.isEmpty(wrkMast.getInvWh()) || wrkMast.getInvWh().equals("N")) {
//                        return SUCCESS;
//                    }
                    // // 出库确认信号位
                    // if (Cools.isEmpty(wrkMast.getInvWh()) || wrkMast.getInvWh().equals("N")) {
                    // return SUCCESS;
                    // }
                    // 根据工作号,查询工作明细档
                    List<WrkDetl> wrkDetls101 = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
                    List<WrkDetl> wrkDetls101 = wrkDetlService
                            .selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
                    if (wrkDetls101.isEmpty()) {
//                        exceptionHandle("全板出库 ===>> 工作明细档为空;[workNo={0}]", wrkMast.getWrkNo());
                        // exceptionHandle("全板出库 ===>> 工作明细档为空;[workNo={0}]", wrkMast.getWrkNo());
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        return FAIL.setMsg("全板出库 ===>> 工作明细档为空; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]");
                        return FAIL.setMsg("全板出库 ===>> 工作明细档为空; [workNo=" + wrkMast.getWrkNo() + "],[locNo="
                                + wrkMast.getSourceLocNo() + "]");
                    }
                    for (WrkDetl wrkDetl : wrkDetls101) {
                        // 更新订单完成数量
                        OrderDetlPakout orderDetlPakout = orderDetlPakoutService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                        OrderDetlPakout orderDetlPakout = orderDetlPakoutService.selectItem(wrkDetl.getOrderNo(),
                                wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(),
                                wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                        if (orderDetlPakout == null) {
                            orderDetlPakout = orderDetlPakoutService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                            orderDetlPakout = orderDetlPakoutService.selectItem(wrkDetl.getOrderNo(),
                                    wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(),
                                    wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                    wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                        }
                        try {
                            if (!Cools.isEmpty(orderDetlPakout)) {
                                if (!orderDetlPakoutService.increaseQtyByOrderNo(wrkDetl.getOrderNo(), wrkDetl.getMatnr(),
                                        orderDetlPakout.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                        wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3(), wrkDetl.getAnfme())) {
                                if (!orderDetlPakoutService.increaseQtyByOrderNo(wrkDetl.getOrderNo(),
                                        wrkDetl.getMatnr(),
                                        orderDetlPakout.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(),
                                        wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                        wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3(),
                                        wrkDetl.getAnfme())) {
                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                    return FAIL.setMsg("全板出库 ===>> 更新订单完成数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]");
                                    return FAIL.setMsg("全板出库 ===>> 更新订单完成数量失败; [workNo=" + wrkMast.getWrkNo()
                                            + "],[locNo=" + wrkMast.getSourceLocNo() + "]");
                                }
                            }
                        } catch (Exception ignore) {
@@ -495,7 +584,8 @@
                    // 删除工作档源库位的库存明细
                    if (!locDetlService.delete(new EntityWrapper<LocDetl>().eq("loc_no", wrkMast.getSourceLocNo()))) {
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        return FAIL.setMsg("全板出库 ===>> 删除库存明细失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]");
                        return FAIL.setMsg("全板出库 ===>> 删除库存明细失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo="
                                + wrkMast.getSourceLocNo() + "]");
                    }
                    // 修改源库位状态 R ===>> O
                    if (locMast.getLocSts().equals("R")) {
@@ -505,38 +595,52 @@
                        locMast.setIoTime(now);
                        if (!locMastService.updateById(locMast)) {
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                            return FAIL.setMsg("全板出库 ===>> 修改源库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]");
                            return FAIL.setMsg("全板出库 ===>> 修改源库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo="
                                    + wrkMast.getSourceLocNo() + "]");
                        }
                    }
                    break;
                // 并板途中捡料
                case 108:
                    // 根据工作号,查询工作明细档
                    List<WrkDetl> wrkDetls108 = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
                    List<WrkDetl> wrkDetls108 = wrkDetlService
                            .selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
                    if (wrkDetls108.isEmpty()) {
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        return FAIL.setMsg("并板途中捡料 ===>> 工作明细档为空; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]");
                        return FAIL.setMsg("并板途中捡料 ===>> 工作明细档为空; [workNo=" + wrkMast.getWrkNo() + "],[locNo="
                                + wrkMast.getSourceLocNo() + "]");
                    }
                    for (WrkDetl wrkDetl : wrkDetls108) {
                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand()
                                , wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(), wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(),
                                wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(),
                                wrkDetl.getStandby3(), wrkDetl.getBoxType1(), wrkDetl.getBoxType2(),
                                wrkDetl.getBoxType3());
                        if (null != locDetl) {
                            if (!locDetlService.updateAnfme(locDetl.getAnfme() - wrkDetl.getAnfme(), locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3()
                                    , wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3())) {
                            if (!locDetlService.updateAnfme(locDetl.getAnfme() - wrkDetl.getAnfme(), locMast.getLocNo(),
                                    wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(),
                                    wrkDetl.getStandby2(), wrkDetl.getStandby3(), wrkDetl.getBoxType1(),
                                    wrkDetl.getBoxType2(), wrkDetl.getBoxType3())) {
                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                return FAIL.setMsg("并板途中捡料 ===>> 修改库存明细数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                                return FAIL.setMsg("并板途中捡料 ===>> 修改库存明细数量失败; [workNo=" + wrkMast.getWrkNo()
                                        + "],[locNo=" + wrkMast.getLocNo() + "]");
                            }
                        }
                        // 更新订单完成数量
                        OrderDetlPakout orderDetlPakout = orderDetlPakoutService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                        OrderDetlPakout orderDetlPakout = orderDetlPakoutService.selectItem(wrkDetl.getOrderNo(),
                                wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(),
                                wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                        try {
                            if (!Cools.isEmpty(orderDetlPakout)) {
                                if (!orderDetlPakoutService.increaseQtyByOrderNo(wrkDetl.getOrderNo(), wrkDetl.getMatnr(),
                                        orderDetlPakout.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                        wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3(), wrkDetl.getAnfme())) {
                                if (!orderDetlPakoutService.increaseQtyByOrderNo(wrkDetl.getOrderNo(),
                                        wrkDetl.getMatnr(),
                                        orderDetlPakout.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(),
                                        wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                        wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3(),
                                        wrkDetl.getAnfme())) {
                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                    return FAIL.setMsg("并板途中捡料 ===>> 更新订单完成数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]");
                                    return FAIL.setMsg("并板途中捡料 ===>> 更新订单完成数量失败; [workNo=" + wrkMast.getWrkNo()
                                            + "],[locNo=" + wrkMast.getSourceLocNo() + "]");
                                }
                            }
                        } catch (Exception ignore) {
@@ -552,9 +656,11 @@
                        locMast.setModiTime(now);
                        locMast.setIoTime(now);
                        if (!locMastService.updateById(locMast)) {
//                            exceptionHandle("空板出库 ===>> 修改源库位状态失败;[workNo={0}],[sourceLocNo={1}]", wrkMast.getWrkNo(), wrkMast.getSourceLocNo());
                            // exceptionHandle("空板出库 ===>> 修改源库位状态失败;[workNo={0}],[sourceLocNo={1}]",
                            // wrkMast.getWrkNo(), wrkMast.getSourceLocNo());
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                            return FAIL.setMsg("空板出库 ===>> 修改源库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]");
                            return FAIL.setMsg("空板出库 ===>> 修改源库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo="
                                    + wrkMast.getSourceLocNo() + "]");
                        }
                    }
                    break;
@@ -565,9 +671,10 @@
            wrkMast.setWrkSts(15L);
            wrkMast.setModiTime(now);
            if (!wrkMastService.updateById(wrkMast)) {
//                exceptionHandle("更新出库完成状态失败;[workNo={0}]", wrkMast.getWrkNo());
                // exceptionHandle("更新出库完成状态失败;[workNo={0}]", wrkMast.getWrkNo());
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                return FAIL.setMsg("更新出库完成状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]");
                return FAIL.setMsg(
                        "更新出库完成状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]");
            }
        } catch (Exception e) {
            log.error("fail", e);
@@ -596,7 +703,6 @@
        return SUCCESS;
    }
    /**
     * @author Ryan
     * @date 2025/9/25
@@ -606,30 +712,40 @@
    public ReturnT<String> agvDoOut(Task task) {
        if (task.getIoType().equals(101)) {
            Date now = new Date();
            LocCache locMast = locCacheService.selectOne(new EntityWrapper<LocCache>().eq("loc_no" ,task.getSourceLocNo()));
            LocCache locMast = locCacheService
                    .selectOne(new EntityWrapper<LocCache>().eq("loc_no", task.getSourceLocNo()));
            if (Objects.isNull(locMast)) {
                throw new RuntimeException("数据错误:库位信息不能为空!!");
            }
            List<TaskDetl> wrkDetls101 = taskDetlService.selectList(new EntityWrapper<TaskDetl>().eq("wrk_no", task.getWrkNo()));
            List<TaskDetl> wrkDetls101 = taskDetlService
                    .selectList(new EntityWrapper<TaskDetl>().eq("wrk_no", task.getWrkNo()));
            if (wrkDetls101.isEmpty()) {
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                return FAIL.setMsg("全板出库 ===>> 工作明细档为空; [workNo=" + task.getWrkNo() + "],[locNo=" + task.getSourceLocNo() + "]");
                return FAIL.setMsg(
                        "全板出库 ===>> 工作明细档为空; [workNo=" + task.getWrkNo() + "],[locNo=" + task.getSourceLocNo() + "]");
            }
            for (TaskDetl wrkDetl : wrkDetls101) {
                // 更新订单完成数量
                OrderDetlPakout orderDetlPakout = orderDetlPakoutService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                OrderDetlPakout orderDetlPakout = orderDetlPakoutService.selectItem(wrkDetl.getOrderNo(),
                        wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(),
                        wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                        wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                if (orderDetlPakout == null) {
                    orderDetlPakout = orderDetlPakoutService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                    orderDetlPakout = orderDetlPakoutService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(),
                            wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(),
                            wrkDetl.getStandby3(),
                            wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                }
                try {
                    if (!Cools.isEmpty(orderDetlPakout)) {
                        if (!orderDetlPakoutService.increaseQtyByOrderNo(wrkDetl.getOrderNo(), wrkDetl.getMatnr(),
                                orderDetlPakout.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3(), wrkDetl.getAnfme())) {
                                orderDetlPakout.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(),
                                wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3(),
                                wrkDetl.getAnfme())) {
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                            return FAIL.setMsg("全板出库 ===>> 更新订单完成数量失败; [workNo=" + task.getWrkNo() + "],[locNo=" + task.getSourceLocNo() + "]");
                            return FAIL.setMsg("全板出库 ===>> 更新订单完成数量失败; [workNo=" + task.getWrkNo() + "],[locNo="
                                    + task.getSourceLocNo() + "]");
                        }
                    }
                } catch (Exception ignore) {
@@ -638,7 +754,8 @@
            // 删除工作档源库位的库存明细
            if (!locDetlService.delete(new EntityWrapper<LocDetl>().eq("loc_no", task.getSourceLocNo()))) {
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                return FAIL.setMsg("全板出库 ===>> 删除库存明细失败; [workNo=" + task.getWrkNo() + "],[locNo=" + task.getSourceLocNo() + "]");
                return FAIL.setMsg(
                        "全板出库 ===>> 删除库存明细失败; [workNo=" + task.getWrkNo() + "],[locNo=" + task.getSourceLocNo() + "]");
            }
            // 修改源库位状态 R ===>> O
            if (locMast.getLocSts().equals(LocStsType.LOC_STS_TYPE_R.type)) {
@@ -648,13 +765,15 @@
                locMast.setIoTime(now);
                if (!locCacheService.updateById(locMast)) {
                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                    return FAIL.setMsg("全板出库 ===>> 修改源库位状态失败; [workNo=" + task.getWrkNo() + "],[locNo=" + task.getSourceLocNo() + "]");
                    return FAIL.setMsg("全板出库 ===>> 修改源库位状态失败; [workNo=" + task.getWrkNo() + "],[locNo="
                            + task.getSourceLocNo() + "]");
                }
            } else {
                throw new CoolException("当前库位状态" + locMast.getLocSts() + ", 无法执行出库操作!!");
            }
            BasStation devNo = basStationService.selectOne(new EntityWrapper<BasStation>().eq("dev_no", task.getStaNo()));
            BasStation devNo = basStationService
                    .selectOne(new EntityWrapper<BasStation>().eq("dev_no", task.getStaNo()));
            if (Objects.isNull(devNo)) {
                throw new CoolException("站点:" + task.getSourceStaNo() + ", 不存在!!");
            }
@@ -673,7 +792,6 @@
        return SUCCESS;
    }
    @Transactional(rollbackFor = Exception.class)
    public ReturnT<String> agvDoIn(Task wrkMast) {
        LocCache locCache = locCacheService.selectOne(new EntityWrapper<LocCache>().eq("loc_no", wrkMast.getLocNo()));
@@ -681,27 +799,30 @@
            throw new CoolException("数据错误,库位不存在!!");
        }
        if (!locCache.getLocSts().equals(LocStsType.LOC_STS_TYPE_S.type)) {
            throw new CoolException("当前库位状态为:" + LocStsType.LOC_STS_TYPE_S.type + "." + LocStsType.LOC_STS_TYPE_S.desc + ",不是出库预约状态");
            throw new CoolException(
                    "当前库位状态为:" + LocStsType.LOC_STS_TYPE_S.type + "." + LocStsType.LOC_STS_TYPE_S.desc + ",不是出库预约状态");
        }
        List<WaitPakin> apallet = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", wrkMast.getBarcode()));
        List<WaitPakin> apallet = waitPakinService
                .selectList(new EntityWrapper<WaitPakin>().eq("zpallet", wrkMast.getBarcode()));
        if (Objects.isNull(apallet)) {
            throw new CoolException("数据错误:组托数据不存在!!");
        }
        apallet.forEach(pakin -> {
            LocDetl detl = new LocDetl();
            BeanUtils.copyProperties(pakin, detl);
            detl.setBarcode(pakin.getBarcode())
                    .setAnfme(pakin.getAnfme())
                    .setBrand(pakin.getBrand())
                    .setAppeTime(new Date())
                    .setSpecs(pakin.getSpecs())
                    .setColor(pakin.getColor())
                    .setLocId(locCache.getId())
                    .setLocNo(locCache.getLocNo())
                    .setAreaId(locCache.getAreaId())
                    .setAreaName(locCache.getAreaName())
                    .setUnit(pakin.getUnit())
                    .setBatch(pakin.getBatch());
            detl.setBarcode(pakin.getBarcode());
            detl.setAnfme(pakin.getAnfme());
            detl.setBrand(pakin.getBrand());
            detl.setAppeTime(new Date());
            detl.setSpecs(pakin.getSpecs());
            detl.setColor(pakin.getColor());
            detl.setLocId(locCache.getId());
            detl.setLocNo(locCache.getLocNo());
            detl.setAreaId(locCache.getAreaId());
            detl.setAreaName(locCache.getAreaName());
            detl.setUnit(pakin.getUnit());
            detl.setBatch(pakin.getBatch());
            if (!locDetlService.insert(detl)) {
                throw new CoolException("库位明细保存失败!!");
            }
src/main/webapp/static/js/orderPakin/order.js
@@ -14,21 +14,21 @@
    // 渲染搜索模板
    $.ajax({
        url: baseUrl+"/docType/list/auth",
        headers: {'token': localStorage.getItem('token')},
        url: baseUrl + "/docType/list/auth",
        headers: { 'token': localStorage.getItem('token') },
        data: {
            limit: 9999
        },
        method: 'POST',
        success: function (res) {
            if (res.code === 200){
            if (res.code === 200) {
                let template = Handlebars.compile($('#docTypeTpl').html());
                $('#docType-query').html(template(res.data));
                layui.form.render('select');
            } else if (res.code === 403){
                top.location.href = baseUrl+"/";
            } else if (res.code === 403) {
                top.location.href = baseUrl + "/";
            } else {
                layer.msg(res.msg, {icon: 2})
                layer.msg(res.msg, { icon: 2 })
            }
        }
    })
@@ -36,19 +36,19 @@
    // 渲染表格
    var insTb = table.render({
        elem: '#order',
        url: baseUrl+'/order/pakin/order/head/page/auth',
        headers: {token: localStorage.getItem('token')},
        url: baseUrl + '/order/pakin/order/head/page/auth',
        headers: { token: localStorage.getItem('token') },
        page: true,
        cellMinWidth: 100,
        cols: [[
            {type: 'numbers'},
            {field: 'orderNo', title: '单据编号', templet: '#orderNoTpl'},
            {field: 'docType$', align: 'center', title: '类型',  minWidth: 160, width: 160},
            {align: 'center', title: '明细', toolbar: '#tbLook', minWidth: 160, width: 160},
            {field: 'createTime$', title: '创建时间', minWidth: 200, width: 200},
            {field: 'settle$', align: 'center', title: '状态', templet: '#settleTpl',  minWidth: 160, width: 160},
            {field: 'memo', align: 'center',title: '备注', hide: true},
            {align: 'center', title: '操作', toolbar: '#operate', width: 180}
            { type: 'numbers' },
            { field: 'orderNo', title: '单据编号', templet: '#orderNoTpl' },
            { field: 'docType$', align: 'center', title: '类型', minWidth: 160, width: 160 },
            { align: 'center', title: '明细', toolbar: '#tbLook', minWidth: 160, width: 160 },
            { field: 'createTime$', title: '创建时间', minWidth: 200, width: 200 },
            { field: 'settle$', align: 'center', title: '状态', templet: '#settleTpl', minWidth: 160, width: 160 },
            { field: 'memo', align: 'center', title: '备注', hide: true },
            { align: 'center', title: '操作', toolbar: '#operate', width: 180 }
        ]],
        request: {
            pageName: 'curr',
@@ -68,7 +68,7 @@
        done: function (res, curr, count) {
            limit();
            if (res.code === 403) {
                top.location.href = baseUrl+"/";
                top.location.href = baseUrl + "/";
            }
            insTbCount = count;
        }
@@ -76,7 +76,7 @@
    // 搜索
    form.on('submit(tbSearch)', function (data) {
        insTb.reload({where: data.field, page: {curr: 1}});
        insTb.reload({ where: data.field, page: { curr: 1 } });
    });
    // 添加
@@ -98,45 +98,33 @@
            doModify(data.id, data.orderNo, 4);
        } else if (layEvent === 'look') {
            var $a = $(obj.tr).find('a[lay-event="look"]');
            var offset = $a.offset();
            var top = offset.top;
            var left = offset.left;
            layer.open({
            admin.open({
                type: 1,
                title: false,
                area: '820px',
                offset: [top + 'px', (left - 530 + $a.outerWidth()) + 'px'],
                shade: .01,
                shadeClose: true,
                fixed: false,
                content: '<table id="lookSSXMTable" lay-filter="lookSSXMTable"></table>',
                success: function (layero) {
                title: '单据明细',
                height: '450px',
                content: $('#orderItem').html(),
                area: '78%',
                success: function (layero, dIndex) {
                    table.render({
                        elem: '#lookSSXMTable',
                        headers: {token: localStorage.getItem('token')},
                        url: baseUrl+'/order/pakin/orderDetl/list/auth',
                        elem: '#itemTable',
                        headers: { token: localStorage.getItem('token') },
                        url: baseUrl + '/order/pakin/orderDetl/list/auth',
                        where: {
                            order_id: data.id
                        },
                        page: true,
                        height: '450px;',
                        cellMinWidth: 100,
                        cols: [[
                            {type: 'numbers'},
                            {field: 'matnr', title: '商品编码', width: 160},
                            {field: 'maktx', title: '商品名称', width: 160},
                            {field: 'batch', title: '批号'},
                            {field: 'anfme', title: '数量'},
                            {field: 'workQty', title: '作业数量'},
                            {field: 'qty', title: '完成数量', style: 'font-weight: bold'},
                            // {field: 'unit', title: '单位'},
                            // {
                            //     field: 'createTime$', title: '创建时间', sort: true, templet: function (d) {
                            //         return util.toDateString(d.createTime);
                            //     },  width: 180
                            // },
                            // {field: 'inQty', title: '已入库量'},
                            // {field: 'color', title: '颜色'},
                            {field: 'specs', title: '规格'}
                            { type: 'numbers' },
                            { field: 'matnr', title: '商品编码', width: 160 },
                            { field: 'maktx', title: '商品名称', width: 160 },
                            { field: 'suppCode', title: '供应商编码', width: 160 },
                            { field: 'batch', title: '批号' },
                            { field: 'anfme', title: '数量' },
                            { field: 'workQty', title: '作业数量' },
                            { field: 'qty', title: '完成数量', style: 'font-weight: bold' },
                            { field: 'specs', title: '规格' }
                        ]],
                        request: {
                            pageName: 'curr',
@@ -182,42 +170,42 @@
                form.on('submit(orderEditSubmit)', function (data) {
                    // 组装数据
                    if (xxDataList.length <= 0) {
                        layer.tips('请添加单据明细', '#matAddBtnComment', {tips: [1, '#ff4c4c']});
                        layer.tips('请添加单据明细', '#matAddBtnComment', { tips: [1, '#ff4c4c'] });
                        return false;
                    }
                    let nList = admin.util.deepClone(xxDataList);
                    for (let xi = 0; xi < nList.length; xi++) {
                        if (nList[xi].anfme <= 0){
                            layer.msg('明细修改数量不合法', {icon: 2});
                        if (nList[xi].anfme <= 0) {
                            layer.msg('明细修改数量不合法', { icon: 2 });
                            return false;
                        }
                        if (nList[xi].anfme < nList[xi].workQty){
                            layer.msg('数量不能小于已作业数量', {icon: 2});
                        if (nList[xi].anfme < nList[xi].workQty) {
                            layer.msg('数量不能小于已作业数量', { icon: 2 });
                            return false;
                        }
                    }
                    layer.load(2);
                    $.ajax({
                        url: baseUrl+"/order/pakin/order/form/" + (isExpAdd?"add":"modify") + "/auth",
                        headers: {'token': localStorage.getItem('token')},
                        url: baseUrl + "/order/pakin/order/form/" + (isExpAdd ? "add" : "modify") + "/auth",
                        headers: { 'token': localStorage.getItem('token') },
                        data: JSON.stringify({
                            orderId: Number(data.field.id),
                            docType: Number(data.field.docType),
                            orderNo: data.field.orderNo,
                            orderDetlPakinList: nList
                        }),
                        contentType:'application/json;charset=UTF-8',
                        contentType: 'application/json;charset=UTF-8',
                        method: 'POST',
                        success: function (res) {
                            layer.closeAll('loading');
                            if (res.code === 200){
                            if (res.code === 200) {
                                layer.close(dIndex);
                                $(".layui-laypage-btn")[0].click();
                                layer.msg(res.msg, {icon: 1});
                            } else if (res.code === 403){
                                top.location.href = baseUrl+"/";
                            }else {
                                layer.msg(res.msg, {icon: 2});
                                layer.msg(res.msg, { icon: 1 });
                            } else if (res.code === 403) {
                                top.location.href = baseUrl + "/";
                            } else {
                                layer.msg(res.msg, { icon: 2 });
                            }
                        }
                    })
@@ -227,22 +215,23 @@
                var xxDataList = [];
                var tbOptions = {
                    elem: '#formSSXMTable',
                    headers: {token: localStorage.getItem('token')},
                    headers: { token: localStorage.getItem('token') },
                    data: xxDataList,
                    page: true,
                    height: '350px;',
                    cellMinWidth: 100,
                    cols: [[
                        {type: 'numbers', title: '#'},
                        {field: 'matnr', title: '商品编码', width: 160},
                        {field: 'maktx', title: '商品名称', width: 200},
                        {field: 'batch', title: '批号', edit: true},
                        {field: 'specs', title: '规格'},
                        {field: 'anfme', title: '数量(修改)', style: 'color: blue;font-weight: bold', edit: true, minWidth: 110, width: 110},
                        {field: 'workQty', title: '作业数量',  minWidth: 100, width: 100},
                        { type: 'numbers', title: '#' },
                        { field: 'matnr', title: '商品编码', width: 160 },
                        { field: 'maktx', title: '商品名称', width: 200 },
                        { field: 'suppCode', title: '供应商编码', width: 160 },
                        { field: 'batch', title: '批号', edit: true },
                        { field: 'specs', title: '规格' },
                        { field: 'anfme', title: '数量(修改)', style: 'color: blue;font-weight: bold', edit: true, minWidth: 110, width: 110 },
                        { field: 'workQty', title: '作业数量', minWidth: 100, width: 100 },
                        // {field: 'unit', title: '单位', width: 80},
                        {field: 'memo', title: '备注' , edit: true},
                        {align: 'center', title: '操作', toolbar: '#formSSXMTableBar', minWidth: 80, width: 80, fixed: 'right'}
                        { field: 'memo', title: '备注', edit: true },
                        { align: 'center', title: '操作', toolbar: '#formSSXMTableBar', minWidth: 80, width: 80, fixed: 'right' }
                    ]],
                    done: function (res) {
                        $(layero).find('.layui-table-view').css('margin', '0');
@@ -251,18 +240,18 @@
                };
                if (!isExpAdd) {
                    $.ajax({
                        url: baseUrl+"/order/pakin/order/detl/all/auth?orderId=" + expTpe.id,
                        headers: {'token': localStorage.getItem('token')},
                        url: baseUrl + "/order/pakin/order/detl/all/auth?orderId=" + expTpe.id,
                        headers: { 'token': localStorage.getItem('token') },
                        method: 'GET',
                        async: false,
                        success: function (res) {
                            if (res.code === 200){
                            if (res.code === 200) {
                                xxDataList = res.data;
                                tbOptions.data = xxDataList;
                            } else if (res.code === 403){
                                top.location.href = baseUrl+"/";
                            }else {
                                layer.msg(res.msg, {icon: 2})
                            } else if (res.code === 403) {
                                top.location.href = baseUrl + "/";
                            } else {
                                layer.msg(res.msg, { icon: 2 })
                            }
                        }
                    })
@@ -275,8 +264,8 @@
                    if (layEvent === 'edit') {
                        showEditModel2(data);
                    } else if (layEvent === 'del') {
                        if(data.workQty > 0){
                            layer.msg("已存在作业数量,不能删除", {icon: 2});
                        if (data.workQty > 0) {
                            layer.msg("已存在作业数量,不能删除", { icon: 2 });
                            return;
                        }
                        layer.confirm('确定要删除吗?', {
@@ -290,7 +279,7 @@
                                    break;
                                }
                            }
                            insTbSSXM.reload({data: xxDataList, page: {curr: 1}});
                            insTbSSXM.reload({ data: xxDataList, page: { curr: 1 } });
                        });
                    }
                });
@@ -298,20 +287,20 @@
                table.on('edit(formSSXMTable)', function (obj) {
                    let index = obj.tr.attr("data-index");
                    let data = xxDataList[index];
                    if (obj.field === 'anfme'){
                    if (obj.field === 'anfme') {
                        let vle = Number(obj.value);
                        if (isNaN(vle)) {
                            layer.msg("请输入数字", {icon: 2});
                            layer.msg("请输入数字", { icon: 2 });
                            return false;
                        } else {
                            if (vle <= 0) {
                                layer.msg("数量必须大于零", {icon: 2});
                                layer.msg("数量必须大于零", { icon: 2 });
                                // data[obj.field] = 0;
                                // insTbSSXM.reload({data: xxDataList});
                                return false;
                            }
                            if(obj.value < data.workQty){
                                layer.msg("输入数量不能小于作业中数量", {icon: 2});
                            if (obj.value < data.workQty) {
                                layer.msg("输入数量不能小于作业中数量", { icon: 2 });
                                // data[obj.field] = 0;
                                // insTbSSXM.reload({data: xxDataList});
                                return false;
@@ -319,7 +308,7 @@
                        }
                    }
                    data[obj.field] = obj.value;
                    insTbSSXM.reload({data: xxDataList});
                    insTbSSXM.reload({ data: xxDataList });
                });
                $('#matAddBtnComment').click(function () {
@@ -340,22 +329,22 @@
                            // 表单提交事件
                            form.on('submit(matEditSubmit)', function (data) {
                                let selectList = matXmSelect.getValue();
                                for (let i = 0; i<selectList.length; i++) {
                                for (let i = 0; i < selectList.length; i++) {
                                    let item = selectList[i];
                                    // 查询物料详情
                                    $.ajax({
                                        url: baseUrl+"/mat/covert/"+item.value+"/auth",
                                        headers: {'token': localStorage.getItem('token')},
                                        url: baseUrl + "/mat/covert/" + item.value + "/auth",
                                        headers: { 'token': localStorage.getItem('token') },
                                        method: 'GET',
                                        async: false,
                                        success: function (res) {
                                            if (res.code === 200){
                                            if (res.code === 200) {
                                                xxDataList.push(res.data);
                                                insTbSSXM.reload({data: xxDataList, page: {curr: 1}});
                                            } else if (res.code === 403){
                                                top.location.href = baseUrl+"/";
                                            }else {
                                                layer.msg(res.msg, {icon: 2})
                                                insTbSSXM.reload({ data: xxDataList, page: { curr: 1 } });
                                            } else if (res.code === 403) {
                                                top.location.href = baseUrl + "/";
                                            } else {
                                                layer.msg(res.msg, { icon: 2 })
                                            }
                                        }
                                    })
@@ -373,20 +362,20 @@
                                toolbar: { show: true },
                                filterable: true,
                                remoteSearch: true,
                                remoteMethod: function(val, cb, show){
                                remoteMethod: function (val, cb, show) {
                                    $.ajax({
                                        url: baseUrl+"/mat/all/get/kv",
                                        headers: {'token': localStorage.getItem('token')},
                                        url: baseUrl + "/mat/all/get/kv",
                                        headers: { 'token': localStorage.getItem('token') },
                                        data: {
                                            condition: val
                                        },
                                        method: 'POST',
                                        success: function (res) {
                                            if (res.code === 200){
                                            if (res.code === 200) {
                                                cb(res.data)
                                            } else {
                                                cb([]);
                                                layer.msg(res.msg, {icon: 2});
                                                layer.msg(res.msg, { icon: 2 });
                                            }
                                        }
                                    });
@@ -412,25 +401,25 @@
            layer.close(i);
            layer.load(2);
            $.ajax({
                url: baseUrl+"/order/pakin/order/delete/auth",
                headers: {'token': localStorage.getItem('token')},
                url: baseUrl + "/order/pakin/order/delete/auth",
                headers: { 'token': localStorage.getItem('token') },
                data: {
                    orderId: orderId
                },
                method: 'POST',
                success: function (res) {
                    layer.closeAll('loading');
                    if (res.code === 200){
                    if (res.code === 200) {
                        if (insTbCount === 0) {
                            insTb.reload({page: {curr: 1}});
                            insTb.reload({ page: { curr: 1 } });
                        } else {
                            $(".layui-laypage-btn")[0].click();
                        }
                        layer.msg(res.msg, {icon: 1});
                    } else if (res.code === 403){
                        top.location.href = baseUrl+"/";
                    }else {
                        layer.msg(res.msg, {icon: 2});
                        layer.msg(res.msg, { icon: 1 });
                    } else if (res.code === 403) {
                        top.location.href = baseUrl + "/";
                    } else {
                        layer.msg(res.msg, { icon: 2 });
                    }
                }
            })
@@ -448,8 +437,8 @@
            console.log(orderId);
            console.log(settle);
            $.ajax({
                url: baseUrl+"/order/pakin/order/update/auth",
                headers: {'token': localStorage.getItem('token')},
                url: baseUrl + "/order/pakin/order/update/auth",
                headers: { 'token': localStorage.getItem('token') },
                data: {
                    id: orderId,
                    orderNo: orderNo,
@@ -458,17 +447,17 @@
                method: 'POST',
                success: function (res) {
                    layer.closeAll('loading');
                    if (res.code === 200){
                    if (res.code === 200) {
                        if (insTbCount === 0) {
                            insTb.reload({page: {curr: 1}});
                            insTb.reload({ page: { curr: 1 } });
                        } else {
                            $(".layui-laypage-btn")[0].click();
                        }
                        layer.msg(res.msg, {icon: 1});
                    } else if (res.code === 403){
                        top.location.href = baseUrl+"/";
                    }else {
                        layer.msg(res.msg, {icon: 2});
                        layer.msg(res.msg, { icon: 1 });
                    } else if (res.code === 403) {
                        top.location.href = baseUrl + "/";
                    } else {
                        layer.msg(res.msg, { icon: 2 });
                    }
                }
            })
@@ -477,17 +466,17 @@
    // 任务追溯
    function showWrkTrace(orderId) {
        let loadIndex = layer.msg('请求中...', {icon: 16, shade: 0.01, time: false});
        let loadIndex = layer.msg('请求中...', { icon: 16, shade: 0.01, time: false });
        $.ajax({
            url: baseUrl+"/order/pakin/order/wrk/trace/auth",
            headers: {'token': localStorage.getItem('token')},
            url: baseUrl + "/order/pakin/order/wrk/trace/auth",
            headers: { 'token': localStorage.getItem('token') },
            data: {
                orderId: orderId
            },
            method: 'POST',
            success: function (res) {
                layer.close(loadIndex);
                if (res.code === 200){
                if (res.code === 200) {
                    laytpl(wrkTraceDialog.innerHTML).render(res.data, function (html) {
                        admin.open({
                            type: 1,
@@ -502,26 +491,26 @@
                                var traceOptions = {
                                    title: {
                                        text: '总量/作业/完成', x: 'center', y: '38%',
                                        textStyle: {fontSize: 18, color: '#262626', fontWeight: 'normal'},
                                        subtextStyle: {fontSize: 36, color: '#10B4E8'},
                                        textStyle: { fontSize: 18, color: '#262626', fontWeight: 'normal' },
                                        subtextStyle: { fontSize: 36, color: '#10B4E8' },
                                        itemGap: 20
                                    },
                                    color: ['#10B4E8', '#E0E0E0', '#FF0000'],
                                    tooltip: {trigger: 'item'},
                                    series: [{name: '数量', type: 'pie', radius: ['75%', '80%'], label: {normal: {show: false}}}]
                                    tooltip: { trigger: 'item' },
                                    series: [{ name: '数量', type: 'pie', radius: ['75%', '80%'], label: { normal: { show: false } } }]
                                };
                                traceCharts.setOption(traceOptions);
                                // 赋值
                                traceCharts.setOption({
                                    title: {
                                        subtext: res.data.totalQty+"/"+res.data.wrkQty+"/"+res.data.endQty
                                        subtext: res.data.totalQty + "/" + res.data.wrkQty + "/" + res.data.endQty
                                    },
                                    series: [
                                        {
                                            data: [
                                                {name: '已作业', value: res.data.wrkQty},
                                                {name: '未作业', value: res.data.totalQty-res.data.wrkQty-res.data.lackQty},
                                                {name: '库存不足', value: res.data.lackQty},
                                                { name: '已作业', value: res.data.wrkQty },
                                                { name: '未作业', value: res.data.totalQty - res.data.wrkQty - res.data.lackQty },
                                                { name: '库存不足', value: res.data.lackQty },
                                            ]
                                        }
                                    ]
@@ -529,10 +518,10 @@
                            }
                        });
                    });
                } else if (res.code === 403){
                    top.location.href = baseUrl+"/";
                }else {
                    layer.msg(res.msg, {icon: 2});
                } else if (res.code === 403) {
                    top.location.href = baseUrl + "/";
                } else {
                    layer.msg(res.msg, { icon: 2 });
                }
            }
        })
@@ -540,7 +529,7 @@
    layDate.render({
        elem: '.layui-laydate-range'
        ,type: 'datetime'
        ,range: true
        , type: 'datetime'
        , range: true
    });
});
src/main/webapp/views/orderPakin/order.html
@@ -140,6 +140,10 @@
          {{# } }}
    >{{d.settle$}}</span>
</script>
<!--单据明细查询-->
<script type="text/html" id="orderItem">
    <table id="itemTable" lay-filter="itemTable"></table>
</script>
<!-- 表单弹窗 -->
<script type="text/html" id="editDialog">
    <form id="editForm" lay-filter="editForm" class="layui-form model-form">