自动化立体仓库 - WMS系统
pang.jiabao
2024-12-31 44d51d79370da8973fcd52203c669da9d0a1e479
并板入库,并板途中拣料,拣料途中并板,以及相关查询接口
16个文件已修改
3个文件已添加
1060 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/MobileController.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OrderController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/CombParam.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/PickConfirmParam.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/PickMatParam.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/StockOutParam.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/WarehouseOutPickMergeParam.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/LocDetlMapper.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/LocDetlService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/MobileService.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java 480 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WorkLogHandler.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocDetlMapper.xml 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderDetlMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderDetlPakinMapper.xml 72 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/MobileController.java
@@ -9,10 +9,7 @@
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.CombParam;
import com.zy.asrs.entity.param.GDYKConfirmGoodsParam;
import com.zy.asrs.entity.param.MobileAdjustParam;
import com.zy.asrs.entity.param.OffSaleParam;
import com.zy.asrs.entity.param.*;
import com.zy.asrs.entity.result.MobileAdjustResult;
import com.zy.asrs.mapper.ManLocDetlMapper;
import com.zy.asrs.service.*;
@@ -23,8 +20,8 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.*;
import java.util.List;
/**
 * 移动端接口控制器
@@ -59,6 +56,71 @@
    @Autowired
    private WrkDetlLogService wrkDetlLogService;
    @Resource
    private StaDescService staDescService;
    @RequestMapping("/pda/WarehouseOut/v1")
    @ManagerAuth(memo = "并板途中拣料-参考念初")
    public R WarehouseOutV1(@RequestBody CombParam combParam) {
        return mobileService.WarehouseOutV1(combParam, getHostId(), getUserId());
    }
    @RequestMapping("/pda/WarehouseOutPickMerge/v1")
    @ManagerAuth(memo = "拣料途中并板")
    public R WarehouseOutPickMergeV1(@RequestBody WarehouseOutPickMergeParam param) {
        if (Cools.isEmpty(param,param.getLocNo(),param.getBarcode(),param.getCombMats())) {
            return R.parse("参数不能为空!");
        }
        return mobileService.WarehouseOutPickMergeV1(param, getHostId(), getUserId());
    }
    @RequestMapping("/pick/in")
    @ManagerAuth(memo = "并板入库")
    public R pickConfirm(@RequestBody PickConfirmParam param) {
        if(Cools.isEmpty(param,param.getList(),param.getLocNo(),param.getStaNo())) {
            return R.parse("参数不完整");
        }
        return mobileService.pickConfirm(param, getUserId());
    }
    @RequestMapping("/barcode/list/all")
    @ManagerAuth(memo = "并板入库途中拣料出库获取任务信息")
    public R orderOutListOrder(@RequestParam(required = false) String barcode) {
        return mobileService.orderOutListOrder(barcode, getUserId());
    }
    @RequestMapping("/barcode/list/pick")
    @ManagerAuth(memo = "拣料入库途中并板获取任务信息")
    public R orderOutListOrderPick(@RequestParam(required = false) String barcode) {
        return mobileService.orderOutListOrderPick(barcode, getUserId());
    }
    @RequestMapping("/loc/f/list")
    @ManagerAuth(memo = "获取在库库位")
    public R locNoF(@RequestParam(required = false) String locNo) {
        Wrapper<LocMast> wrapper = new EntityWrapper<LocMast>()
                .eq("loc_sts", "F");
        if (!Cools.isEmpty(locNo)) {
            wrapper.like("loc_no", locNo);
        }
        List<LocMast> list = locMastService.selectList(wrapper);
        return R.ok().add(list);
    }
    @RequestMapping("/pick/sta/list")
    @ManagerAuth(memo = "获取并板站")
    public R pickSta() {
        List<StaDesc> list = staDescService.selectList(new EntityWrapper<StaDesc>()
                .eq("type_no", 104));
        return R.ok().add(list);
    }
    @RequestMapping("/pick/mat/list")
    @ManagerAuth(memo = "获取并板物料")
    public R pickMats(@RequestParam(required = false) String matnr, @RequestParam(required = false) String orderNo) {
        return mobileService.pickMats(matnr, orderNo);
    }
    // 商品上架
    @RequestMapping("/mat/onSale/auth")
src/main/java/com/zy/asrs/controller/OrderController.java
@@ -104,7 +104,7 @@
            DocType docType = docTypeService.selectById(param.getDocType());
            if(!Cools.isEmpty(docType)){
                prefix = docType.getPakin() == 1 ? "RK" : "CK";
                status = (prefix == "RK" ? 1 : (prefix == "CK" ? 2 : 0));
                status = (prefix.equals("RK") ? 1 : (prefix.equals("CK") ? 2 : 0));
            }
            param.setOrderNo(prefix + snowflakeIdWorker.nextId());
        } else {
src/main/java/com/zy/asrs/entity/param/CombParam.java
@@ -1,6 +1,5 @@
package com.zy.asrs.entity.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@@ -18,13 +17,15 @@
    private String barcode;
    // 库位编号
    private String locno;
    private String locNo;
    private List<CombMat> combMats;
    @Data
    public static class CombMat {
        private String orderNo;
        // 物料编号
        private String matnr = "";
src/main/java/com/zy/asrs/entity/param/PickConfirmParam.java
New file
@@ -0,0 +1,16 @@
package com.zy.asrs.entity.param;
import lombok.Data;
import java.util.List;
@Data
public class PickConfirmParam {
    private String locNo;
    private Integer staNo;
    private List<PickMatParam> list;
}
src/main/java/com/zy/asrs/entity/param/PickMatParam.java
New file
@@ -0,0 +1,63 @@
package com.zy.asrs.entity.param;
import com.baomidou.mybatisplus.annotations.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class PickMatParam {
    private String matnr;
    private String batch;
    private String brand;
    private String orderNo;
    private Long orderId;
    private Double count;
    private Double useCount;
    /**
     * 备用1
     */
    @ApiModelProperty(value= "备用1")
    private String standby1 = "";
    /**
     * 备用2
     */
    @ApiModelProperty(value= "备用2")
    private String standby2 = "";
    /**
     * 备用3
     */
    @ApiModelProperty(value= "备用3")
    private String standby3 = "";
    /**
     * 备用1
     */
    @ApiModelProperty(value= "备用1")
    @TableField("box_type1")
    private String boxType1 = "1";
    /**
     * 备用2
     */
    @ApiModelProperty(value= "备用2")
    @TableField("box_type2")
    private String boxType2 = "1";
    /**
     * 备用3
     */
    @ApiModelProperty(value= "备用3")
    @TableField("box_type3")
    private String boxType3 = "1";
}
src/main/java/com/zy/asrs/entity/param/StockOutParam.java
@@ -1,5 +1,7 @@
package com.zy.asrs.entity.param;
import com.baomidou.mybatisplus.annotations.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@@ -31,6 +33,47 @@
        // 数量
        private Double count;
        private String brand;
        /**
         * 备用1
         */
        @ApiModelProperty(value= "备用1")
        private String standby1 = "";
        /**
         * 备用2
         */
        @ApiModelProperty(value= "备用2")
        private String standby2 = "";
        /**
         * 备用3
         */
        @ApiModelProperty(value= "备用3")
        private String standby3 = "";
        /**
         * 备用1
         */
        @ApiModelProperty(value= "备用1")
        @TableField("box_type1")
        private String boxType1 = "1";
        /**
         * 备用2
         */
        @ApiModelProperty(value= "备用2")
        @TableField("box_type2")
        private String boxType2 = "1";
        /**
         * 备用3
         */
        @ApiModelProperty(value= "备用3")
        @TableField("box_type3")
        private String boxType3 = "1";
    }
}
src/main/java/com/zy/asrs/entity/param/WarehouseOutPickMergeParam.java
New file
@@ -0,0 +1,23 @@
package com.zy.asrs.entity.param;
import com.zy.asrs.entity.OrderDetl;
import lombok.Data;
import java.util.List;
@Data
public class WarehouseOutPickMergeParam {
    // 单据编号
    private String orderNo;
    // 库位编号
    private String locNo;
    // 条码
    private String barcode;
    //组托物料
    private List<OrderDetl> combMats;
}
src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
@@ -27,11 +27,17 @@
    Integer listByPageCount(Map<String, Object> map);
    LocDetl selectItem(@Param("locNo")String locNo, @Param("matnr")String matnr, @Param("batch")String batch);
    LocDetl selectItem(@Param("locNo")String locNo, @Param("matnr")String matnr, @Param("batch")String batch,
                       @Param("brand")String brand,@Param("standby1")String standby1,@Param("standby2")String standby2,
                       @Param("standby3")String standby3,@Param("boxType1")String boxType1,@Param("boxType2")String boxType2,@Param("boxType3")String boxType3 );
    int deleteItem(@Param("locNo")String locNo, @Param("matnr")String matnr, @Param("batch")String batch);
    int deleteItem(@Param("locNo")String locNo, @Param("matnr")String matnr, @Param("batch")String batch,
                   @Param("brand")String brand,@Param("standby1")String standby1,@Param("standby2")String standby2,
                   @Param("standby3")String standby3,@Param("boxType1")String boxType1,@Param("boxType2")String boxType2,@Param("boxType3")String boxType3 );
    int updateAnfme(@Param("anfme")Double anfme, @Param("locNo")String locNo, @Param("matnr")String matnr, @Param("batch")String batch);
    int updateAnfme(@Param("anfme")Double anfme, @Param("locNo")String locNo, @Param("matnr")String matnr, @Param("batch")String batch,
                    @Param("brand")String brand,@Param("standby1")String standby1,@Param("standby2")String standby2,
                    @Param("standby3")String standby3,@Param("boxType1")String boxType1,@Param("boxType2")String boxType2,@Param("boxType3")String boxType3 );
    List<LocDetl> getStockOutPage(Map<String, Object> map);
