MobileReceiptController.java 10.8 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.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.domain.Container;
import com.huaheng.config.api.domain.Location;
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.RemoteTaskService;
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;


    @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);
        }
        receiptContainerHeaderService.batchSave(receiptContainerViewList);
        AjaxResult retResult = taskHeaderService.createQuickTask(containerCode);

        return retResult;
    }

    @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("创建入库单失败");
    }
}