MobileReceiptController.java 21.3 KB
package com.huaheng.receipt.mobile;

import com.alibaba.fastjson.JSONException;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.common.core.constant.QuantityConstant;
import com.huaheng.common.core.exception.ServiceException;
import com.huaheng.common.core.utils.StringUtils;
import com.huaheng.common.core.web.domain.AjaxResult;
import com.huaheng.common.security.utils.SecurityUtils;
import com.huaheng.config.api.RemoteContainerService;
import com.huaheng.config.api.RemoteLocationService;
import com.huaheng.config.api.RemoteMaterialService;
import com.huaheng.config.api.domain.Container;
import com.huaheng.config.api.domain.Location;
import com.huaheng.config.api.domain.Material;
import com.huaheng.receipt.api.domain.ReceiptContainerDetail;
import com.huaheng.receipt.api.domain.ReceiptContainerHeader;
import com.huaheng.receipt.api.domain.ReceiptDetail;
import com.huaheng.receipt.api.domain.ReceiptHeader;
import com.huaheng.receipt.receipt.domain.ReceiptBill;
import com.huaheng.receipt.receipt.mapper.ReceiptHeaderMapper;
import com.huaheng.receipt.receipt.service.ReceiptDetailService;
import com.huaheng.receipt.receipt.service.ReceiptHeaderService;
import com.huaheng.receipt.receiptContainer.domain.ReceiptContainerView;
import com.huaheng.receipt.receiptContainer.service.ReceiptContainerDetailService;
import com.huaheng.receipt.receiptContainer.service.ReceiptContainerHeaderService;
import com.huaheng.task.api.RemoteTaskDetailService;
import com.huaheng.task.api.RemoteTaskService;
import com.huaheng.task.api.domain.TaskDetail;
import com.huaheng.task.api.domain.TaskHeader;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

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

/**
 *
 * @author Enzo Cotter
 * @date 2019/12/15
 */
@CrossOrigin
@RestController
@RequestMapping("/mobile")
@Api(tags = {"移动端收货"}, value = "移动端收货MobileBatchReceiptController")
public class MobileReceiptController {

    @Resource
    private ReceiptContainerHeaderService receiptContainerHeaderService;
    @Resource
    private ReceiptHeaderService receiptHeaderService;
    @Resource
    private ReceiptDetailService receiptDetailService;
    @Resource
    private ReceiptContainerDetailService receiptContainerDetailService;
    @Resource
    private ReceiptHeaderMapper receiptHeaderMapper;
    @Resource
    private RemoteContainerService containerService;
    @Resource
    private RemoteLocationService locationService;
    @Resource
    private RemoteTaskService taskHeaderService;
    @Resource
    private RemoteTaskDetailService taskDetailService;
    @Resource
    private RemoteMaterialService materialService;



    @PostMapping("/searchReceiptInCondition")
    @ApiOperation("移动端查询入库单")
    public AjaxResult searchReceiptInCondition(@RequestBody @ApiParam(value = "物料号") Map<String, String> param){
        String companyCode = param.get("companyCode");
        String code = param.get("code");
        String receiptType = param.get("receiptType");
        String lastStatus = param.get("lastStatus");
        String startTime = param.get("startTime");
        String endTime = param.get("endTime");
        LambdaQueryWrapper<ReceiptHeader> receiptQueryWrapper = Wrappers.lambdaQuery();
        receiptQueryWrapper.eq(ReceiptHeader::getCompanyCode, companyCode)
                .eq(ReceiptHeader::getWarehouseCode, SecurityUtils.getWarehouseCode())
                .like(StringUtils.isNotEmpty(code), ReceiptHeader::getCode, code)
                .eq(StringUtils.isNotEmpty(receiptType), ReceiptHeader::getReceiptType, receiptType)
                .eq(StringUtils.isNotEmpty(lastStatus), ReceiptHeader::getLastStatus, lastStatus)
                .gt(StringUtils.isNotEmpty(startTime), ReceiptHeader::getCreated, startTime)
                .le(StringUtils.isNotEmpty(endTime), ReceiptHeader::getCreated, endTime)
                .orderByDesc(ReceiptHeader::getCreated);
        List<ReceiptHeader>  receiptDetailList = receiptHeaderService.list(receiptQueryWrapper);
        return AjaxResult.success(receiptDetailList);
    }

