ReceiptAPIService.java 17.4 KB
package com.huaheng.api.general.service;


import com.alibaba.fastjson.JSON;
import com.huaheng.api.general.domain.ReceiptItems;
import com.huaheng.api.general.domain.ReceiptObject;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.http.HttpUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.pc.config.address.domain.Address;
import com.huaheng.pc.config.address.service.IAddressService;
import com.huaheng.pc.general.company.domain.Company;
import com.huaheng.pc.general.company.service.ICompanyService;
import com.huaheng.pc.general.material.domain.Material;
import com.huaheng.pc.general.material.service.IMaterialService;
import com.huaheng.pc.general.warehouse.domain.Warehouse;
import com.huaheng.pc.general.warehouse.service.IWarehouseService;
import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
import com.huaheng.pc.receipt.receiptDetail.service.IReceiptDetailService;
import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.receipt.receiptHeader.service.IReceiptHeaderService;
import com.huaheng.pc.task.task.domain.Task;
import com.huaheng.pc.task.task.service.ITaskService;
import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
import com.huaheng.pc.task.taskDetail.service.ITaskDetailService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
public class ReceiptAPIService {


    @Autowired
    private IReceiptHeaderService receiptHeaderService;
    @Autowired
    private IReceiptDetailService receiptDetailService;
    @Autowired
    private IMaterialService materialService;
    @Autowired
    private ICompanyService companyService;
    @Autowired
    private IWarehouseService warehouseService;
    @Autowired
    private ITaskService taskService;
    @Autowired
    private ITaskDetailService taskDetailService;
    @Autowired
    private IAddressService addressService;

    private static final Logger log = LoggerFactory.getLogger(ReceiptAPIService.class);

