BarCodeApiService.java 14 KB
package com.huaheng.api.general.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.huaheng.common.utils.Wrappers;
import com.huaheng.api.erp.service.TaskReturnService;
import com.huaheng.api.general.domain.BarCodeDomain;
import com.huaheng.api.wcs.service.taskInfo.TaskInfoService;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.constant.Res;
import com.huaheng.common.exception.BusinessException;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.DateUtils;
import com.huaheng.common.utils.bean.BeanUtils;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.common.utils.spring.SpringUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.pc.barcode.barcodeDetail.domain.BarCodeDetail;
import com.huaheng.pc.barcode.barcodeDetail.service.BarCodeDetailService;
import com.huaheng.pc.barcode.barcodeHeader.domain.BarCodeHeader;
import com.huaheng.pc.barcode.barcodeHeader.service.BarCodeHeaderService;
import com.huaheng.pc.config.material.domain.Material;
import com.huaheng.pc.config.material.service.MaterialService;
import com.huaheng.pc.config.station.domain.Station;
import com.huaheng.pc.receipt.receiptContainerHeader.service.ReceiptContainerHeaderService;
import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService;
import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
import com.huaheng.pc.task.taskHeader.service.ReceiptTaskService;
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;

@Component
@Transactional
public class BarCodeApiService {
    @Resource
    private BarCodeHeaderService barCodeHeaderService;
    @Resource
    private MaterialService materialService;
    @Resource
    private BarCodeDetailService barCodeDetailService;
    @Resource
    private ReceiptHeaderService receiptHeaderService;
    @Resource
    private ReceiptContainerHeaderService receiptContainerHeaderService;


    @Transactional(rollbackFor = Exception.class)
    public AjaxResult addBarCodeApi(BarCodeDomain barCodeDomain){

        AjaxResult ajaxResult = checkBarCode(barCodeDomain);
        if (ajaxResult.getCode()!=200) {
            return AjaxResult.error(ajaxResult.getMsg());
        }
        boolean result;
        BarCodeHeader header = barCodeDomain.getBarCodeHeader();
        BarCodeHeader barCodeHeader = new BarCodeHeader();

        barCodeHeader.setLocked(QuantityConstant.BARCODEHEADER_LOCKED_DEFAULT);
        barCodeHeader.setCode(barCodeHeaderService.createCode("BZXXRK"));
        barCodeHeader.setMaterialBatch(header.getMaterialBatch());
        barCodeHeader.setReceiptType("BZXXRK");
        barCodeHeader.setWarehouseCode(QuantityConstant.DEFAULT_WAREHOUSE);
        barCodeHeader.setCompanyCode(QuantityConstant.DEFAULT_COMPANYCODE);
        if(header.getFbillno() == null || "".equals(header.getFbillno())){
            //生产订单号为空就不回传ERP
            barCodeHeader.setFbillno("0");
        }else{
            barCodeHeader.setFbillno(header.getFbillno());
        }
        barCodeHeader.setCreatedBy(QuantityConstant.PLATFORM_MES);
        barCodeHeader.setBarCodeHeaderCode(header.getCode());
        barCodeHeader.setReceiptNote(header.getReceiptNote());
        barCodeHeader.setEchelon(header.getEchelon());
        barCodeHeader.setTotalQty(BigDecimal.ZERO);
        barCodeHeader.setTotalLines(0);
        barCodeHeader.setTotalWeight(BigDecimal.ZERO);
        result = barCodeHeaderService.save(barCodeHeader);
        if(!result){
            throw new ServiceException("包装头信息创建失败");
        }
        List<BarCodeDetail> barCodeDetails = barCodeDomain.getBarCodeDetails();
        BigDecimal totalQty = BigDecimal.ZERO;
        BigDecimal totalWeight = BigDecimal.ZERO;
        int totalLines = barCodeDetails.size();
        List<BarCodeDetail> bardetaillist=new ArrayList<>();
        for (BarCodeDetail detail : barCodeDetails) {
            BarCodeDetail barCodeDetail = new BarCodeDetail();
            barCodeDetail.setWarehouseCode(QuantityConstant.DEFAULT_WAREHOUSE);
            barCodeDetail.setCompanyCode(QuantityConstant.DEFAULT_COMPANYCODE);
            barCodeDetail.setReceiptId(barCodeHeader.getId());
            barCodeDetail.setCode(detail.getCode());
            barCodeDetail.setDayShift("day");
            AjaxResult ajaxResultCode = barCodeDetailService.createRegenerationCode(1);
            String regenerationCode = (String)ajaxResultCode.getData();
            barCodeDetail.setRegenerationCode(regenerationCode);
            barCodeDetail.setReceiptCode(barCodeHeader.getCode());
            String materialCode = detail.getMaterialCode();
            BigDecimal qty = detail.getQty();
            BigDecimal weight = detail.getWeight();
            BarCodeHeader oneBarCodeHeader = barCodeHeaderService.getOne(new LambdaQueryWrapper<BarCodeHeader>().eq(BarCodeHeader::getId, barCodeHeader.getId()));
            if(header.getEchelon()==null){
                oneBarCodeHeader.setProType("2");//拆解
            }else {
                oneBarCodeHeader.setProType("1");//装配
            }
            barCodeHeaderService.updateById(oneBarCodeHeader);

            if (detail.getCode()==null || "".equals(detail.getCode())) { //没有子条码,属于拆解中的散装,只有重量没有数量,重量赋值给数量
                qty=weight;
            }
            totalQty.add(qty);
            totalWeight.add(weight);
            Material material = materialService.getOne(new LambdaQueryWrapper<Material>().eq(Material::getCode,materialCode));
            barCodeDetail.setMaterialCode(material.getCode());
            barCodeDetail.setMaterialName(material.getName());
            barCodeDetail.setMaterialSpec(material.getSpec());
            barCodeDetail.setMaterialUnit(material.getUnit());
            barCodeDetail.setTotalQty(qty);
            barCodeDetail.setSn(detail.getSn());
            barCodeDetail.setWeight(weight);
            if(barCodeDetail.getCode().length() == 17 || barCodeDetail.getCode().length() == 19){
                String code = barCodeDetail.getCode();
                String productType = code.substring(3,4);
                if(exist(productType)){
                    barCodeDetail = addAttr(barCodeDetail.getCode(),barCodeDetail,header);
                }
            }
            result = barCodeDetailService.save(barCodeDetail);
            if(!result){
                result=false;
                throw new ServiceException("包装子信息创建失败");
            }
            bardetaillist.add(barCodeDetail);
        }
        barCodeHeader.setTotalQty(barCodeHeader.getTotalQty().add(totalQty));
        barCodeHeader.setTotalWeight(barCodeHeader.getTotalWeight().add(totalWeight));
        barCodeHeader.setTotalLines(totalLines);
        barCodeHeader.setLocked(QuantityConstant.BARCODEHEADER_LOCKED);
        result = barCodeHeaderService.updateById(barCodeHeader);
        if(!result){
            throw new ServiceException("更新包装入库头信息失败。");
        }
        //保存原料入库信息
        saveReceiptHeader(barCodeHeader,bardetaillist);
        return AjaxResult.toAjax(result);
    }