    @PostMapping("/findReceipt")
    @ApiOperation("移动端查询入库单")
    public AjaxResult findReceipt(@RequestBody @ApiParam(value = "物料号") Map<String, String> param){
        String receiptCode = param.get("receiptCode");
        String companyCode = param.get("companyCode");
        if (StringUtils.isNull(receiptCode)){
            return AjaxResult.error("上游系统关联单号为空");
        } else if (StringUtils.isNull(companyCode)){
            return AjaxResult.error("公司编码为空");
        }

        /* 查询入库单,如果数据库中不存在,则调用ERP接口拉取单据,成功后再次查询返回结果*/
        LambdaQueryWrapper<ReceiptHeader> receiptLambdaQueryWrapper = Wrappers.lambdaQuery();
        receiptLambdaQueryWrapper.eq(ReceiptHeader::getCode, receiptCode)
                .eq(ReceiptHeader::getCompanyCode, companyCode);
        ReceiptHeader receiptHeader = receiptHeaderService.getOne(receiptLambdaQueryWrapper);
        if(receiptHeader == null) {
            return AjaxResult.error("没有找到入库单");
        }
        ReceiptDomain receipt = new ReceiptDomain();
        receipt.setReceiptHeader(receiptHeader);

        LambdaQueryWrapper<ReceiptDetail> receiptDetailQueryWrapper = Wrappers.lambdaQuery();
        receiptDetailQueryWrapper.eq(ReceiptDetail::getReceiptId, receiptHeader.getId());
        List<ReceiptDetail> receiptDetailList = receiptDetailService.list(receiptDetailQueryWrapper);
        receipt.setReceiptDetails(receiptDetailList);
        return AjaxResult.success(receipt);
    }

    @PostMapping("/listReceipt")
    @ApiOperation("移动端根据表单整盘入库")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult listReceipt(@RequestBody @ApiParam(value="收货单") List<ReceiptBill> receiptBills) throws Exception {
        if (receiptBills == null || receiptBills.size() <=0) {
            throw new JSONException("没有收货信息");
        }
        String containerCode = receiptBills.get(0).getReceiptContainerCode();
        String companyCode = receiptBills.get(0).getCompanyCode();
        String receiptDetailId = receiptBills.get(0).getReceiptDetailId();
        String locationCode = receiptBills.get(0).getLocationCode();

        Container container = containerService.getContainerByCode(containerCode);
        if(container == null) {
            return AjaxResult.error("不存在这个托盘");
        }

        if(locationCode != null) {
            Location location = locationService.getLocationByCode(locationCode);
            if(location == null) {
                throw new JSONException("不存在这个托盘");
            }
            if(!"empty".equals(location.getStatus())) {
                throw new JSONException("库位状态不是空闲");
            }
        }

        LambdaQueryWrapper<ReceiptDetail> receiptDetailQueryWrapper = Wrappers.lambdaQuery();
        receiptDetailQueryWrapper.eq(ReceiptDetail::getId, receiptDetailId);
        ReceiptDetail receiptDetail = receiptDetailService.getOne(receiptDetailQueryWrapper);
        if(receiptDetail == null) {
            throw new JSONException("没有找到入库单详情");
        }

        LambdaQueryWrapper<ReceiptHeader> receiptHeaderQueryWrapper = Wrappers.lambdaQuery();
        receiptHeaderQueryWrapper.eq(ReceiptHeader::getId, receiptDetail.getReceiptId());
        ReceiptHeader receiptHeader = receiptHeaderService.getOne(receiptHeaderQueryWrapper);
        if(receiptHeader == null) {
            throw new JSONException("没有找到入库单");
        }

        List<ReceiptContainerView> receiptContainerViewList = new ArrayList<>();
        for(ReceiptBill receiptBill : receiptBills) {
            if(receiptBill.getQty().compareTo(BigDecimal.ZERO) == 0) {
                continue;
            }
            ReceiptContainerView receiptContainerView = new ReceiptContainerView();
            receiptContainerView.setLocationCode(receiptBill.getLocationCode());
            receiptContainerView.setCompanyCode(receiptBill.getCompanyCode());
            receiptContainerView.setReceiptContainerCode(containerCode);
            receiptContainerView.setReceiptDetailId(Integer.parseInt(receiptBill.getReceiptDetailId()));
            receiptContainerView.setQty(receiptBill.getQty());
            receiptContainerView.setTaskType((short)100);
            receiptContainerViewList.add(receiptContainerView);
        }
        AjaxResult retResult = receiptContainerHeaderService.batchSave(receiptContainerViewList);
        return retResult;
    }