    //入库单下发
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult insertReceipt(ReceiptObject receiptObject){
        log.warn("入库单下发数据:"+ receiptObject);
        //主单校验

        if(StringUtils.isEmpty(receiptObject.getReceiptCode()) ||
                StringUtils.isEmpty(receiptObject.getWarehouseCode()) ||
                StringUtils.isEmpty(receiptObject.getCompanyCode()) ||
                StringUtils.isEmpty(receiptObject.getReceiptType())
                    ){
                return AjaxResult.error("入库信息主单数据必填项有误");
        }
        /*单据的重复校验,"receiptId":"","receiptCode":""*/




        //明细校验
        if(receiptObject.getReceiptItems() == null || receiptObject.getReceiptItems().size() < 1){
            return AjaxResult.error("明细子单没有数据!");
        }
        if(receiptObject.getReceiptItems().size() > 200){
           return AjaxResult.error("明细单不能超过200行");
        }
        List<ReceiptItems> receiptItemsList = receiptObject.getReceiptItems();
        //判断入库类型是否匹配
        /*if(!dictDataService.checkConfig("receiptType", receiptApiHeader.getReceiptType())){
            throw new ServiceException("没有对应的入库单类型");
        }*/
        ReceiptHeader header = new ReceiptHeader();
        header.setCode(receiptHeaderService.createCode(receiptObject.getReceiptType()));//主单编码
        Date date = null;
        if(StringUtils.isNotEmpty(receiptObject.getcDatetime())){
        try{
            DateFormat fmt =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            date = fmt.parse(receiptObject.getcDatetime());
        }catch (Exception e){
            throw new ServiceException(e.toString());
        }
            header.setCreated(date);
        }else {
            header.setCreated(new Date());
        }
        header.setStation(String.valueOf(2));
        header.setType(receiptObject.getReceiptType());
        header.setSourceCode(receiptObject.getReceiptId().toString());
        header.setSourcePlatform("ERP");
        header.setFirstStatus((short) 0);
        header.setLastStatus((short) 0);
        header.setCreatedBy("ERP");
        header.setLastUpdated(new Date());
        header.setLastUpdatedBy("ERP");
        header.setTotalQty(new BigDecimal(0));
        header.setTotalLines(0);
        //校验货主和仓库
        Company company=new Company();
        company.setCode(receiptObject.getCompanyCode());
        company = companyService.selectFirstEntity(company);
        if (company == null) {
            return AjaxResult.error("系统没有该货主");
        } else {
            header.setCompanyId(company.getId());
        }
        Warehouse warehouse= new Warehouse();
        warehouse.setCode(receiptObject.getWarehouseCode());
        warehouse = warehouseService.selectFirstEntity(warehouse);
        if (warehouse == null) {
            return AjaxResult.error("系统没有该仓库");
        } else {
            header.setWarehouseId(warehouse.getId());
        }
        header.setCompanyCode(company.getCode());
        header.setWarehouseCode(warehouse.getCode());
        header.setUploadStatus(0);
        //插入主单
        int j = receiptHeaderService.insert(header);
        if(j < 1){
            throw new ServiceException("新增入库主单失败!");
        }
        //明细单
        BigDecimal totalQty = BigDecimal.ZERO;
        List<ReceiptDetail> receiptDetails = new ArrayList<>();
        for(ReceiptItems item : receiptItemsList){
            //校验数据
            if(StringUtils.isEmpty(item.getItemCode()) ||
                item.getQty() == null ||
                    item.getQty() ==0 ){
                throw new ServiceException("入库明细单必填项数据错误!");
            }
            Material materialTmp = new Material();
            materialTmp.setCode(item.getItemCode());
            materialTmp.setName(item.getItemName());
            materialTmp.setSpecification(item.getItemSpecification());
            materialTmp.setWarehouseCode(receiptObject.getWarehouseCode());
            Material material = materialService.selectFirstEntity(materialTmp);
            if (StringUtils.isNull(material) ) {
                throw new ServiceException("没有该物料");
            }
            ReceiptDetail receiptDetail = new ReceiptDetail();

            receiptDetail.setWarehouseId(header.getWarehouseId());
            receiptDetail.setWarehouseCode(header.getWarehouseCode());
            receiptDetail.setCompanyId(header.getCompanyId());
            receiptDetail.setCompanyCode(header.getCompanyCode());
            receiptDetail.setSourceCode(item.getItemId().toString());
            receiptDetail.setSourceLine(receiptObject.getReceiptId().toString());
            receiptDetail.setReceiptId(header.getId());
            receiptDetail.setReceiptCode(header.getCode());
            receiptDetail.setMaterialId(material.getId());
            receiptDetail.setMaterialCode(material.getCode());
//            receiptDetail.setMaterialName(material.getName());
//            receiptDetail.setSpecification(material.getSpecification());
            receiptDetail.setBatch(item.getItemBatch());
            receiptDetail.setLot("");
            receiptDetail.setProject(item.getItemProject());
            receiptDetail.setManufactureDate(null);
            receiptDetail.setExpirationDate(null);
            if(StringUtils.isNotEmpty(item.getItemState())){
                receiptDetail.setInventoryStatus(item.getItemState());
            }else{
                receiptDetail.setInventoryStatus("good");
            }
            try {
                receiptDetail.setQty(BigDecimal.valueOf(item.getQty()));
            }catch (Exception e){
                throw new ServiceException(e.toString());
            }
            receiptDetail.setQtyCompleted(new BigDecimal("0"));
            receiptDetail.setPrice(new BigDecimal("0"));
            receiptDetail.setStatus((short) 0);
            receiptDetail.setCreated(date);
            receiptDetail.setCreatedBy("ERP");
            receiptDetail.setLastUpdated(new Date());
            receiptDetail.setLastUpdatedBy("ERP");
            receiptDetail.setZoneCode("LK");
            if(StringUtils.isNotEmpty(item.getItemUnit())){
                receiptDetail.setUnit(item.getItemUnit());
            }else{
                receiptDetail.setUnit("PCS");
            }
            receiptDetail.setDeleted(false);
            receiptDetail.setUserDef1("");
            receiptDetail.setUserDef2("");
            receiptDetail.setUserDef3("");
            receiptDetails.add(receiptDetail);
            //更新表头的总行数和总数量统计
            totalQty = totalQty.add(receiptDetail.getQty());
        }
        //批量插入入库明细
        int k = receiptDetailService.insertBatch(receiptDetails);
        if(receiptDetails.size() != k){
            throw new ServiceException("明细单插入失败");
        }
        //更新表头的总行数和总数量统计
        header.setTotalQty(totalQty);
        header.setTotalLines( receiptDetails.size());
        receiptHeaderService.updateByModel(header);
        return AjaxResult.success("入库单据下发成功");
    }


