自动化立体仓库 - WMS系统
*
whycq
2024-09-24 0ac582221270f883cd2a8f842ce1b352afaeb3f4
*
24个文件已修改
912 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/MobileController.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OrderController.java 156 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OrderDetlController.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/Order.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WaitPakin.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/CombParam.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/LocDetlMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/LocDetlService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/MobileService.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OrderDetlService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/WrkDetlService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java 280 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OrderDetlServiceImpl.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/DetlDto.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/WcsController.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocDetlMapper.xml 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderDetlMapper.xml 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/order/order.js 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/order/order.html 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/MobileController.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.annotations.ManagerAuth;
import com.core.common.BaseRes;
import com.core.common.Cools;
@@ -137,13 +138,42 @@
        return R.ok("组托成功");
    }
    @RequestMapping("/merge/comb/auth")
    @RequestMapping("/comb/auth3")
    @ManagerAuth(memo = "组托")
    public R comb3(@RequestBody CombParam combParam){
        mobileService.comb3(combParam, getUserId());
        return R.ok("组托成功");
    }
    @RequestMapping("/check/fullplt/auth")
    @ManagerAuth(memo = "检测物料是否有未满托托盘")
    public R checkFullplt(@RequestBody CombParam.CombMat combMat){
        List<LocMast> locMasts = mobileService.checkFullplt(combMat, getUserId());
        return R.ok().add(locMasts);
    }
    @RequestMapping("/merge/comb/auth")
    @ManagerAuth(memo = "并板")
    public R mergeComb(@RequestBody CombParam combParam){
        mobileService.mergeComb(combParam, getUserId());
        return R.ok("组托成功");
    }
    @RequestMapping("/merge/out/auth")
    @ManagerAuth(memo = "pda并板出库")
    public R mergeOut(@RequestParam String locNo,@RequestParam String staNo){
        mobileService.mergeOut(locNo,staNo, getUserId());
        return R.ok("出库成功");
    }
    @RequestMapping("/merge/comb2/auth")
    @ManagerAuth(memo = "并板")
    public R mergeComb2(@RequestBody CombParam combParam){
        mobileService.mergeComb2(combParam, getUserId());
        return R.ok("并板成功");
    }
    @RequestMapping("/comb/checkBom")
    @ManagerAuth(memo = "校验Bom")
    public R checkBom(@RequestBody CheckBom checkBom){
src/main/java/com/zy/asrs/controller/OrderController.java
@@ -149,7 +149,8 @@
                now,    // 添加时间
                getUserId(),    // 修改人员
                now,    // 修改时间
                null    // 备注
                null,    // 备注
                null
        );
        if (!orderService.insert(order)) {
            throw new CoolException("保存订单主档失败");
@@ -159,9 +160,9 @@
            if (orderDetl.getBatch() == null) {
                orderDetl.setBatch("");
            }
            DetlDto dto = new DetlDto(orderDetl.getMatnr(), orderDetl.getBatch());
            if (DetlDto.has(list, dto)) {
                OrderDetl item = orderDetlService.selectItem(order.getId(), orderDetl.getMatnr(), orderDetl.getBatch());
            DetlDto dto = new DetlDto(orderDetl.getMatnr(), orderDetl.getBatch(),orderDetl.getBomCode(),orderDetl.getThreeCode());
            if (DetlDto.has2(list, dto)) {
                OrderDetl item = orderDetlService.selectItem(order.getId(), orderDetl.getMatnr(), orderDetl.getBatch(),orderDetl.getBomCode(),orderDetl.getThreeCode());
                item.setAnfme(item.getAnfme() + orderDetl.getAnfme());
                if (!orderDetlService.updateById(item)) {
                    throw new CoolException("保存订单明细档失败");
@@ -175,6 +176,7 @@
                orderDetl.setUpdateBy(getUserId());
                orderDetl.setUpdateTime(now);
                orderDetl.setStatus(1);
                orderDetl.setSource(param.getDocType().intValue());
                orderDetl.setQty(0.0D);
                if (!orderDetlService.insert(orderDetl)) {
                    throw new CoolException("保存订单明细档失败");
@@ -212,9 +214,9 @@
        // 2.重组数据
        List<DetlDto> list = new ArrayList<>();
        for (OrderDetl orderDetl : param.getOrderDetlList()) {
            DetlDto dto = new DetlDto(orderDetl.getMatnr(), orderDetl.getBatch());
            if (DetlDto.has(list, dto)) {
                OrderDetl item = orderDetlService.selectItem(order.getId(), orderDetl.getMatnr(), orderDetl.getBatch());
            DetlDto dto = new DetlDto(orderDetl.getMatnr(), orderDetl.getBatch(),orderDetl.getBomCode(),orderDetl.getThreeCode());
            if (DetlDto.has2(list, dto)) {
                OrderDetl item = orderDetlService.selectItem(order.getId(), orderDetl.getMatnr(), orderDetl.getBatch(),orderDetl.getBomCode(),orderDetl.getThreeCode());
                item.setAnfme(item.getAnfme() + orderDetl.getAnfme());
                if (!orderDetlService.updateById(item)) {
                    throw new CoolException("保存订单明细档失败");
@@ -228,6 +230,7 @@
                orderDetl.setUpdateBy(getUserId());
                orderDetl.setUpdateTime(now);
                orderDetl.setStatus(1);
                orderDetl.setSource(param.getDocType().intValue());
                orderDetl.setQty(0.0D);
                if (!orderDetlService.insert(orderDetl)) {
                    throw new CoolException("保存订单明细档失败");
@@ -459,7 +462,8 @@
                        now,    // 添加时间
                        userId,    // 修改人员
                        now,    // 修改时间
                        null    // 备注
                        null,    // 备注
                        null
                );
                if (!orderService.insert(order)) {
                    throw new CoolException("生成单据主档失败,请重新导入!");
@@ -492,4 +496,140 @@
        return R.ok("导入成功");
    }
    /**
     * excel导入
     */
    @PostMapping(value = "/order/excel/import2/auth")
    @ManagerAuth(memo = "销售单Excel导入")
    @Transactional
    public R cstmrExcelImport2(MultipartFile file) throws IOException {
        InputStream inStream = file.getInputStream();
        String fileMime = file.getContentType();
        int excelVersion = 2007;
        if ("application/vnd.ms-excel".equals(fileMime)) {
            excelVersion = 2003;
        }
        Workbook book = null;
        try {
            if (excelVersion == 2003) {
                book = new HSSFWorkbook(inStream);
            }
            else {  // 当 excel 是 2007 时
                book = new XSSFWorkbook(inStream);
            }
        } catch (Exception e) {
            log.error("fail", e);
            return R.error("导入文件格式错误,请使用xls后缀的文件!");
        }
        Sheet sheet = book.getSheetAt(0);
        int totalRows = sheet.getLastRowNum() + 1;    // 总
        Long userId = getUserId();
        Date now = new Date();
        DataFormatter dataFormatter = new DataFormatter();
        for (int i = 1; i < totalRows; i++) {
            Row row = sheet.getRow(i);
            // 单据编号
            String uuid = dataFormatter.formatCellValue(row.getCell(0));
            // 销售单号
            String threeCode = dataFormatter.formatCellValue(row.getCell(1));
            // 部件号
            String unitNum = dataFormatter.formatCellValue(row.getCell(2));
            // 组件号
            String bomNum = dataFormatter.formatCellValue(row.getCell(3));
            // 批号
            String batch = dataFormatter.formatCellValue(row.getCell(4));
            // 商品编码
            String matnr = dataFormatter.formatCellValue(row.getCell(6));
            // 数量
            Double anfme = Double.parseDouble(dataFormatter.formatCellValue(row.getCell(7)));
            // 单据类型
            Long orderType = Long.parseLong(dataFormatter.formatCellValue(row.getCell(8)));
            // 下单时间
            String timeStr = dataFormatter.formatCellValue(row.getCell(9));
            Date time = null;
            try {
                time = DateUtils.convert(timeStr, DateUtils.yyyyMMddHHmmss_F);
            } catch (Exception e) {
                throw new CoolException("第" + i + "行下的那时间解析失败,请重新导入!");
            }
            Mat mat = matService.selectByMatnr(matnr);
            if (null == mat) {
                throw new CoolException(matnr + "商品编码的商品不存在,请重新导入!");
            }
            Order order = orderService.selectByNo(uuid);
            if (null == order) {
                order = new Order(
                        String.valueOf(snowflakeIdWorker.nextId()),    // 编号[非空]
                        uuid,    // 订单编号
                        timeStr,    // 单据日期
                        orderType,    // 单据类型
                        null,    // 项目编号
                        null,    //
                        null,    // 调拨项目编号
                        null,    // 初始票据号
                        null,    // 票据号
                        null,    // 客户编号
                        null,    // 客户
                        null,    // 联系方式
                        null,    // 操作人员
                        null,    // 合计金额
                        null,    // 优惠率
                        null,    // 优惠金额
                        null,    // 销售或采购费用合计
                        null,    // 实付金额
                        null,    // 付款类型
                        null,    // 业务员
                        null,    // 结算天数
                        null,    // 邮费支付类型
                        null,    // 邮费
                        null,    // 付款时间
                        null,    // 发货时间
                        null,    // 物流名称
                        null,    // 物流单号
                        1L,    // 订单状态
                        1,    // 状态
                        userId,    // 添加人员
                        now,    // 添加时间
                        userId,    // 修改人员
                        now,    // 修改时间
                        null,    // 备注
                        threeCode
                );
                if (!orderService.insert(order)) {
                    throw new CoolException("生成单据主档失败,请重新导入!");
                }
            }
            OrderDetl orderDetl = orderDetlService.selectItem(order.getId(), matnr, batch,bomNum,threeCode);
            if (orderDetl == null) {
                orderDetl = new OrderDetl();
                orderDetl.sync(mat);
                orderDetl.setBatch(batch);
                orderDetl.setAnfme(anfme);
                orderDetl.setOrderId(order.getId());
                orderDetl.setOrderNo(order.getOrderNo());
                orderDetl.setCreateBy(userId);
                orderDetl.setCreateTime(now);
                orderDetl.setUpdateBy(userId);
                orderDetl.setUpdateTime(now);
                orderDetl.setStatus(1);
                orderDetl.setBomCode(bomNum);
                orderDetl.setThreeCode(threeCode);
                orderDetl.setQty(0.0D);
                if (!orderDetlService.insert(orderDetl)) {
                    throw new CoolException("生成单据明细失败,请重新导入!");
                }
            } else {
                if(!orderDetlService.increaseAnfme2(order.getId(), matnr, batch, anfme,bomNum,threeCode)) {
                    throw new CoolException("生成单据明细失败,请重新导入!");
                }
            }
        }
        return R.ok("导入成功");
    }
}
src/main/java/com/zy/asrs/controller/OrderDetlController.java
@@ -57,6 +57,21 @@
        return R.ok(orderDetlPage);
    }
    @RequestMapping("/orderPakin/page/auth")
    @ManagerAuth(memo = "查询入库订单")
    public R orderPakinPage(@RequestParam(defaultValue = "1")Integer curr,
                            @RequestParam(defaultValue = "10")Integer limit,
                            @RequestParam(required = false)String orderByField,
                            @RequestParam(required = false)String orderByType,
                            @RequestParam Map<String, Object> param){
        EntityWrapper<OrderDetl> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convertLike(param, wrapper);
        wrapper.eq("source",30);
        Page<OrderDetl> page = orderDetlService.selectPage(new Page<>(curr, limit), wrapper);
        return R.ok(page);
    }
    @RequestMapping(value = "/orderDetl/pakout/list/auth")
    @ManagerAuth
    public R pakoutList(@RequestParam(defaultValue = "1")Integer curr,
@@ -80,6 +95,19 @@
        }
    }
    private <T> void convertLike(Map<String, Object> map, EntityWrapper<T> wrapper){
        for (Map.Entry<String, Object> entry : map.entrySet()){
            String val = String.valueOf(entry.getValue());
            if (val.contains(RANGE_TIME_LINK)){
                String[] dates = val.split(RANGE_TIME_LINK);
                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
            } else {
                wrapper.like(entry.getKey(), val);
            }
        }
    }
    @RequestMapping(value = "/orderDetl/add/auth")
    @ManagerAuth
    public R add(OrderDetl orderDetl) {
src/main/java/com/zy/asrs/entity/Order.java
@@ -261,9 +261,16 @@
    @ApiModelProperty(value= "备注")
    private String memo;
    /**
     * 销售单号
     */
    @ApiModelProperty(value= "销售单号")
    @TableField("three_code")
    private String threeCode;
    public Order() {}
    public Order(String uuid,String orderNo,String orderTime,Long docType,Long itemId,String itemName,Long allotItemId,String defNumber,String number,Long cstmr,String cstmrName,String tel,String operMemb,Double totalFee,Double discount,Double discountFee,Double otherFee,Double actFee,Integer payType,String salesman,Integer accountDay,Integer postFeeType,Double postFee,Date payTime,Date sendTime,String shipName,String shipCode,Long settle,Integer status,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
    public Order(String uuid,String orderNo,String orderTime,Long docType,Long itemId,String itemName,Long allotItemId,String defNumber,String number,Long cstmr,String cstmrName,String tel,String operMemb,Double totalFee,Double discount,Double discountFee,Double otherFee,Double actFee,Integer payType,String salesman,Integer accountDay,Integer postFeeType,Double postFee,Date payTime,Date sendTime,String shipName,String shipCode,Long settle,Integer status,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo,String threeCode) {
        this.uuid = uuid;
        this.orderNo = orderNo;
        this.orderTime = orderTime;
@@ -298,6 +305,7 @@
        this.updateBy = updateBy;
        this.updateTime = updateTime;
        this.memo = memo;
        this.threeCode = threeCode;
    }
//    Order order = new Order(
src/main/java/com/zy/asrs/entity/WaitPakin.java
@@ -164,6 +164,10 @@
    @TableField("bom_code")
    private String bomCode;
    @ApiModelProperty(value= "bom号")
    @TableField("is_full")
    private String isFull;
    public String getBeBatch$(){
        if (null == this.beBatch){ return null; }
        switch (this.beBatch){
src/main/java/com/zy/asrs/entity/param/CombParam.java
@@ -16,11 +16,17 @@
    // 单据编号
    private String orderNo;
    // 销售单号
    private String threeCode;
    // 托盘条码
    private String barcode;
    // 库位编号
    private String locno;
    // 是否满板
    private String isFull;
    private List<CombMat> combMats;
@@ -32,6 +38,9 @@
        // Bom号
        private String bomCode;
        // 销售单号
        private String threeCode;
        // 物料编号
        private String matnr;
@@ -41,6 +50,9 @@
        // 物料数量
        private Double anfme;
        // 库位号
        private String locNo;
    }
}
src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
@@ -23,10 +23,16 @@
    LocDetl selectItem(@Param("locNo")String locNo, @Param("matnr")String matnr, @Param("batch")String batch);
    LocDetl selectItem2(@Param("locNo")String locNo, @Param("matnr")String matnr, @Param("batch")String batch, @Param("bomCode")String bomCode, @Param("threeCode")String threeCode);
    int deleteItem(@Param("locNo")String locNo, @Param("matnr")String matnr, @Param("batch")String batch);
    int deleteItem2(@Param("locNo")String locNo, @Param("matnr")String matnr, @Param("batch")String batch,@Param("bomCode")String bomCode, @Param("threeCode")String threeCode);
    int updateAnfme(@Param("anfme")Double anfme, @Param("locNo")String locNo, @Param("matnr")String matnr, @Param("batch")String batch);
    int updateAnfme2(@Param("anfme")Double anfme, @Param("locNo")String locNo, @Param("matnr")String matnr, @Param("batch")String batch,@Param("bomCode")String bomCode, @Param("threeCode")String threeCode);
    List<LocDetl> getStockOutPage(Map<String, Object> map);
    Integer getStockOutPageCount(Map<String, Object> map);
src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java
@@ -15,7 +15,11 @@
    OrderDetl selectItem(@Param("orderId") Long orderId, @Param("matnr") String matnr, @Param("batch") String batch);
    OrderDetl selectItem(@Param("orderId") Long orderId, @Param("matnr") String matnr, @Param("batch") String batch,@Param("bomNum") String bomNum,@Param("threeCode") String threeCode);
    OrderDetl selectItemByOrderNo(@Param("orderNo") String orderNo, @Param("matnr") String matnr, @Param("batch") String batch);
    OrderDetl selectItemByOrderNo2(@Param("orderNo") String orderNo, @Param("matnr") String matnr, @Param("batch") String batch, @Param("bomCode") String bomCode, @Param("threeCode") String threeCode);
    List<OrderDetl> selectWorkingDetls(Long orderId);
@@ -33,7 +37,11 @@
    int increaseQtyByOrderNo(@Param("orderNo")String orderNo, @Param("matnr")String matnr, @Param("batch")String batch, @Param("qty")Double qty);
    int increaseQtyByOrderNo2(@Param("orderNo")String orderNo, @Param("matnr")String matnr, @Param("batch")String batch, @Param("qty")Double qty, @Param("bomCode")String bomCode, @Param("threeCode")String threeCode);
    int increaseWorkQty(@Param("orderId")Long orderId, @Param("matnr")String matnr, @Param("batch")String batch, @Param("workQty")Double workQty);
    int increaseWorkQty2(@Param("orderId")Long orderId, @Param("matnr")String matnr, @Param("batch")String batch, @Param("bomCode")String bomCode, @Param("threeCode")String threeCode, @Param("workQty")Double workQty);
    Integer checkAllDetlFinish(@Param("orderNo") String orderNo);
@@ -41,6 +49,8 @@
    int increaseAnfme(@Param("orderId")Long orderId, @Param("matnr")String matnr, @Param("batch")String batch, @Param("qty")Double qty);
    int increaseAnfme2(@Param("orderId")Long orderId, @Param("matnr")String matnr, @Param("batch")String batch, @Param("qty")Double qty,@Param("bumNum")String bumNum,@Param("threeCode")String threeCode);
    /**
     * 根据商品编码和批号分别查询在平库该物料库存
     * @param matnr 商品编号
src/main/java/com/zy/asrs/service/LocDetlService.java
@@ -15,6 +15,8 @@
    LocDetl selectItem(String locNo, String matnr, String batch);
    LocDetl selectItem(String locNo, String matnr, String batch, String bomCode, String threeCode);
    Page<LocDetl> getStockOut(Page<LocDetl> page);
    /**
@@ -22,6 +24,8 @@
     */
    boolean updateAnfme(Double anfme, String locNo, String matnr, String batch);
    boolean updateAnfme(Double anfme, String locNo, String matnr, String batch, String bomCode, String threeCode);
    boolean updateLocNo(String newLocNo, String oldLocNo);
    /**
src/main/java/com/zy/asrs/service/MobileService.java
@@ -4,6 +4,7 @@
import com.core.common.R;
import com.zy.asrs.entity.BasDevp;
import com.zy.asrs.entity.LocDetl;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.entity.param.CheckBom;
import com.zy.asrs.entity.param.CombParam;
@@ -11,6 +12,7 @@
import com.zy.asrs.entity.param.OffSaleParam;
import java.util.Date;
import java.util.List;
public interface MobileService {
@@ -27,9 +29,28 @@
    /**
     * 组托
     */
    void comb3(CombParam param, Long userId);
    /**
     * 检测物料是否有未满托托盘
     */
    List<LocMast> checkFullplt(CombParam.CombMat param, Long userId);
    /**
     * 组托
     */
    void mergeComb(CombParam param, Long userId);
    /**
     * 组托
     */
    void mergeComb2(CombParam param, Long userId);
    /**
     * pda并板出库
     */
    void mergeOut(String locNo,String staNo, Long userId);
    /**
     * 校验bom
     */
    R checkBom(CheckBom param, Long userId);
src/main/java/com/zy/asrs/service/OrderDetlService.java
@@ -15,7 +15,11 @@
    OrderDetl selectItem(Long orderId, String matnr, String batch);
    OrderDetl selectItem(Long orderId, String matnr, String batch,String bomNum,String threeCode);
    OrderDetl selectItem(String orderNo, String matnr, String batch);
    OrderDetl selectItem(String orderNo, String matnr, String batch,String bomNum,String threeCode);
    OrderDetl findByLook(List<OrderDetl> orderDetls, Long orderId, String matnr, String batch);
@@ -29,6 +33,8 @@
    boolean increaseQtyByOrderNo(String orderNo, String matnr, String batch, Double qty);
    boolean increaseQtyByOrderNo(String orderNo, String matnr, String batch, Double qty,String bomCode,String threeCode);
    /**
     * 入出库任务生成时,更新单据表中作业数量
     * @param orderId
@@ -39,12 +45,16 @@
     */
    boolean increaseWorkQty(Long orderId, String matnr, String batch, Double workQty);
    boolean increaseWorkQty(Long orderId, String matnr, String batch, String bomCode, String threeCode, Double workQty);
    Boolean checkAllDetlFinish(String orderNo);
    Integer sameOrderComb(String orderNo, String matnr, String batch);
    boolean increaseAnfme(Long orderId, String matnr, String batch, Double qty);
    boolean increaseAnfme2(Long orderId, String matnr, String batch, Double qty,String bumNum,String threeCode);
    /**
     * 根据商品编码和批号分别查询在平库和立库该物料库存
     * @param matnr 商品编码
src/main/java/com/zy/asrs/service/WrkDetlService.java
@@ -1,6 +1,7 @@
package com.zy.asrs.service;
import com.baomidou.mybatisplus.service.IService;
import com.zy.asrs.entity.LocDetl;
import com.zy.asrs.entity.MatCodeCountDto;
import com.zy.asrs.entity.WrkDetl;
import com.zy.common.model.DetlDto;
src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
@@ -37,6 +37,15 @@
        }
    }
    @Override
    public boolean updateAnfme(Double anfme, String locNo, String matnr, String batch,String bomCode, String threeCode) {
        if (anfme <= 0) {
            return this.baseMapper.deleteItem2(locNo, matnr, batch, bomCode, threeCode) > 0;
        } else {
            return baseMapper.updateAnfme2(anfme, locNo, matnr, batch, bomCode, threeCode) > 0;
        }
    }
    @Override
    public boolean updateLocNo(String newLocNo, String oldLocNo) {
@@ -118,6 +127,11 @@
    }
    @Override
    public LocDetl selectItem(String locNo, String matnr, String batch, String bomCode, String threeCode) {
        return this.baseMapper.selectItem(locNo, matnr, batch);
    }
    @Override
    public Double getLocDetlSumQty(String locNo) {
        return this.baseMapper.selectLocDetlSumQty(locNo);
    }
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -10,13 +10,12 @@
import com.core.common.SnowflakeIdWorker;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.CheckBom;
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 com.zy.asrs.mapper.ManLocDetlMapper;
import com.zy.asrs.service.*;
import com.zy.common.model.DetlDto;
import com.zy.common.model.LocDetlDto;
import com.zy.common.model.enums.IoWorkType;
import com.zy.common.service.CommonService;
import com.zy.common.utils.Synchro;
import lombok.extern.slf4j.Slf4j;
@@ -81,6 +80,8 @@
    private MatV2Service matV2Service;
    @Autowired
    private BomMatService bomMatService;
    @Autowired
    private WorkService workService;
    @Override
    @Transactional
@@ -389,6 +390,199 @@
    }
    @Override
    @Transactional
    public void comb3(CombParam param, Long userId) {
        if (Cools.isEmpty(param.getBarcode(), param.getCombMats())) {
            throw new CoolException(BaseRes.PARAM);
        }
        if(param.getCombMats().stream().anyMatch(obj -> obj.getAnfme() == null)){
            throw new CoolException("入库物料数量不能为空");
        }
        // 判断是否有相同条码的数据
        if (waitPakinService.selectCount(new EntityWrapper<WaitPakin>().
                eq("zpallet", param.getBarcode()).eq("io_status", "N")) > 0) {
            throw new CoolException(param.getBarcode() + "数据正在进行入库");
        }
        int countLoc = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet",param.getBarcode()));
        WrkMast wrkMast = wrkMastService.selectByBarcode(param.getBarcode());
        if (wrkMast != null && wrkMast.getIoType() < 100){
            throw new CoolException("工作档/库存条码数据已存在===>>" + param.getBarcode());
        }
        if (countLoc > 0 ) {
            throw new CoolException("工作档/库存条码数据已存在===>>" + param.getBarcode());
        }
        //设置非null批号,
        for (CombParam.CombMat combMat : param.getCombMats()) {
            if (combMat.getBatch() == null){
                combMat.setBatch("");
            }
        }
        Date now = new Date();
        // 无单组托
        if (Cools.isEmpty(param.getCombMats().get(0).getOrderNo())) {
            // 生成入库通知档
            List<DetlDto> detlDtos = new ArrayList<>();
            param.getCombMats().forEach(elem -> {
                DetlDto detlDto = new DetlDto(elem.getMatnr(), elem.getBatch(), elem.getAnfme());
                if (DetlDto.has(detlDtos, detlDto)) {
                    DetlDto one = DetlDto.find(detlDtos, detlDto.getMatnr(), detlDto.getBatch());
                    assert one != null;
                    one.setAnfme(one.getAnfme() + detlDto.getAnfme());
                } else {
                    detlDtos.add(detlDto);
                }
            });
            for (DetlDto detlDto : detlDtos) {
                Mat mat = matService.selectByMatnr(detlDto.getMatnr());
                WaitPakin waitPakin = new WaitPakin();
                if (Cools.isEmpty(mat)) {
                    MatV2 matV2 = matV2Service.selectOne(new EntityWrapper<MatV2>().eq("matnr", detlDto.getMatnr()));
                    if(Cools.isEmpty(matV2)){
                        throw new CoolException(detlDto.getMatnr() + "商品档案不存在");
                    }
                    waitPakin.sync(matV2);
                    waitPakin.setBrand("组件");
                } else {
                    waitPakin.sync(mat);
                }
                // 校验是否为bom入库  bom入库的数量不能超过库存原有数量
                if (!Cools.isEmpty(param.getBomCode())) {
                    BomMat bomMat = bomMatService.selectOne(new EntityWrapper<BomMat>().eq("bom_num", param.getBomCode()).eq("element_num", detlDto.getMatnr()));
                    Double bomQyt = locDetlService.getBomQyt(param.getBomCode(), detlDto.getMatnr());
                    if (!Cools.isEmpty(bomQyt)) {
                        bomMat.setZpalletAnfme(bomMat.getZpalletAnfme() - bomQyt);
                    }
                    Double bomQty = wrkDetlService.getBomQty(param.getBomCode(), detlDto.getMatnr());
                    if (!Cools.isEmpty(bomQty)) {
                        bomMat.setZpalletAnfme(bomMat.getZpalletAnfme() - bomQty);
                    }
                    if (bomMat.getZpalletAnfme() == 0.0D) {
                        throw new CoolException(detlDto.getMatnr() + "当前物料已入最大数量");
                    } else {
                        if (bomMat.getZpalletAnfme() < detlDto.getAnfme()) {
                            throw new CoolException(detlDto.getMatnr() + "当前物料最多可入" + bomMat.getZpalletAnfme() + "件");
                        }
                    }
                }
                waitPakin.setBatch(detlDto.getBatch());
                waitPakin.setZpallet(param.getBarcode());   // 托盘码
                waitPakin.setIoStatus("N");     // 入出状态
                waitPakin.setAnfme(detlDto.getAnfme());  // 数量
                waitPakin.setStatus("Y");    // 状态
                waitPakin.setAppeUser(userId);
                waitPakin.setBomCode(param.getBomCode());
                waitPakin.setAppeTime(now);
                waitPakin.setModiUser(userId);
                waitPakin.setModiTime(now);
                if (!waitPakinService.insert(waitPakin)) {
                    throw new CoolException("保存入库通知档失败");
                }
            }
            // 关联组托
        } else {
            for (CombParam.CombMat combMat : param.getCombMats()) {
                // 生成入库通知档
                Order order = orderService.selectByNo(combMat.getOrderNo());
                //判断订单类型是否是入库
                DocType docType=docTypeService.selectById(order.getDocType());
                if(docType.getPakin()!=1 || docType.getStatus()!=1){
                    throw new CoolException("订单为出库订单,不能组托!");
                }
                if (order.getSettle() > 2) {
                    throw new CoolException("单据编号已过期");
                }
                OrderDetl orderDetl = orderDetlService.selectItem(combMat.getOrderNo(), combMat.getMatnr(), combMat.getBatch(), combMat.getBomCode(), combMat.getThreeCode());
                if (orderDetl == null) {
                    throw new CoolException("找不到组托的单据明细");
                }
                //订单数-工作中的数量-组托数量
                if ( orderDetl.getAnfme() - orderDetl.getWorkQty() - combMat.getAnfme()<0) {
                    throw new CoolException("组托数量已超出订单需求量,请检查是否有其他的组托已完成");
                }
                // 修改订单作业数量
                if (!orderDetlService.increaseWorkQty(order.getId(), combMat.getMatnr(), combMat.getBatch(), combMat.getBomCode(),combMat.getThreeCode(), combMat.getAnfme())) {
                    throw new CoolException("修改单据作业数量失败");
                }
                Mat mat = matService.selectByMatnr(combMat.getMatnr());
                if (Cools.isEmpty(mat)) {
                    throw new CoolException(combMat.getMatnr() + "商品档案不存在");
                }
                WaitPakin waitPakin = new WaitPakin();
                waitPakin.sync(mat);
                waitPakin.setOrderNo(order.getOrderNo());   // 单据编号
                waitPakin.setBomCode(combMat.getBomCode());
                waitPakin.setThreeCode(combMat.getThreeCode());
                waitPakin.setBatch(combMat.getBatch());
                waitPakin.setIsFull(param.getIsFull().equals("1") ? "Y" : "N"); // 序列码
                waitPakin.setZpallet(param.getBarcode());   // 托盘码
                waitPakin.setIoStatus("N");     // 入出状态
                waitPakin.setAnfme(combMat.getAnfme());  // 数量
                waitPakin.setStatus("Y");    // 状态
                waitPakin.setAppeUser(userId);
                waitPakin.setAppeTime(now);
                waitPakin.setModiUser(userId);
                waitPakin.setModiTime(now);
                if (!waitPakinService.insert(waitPakin)) {
                    throw new CoolException("保存入库通知档失败");
                }
//                DetlDto detlDto = new DetlDto(combMat.getMatnr(), combMat.getBatch(), combMat.getAnfme());
//                if (DetlDto.has(detlDtos, detlDto)) {
//                    DetlDto one = DetlDto.find(detlDtos, detlDto.getMatnr(), detlDto.getBatch());
//                    assert one != null;
//                    one.setAnfme(one.getAnfme() + detlDto.getAnfme());
//                } else {
//                }
                orderService.updateSettle(order.getId(), 2L, userId);
            }
        }
    }
    @Override
    @Transactional
    public List<LocMast> checkFullplt(CombParam.CombMat param, Long userId) {
        // 查询包含待组托物料在库存中是否存在
        List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>()
                .eq("three_code", param.getThreeCode())
                .eq("bom_code", param.getBomCode()));
        if (Cools.isEmpty(locDetls)) {
            throw new CoolException("库存中没有存在当前物料所使用的销售单号");
        }
        ArrayList<LocMast> locMasts = new ArrayList<>();
        locDetls.forEach(locDetl -> {
            LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetl.getLocNo()));
            if (!Cools.isEmpty(locMast)) {
                if (!locMasts.contains(locMast)) {
                    locMasts.add(locMast);
                }
            }
        });
        return locMasts;
    }
    @Override
    @Transactional
    public void mergeComb(CombParam param, Long userId) {
@@ -422,8 +616,6 @@
        Date now = new Date();
        for (CombParam.CombMat combMat : param.getCombMats()) {
            Mat mat = matService.selectByMatnr(combMat.getMatnr());
            LocDetl locDetl = new LocDetl();
            locDetl.sync(mat);
            locDetl.setLocNo(wrkMast.getSourceLocNo());
@@ -445,6 +637,82 @@
    @Override
    @Transactional
    public void mergeComb2(CombParam param, Long userId) {
        if (Cools.isEmpty(param.getBarcode(), param.getCombMats())) {
            throw new CoolException(BaseRes.PARAM);
        }
        if(param.getCombMats().stream().anyMatch(obj -> obj.getAnfme() == null)){
            throw new CoolException("入库物料数量不能为空");
        }
        // 判断是否有相同条码的数据
        if (waitPakinService.selectCount(new EntityWrapper<WaitPakin>().
                eq("zpallet", param.getBarcode()).eq("io_status", "N")) > 0) {
            throw new CoolException(param.getBarcode() + "数据正在进行入库");
        }
        int countLoc = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet",param.getBarcode()));
        WrkMast wrkMast = wrkMastService.selectByBarcode(param.getBarcode());
        if (wrkMast.getWrkSts() != 14L) {
            throw new CoolException("当前托盘出库未完成!");
        }
        //设置非null批号,
        for (CombParam.CombMat combMat : param.getCombMats()) {
            if (combMat.getBatch() == null){
                combMat.setBatch("");
            }
        }
        Date now = new Date();
        for (CombParam.CombMat combMat : param.getCombMats()) {
            Mat mat = matService.selectByMatnr(combMat.getMatnr());
            WrkDetl wrkDetl = new WrkDetl();
            wrkDetl.sync(mat);
            wrkDetl.setWrkNo(wrkMast.getWrkNo());
            wrkDetl.setZpallet(param.getBarcode());
            wrkDetl.setOrderNo(combMat.getOrderNo());
            wrkDetl.setBatch(combMat.getBatch());
            wrkDetl.setBomCode(combMat.getBomCode());
            wrkDetl.setThreeCode(combMat.getThreeCode());
            wrkDetl.setAnfme(combMat.getAnfme());
            wrkDetl.setAppeTime(now);
            wrkDetl.setAppeUser(userId);
            wrkDetl.setModiTime(now);
            wrkDetl.setModiUser(userId);
            wrkDetl.setMemo("并板");
            wrkDetlService.insert(wrkDetl);
            // 同步订单
            OrderDetl orderDetl = orderDetlService.selectItem(combMat.getOrderNo(), combMat.getMatnr(), combMat.getBatch(), combMat.getBomCode(), combMat.getThreeCode());
            orderDetl.setQty(orderDetl.getWorkQty() + combMat.getAnfme());
            orderDetlService.update(orderDetl,new EntityWrapper<OrderDetl>()
                    .eq("order_no", combMat.getOrderNo())
                    .eq("matnr", combMat.getMatnr())
                    .eq("batch", combMat.getBatch())
                    .eq("bom_code", combMat.getBomCode())
                    .eq("three_code", combMat.getThreeCode()));
        }
    }
    @Override
    @Transactional
    public void mergeOut(String locNo,String staNo, Long userId) {
        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locNo));
        if (!locMast.getLocSts().equals("F")) {
            throw new CoolException("当前库位状态不是在库状态不能出库");
        }
        List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", locNo));
        // 获取库位明细
        List<LocDetlDto> locDetlDtos = new ArrayList<>();
        for (LocDetl locDetl : locDetls) {
            locDetlDtos.add(new LocDetlDto(locDetl, locDetl.getAnfme()));
        }
        BasDevp basDevp = basDevpService.selectById(staNo);
        workService.stockOut(basDevp, locDetlDtos, IoWorkType.MERGE_OUT, userId);
    }
    @Override
    @Transactional
    public R checkBom(CheckBom param, Long userId) {
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -105,7 +105,8 @@
                now,    // 添加时间
                9527L,    // 修改人员
                now,    // 修改时间
                null    // 备注
                null,    // 备注
                null
        );
        if (!orderService.insert(order)) {
            throw new CoolException("生成单据主档失败,请联系管理员");
@@ -252,7 +253,8 @@
                now,    // 添加时间
                9527L,    // 修改人员
                now,    // 修改时间
                null    // 备注
                null,    // 备注
                null
        );
        if (!orderService.insert(order)) {
            throw new CoolException("生成单据主档失败,请联系管理员");
src/main/java/com/zy/asrs/service/impl/OrderDetlServiceImpl.java
@@ -43,6 +43,16 @@
    }
    @Override
    public OrderDetl selectItem(Long orderId, String matnr, String batch,String bomNum,String threeCode) {
        return this.baseMapper.selectItem(orderId, matnr, batch,bomNum,threeCode);
    }
    @Override
    public OrderDetl selectItem(String orderNo, String matnr, String batch,String bomNum,String threeCode) {
        return this.baseMapper.selectItemByOrderNo2(orderNo, matnr, batch,bomNum,threeCode);
    }
    @Override
    public OrderDetl findByLook(List<OrderDetl> orderDetls, Long orderId, String matnr, String batch) {
        for (OrderDetl orderDetl : orderDetls) {
            if (orderDetl.getOrderId().equals(orderId) && orderDetl.getMatnr().equals(matnr)) {
@@ -84,6 +94,11 @@
        return this.baseMapper.increaseQtyByOrderNo(orderNo, matnr, batch, qty) > 0;
    }
    @Override
    public boolean increaseQtyByOrderNo(String orderNo, String matnr, String batch, Double qty,String bomCode,String threeCode) {
        return this.baseMapper.increaseQtyByOrderNo2(orderNo, matnr, batch, qty,bomCode,threeCode) > 0;
    }
    /**
     * 入出库任务生成时,更新单据表中作业数量
     * @param orderId
@@ -95,6 +110,11 @@
    @Override
    public boolean increaseWorkQty(Long orderId, String matnr, String batch, Double workQty) {
        return this.baseMapper.increaseWorkQty(orderId, matnr, batch, workQty) > 0;
    }
    @Override
    public boolean increaseWorkQty(Long orderId, String matnr, String batch, String bomCode, String threeCode, Double workQty) {
        return this.baseMapper.increaseWorkQty2(orderId, matnr, batch, bomCode, threeCode, workQty) > 0;
    }
    @Override
@@ -121,6 +141,11 @@
    }
    @Override
    public boolean increaseAnfme2(Long orderId, String matnr, String batch, Double qty,String bumNum,String threeCode) {
        return this.baseMapper.increaseAnfme2(orderId, matnr, batch, qty,bumNum,threeCode) > 0;
    }
    @Override
    public Map<String, Long> selectCountByMatnr(String matnr, String batch) {
        Map<String,Long> map = new HashMap<>();
        map.put("asrCount",orderDetlMapper.selectCountToAsrByMatnr(matnr, batch));
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -128,11 +128,15 @@
                        }
                        // 更新订单完成数量
                        OrderDetl orderDetl = orderDetlService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch());
                        OrderDetl orderDetl = orderDetlService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(),wrkDetl.getBomCode(),wrkDetl.getThreeCode());
                        try {
                            if(!Cools.isEmpty(orderDetl)){
                                if(!orderDetlService.increaseQtyByOrderNo(wrkDetl.getOrderNo(), wrkDetl.getMatnr(),
                                        wrkDetl.getBatch(),wrkDetl.getAnfme())){
                                if(!orderDetlService.increaseQtyByOrderNo(wrkDetl.getOrderNo(),
                                        wrkDetl.getMatnr(),
                                        wrkDetl.getBatch(),
                                        wrkDetl.getAnfme(),
                                        wrkDetl.getBomCode(),
                                        wrkDetl.getThreeCode())){
//                                    exceptionHandle("全板入库 ===>> 更新订单完成数量失败;[workNo={0}],[locNo={1}]",
//                                            wrkMast.getWrkNo(), wrkMast.getLocNo());
                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@@ -146,6 +150,7 @@
                    if (locMast.getLocSts().equals("S")) {
                        locMast.setLocSts("F");
                        locMast.setBarcode(wrkMast.getBarcode());
                        locMast.setFullPlt(wrkMast.getFullPlt());
                        locMast.setIoTime(now);
                        locMast.setModiTime(now);
                        if (!locMastService.updateById(locMast)) {
@@ -231,10 +236,12 @@
                    }
                    // 修改库存明细数量,如无库存,曾新增
                    for (WrkDetl wrkDetl:wrkDetls54) {
                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch());
                        if (Cools.isEmpty(wrkDetl.getMemo())) {
                            continue;
                        }
                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(),wrkDetl.getBomCode(), wrkDetl.getThreeCode());
                        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.getBomCode(), wrkDetl.getThreeCode())) {
                                exceptionHandle("并板入库 ===>> 修改库存明细数量失败;[workNo={0}],[matnr={1}]", wrkMast.getWrkNo(), wrkDetl.getMatnr());
                            }
                        } else {
@@ -251,14 +258,18 @@
                        }
                        // 更新订单完成数量
                        OrderDetl orderDetl = orderDetlService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch());
                        OrderDetl orderDetl = orderDetlService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBomCode(), wrkDetl.getThreeCode());
                        if (orderDetl == null) {
                            orderDetl = orderDetlService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch());
                            orderDetl = orderDetlService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBomCode(), wrkDetl.getThreeCode());
                        }
                        try {
                            if(!Cools.isEmpty(orderDetl)){
                                if (!orderDetlService.increaseQtyByOrderNo(wrkDetl.getOrderNo(), wrkDetl.getMatnr(),
                                        orderDetl.getBatch(), wrkDetl.getAnfme())) {
                                if (!orderDetlService.increaseQtyByOrderNo(wrkDetl.getOrderNo(),
                                        wrkDetl.getMatnr(),
                                        orderDetl.getBatch(),
                                        wrkDetl.getAnfme(),
                                        wrkDetl.getBomCode(),
                                        wrkDetl.getThreeCode())) {
                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                    return FAIL.setMsg("并板入库 ===>> 更新订单完成数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                                }
src/main/java/com/zy/common/model/DetlDto.java
@@ -20,6 +20,10 @@
    private Double anfme;
    private String bomCode;
    private String threeCode;
    public DetlDto() {
    }
@@ -37,6 +41,13 @@
        this.matnr = matnr;
        this.batch = batch;
        this.anfme = anfme;
    }
    public DetlDto(String matnr, String batch,String bomCode,String threeCode) {
        this.matnr = matnr;
        this.batch = batch;
        this.bomCode = bomCode;
        this.threeCode = threeCode;
    }
@@ -66,6 +77,19 @@
        return false;
    }
    public static boolean has2(List<DetlDto> detlDtos, DetlDto detlDto) {
        for (DetlDto dto : detlDtos) {
            if (dto.getMatnr().equals(detlDto.getMatnr())
                    && Cools.eq(dto.getBatch(), detlDto.getBatch())
                    && Cools.eq(dto.getBomCode(), detlDto.getBomCode())
                    && Cools.eq(dto.getThreeCode(), detlDto.getThreeCode())
            ) {
                return true;
            }
        }
        return false;
    }
    public static DetlDto find(List<DetlDto> detlDtos, String matnr, String batch) {
        if (Cools.isEmpty(matnr)) {
            return null;
src/main/java/com/zy/common/web/WcsController.java
@@ -175,6 +175,13 @@
                break;
            }
        }
        String fullPlt = "N";
        for (WaitPakin waitPakin : waitPakins) {
            if (waitPakin.getIsFull().equals("Y")) {
                fullPlt = "Y";
                break;
            }
        }
        StartupDto dto = commonService.getLocNo(integer, 1, devpNo, matNos, locTypeDto,0);
        int workNo = dto.getWorkNo();
@@ -191,7 +198,7 @@
        wrkMast.setStaNo(dto.getStaNo());
        wrkMast.setLocNo(dto.getLocNo());
        wrkMast.setBarcode(barcode); // 托盘码
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setFullPlt(fullPlt); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("N"); // 空板
src/main/resources/application.yml
@@ -11,7 +11,7 @@
  datasource:
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
#    url: jdbc:sqlserver://192.168.4.15:1433;databasename=phpsasrs
    url: jdbc:sqlserver://10.10.10.233:1433;databasename=phpsasrs
    url: jdbc:sqlserver://127.0.0.1:1433;databasename=phpsasrs
    username: sa
    password: sa@123
  mvc:
src/main/resources/mapper/LocDetlMapper.xml
@@ -67,6 +67,55 @@
        <include refid="batchSeq"></include>
    </select>
    <select id="selectItem2" resultMap="BaseResultMap">
        select top 1 *
        from asr_loc_detl
        where 1=1
        and loc_no = #{locNo}
        and matnr = #{matnr}
        <choose>
            <when test="threeCode != null">
                and three_code = #{threeCode}
            </when>
            <otherwise>
                and (three_code IS NULL)
            </otherwise>
        </choose>
        <choose>
            <when test="bomCode != null">
                and bom_code = #{bomCode}
            </when>
            <otherwise>
                and (bom_code IS NULL)
            </otherwise>
        </choose>
        <include refid="batchSeq"></include>
    </select>
    <delete id="deleteItem2">
        delete from asr_loc_detl
        where 1=1
        and loc_no = #{locNo}
        and matnr = #{matnr}
        <choose>
            <when test="threeCode != null">
                and three_code = #{threeCode}
            </when>
            <otherwise>
                and (three_code IS NULL)
            </otherwise>
        </choose>
        <choose>
            <when test="bomCode != null">
                and bom_code = #{bomCode}
            </when>
            <otherwise>
                and (bom_code IS NULL)
            </otherwise>
        </choose>
        <include refid="batchSeq"></include>
    </delete>
    <delete id="deleteItem">
        delete from asr_loc_detl
        where 1=1
@@ -85,6 +134,32 @@
        <include refid="batchSeq"></include>
    </update>
    <update id="updateAnfme2">
        update asr_loc_detl
        set anfme = #{anfme}
        , modi_time = getdate()
        where 1=1
        and loc_no = #{locNo}
        and matnr = #{matnr}
        <choose>
            <when test="threeCode != null">
                and three_code = #{threeCode}
            </when>
            <otherwise>
                and (three_code IS NULL)
            </otherwise>
        </choose>
        <choose>
            <when test="bomCode != null">
                and bom_code = #{bomCode}
            </when>
            <otherwise>
                and (bom_code IS NULL)
            </otherwise>
        </choose>
        <include refid="batchSeq"></include>
    </update>
    <sql id="stockOutCondition">
        <if test="loc_no!=null and loc_no!='' ">
            and a.loc_no like '%' + #{loc_no} + '%'
src/main/resources/mapper/OrderDetlMapper.xml
@@ -74,6 +74,22 @@
        </if>
    </select>
    <select id="selectItemByOrderNo2" resultMap="BaseResultMap">
        select * from man_order_detl
        where 1=1
        and order_no = #{orderNo}
        and matnr = #{matnr}
        <if test="batch!=null and batch!='' ">
            and batch = #{batch}
        </if>
        <if test="bomCode!=null and bomCode!='' ">
            and bom_code = #{bomCode}
        </if>
        <if test="threeCode!=null and threeCode!='' ">
            and three_code = #{threeCode}
        </if>
    </select>
    <select id="selectWorkingDetls" resultMap="BaseResultMap">
        select * from man_order_detl
        where 1=1
@@ -215,6 +231,38 @@
        </choose>
    </update>
    <update id="increaseQtyByOrderNo2">
        update man_order_detl
        set qty = 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>
        <choose>
            <when test="bomCode != null and bomCode != ''">
                and bom_code = #{bomCode}
            </when>
            <otherwise>
                and (bom_code IS NULL OR bom_code = '')
            </otherwise>
        </choose>
        <choose>
            <when test="threeCode != null and threeCode != ''">
                and three_code = #{threeCode}
            </when>
            <otherwise>
                and (three_code IS NULL OR three_code = '')
            </otherwise>
        </choose>
    </update>
    <update id="increaseWorkQty">
        update man_order_detl
        set work_qty = work_qty + #{workQty}
@@ -231,6 +279,38 @@
        </choose>
    </update>
    <update id="increaseWorkQty2">
        update man_order_detl
        set work_qty = work_qty + #{workQty}
        where 1=1
        and order_id = #{orderId}
        and matnr = #{matnr}
        <choose>
            <when test="batch != null and batch != ''">
                and batch = #{batch}
            </when>
            <otherwise>
                and (batch IS NULL OR batch = '')
            </otherwise>
        </choose>
        <choose>
            <when test="bomCode != null and bomCode != ''">
                and bom_code = #{bomCode}
            </when>
            <otherwise>
                and (bom_code IS NULL OR bom_code = '')
            </otherwise>
        </choose>
        <choose>
            <when test="threeCode != null and threeCode != ''">
                and three_code = #{threeCode}
            </when>
            <otherwise>
                and (three_code IS NULL OR three_code = '')
            </otherwise>
        </choose>
    </update>
    <update id="increaseAnfme">
        update man_order_detl
        set anfme = anfme + #{qty}
@@ -247,6 +327,28 @@
        </choose>
    </update>
    <update id="increaseAnfme2">
        update man_order_detl
        set anfme = anfme + #{qty}
        where 1=1
        and order_id = #{orderId}
        and matnr = #{matnr}
        <choose>
            <when test="batch != null and batch != ''">
                and batch = #{batch}
            </when>
            <when test="bumNum != null and bumNum != ''">
                and bom_code = #{bumNum}
            </when>
            <when test="threeCode != null and threeCode != ''">
                and three_code = #{threeCode}
            </when>
            <otherwise>
                and (batch IS NULL OR batch = '')
            </otherwise>
        </choose>
    </update>
    <update id="increaseWorkQtyByOrderNo">
        update man_order_detl
        set work_qty = work_qty + #{qty}
src/main/webapp/static/js/order/order.js
@@ -45,11 +45,12 @@
        cols: [[
            {type: 'numbers'},
            // {field: 'orderNo', title: '单据编号', templet: '#orderNoTpl'},
            {field: 'orderNo', title: '单据编号',  minWidth: 160, width: 300},
            {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: 'orderNo', title: '单据编号',  minWidth: 160, },
            {field: 'docType$', align: 'center', title: '类型',  minWidth: 160, },
            {field: 'threeCode', title: '销售单号',  minWidth: 160, },
            {align: 'center', title: '明细', toolbar: '#tbLook', minWidth: 160, },
            {field: 'createTime$', title: '创建时间', minWidth: 200, },
            {field: 'settle$', align: 'center', title: '状态', templet: '#settleTpl',  minWidth: 160, },
            {field: 'memo', align: 'center',title: '备注', hide: true},
            {align: 'center', title: '操作', toolbar: '#operate'}
        ]],
@@ -90,6 +91,10 @@
    // 导入销售单
    $("#importOrder").click(function () {
        $("#importExcel").trigger("click");
    });
    // 导入销售单
    $("#importOrder2").click(function () {
        $("#importExcel2").trigger("click");
    });
    // 工具条点击事件
@@ -135,6 +140,7 @@
                            {field: 'matnr', title: '商品编码', width: 160},
                            {field: 'maktx', title: '商品名称', width: 160},
                            {field: 'bomCode', title: 'Bom号'},
                            {field: 'threeCode', title: '销售单号'},
                            {field: 'batch', title: '批号'},
                            {field: 'anfme', title: '数量'},
                            {field: 'supp', title: '立库库存', templet: function (item){
@@ -263,6 +269,7 @@
                        {field: 'maktx', title: '商品名称', width: 200},
                        {field: 'bomCode', title: 'Bom号', style: 'color: blue;font-weight: bold', edit: true, minWidth: 110, width: 110},
                        {field: 'batch', title: '批号', edit: true},
                        {field: 'threeCode', 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},
@@ -602,6 +609,35 @@
    }, function(index){
    });
}
function upload2(obj){
    if(!obj.files) {
        return;
    }
    var file = obj.files[0];
    admin.confirm('确认导入 [' + file.name +'] 文件吗?', function (index) {
        layer.load(1, {shade: [0.1,'#fff']});
        var url = baseUrl + "/order/excel/import2/auth";
        var form = new FormData();
        form.append("file", file);
        let xhr = new XMLHttpRequest();
        xhr.open("post", url, true);
        xhr.setRequestHeader('token', localStorage.getItem('token'));
        xhr.onload = uploadComplete;
        xhr.onerror =  uploadFailed;
        xhr.onloadend = function () {
            layer.closeAll('loading');
        };
        // xhr.upload.onprogress = progressFunction;
        xhr.upload.onloadstart = function(){
            ot = new Date().getTime();
            oloaded = 0;
        };
        xhr.send(form);
    }, function(index){
    });
}
function uploadComplete(evt) {
    let res = JSON.parse(evt.target.responseText);
    if(res.code === 200) {
src/main/webapp/views/order/order.html
@@ -86,7 +86,11 @@
                        <button id="importOrder" class="layui-btn icon-btn btn-add">
                            <i class="layui-icon layui-icon-upload"></i>&nbsp;导入订单
                        </button>
                        <button id="importOrder2" class="layui-btn icon-btn btn-add">
                            <i class="layui-icon layui-icon-upload"></i>&nbsp;导入订单
                        </button>
                        <input style="display:none" id="importExcel" type="file" onchange="upload(this)" >
                        <input style="display:none" id="importExcel2" type="file" onchange="upload2(this)" >
                    </div>
                </div>
            </div>