    @PostMapping("/quickReceipt")
    @ApiOperation("移动端收货保存")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult quickReceipt(@RequestBody @ApiParam(value="收货单") List<ReceiptBill> receiptBills) throws Exception {
        if (receiptBills == null || receiptBills.size() <=0) {
            throw new JSONException("没有收货信息");
        }
        String containerCode = receiptBills.get(0).getReceiptContainerCode();
        String locationCode = receiptBills.get(0).getLocationCode();
        String companyCode = receiptBills.get(0).getCompanyCode();
        String receiptDetailId = receiptBills.get(0).getReceiptDetailId();

        Container container = containerService.getContainerByCode(containerCode);
        if(container == null) {
            throw new JSONException("不存在这个托盘");
        }
        if(locationCode != null && locationCode.equals(container.getLocationCode())) {
            /* 查询未完成的入库任务*/
            TaskHeader taskHeader = taskHeaderService.getUnCompleteReceiptTask(containerCode);
            if(taskHeader == null) {
                throw new JSONException("没有找到托盘对应的任务");
            }
            LambdaQueryWrapper<ReceiptDetail> receiptDetailQueryWrapper = Wrappers.lambdaQuery();
            receiptDetailQueryWrapper.eq(ReceiptDetail::getId, receiptDetailId);
            ReceiptDetail receiptDetail = receiptDetailService.getOne(receiptDetailQueryWrapper);
            if(receiptDetail == null) {
                throw new JSONException("没有找到入库单详情");
            }

            LambdaQueryWrapper<ReceiptHeader> receiptHeaderQueryWrapper = Wrappers.lambdaQuery();
            receiptHeaderQueryWrapper.eq(ReceiptHeader::getId, receiptDetail.getReceiptId());
            ReceiptHeader receiptHeader = receiptHeaderService.getOne(receiptHeaderQueryWrapper);
            if(receiptHeader == null) {
                throw new JSONException("没有找到入库单");
            }

            LambdaQueryWrapper<ReceiptContainerHeader> lambda = Wrappers.lambdaQuery();
            lambda.eq(ReceiptContainerHeader::getContainerCode, containerCode)
                    .lt(ReceiptContainerHeader::getStatus, QuantityConstant.RECEIPT_CONTAINER_FINISHED);
            List<ReceiptContainerHeader> list = receiptContainerHeaderService.list(lambda);
            if (list.size() >= 1){
                throw new ServiceException("容器已经生成任务,不能放物料了!");
            }
            ReceiptContainerHeader receiptContainerHeader = new ReceiptContainerHeader();
            //如果不存在记录则新建记录
            receiptContainerHeader.setWarehouseCode(SecurityUtils.getWarehouseCode());
            receiptContainerHeader.setCompanyCode(companyCode);
            receiptContainerHeader.setContainerCode(containerCode);
            Container container2 = containerService.getContainerByCode(containerCode);
            receiptContainerHeader.setContainerType(container2.getContainerType());
            receiptContainerHeader.setTaskType(QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT);
            receiptContainerHeader.setFromLocation(container2.getLocationCode());
            receiptContainerHeader.setToLocation(locationCode);
            receiptContainerHeader.setCreatedBy(SecurityUtils.getUsername());
            receiptContainerHeader.setLastUpdatedBy(SecurityUtils.getUsername());
            receiptContainerHeader.setStatus(10);

            if (!receiptContainerHeaderService.save(receiptContainerHeader)){
                throw new ServiceException("入库组盘头表保存失败");
            }

            receiptHeader.setFirstStatus(QuantityConstant.RECEIPT_HEADER_RECEIVING);
            receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_RECEIVING);
            receiptHeaderService.update(receiptHeader, receiptHeaderQueryWrapper);

            taskHeader.setAllocationHeadId(receiptContainerHeader.getId());
            taskHeaderService.updateById(taskHeader);
            for(ReceiptBill receiptBill : receiptBills) {


                LambdaQueryWrapper<ReceiptDetail> receiptDetail2QueryWrapper = Wrappers.lambdaQuery();
                receiptDetail2QueryWrapper.eq(ReceiptDetail::getId, receiptBill.getReceiptDetailId());
                ReceiptDetail receiptDetail2 = receiptDetailService.getOne(receiptDetail2QueryWrapper);
                if(receiptDetail2 == null) {
                    throw new JSONException("没有找到入库单详情");
                }

                BigDecimal openQty = receiptDetail2.getOpenQty();
                BigDecimal totalQty = receiptDetail2.getTotalQty();
                BigDecimal qty = openQty.add(receiptBill.getQty());
                if(totalQty.subtract(qty).compareTo(BigDecimal.ZERO) < 0) {
                    throw new Exception("配盘数量大于表单数量");
                }

                receiptDetail2.setOpenQty(qty);
                receiptDetailService.update(receiptDetail2, receiptDetail2QueryWrapper);

                ReceiptContainerDetail receiptContainerDetail = new ReceiptContainerDetail();
                receiptContainerDetail.setReceiptContainerId(receiptContainerHeader.getId());
                receiptContainerDetail.setWarehouseCode(SecurityUtils.getWarehouseCode());
                receiptContainerDetail.setReceiptId(receiptHeader.getId());
                receiptContainerDetail.setReceiptDetailId(receiptDetail2.getId());
                receiptContainerDetail.setReceiptCode(receiptHeader.getCode());
                receiptContainerDetail.setReceiptType(receiptHeader.getReceiptType());
                receiptContainerDetail.setLocationCode(locationCode);
                receiptContainerDetail.setContainerCode(containerCode);
                receiptContainerDetail.setContainerType(container.getContainerType());
                receiptContainerDetail.setCompanyCode(companyCode);

//                LambdaQueryWrapper<Material> materialQueryWrapper = Wrappers.lambdaQuery();
//                materialQueryWrapper.eq(Material::getCode, receiptBill.getMaterialCode())
//                        .eq(Material::getDeleted, 0);
                Material material = materialService.getByCode(receiptBill.getMaterialCode());

                receiptContainerDetail.setMaterialCode(material.getCode());
                receiptContainerDetail.setMaterialName(material.getName());
                receiptContainerDetail.setMaterialSpec(material.getSpec());
                receiptContainerDetail.setMaterialUnit(material.getUnit());
                receiptContainerDetail.setQty(receiptBill.getQty());
                receiptContainerDetail.setStatus(10);
                receiptContainerDetail.setCreatedBy(SecurityUtils.getUsername());
                receiptContainerDetail.setLastUpdatedBy(SecurityUtils.getUsername());
                receiptContainerDetailService.save(receiptContainerDetail);

                TaskDetail taskDetail = new TaskDetail();
                taskDetail.setTaskId(taskHeader.getId());
                taskDetail.setContainerCode(containerCode);
                taskDetail.setTaskType(taskHeader.getTaskType());
                taskDetail.setInternalTaskType(taskHeader.getInternalTaskType());
                taskDetail.setWarehouseCode(SecurityUtils.getWarehouseCode());
                taskDetail.setCompanyCode(companyCode);
                taskDetail.setBillCode(receiptHeader.getCode());
                taskDetail.setBillDetailId(Integer.parseInt(receiptBill.getReceiptDetailId()));
                taskDetail.setMaterialCode(receiptBill.getMaterialCode());
                taskDetail.setMaterialName(receiptBill.getMaterialName());
                taskDetail.setQty(receiptBill.getQty());
                taskDetail.setFromLocation(taskHeader.getFromLocation());
                taskDetail.setToLocation(taskHeader.getToLocation());
                taskDetail.setAllocationId(receiptContainerDetail.getId());
                taskDetail.setStatus(taskHeader.getStatus());
                taskDetail.setBatch(receiptBill.getBatch());
                taskDetail.setCompanyCode(taskHeader.getCompanyCode());
                taskDetailService.save(taskDetail);
            }

        } else {
            ReceiptContainerView record = new ReceiptContainerView();
            record.setReceiptContainerCode(containerCode);
            record.setLocationCode(locationCode);
            record.setTaskType((short)100);
            record.setCompanyCode(receiptBills.get(0).getCompanyCode());
            receiptContainerHeaderService.checkContainer(record);
            if(locationCode != null) {
                receiptContainerHeaderService.mobileCheckLocationCode(record);
            }
            int receiptHeaderId = receiptHeaderService.createTodayHeader(companyCode);
            ReceiptHeader receiptHeader = receiptHeaderService.getById(receiptHeaderId);
            List<Integer> receiptDetailIds = receiptDetailService.insertTodayReceiptDetail(receiptHeaderId, receiptBills, true, companyCode);
            if(receiptDetailIds != null && receiptDetailIds.size() > 0) {
                int containerHeaderId = receiptContainerHeaderService.insertTodayReceiptContainerHeader(receiptBills.get(0), receiptHeader.getCode());
                if(containerHeaderId > 0) {
                    List<Integer> receiptContainerDetailIds = receiptContainerDetailService.insertTodayReceiptcContainerDetail(containerHeaderId, receiptHeaderId, receiptDetailIds, receiptBills);
                    if(receiptContainerDetailIds != null && receiptContainerDetailIds.size() > 0) {

                    } else {
                        return AjaxResult.error("入库组盘失败");
                    }
                } else {
                    return AjaxResult.error("插入入库容器表单头失败");
                }
            } else {
                return AjaxResult.error("插入入库明细表单失败");
            }
        }