    /**
     * 入库单单据回传
     *任务回传
     * **/
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult confirmReceipt() {
        /*根据任务回传*/
        //查询已完成的任务回传,回传成功修改状态
        Task task = taskService.selectReceiptConfirm();
        if (StringUtils.isNull(task)) {
            return AjaxResult.success("没有需要回传的入库任务!");
        }
        //获取明细
        TaskDetail taskDetailt = new TaskDetail();
        taskDetailt.setWarehouseCode(task.getWarehouseCode());
        taskDetailt.setTaskId(task.getId());
        List<TaskDetail> taskDetails = taskDetailService.selectListEntityByEqual(taskDetailt);
        if(taskDetails == null || taskDetails.size() < 1){
            return AjaxResult.success(task.getId() + "任务没有明细");
        }
        //set回传实体
        String timeStr = null; //时间
        try{
            timeStr= LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        }catch (Exception e) {
            throw new ServiceException("获取时间错误!");
        }
        ReceiptObject receiptObject = new ReceiptObject();
        receiptObject.setReceiptId(task.getId());
        receiptObject.setWarehouseCode(task.getWarehouseCode());
        receiptObject.setCompanyCode(task.getCompanyCode());
        receiptObject.setcDatetime(timeStr);
        receiptObject.setContainerCode(task.getDestinationLocation());
        receiptObject.setLocationCode(task.getContainerCode());
        //set任务明细
        List<ReceiptItems> receiptItemsList = new ArrayList<>();

        for(TaskDetail detail:taskDetails){
            ReceiptItems receiptItems = new ReceiptItems();
            //物料
            Material material = materialService.getMaterial(detail.getMaterialCode());
            if(StringUtils.isNull(material)){
                return AjaxResult.error("物料错误");
            }
            //入库明细单
            ReceiptDetail receiptDetail = receiptDetailService.selectEntityById(detail.getBillDetailId());
            if(StringUtils.isNull(receiptDetail)){
                return AjaxResult.error("入库明细错误。");
            }
            receiptItems.setReceiptCode(detail.getBillCode());
            receiptItems.setItemId(detail.getId());
            receiptItems.setItemCode(detail.getMaterialCode());
            receiptItems.setItemName(detail.getMaterialName());
            receiptItems.setItemSpecification(material.getSpecification());
            receiptItems.setItemBatch(detail.getBatch());
            receiptItems.setItemState(receiptDetail.getInventoryStatus());
            try {
                receiptItems.setQty(detail.getQty().floatValue());
            }catch (Exception e){
                throw new ServiceException(e.toString());
            }
            receiptItems.setItemUnit("PCS");
            receiptItemsList.add(receiptItems);
        }

        receiptObject.setReceiptItems(receiptItemsList);
        //json
        //AjaxResult<ReceiptObject> ajaxResult = JSON.parseObject(receiptObject, new TypeReference<AjaxResult<ReceiptObject>>() {});
        String jsonParam = JSON.toJSONString(receiptObject);
        //url
        Address address = new Address();
        address.setWarehouseCode("TD0001");
        address.setParam("u8ConfirmReceipt");
        address = addressService.selectEntity(address);
        if(address == null || StringUtils.isEmpty(address.getUrl())){
            return AjaxResult.error("回传URL为空!");
        }
        String url = address.getUrl();
        String result = HttpUtils.bodypost(url, jsonParam);
        AjaxResult ajaxResult = JSON.parseObject(result, AjaxResult.class);
        if(ajaxResult.getCode() != 200){
            throw new ServiceException("入库单回传ERP回复异常,回传失败!");
        }
        //修改任务的回传状态
        task.setFirstStatus((short) 120);
        task.setLastStatus((short) 120);
        int j = taskService.updateByModel(task);
        if(j < 1){
            throw new ServiceException(task.getId() + "任务回传状态修改失败");
        }
        return AjaxResult.success("入库 " + task.getId() + "回传ERP成功");
    }