src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java
@@ -58,5 +58,8 @@
            , @Param("boxType1")String boxType1,
                        @Param("boxType2")String boxType2,
                        @Param("boxType3")String boxType3, @Param("workQty")Double workQty);
    int increaseWorkQtyByOrderNo(@Param("orderNo") String orderNo, @Param("matnr") String matnr, @Param("batch") String batch, @Param("qty") Double qty);
    int increaseWorkQty(@Param("orderId")Long orderId, @Param("matnr")String matnr, @Param("batch")String batch, @Param("brand")String brand, @Param("standby1")String standby1, @Param("standby2")String standby2, @Param("standby3")String standby3, @Param("workQty")Double workQty);
}
src/main/java/com/zy/asrs/service/LocDetlService.java
@@ -22,7 +22,7 @@
    int selectAllCount(LocDetlDTO locDetlDTO);
    LocDetl selectItem(String locNo, String matnr, String batch);
    LocDetl selectItem(String locNo, String matnr, String batch,String brand,String standby1,String standby2,String standby3,String boxType1,String boxType2,String boxType3);
    Page<LocDetl> getStockOut(Page<LocDetl> page);
@@ -33,7 +33,8 @@
    /**
     * 修改库存明细数量,如果数量为0,则删除记录
     */
    boolean updateAnfme(Double anfme, String locNo, String matnr, String batch);
    boolean updateAnfme(Double anfme, String locNo, String matnr
            ,String batch,String brand,String standby1,String standby2,String standby3,String boxType1,String boxType2,String boxType3);
    boolean updateLocNo(String newLocNo, String oldLocNo);