    public ReceiptDetail createReceiptDetail(ReceiptHeader receiptHeader){
        ReceiptDetail receiptDetail=new ReceiptDetail();
        receiptDetail.setReceiptId(receiptHeader.getId());
        receiptDetail.setReceiptCode(receiptHeader.getCode());
        receiptDetail.setWarehouseCode(receiptHeader.getWarehouseCode());
        receiptDetail.setCompanyCode(receiptHeader.getCompanyCode());
        receiptDetail.setCreated(receiptHeader.getCreated());
        receiptDetail.setLastUpdatedBy(receiptHeader.getLastUpdatedBy());
        receiptDetail.setLastUpdated(receiptHeader.getLastUpdated());
        return receiptDetail;
    }

    /**
     * 1.先查找主条码有没有未完成的单据
     * 2.有则不新增ReceiptHeader,直接添加明细
     * @param barCodeHeader
     * @param bardetaillist
     * @return
     */
    public ReceiptHeader saveReceiptHeader(BarCodeHeader barCodeHeader,List<BarCodeDetail> bardetaillist){
        LambdaQueryWrapper<ReceiptHeader> receiptHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
        receiptHeaderLambdaQueryWrapper.eq(ReceiptHeader::getBarCodeHeaderCode, barCodeHeader.getBarCodeHeaderCode());
        receiptHeaderLambdaQueryWrapper.lt(ReceiptHeader::getFirstStatus, QuantityConstant.RECEIPT_HEADER_RETURN);
        receiptHeaderLambdaQueryWrapper.orderByDesc(ReceiptHeader::getId);
        List<ReceiptHeader> receiptHeaderList=receiptHeaderService.list(receiptHeaderLambdaQueryWrapper);
        ReceiptHeader receiptHeader=null;
        int totalQty=0;
        int totalLines=0;
        if(receiptHeaderList!=null&&receiptHeaderList.size()>0){
            receiptHeader=receiptHeaderList.get(0);
            totalQty=receiptHeader.getTotalQty().intValue();
            totalLines=receiptHeader.getTotalLines();
        }else{
            receiptHeader=new ReceiptHeader();
            BeanUtils.copyBeanProp(receiptHeader,barCodeHeader);
            receiptHeader.setReceiptType("CPRK");
            receiptHeader.setId(null);
            String receiptCode = receiptHeaderService.createCode(receiptHeader.getReceiptType());
            receiptHeader.setCode(receiptCode);
            receiptHeader.setBarCodeHeaderId(barCodeHeader.getId());
            receiptHeader.setBarCodeHeaderCode(barCodeHeader.getBarCodeHeaderCode());
            receiptHeader.setFirstStatus(QuantityConstant.RECEIPT_HEADER_BUILD);
            receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_BUILD);

            receiptHeader.setCreatedBy(ShiroUtils.getLoginName());
            receiptHeader.setCreated(new Date());
            receiptHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
            receiptHeader.setLastUpdated(new Date());

            receiptHeaderService.save(receiptHeader);
        }
        ReceiptDetail receiptDetail=createReceiptDetail(receiptHeader);
        //保存详情
        receiptContainerHeaderService.saveReceiptDetail(bardetaillist,receiptDetail,false);