    /**
     * 入库单单据回传
     *整单回传
     * **/
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult confirmReceiptA(String url)
    {
        ReceiptHeader receiptHeader = new ReceiptHeader();
        receiptHeader.setWarehouseCode("TD0001");
        receiptHeader.setLastStatus((short)800);
        ReceiptHeader header = receiptHeaderService.selectFirstEntity(receiptHeader);
        if (StringUtils.isNull(header)) {
            return AjaxResult.success("没有需要回传的主单");
        }
        ReceiptDetail receiptDetail = new ReceiptDetail();
        receiptDetail.setReceiptCode(header.getCode());
        receiptDetail.setWarehouseCode(header.getWarehouseCode());
        List<ReceiptDetail> receiptDetails = receiptDetailService.selectListEntityByEqual(receiptDetail);
        if (receiptDetails == null || receiptDetails.size() < 1) {
            return AjaxResult.error("该入库主单没有子单");
        }
        ReceiptObject receiptObject = new ReceiptObject();
        //主单写入
        receiptObject.setReceiptId(header.getId());
        receiptObject.setReceiptCode(header.getCode());
        receiptObject.setReceiptType(header.getType());
        receiptObject.setWarehouseCode(header.getWarehouseCode());
        receiptObject.setCompanyCode(header.getCompanyCode());
        String dateTime = null;
        try{
            dateTime = new java.sql.Timestamp(System.currentTimeMillis()).toString();
        }catch (Exception e){
            throw new ServiceException(e.toString());
        }
        receiptObject.setcDatetime(dateTime);
        //明细
        List<ReceiptItems> receiptItemsList = new ArrayList<>();
        for (ReceiptDetail item:receiptDetails){
                ReceiptItems receiptItems = new ReceiptItems();
                receiptItems.setItemId(item.getId());
                receiptItems.setItemCode(item.getMaterialCode());
                Material materialTmp = new Material();
                materialTmp.setCode(item.getMaterialCode());
                materialTmp.setWarehouseCode(receiptHeader.getWarehouseCode());
                Material material = materialService.selectFirstEntity(materialTmp);
                if (StringUtils.isNull(material) ) {
                    return AjaxResult.error("没有该物料");
                }
                receiptItems.setItemName(material.getName());
                receiptItems.setItemSpecification(material.getSpecification());
                receiptItems.setItemBarcode(material.getBarcode());
                receiptItems.setItemBatch(item.getProject());
                receiptItems.setItemState(item.getInventoryStatus());
                try{
                    receiptItems.setQty(item.getQty().floatValue());
                }catch (Exception e){
                    throw new ServiceException(e.toString());
                }
                receiptItems.setItemUnit("PCS");
                receiptItemsList.add(receiptItems);
        }
        //set
        receiptObject.setReceiptItems(receiptItemsList);

        String JsonParam = JSON.toJSONString(receiptObject);
        String result = HttpUtils.bodypost(url, JsonParam);
        AjaxResult ajaxResult = JSON.parseObject(result, AjaxResult.class);
        if(ajaxResult.getCode() != 200){
            throw new ServiceException("入库单回传ERP回复异常,回传失败!");
        }
        receiptHeader.setFirstStatus((short)900);
        receiptHeader.setLastStatus((short)900);
        receiptHeader.setUploadTime(new Date());
        receiptHeaderService.updateByModel(receiptHeader);
        return ajaxResult;
    }
}