        return AjaxResult.success("收货成功");
    }

    @PostMapping("/createReceiptCode")
    @ApiOperation("移动端创建入库单号")
    public AjaxResult createReceiptCode(@RequestBody @ApiParam(value = "物料号") Map<String, String> param){
        String companyCode = param.get("companyCode");
        String receiptType = "DE";
        String code = null;
        Date now = new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
        String maxCode = receiptHeaderMapper.createCode(receiptType);
        //如果指定类型的最后的code存在,并且日期一致。那么 code = 入库单类型 + 年月日 + (排序号 + 1)
        if (maxCode != null && maxCode.substring(maxCode.length() - 13, maxCode.length() - 5).equals(df.format(now))) {
            Integer Count = Integer.valueOf(maxCode.substring(maxCode.length() - 5, maxCode.length()));
            code = receiptType + df.format(now) + String.format("%05d", Count + 1);
        } else {
            code = receiptType + df.format(now) + "00001";
        }
        return AjaxResult.success("创建成功",code);
    }

    @PostMapping("/createReceipt")
    @ApiOperation("移动端创建入库单")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult createReceipt(@RequestBody @ApiParam(value = "物料号")List<ReceiptBill> receiptBills){
        String companyCode = receiptBills.get(0).getCompanyCode();
        String receiptCode = receiptBills.get(0).getReceiptCode();
        String receiptType = "DE";
        ReceiptHeader receiptHeader = new ReceiptHeader();
        receiptHeader.setId(null);
        receiptHeader.setCode(receiptCode);
        receiptHeader.setReceiptType(receiptType);
        receiptHeader.setWarehouseCode(SecurityUtils.getWarehouseCode());
        receiptHeader.setCreated(null);
        receiptHeader.setCreatedBy(SecurityUtils.getUsername());
        receiptHeader.setLastUpdated(null);
        receiptHeader.setLastUpdatedBy(SecurityUtils.getUsername());
        receiptHeader.setFirstStatus(200);
        receiptHeader.setLastStatus(200);
        receiptHeader.setCompanyCode(companyCode);
        receiptHeaderService.save(receiptHeader);
        List<Integer> receiptDetailIds = receiptDetailService.insertTodayReceiptDetail(receiptHeader.getId(), receiptBills, false, companyCode);
        receiptDetailService.updateReceiptHeader(receiptHeader);
        if(receiptDetailIds != null && receiptDetailIds.size() > 0) {
            return AjaxResult.success("创建入库单成功");
        }
        return AjaxResult.error("创建入库单失败");
    }
}