src/main/java/com/zy/asrs/service/MobileService.java
@@ -1,18 +1,47 @@
package com.zy.asrs.service;
import com.alibaba.fastjson.JSONObject;
import com.core.common.R;
import com.zy.asrs.entity.BasDevp;
import com.zy.asrs.entity.LocDetl;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.entity.param.CombParam;
import com.zy.asrs.entity.param.MobileAdjustParam;
import com.zy.asrs.entity.param.OffSaleParam;
import com.zy.asrs.entity.param.*;
import java.util.Date;
public interface MobileService {
    /**
     * 并板途中拣料
     */
    R WarehouseOutV1(CombParam combParam, Long hostId, Long userId);
    /**
     * 拣料途中并板
     */
    R WarehouseOutPickMergeV1(WarehouseOutPickMergeParam param, Long hostId, Long userId);
    /**
     * 并板入库
     */
    R pickConfirm(PickConfirmParam param, Long userId);
    /**
     * 并板入库途中拣料出库获取任务信息
     */
    R orderOutListOrder(String barcode, Long userId);
    /**
     * 拣料入库途中并板获取任务信息
     */
    R orderOutListOrderPick(String barcode, Long userId);
    /**
     *获取并板物料
     */
    R pickMats(String matnr, String orderNo);
    /**
     * 组托
     */
    void comb(CombParam param, Long userId);
src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
@@ -53,11 +53,12 @@
    }
    @Override
    public boolean updateAnfme(Double anfme, String locNo, String matnr, String batch) {
    public boolean updateAnfme(Double anfme, String locNo, String matnr, String batch,
                               String brand,String standby1,String standby2,String standby3,String boxType1,String boxType2,String boxType3) {
        if (anfme <= 0) {
            return this.baseMapper.deleteItem(locNo, matnr, batch) > 0;
            return this.baseMapper.deleteItem(locNo, matnr, batch, brand, standby1, standby2, standby3, boxType1, boxType2, boxType3) > 0;
        } else {
            return baseMapper.updateAnfme(anfme, locNo, matnr, batch) > 0;
            return baseMapper.updateAnfme(anfme, locNo, matnr, batch, brand, standby1, standby2, standby3, boxType1, boxType2, boxType3) > 0;
        }
    }
@@ -137,8 +138,8 @@
    @Override
    public LocDetl selectItem(String locNo, String matnr, String batch) {
        return this.baseMapper.selectItem(locNo, matnr, batch);
    public LocDetl selectItem(String locNo, String matnr, String batch,String brand,String standby1,String standby2,String standby3,String boxType1,String boxType2,String boxType3) {
        return this.baseMapper.selectItem(locNo, matnr, batch,brand,standby1,standby2,standby3,boxType1,boxType2,boxType3);
    }
    @Override
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -7,19 +7,17 @@
import com.core.common.*;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.CombParam;
import com.zy.asrs.entity.param.MobileAdjustParam;
import com.zy.asrs.entity.param.OffSaleParam;
import com.zy.asrs.entity.param.OpenOrderPakinParam;
import com.zy.asrs.entity.param.*;
import com.zy.asrs.mapper.LocMastMapper;
import com.zy.asrs.mapper.ManLocDetlMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.MatUtils;
import com.zy.asrs.utils.OrderInAndOutUtil;
import com.zy.common.CodeRes;
import com.zy.common.constant.MesConstant;
import com.zy.common.entity.Parameter;
import com.zy.common.model.DetlDto;
import com.zy.common.model.MesCombParam;
import com.zy.common.model.enums.WorkNoType;
import com.zy.common.service.CommonService;
import com.zy.common.utils.HttpHandler;
import lombok.extern.slf4j.Slf4j;
@@ -27,10 +25,8 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.annotation.Resource;
import java.util.*;
/**
 * 移动端服务核心类
@@ -79,6 +75,468 @@
    @Autowired
    private ManLocDetlMapper manLocDetlMapper;
    @Autowired
    private AdjDetlService adjDetlService;
    @Resource
    private LocMastMapper locMastMapper;
    @Resource
    private DocTypeService docTypeService;
    @Resource
    private OrderDetlPakinService orderDetlPakinService;
    @Resource
    private OrderPakinService orderPakinService;
    @Resource
    private OrderPakoutService orderPakoutService;
    @Resource
    private OrderDetlPakoutService orderDetlPakoutService;
    @Override
    @Transactional
    public R WarehouseOutPickMergeV1(WarehouseOutPickMergeParam param, Long hostId, Long userId) {
        //判断库位状态
        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", param.getLocNo()));
        if (Cools.isEmpty(locMast)){
            return R.error("该库位不存在");
        }
        if (!locMast.getLocSts().equals("P")){
            return R.error("该库位状态为:"+locMast.getLocSts()+",不满足拣料途中并板条件!!!");
        }
        Date now = new Date();
        // 创建入库工作主档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(commonService.getWorkNo(0));
        wrkMast.setIoTime(now);
        wrkMast.setWrkSts(4L); // 工作状态:入库完成
        wrkMast.setIoType(8); // 入出库状态:8.拣料途中并板
        wrkMast.setIoPri(13D); // 优先级
        wrkMast.setCrnNo(1);
        wrkMast.setSourceStaNo(1);
        wrkMast.setStaNo(1);
        wrkMast.setLocNo(param.getLocNo());
        wrkMast.setBarcode(param.getBarcode()); // 托盘码
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("N"); // 空板
        wrkMast.setLinkMis("Y");
        wrkMast.setCtnType(0); // 容器类型
        // 操作人员数据
        wrkMast.setAppeTime(now);
        wrkMast.setModiTime(now);
        wrkMast.setAppeUser(userId);
        wrkMast.setModiUser(userId);
        wrkMastService.insert(wrkMast);
        for (OrderDetl orderDetl : param.getCombMats()) {
            Mat mat = matService.selectOne(new EntityWrapper<Mat>().eq("matnr",orderDetl.getMatnr()));
            if (mat == null) {
                throw new CoolException("保存工作档失败,物料信息不存在:" + orderDetl.getMatnr());
            }
            WrkDetl wrkDetl = new WrkDetl();
            wrkDetl.sync(mat);
            wrkDetl.setOrderNo(orderDetl.getOrderNo());
            wrkDetl.setWrkNo(wrkMast.getWrkNo());
            wrkDetl.setIoTime(now);
            wrkDetl.setAnfme(orderDetl.getAnfme()); // 数量
            wrkDetl.setAppeTime(now);
            wrkDetl.setAppeUser(userId);
            wrkDetl.setModiTime(now);
            wrkDetl.setModiUser(userId);
            wrkDetl.setZpallet(wrkMast.getBarcode());
            wrkDetl.setBatch(orderDetl.getBatch());
            if(Cools.isEmpty(orderDetl.getBatch())){
                wrkDetl.setBatch("");
            }
            wrkDetl.setBoxType1(orderDetl.getBoxType1());
            wrkDetl.setBoxType2(orderDetl.getBoxType2());
            wrkDetl.setBoxType3(orderDetl.getBoxType3());
            wrkDetl.setStandby1(orderDetl.getStandby1());
            wrkDetl.setStandby2(orderDetl.getStandby2());
            wrkDetl.setStandby3(orderDetl.getStandby3());
            // 生成工作档明细
            wrkDetlService.insert(wrkDetl);
            if (!Cools.isEmpty(orderDetl.getOrderNo())) {
                OrderPakin order = orderPakinService.selectByNo(orderDetl.getOrderNo());
                if (Cools.isEmpty(order)){
                    continue;
                }
                OrderDetlPakin orderDetlPakin = orderDetlPakinService.selectItem(order.getId(), orderDetl.getMatnr(), orderDetl.getBatch(),orderDetl.getBrand(),orderDetl.getStandby1(),orderDetl.getStandby2(),orderDetl.getStandby3(),orderDetl.getBoxType1(),orderDetl.getBoxType2(),orderDetl.getBoxType3());
                if (Cools.isEmpty(orderDetlPakin)){
                    continue;
                }
                if (orderDetlPakin.getAnfme() < (orderDetlPakin.getWorkQty() + orderDetl.getAnfme())) {
                    throw new CoolException("并板数量出错,订单剩余出库数量小于已出库数量与将并板数量之和!!!");
                }
                // 修改订单明细作业数量
                if (!orderDetlPakinService.increaseWorkQty(orderDetlPakin.getOrderId(), orderDetlPakin.getMatnr(), orderDetlPakin.getBatch(), orderDetlPakin.getBrand(),
                        orderDetlPakin.getStandby1(), orderDetlPakin.getStandby2(), orderDetlPakin.getStandby3(), orderDetlPakin.getBoxType1(), orderDetlPakin.getBoxType2(), orderDetlPakin.getBoxType3(),orderDetl.getAnfme())) {
                    throw new CoolException("修改单据明细工作数量失败");
                }
                if (order.getSettle() == 1){
                    orderPakinService.updateSettle(order.getId(), 2L, userId);
                }
            }
        }
        return R.ok();
    }
    @Override
    @Transactional
    public R pickConfirm(PickConfirmParam param,Long userId) {
        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
                .eq("loc_no", param.getLocNo()));
        if (!locMast.getLocSts().equals("F")) {
            return R.error("库位状态不是在库");
        }
        // 判断库位是否冻结
        String sourceLocFrozen = locMastMapper.findFirstFrozenLocNo(Collections.singletonList(locMast.getLocNo()));
        if (sourceLocFrozen != null) {
            throw new CoolException(sourceLocFrozen + "库位已被冻结!");
        }
        StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                .eq("type_no", 104)
                .eq("stn_no", param.getStaNo()));
        if (staDesc == null) {
            return R.error("站点不存在");
        }
        OrderDetlPakin orderDetlPakin = null;
        //检验传参是否和订单明细匹配
        for (PickMatParam matParam : param.getList()) {
            orderDetlPakin = orderDetlPakinService.selectItem
                    (matParam.getOrderNo(), matParam.getMatnr(),matParam.getBatch(),matParam.getBrand(),
                            matParam.getStandby1(),matParam.getStandby2(),matParam.getStandby3(),
                            matParam.getBoxType1(),matParam.getBoxType2(),matParam.getBoxType3());
            if (orderDetlPakin == null) {
                return R.error("物料数据不存在");
            }
            //剩余可用数量
            double count = orderDetlPakin.getAnfme() - orderDetlPakin.getWorkQty();
            if (matParam.getCount() != count) {
                return R.error("物料数据已过期");
            }
            if (matParam.getUseCount() > count) {
                return R.error("可用数量不足");
            }
        }
        Date now = new Date();
        // 生成工作号
        int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(104));
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
        wrkMast.setIoTime(now);
        wrkMast.setWrkSts(11L); // 工作状态:101.生成出库
        wrkMast.setIoType(104); // 入出库状态
        wrkMast.setIoPri(13D); // 优先级:13
        wrkMast.setSourceStaNo(staDesc.getCrnStn()); // 源站
        wrkMast.setStaNo(staDesc.getStnNo()); // 目标站
        wrkMast.setSourceLocNo(param.getLocNo()); // 源库位
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setPicking("Y"); // 拣料
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("N"); // 空板
        wrkMast.setBarcode(locMast.getBarcode());
        wrkMast.setAppeUser(userId); // 操作人员数据
        wrkMast.setAppeTime(now);
        wrkMast.setModiUser(userId);
        wrkMast.setModiTime(now);
        wrkMast.setCrnNo(staDesc.getCrnNo());
        if (!wrkMastService.insert(wrkMast)) {
            throw new CoolException("保存工作档失败,出库库位号:" + param.getLocNo());
        }
        // 生成工作档明细
        for (PickMatParam matParam : param.getList()) {
            Wrapper<Mat> wrapper = new EntityWrapper<>();
            wrapper.eq("status", 1);
            wrapper.eq("matnr", matParam.getMatnr());
            Mat mat = matService.selectOne(wrapper);
            if (mat == null) {
                throw new CoolException("保存工作档失败,物料信息不存在:" + matParam.getMatnr());
            }
            WrkDetl wrkDetl = new WrkDetl();
            wrkDetl.sync(mat);
            wrkDetl.setBatch(matParam.getBatch());
            wrkDetl.setOrderNo(matParam.getOrderNo());
            wrkDetl.setWrkNo(workNo);
            wrkDetl.setIoTime(now);
            wrkDetl.setAnfme(matParam.getUseCount()); // 数量
            wrkDetl.setAppeTime(now);
            wrkDetl.setAppeUser(userId);
            wrkDetl.setModiTime(now);
            wrkDetl.setModiUser(userId);
            wrkDetl.setZpallet(wrkMast.getBarcode());
            if(Cools.isEmpty(matParam.getBatch())){
                wrkDetl.setBatch("");
            }
            if (!wrkDetlService.insert(wrkDetl)) {
                throw new CoolException("保存工作档明细失败");
            }
            //更新订单工作数量
            orderDetlPakinService.increaseWorkQty(orderDetlPakin.getOrderId(), matParam.getMatnr(),
                    matParam.getBatch(),matParam.getBrand(),matParam.getStandby1(),matParam.getStandby2(),matParam.getStandby3(),
                    matParam.getBoxType1(),matParam.getBoxType2(),matParam.getBoxType3(),matParam.getUseCount());
            // 更新工作档状态
            orderPakinService.updateSettle(orderDetlPakin.getOrderId(),2L,userId);
        }
        // 修改库位状态:   F.在库 ====>>> R.出库预约/P.拣料/盘点/并板出库中
        locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", param.getLocNo()));
        if (locMast.getLocSts().equals("F")) {
            locMast.setLocSts("P");
            locMast.setModiUser(userId);
            locMast.setModiTime(now);
            if (!locMastService.updateById(locMast)) {
                throw new CoolException("预约库位状态失败,库位号:" + param.getLocNo());
            }
        } else {
            throw new CoolException(param.getLocNo() + "库位不是在库状态");
        }
        return R.ok();
    }
    @Override
    @Transactional
    public R WarehouseOutV1(CombParam combParam, Long hostId, Long userId) {
        //判断库位状态
        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", combParam.getLocNo()));
        if (Cools.isEmpty(locMast)){
            return R.error("该库位不存在");
        }
        if (!locMast.getLocSts().equals("P")){
            return R.error("该库位状态为:"+locMast.getLocSts()+",不满足并板途中拣选条件!!!");
        }
        //查询库存数据
        for (CombParam.CombMat combMat :combParam.getCombMats()){
            List<LocDetl> locDetlList = locDetlService.selectList(new EntityWrapper<LocDetl>()
                            .eq("loc_no", combParam.getLocNo())
                            .eq("matnr", combMat.getMatnr())
            );
            if (locDetlList.isEmpty()){
                return R.error("未查询到库存数据");
            }
            if (locDetlList.size()>1){
                return R.error("库存数据大于1条,为保证数据准确性,请用正常流程出库!!!");
            }
            LocDetl locDetl = locDetlList.get(0);
            if (combMat.getAnfme() > locDetl.getAnfme()){
                return R.error("拣选数量错误,超出库存数量");
            }
            if (!Cools.isEmpty(combMat.getOrderNo())){
                OrderPakout orderPakout = orderPakoutService.selectByNo(combMat.getOrderNo());
                if (Cools.isEmpty(orderPakout)){
                    continue;
                }
                if (orderPakout.getSettle() == 1){
                    OrderInAndOutUtil.updateOrder(false,orderPakout.getId(), 2L, 9527L);
                }
                OrderDetlPakout orderDetlPakout = orderDetlPakoutService.selectItem(orderPakout.getId(), combMat.getMatnr(), combMat.getBatch(),
                        combMat.getBrand(), combMat.getStandby1(), combMat.getStandby2(), combMat.getStandby3(), combMat.getBoxType1(), combMat.getBoxType2(), combMat.getBoxType3());
                if (Cools.isEmpty(orderDetlPakout)){
                    continue;
                }
                if (orderDetlPakout.getAnfme() < (orderDetlPakout.getWorkQty()+combMat.getAnfme())){
                    throw new CoolException("拣选数量出错,订单剩余出库数量小于已出库数量与将拣选数量之和!!!");
                }
                // 修改订单明细作业数量
                if (!orderDetlPakoutService.increaseWorkQty(orderDetlPakout.getOrderId(), combMat.getMatnr(), combMat.getBatch(), combMat.getBrand(),
                        combMat.getStandby1(), combMat.getStandby2(), combMat.getStandby3(), combMat.getBoxType1(), combMat.getBoxType2(), combMat.getBoxType3(),combMat.getAnfme())) {
                    throw new CoolException("修改单据明细工作数量失败");
                }
//                // 修改订单明细完成数量
//                if (!orderDetlPakoutService.increase(orderPakout.getId(),combMat.getMatnr(), combMat.getBatch(), combMat.getBrand(),
//                        combMat.getStandby1(), combMat.getStandby2(), combMat.getStandby3(), combMat.getBoxType1(), combMat.getBoxType2(), combMat.getBoxType3(),combMat.getAnfme())) {
//                    throw new CoolException("修改单据明细完成数量失败");
//                }
//                // 修改订单状态 作业中 ===>> 已完成
//                orderPakoutService.checkComplete(combMat.getOrderNo());
            }
            try {
                Date now = new Date();
                // 创建入库工作档
                WrkMast wrkMast = new WrkMast();
                wrkMast.setWrkNo(commonService.getWorkNo(2));
                wrkMast.setIoTime(now);
                wrkMast.setWrkSts(14L); // 工作状态:出库完成
                wrkMast.setIoType(108); // 入出库状态:出库,拣料入库
                wrkMast.setIoPri(13D); // 优先级
                wrkMast.setCrnNo(1);
                wrkMast.setSourceStaNo(1);
                wrkMast.setStaNo(1);
                wrkMast.setSourceLocNo(combParam.getLocNo());
                wrkMast.setBarcode(combParam.getBarcode()); // 托盘码
                wrkMast.setFullPlt("Y"); // 满板:Y
                wrkMast.setPicking("N"); // 拣料
                wrkMast.setExitMk("N"); // 退出
                wrkMast.setEmptyMk("N"); // 空板
                wrkMast.setLinkMis("Y");
                wrkMast.setCtnType(0); // 容器类型
                // 操作人员数据
                wrkMast.setAppeTime(now);
                wrkMast.setModiTime(now);
                wrkMast.setAppeUser(userId);
                wrkMast.setModiUser(userId);
                wrkMastService.insert(wrkMast);
                Mat mat = matService.selectOne(new EntityWrapper<Mat>().eq("matnr",combMat.getMatnr()));
                if (mat == null) {
                    throw new CoolException("保存工作档失败,物料信息不存在:" + combMat.getMatnr());
                }
                WrkDetl wrkDetl = new WrkDetl();
                wrkDetl.sync(mat);
                wrkDetl.setOrderNo(combMat.getOrderNo());
                wrkDetl.setWrkNo(wrkMast.getWrkNo());
                wrkDetl.setIoTime(now);
                wrkDetl.setAnfme(combMat.getAnfme()); // 数量
                wrkDetl.setAppeTime(now);
                wrkDetl.setAppeUser(userId);
                wrkDetl.setModiTime(now);
                wrkDetl.setModiUser(userId);
                wrkDetl.setZpallet(wrkMast.getBarcode());
                wrkDetl.setBatch(combMat.getBatch());
                if(Cools.isEmpty(combMat.getBatch())){
                    wrkDetl.setBatch("");
                }
                wrkDetl.setBoxType1(combMat.getBoxType1());
                wrkDetl.setBoxType2(combMat.getBoxType2());
                wrkDetl.setBoxType3(combMat.getBoxType3());
                wrkDetl.setStandby1(combMat.getStandby1());
                wrkDetl.setStandby2(combMat.getStandby2());
                wrkDetl.setStandby3(combMat.getStandby3());
                // 生成工作档明细
                wrkDetlService.insert(wrkDetl);
                System.out.println("正常");
            }catch (Exception e) {
                throw new CoolException("操作数据异常:"+e.getMessage());
            }
        }
        return R.ok("操作成功!");
    }
    @Override
    public R orderOutListOrder(String barcode, Long userId) {
        ArrayList<WrkMast> wrkMastArrayList = new ArrayList<>();
        if (Cools.isEmpty(barcode) || barcode.isEmpty()) {
            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .eq("wrk_sts", 14L)
                    .eq("io_type", 104));
            wrkMastArrayList.addAll(wrkMasts);
            List<WrkMast> wrkMasts1 = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .eq("wrk_sts", 14L)
                    .eq("io_type", 107));
            wrkMastArrayList.addAll(wrkMasts1);
        } else {
            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .like("barcode", barcode)
                    .eq("wrk_sts", 199L)
                    .eq("io_type", 104));
            wrkMastArrayList.addAll(wrkMasts);
            List<WrkMast> wrkMasts1 = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .like("barcode", barcode)
                    .eq("wrk_sts", 199L)
                    .eq("io_type", 107));
            wrkMastArrayList.addAll(wrkMasts1);
        }
        return R.ok().add(wrkMastArrayList);
    }
    @Override
    public R orderOutListOrderPick(String barcode, Long userId) {
        ArrayList<WrkMast> wrkMastArrayList = new ArrayList<>();
        if (Cools.isEmpty(barcode) || barcode.isEmpty()) {
            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .eq("wrk_sts", 199L)
                    .eq("io_type", 103));
            wrkMastArrayList.addAll(wrkMasts);
            List<WrkMast> wrkMasts1 = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .eq("wrk_sts", 199L)
                    .eq("io_type", 107));
            wrkMastArrayList.addAll(wrkMasts1);
        } else {
            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .like("barcode", barcode)
                    .eq("wrk_sts", 199L)
                    .eq("io_type", 103)
            );
            wrkMastArrayList.addAll(wrkMasts);
            List<WrkMast> wrkMasts1 = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .like("barcode", barcode)
                    .eq("wrk_sts", 199L)
                    .eq("io_type", 107));
            wrkMastArrayList.addAll(wrkMasts1);
        }
        return R.ok().add(wrkMastArrayList);
    }
    @Override
    public R pickMats(String matnr, String orderNo) {
        List<DocType> docTypes = docTypeService.selectList(new EntityWrapper<DocType>().like("pakin", "1"));
        ArrayList<Long> typeList = new ArrayList<>();
        for (DocType docType : docTypes) {
            typeList.add(docType.getDocId());
        }
        Wrapper<Order> wrapper = new EntityWrapper<>();
        wrapper.eq("status", 1);
        wrapper.in("doc_type", typeList);
        List<Order> orders = orderService.selectList(wrapper);
        ArrayList<Long> orderIds = new ArrayList<>();
        for (Order order : orders) {
            orderIds.add(order.getId());
        }
        //搜索明细
        Wrapper<OrderDetl> wrapper1 = new EntityWrapper<>();
        wrapper1.eq("status", 1);
        wrapper1.in("order_id", orderIds);
        wrapper1.orderBy("create_time",false);
        if (!Cools.isEmpty(matnr)) {
            wrapper1.like("matnr", matnr);
        }
        if (!Cools.isEmpty(orderNo)) {
            wrapper1.like("order_no", orderNo);
        }
        List<OrderDetl> list = orderDetlService.selectList(wrapper1);
        ArrayList<PickMatParam> maps = new ArrayList<>();
        for (OrderDetl orderDetl : list) {
            //剩余可用数量
            double count = orderDetl.getAnfme() - orderDetl.getWorkQty();
            if (count <= 0) {
                continue;
            }
            PickMatParam matParam = new PickMatParam();
            matParam.setMatnr(orderDetl.getMatnr());
            matParam.setBatch(orderDetl.getBatch());
            matParam.setOrderNo(orderDetl.getOrderNo());
            matParam.setOrderId(orderDetl.getOrderId());
            matParam.setCount(count);
            matParam.setUseCount(count);
            maps.add(matParam);
        }
        return R.ok().add(maps);
    }
    @Override
    @Transactional
@@ -215,10 +673,10 @@
    public void onSale(CombParam param) {
        Date now = new Date();
        // 获取库位号
        String locno = param.getLocno();
        String locno = param.getLocNo();
        Node node = nodeService.selectByUuid(locno);
        if (Cools.isEmpty(node)) {
            throw new CoolException(param.getLocno() + ":库位不存在");
            throw new CoolException(param.getLocNo() + ":库位不存在");
        }
        // 获取商品列表
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -181,7 +181,8 @@
        List<LocDetlDto> locDetlDtos = new ArrayList<>();
        for (StockOutParam.LocDetl paramLocDetl : param.getLocDetls()) {
            if (!Cools.isEmpty(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getCount())) {
                LocDetl one = locDetlService.selectItem(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getBatch());
                LocDetl one = locDetlService.selectItem(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getBatch(),paramLocDetl.getBrand()
                        ,paramLocDetl.getStandby1(),paramLocDetl.getStandby2(),paramLocDetl.getStandby3(),paramLocDetl.getBoxType1(),paramLocDetl.getBoxType2(),paramLocDetl.getBoxType3());
                if (null != one) locDetlDtos.add(new LocDetlDto(one, paramLocDetl.getCount()));
            }
        }
@@ -679,7 +680,8 @@
        List<LocDetlDto> locDetlDtos = new ArrayList<>();
        for (StockOutParam.LocDetl paramLocDetl : param.getLocDetls()) {
            if (!Cools.isEmpty(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getCount())) {
                LocDetl one = locDetlService.selectItem(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getBatch());
                LocDetl one = locDetlService.selectItem(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getBatch(),paramLocDetl.getBrand()
                        ,paramLocDetl.getStandby1(),paramLocDetl.getStandby2(),paramLocDetl.getStandby3(),paramLocDetl.getBoxType1(),paramLocDetl.getBoxType2(),paramLocDetl.getBoxType3());
                if (null != one) locDetlDtos.add(new LocDetlDto(one, paramLocDetl.getCount()));
            }
        }
@@ -858,7 +860,8 @@
                    if (!locDetl.getAnfme().equals(adjust.getCount())) {
                        // todo 盘点记录
                        // 修改库存
                        if (!locDetlService.updateAnfme(adjust.getCount(), locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getBatch())) {
                        if (!locDetlService.updateAnfme(adjust.getCount(), locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(),locDetl.getBrand(),
                                locDetl.getStandby1(),locDetl.getStandby2(),locDetl.getStandby3(),locDetl.getBoxType1(),locDetl.getBoxType2(),locDetl.getBoxType3())) {
                            throw new CoolException(locDetl.getLocNo() + "库位," + locDetl.getMatnr() + "商品," + locDetl.getBatch() + "批号修改数量失败");
                        }
                        // 保存调整记录
@@ -883,7 +886,8 @@
        // 删除库存
        for (LocDetl locDetl : locDetls) {
            // todo 盘点记录
            if (!locDetlService.updateAnfme(-1.0D, locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getBatch())) {
            if (!locDetlService.updateAnfme(-1.0D, locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(),locDetl.getBrand(),
                    locDetl.getStandby1(),locDetl.getStandby2(),locDetl.getStandby3(),locDetl.getBoxType1(),locDetl.getBoxType2(),locDetl.getBoxType3())) {
                throw new CoolException("删除" + locDetl.getLocNo() + "库位," + locDetl.getMatnr() + "商品," + locDetl.getBatch() + "批号库存明细失败");
            }
            // 保存调整记录
src/main/java/com/zy/asrs/task/handler/WorkLogHandler.java
@@ -51,7 +51,7 @@
                    WrkDetl wrkDetl = iterator.next();
                    if (!Cools.isEmpty(wrkDetl.getOrderNo())) {
//                        orderService.checkComplete(wrkDetl.getOrderNo());
                        if (wrkMast.getIoType() ==  1 ||  wrkMast.getIoType() == 54 ||  wrkMast.getIoType() == 104){
                        if (wrkMast.getIoType() ==  1 || wrkMast.getIoType() == 8 ||  wrkMast.getIoType() == 54 ||  wrkMast.getIoType() == 104){
                            OrderInAndOutUtil.checkComplete(Boolean.TRUE,wrkDetl.getOrderNo());
                        } else {
                            OrderInAndOutUtil.checkComplete(Boolean.FALSE,wrkDetl.getOrderNo());
@@ -69,11 +69,11 @@
                    if (!Cools.isEmpty(wrkMast.getBarcode())) {
                        // 保存入库通知档历史档
                        if (!waitPakinLogService.save(wrkMast.getBarcode())) {
                            exceptionHandle("保存入库通知档历史档[workNo={0}]失败", wrkMast.getWrkNo());
//                            exceptionHandle("保存入库通知档历史档[workNo={0}]失败", wrkMast.getWrkNo());
                        }
                        // 删除入库通知档
                        if (!waitPakinService.delete(new EntityWrapper<WaitPakin>().eq("zpallet", wrkMast.getBarcode()))) {
                            exceptionHandle("删除入库通知档[workNo={0}]失败", wrkMast.getWrkNo());
//                            exceptionHandle("删除入库通知档[workNo={0}]失败", wrkMast.getWrkNo());
                        }
                    }
//                    // 手动入库生成单据 【 上报三方平台 】
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -96,9 +96,11 @@
                    // 遍历工作明细,更新库存明细和入库通知档
                    for (WrkDetl wrkDetl : wrkDetls) {
                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch());
                        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())) {
                            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() + "]");
@@ -155,6 +157,50 @@
                        }
                    }
                    break;
                // 拣料途中并板
                case 8:
                    // 根据工作号,查询工作明细档
                    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() + "]");
                    }
                    // 遍历工作明细,更新库存明细和入库通知档
                    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());
                        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())) {
                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                return FAIL.setMsg("拣料途中并板 ===>> 更新库存明细失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                            }
                        } else {
                            locDetl = new LocDetl();
                            locDetl.sync(wrkDetl);
                            locDetl.setLocNo(wrkMast.getLocNo()); // 库位号
                            locDetl.setAnfme(wrkDetl.getAnfme()); // 数量
                            locDetl.setZpallet(wrkDetl.getZpallet()); // 托盘条码
                            locDetl.setModiTime(now);
                            locDetl.setAppeTime(now);
                            if (!locDetlService.insert(locDetl)) {
                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                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())) {
                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                return FAIL.setMsg("拣料途中并板 ===>> 更新订单完成数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                            }
                        }
                    }
                    break;
                // 拣料入库
                case 53:
                    // 根据工作号,查询工作明细档
@@ -166,9 +212,11 @@
                    }
                    for (WrkDetl wrkDetl : wrkDetls53) {
                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch());
                        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())) {
                            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() + "]");
@@ -224,9 +272,11 @@
                    // 修改库存明细数量,如无库存,曾新增
                    for (WrkDetl wrkDetl:wrkDetls54) {
                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch());
                        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())) {
                            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() + "]");
@@ -240,11 +290,26 @@
                            locDetl.setModiTime(now);
                            locDetl.setAppeTime(now);
                            if (!locDetlService.insert(locDetl)) {
//                                exceptionHandle("并板入库 ===>> 新增库存明细失败;[workNo={0}],[matnr={1}]", wrkMast.getWrkNo(), wrkDetl.getMatnr());
                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                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());
                        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())){
                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                    return FAIL.setMsg("并板入库 ===>> 更新订单完成数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                                }
                            }
                        } catch (Exception ignore){
                        }
                    }
                    // 修改库位状态 Q ====>> F
                    if (locMast.getLocSts().equals("Q")) {
@@ -403,6 +468,39 @@
                        }
                    }
                    break;
                // 并板途中捡料
                case 108:
                    // 根据工作号,查询工作明细档
                    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() + "]");
                    }
                    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());
                        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())) {
                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                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(),
                                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())){
                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                    return FAIL.setMsg("并板途中捡料 ===>> 更新订单完成数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]");
                                }
                            }
                        } catch (Exception ignore){}
                    }
                    break;
                // 空板出库
                case 110:
                    // 修改库位状态 R ===>> O
src/main/resources/mapper/LocDetlMapper.xml
@@ -119,6 +119,72 @@
            </otherwise>
        </choose>
    </sql>
    <sql id="batchSeqNew">
        <choose>
            <when test="batch != null and batch != ''">
                and batch = #{batch}
            </when>
            <otherwise>
                and (batch IS NULL OR batch = '')
            </otherwise>
        </choose>
        <choose>
            <when test="brand != null and brand != ''">
                and brand = #{brand}
            </when>
            <otherwise>
                and (brand IS NULL OR brand = '')
            </otherwise>
        </choose>
        <choose>
            <when test="standby1 != null and standby1 != ''">
                and standby1 = #{standby1}
            </when>
            <otherwise>
                and (standby1 IS NULL OR standby1 = '')
            </otherwise>
        </choose>
        <choose>
            <when test="standby2 != null and standby2 != ''">
                and standby2 = #{standby2}
            </when>
            <otherwise>
                and (standby2 IS NULL OR standby2 = '')
            </otherwise>
        </choose>
        <choose>
            <when test="standby3 != null and standby3 != ''">
                and standby3 = #{standby3}
            </when>
            <otherwise>
                and (standby3 IS NULL OR standby3 = '')
            </otherwise>
        </choose>
        <choose>
            <when test="boxType1 != null and boxType1 != ''">
                and box_type1 = #{boxType1}
            </when>
            <otherwise>
                and (box_type1 IS NULL OR box_type1 = '')
            </otherwise>
        </choose>
        <choose>
            <when test="boxType2 != null and boxType2 != ''">
                and box_type2 = #{boxType2}
            </when>
            <otherwise>
                and (box_type2 IS NULL OR box_type2 = '')
            </otherwise>
        </choose>
        <choose>
            <when test="boxType3 != null and boxType3 != ''">
                and box_type3 = #{boxType3}
            </when>
            <otherwise>
                and (box_type3 IS NULL OR box_type3 = '')
            </otherwise>
        </choose>
    </sql>
    <sql id="selectAllSql">
        <if test="locNo!=null and locNo!='' ">
@@ -160,7 +226,7 @@
    <select id="selectItem" resultMap="BaseResultMap">
        select top 1 *
        from asr_loc_detl
        from asr_loc_detl d
        where 1=1
        and loc_no = #{locNo}
        and matnr = #{matnr}
@@ -172,7 +238,7 @@
        where 1=1
        and loc_no = #{locNo}
        and matnr = #{matnr}
        <include refid="batchSeq"></include>
        <include refid="batchSeqNew"></include>
    </delete>
    <update id="updateAnfme">
@@ -182,7 +248,7 @@
        where 1=1
        and loc_no = #{locNo}
        and matnr = #{matnr}
        <include refid="batchSeq"></include>
        <include refid="batchSeqNew"></include>
    </update>
    <sql id="stockOutCondition">
src/main/resources/mapper/OrderDetlMapper.xml
@@ -186,4 +186,20 @@
        <include refid="standbyAll"></include>
    </update>
    <update id="increaseWorkQtyByOrderNo">
        update man_order_detl
        set work_qty = work_qty + #{qty}
        where 1=1
        and order_no = #{orderNo}
        and matnr = #{matnr}
        <choose>
            <when test="batch != null and batch != ''">
                and batch = #{batch}
            </when>
            <otherwise>
                and (batch IS NULL OR batch = '')
            </otherwise>
        </choose>
    </update>
</mapper>
src/main/resources/mapper/OrderDetlPakinMapper.xml
@@ -57,14 +57,70 @@
    </resultMap>
    <sql id="standbyAll">
        and batch = #{batch}
        and brand = #{brand}
        and standby1 = #{standby1}
        and standby2 = #{standby2}
        and standby3 = #{standby3}
        and box_type1 = #{boxType1}
        and box_type2 = #{boxType2}
        and box_type3 = #{boxType3}
        <choose>
            <when test="batch != null and batch != ''">
                and batch = #{batch}
            </when>
            <otherwise>
                and (batch IS NULL OR batch = '')
            </otherwise>
        </choose>
        <choose>
            <when test="brand != null and brand != ''">
                and brand = #{brand}
            </when>
            <otherwise>
                and (brand IS NULL OR brand = '')
            </otherwise>
        </choose>
        <choose>
            <when test="standby1 != null and standby1 != ''">
                and standby1 = #{standby1}
            </when>
            <otherwise>
                and (standby1 IS NULL OR standby1 = '')
            </otherwise>
        </choose>
        <choose>
            <when test="standby2 != null and standby2 != ''">
                and standby2 = #{standby2}
            </when>
            <otherwise>
                and (standby2 IS NULL OR standby2 = '')
            </otherwise>
        </choose>
        <choose>
            <when test="standby3 != null and standby3 != ''">
                and standby3 = #{standby3}
            </when>
            <otherwise>
                and (standby3 IS NULL OR standby3 = '')
            </otherwise>
        </choose>
        <choose>
            <when test="boxType1 != null and boxType1 != ''">
                and box_type1 = #{boxType1}
            </when>
            <otherwise>
                and (box_type1 IS NULL OR box_type1 = '')
            </otherwise>
        </choose>
        <choose>
            <when test="boxType2 != null and boxType2 != ''">
                and box_type2 = #{boxType2}
            </when>
            <otherwise>
                and (box_type2 IS NULL OR box_type2 = '')
            </otherwise>
        </choose>
        <choose>
            <when test="boxType3 != null and boxType3 != ''">
                and box_type3 = #{boxType3}
            </when>
            <otherwise>
                and (box_type3 IS NULL OR box_type3 = '')
            </otherwise>
        </choose>
    </sql>
    <sql id="standbyAllMemo">
        --         and line_number = #{lineNumber}