        receiptHeader.setTotalQty(new BigDecimal(totalQty+barCodeHeader.getTotalQty().intValue()));
        receiptHeader.setTotalLines(totalLines+barCodeHeader.getTotalLines());
        receiptHeaderService.updateById(receiptHeader);
        return receiptHeader;
    }


    public AjaxResult checkBarCode(BarCodeDomain barCodeDomain) {
        BarCodeHeader barCodeHeader = barCodeDomain.getBarCodeHeader();
        String barCodeHeaderCode = barCodeHeader.getCode();
        if(barCodeHeaderCode == null || "".equals(barCodeHeaderCode)){
            return AjaxResult.error("没有托盘号!");
        }

//        if(barCodeHeader.getFbillno() == null || "".equals(barCodeHeader.getFbillno())){
//            return AjaxResult.error("没有生产订单编号");
//        }

        BarCodeHeader one = barCodeHeaderService.getOne(new LambdaQueryWrapper<BarCodeHeader>()
                .eq(BarCodeHeader::getBarCodeHeaderCode,barCodeHeaderCode)
                .eq(BarCodeHeader::getFbillno,barCodeHeader.getFbillno()));
        if(one != null){
            return AjaxResult.error("包装信息头错误:托盘号【"+barCodeHeaderCode+"】和生产订单号都重复了 "+barCodeHeader.getFbillno());
        }

        List<BarCodeDetail> barCodeDetailList = barCodeDomain.getBarCodeDetails();
        for (BarCodeDetail barCodeDetail : barCodeDetailList) {

            String materialCode = barCodeDetail.getMaterialCode();
            if(materialCode == null){
                return AjaxResult.error("物料编码为空");
            }
            Material material = materialService.getOne(new LambdaQueryWrapper<Material>().eq(Material::getCode,barCodeDetail.getMaterialCode()));
            if(material == null){
                return AjaxResult.error("没有该物料编码:"+materialCode);
            }
        }
        return AjaxResult.success();
    }

    private BarCodeDetail addAttr(String barCode,BarCodeDetail detail,BarCodeHeader header){
        String type = "";
        if(barCode.length()==17){
            detail.setCode(barCode+"RC");
            type = "RC";
        }else if(barCode.length()==19){
            type = barCode.substring(17,19);
        }else if("1".equals(header.getEchelon())){
            type = "RM";
        }
        String productType = barCode.substring(3,4);
        String batteryType = barCode.substring(4,5);
        String productDate = barCode.substring(7,10);
        String year = productDate.substring(0, 1);
        String month = productDate.substring(1, 2);
        String day = productDate.substring(2, 3);

        String days = Res.string().dateKey(day);
        String years = Res.string().yearKey(year);
        Date inTime = DateUtils.dateTime("yyyy-MM-dd", years + "-" + month + "-" + days);

        //默认都是 1 梯级利用 (0是再生利用 再生利用需要填type)
        detail.setStorageType("1");
//        detail.setType("1");
        detail.setConstitute(Res.string().batteryKey(type));
        detail.setProductType(Res.string().batteryKey(productType+"1"));
        detail.setBatteryModel(Res.string().batteryKey(batteryType));
        detail.setWarehouseInTime(inTime);
        return detail;
    }

    private Boolean exist(String proTypeStr){
        if(StringUtils.isNotEmpty(proTypeStr)){
            if(proTypeStr.contains("P")){
                return true;
            }
            if(proTypeStr.contains("M")){
                return true;
            }
            if(proTypeStr.contains("C")){
                return true;
            }
        }
        return false;
    }
}