MobileShipmentController.java 19.3 KB
package com.huaheng.mobile.shipment;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.api.general.domain.ReceiptDomain;
import com.huaheng.api.general.domain.ShipmentDomain;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.exception.BusinessException;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.aspectj.lang.annotation.Log;
import com.huaheng.framework.aspectj.lang.constant.BusinessType;
import com.huaheng.framework.web.controller.BaseController;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.mobile.invenory.TaskIds;
import com.huaheng.mobile.receipt.ReceiptBill;
import com.huaheng.pc.config.company.domain.Company;
import com.huaheng.pc.config.company.service.CompanyService;
import com.huaheng.pc.config.material.domain.Material;
import com.huaheng.pc.config.material.service.MaterialService;
import com.huaheng.pc.config.receiptType.domain.ReceiptType;
import com.huaheng.pc.config.shipmentType.domain.ShipmentType;
import com.huaheng.pc.config.shipmentType.service.ShipmentTypeService;
import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService;
import com.huaheng.pc.inventory.inventoryHeader.service.InventoryHeaderService;
import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.shipment.shipmentContainerHeader.domain.ShipmentCombinationModel;
import com.huaheng.pc.shipment.shipmentContainerHeader.domain.ShipmentContainerHeader;
import com.huaheng.pc.shipment.shipmentContainerHeader.service.ShipmentContainerHeaderService;
import com.huaheng.pc.shipment.shipmentDetail.domain.ShipmentDetail;
import com.huaheng.pc.shipment.shipmentDetail.service.ShipmentDetailService;
import com.huaheng.pc.shipment.shipmentHeader.domain.ShipmentHeader;
import com.huaheng.pc.shipment.shipmentHeader.mapper.ShipmentHeaderMapper;
import com.huaheng.pc.shipment.shipmentHeader.service.ShipmentHeaderService;
import com.huaheng.pc.task.taskHeader.domain.ShipmentTaskCreateModel;
import com.huaheng.pc.task.taskHeader.service.ShipmentTaskService;
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
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.*;
import java.util.stream.Collectors;

/**
 * @author mahua
 * @ClassName MobileShipmentController
 * @projectName wms_xinyi
 * @description: TODO
 * @date 2020/2/1115:29
 */
@RestController
@RequestMapping("/mobile/shipment")
public class MobileShipmentController extends BaseController {
    @Resource
    private ShipmentHeaderService shipmentHeaderService;
    @Resource
    private ShipmentDetailService shipmentDetailService;
    @Resource
    private ShipmentContainerHeaderService shipmentContainerHeaderService;
    @Resource
    private ShipmentTaskService shipmentTaskService;
    @Resource
    private ShipmentTypeService shipmentTypeService;
    @Resource
    private InventoryDetailService inventoryDetailService;
    @Resource
    private ShipmentHeaderMapper shipmentHeaderMapper;
    @Resource
    private MaterialService  materialService;

    /**
     * 自动组盘
     * @param
     * @return
     */
    @PostMapping("/autoCombination")
    @ResponseBody
    public AjaxResult autoCombination(@RequestBody  Map<String, String> param){
        String shipmentCode = param.get("shipmentCode");
        AjaxResult ajaxResult = shipmentContainerHeaderService.autoCombination(shipmentCode);
        return ajaxResult;
    }

    /**
     * 手动组盘
     * @param
     * @return
     */
    @PostMapping("/combination")
    @ResponseBody
    public AjaxResult combination(@RequestBody List<ShipmentMaterial> shipmentMaterials){
        if(shipmentMaterials == null || shipmentMaterials.size() <= 0) {
            return AjaxResult.error("组盘信息为空");
        }
        List<Integer> taskIds = new ArrayList<>();
        for(ShipmentMaterial shipmentMaterial : shipmentMaterials) {
            if(shipmentMaterial.getQty() == 0) {
                continue;
            }
            ShipmentCombinationModel shipmentCombination = new ShipmentCombinationModel();
            String containerCode = shipmentMaterial.getContainerCode();
            String locationCode = shipmentMaterial.getLocaitonCode();
            shipmentCombination.setShipQty(new BigDecimal(shipmentMaterial.getQty()));
            shipmentCombination.setTaskType(QuantityConstant.TASK_TYPE_SORTINGSHIPMENT);
            shipmentCombination.setCompanyCode(shipmentMaterial.getCompanyCode());
            shipmentCombination.setShipmentDetailId(shipmentMaterial.getShipmentDetailId());
            LambdaQueryWrapper<InventoryDetail> lambdaQueryWrapper = Wrappers.lambdaQuery();
            lambdaQueryWrapper.eq(InventoryDetail::getWarehouseCode, ShiroUtils.getWarehouseCode())
                             .eq(StringUtils.isNotEmpty(containerCode), InventoryDetail::getContainerCode, containerCode)
                             .eq(StringUtils.isNotEmpty(locationCode), InventoryDetail::getLocationCode, locationCode)
                             .eq(InventoryDetail::getMaterialCode, shipmentMaterial.getMaterialCode());
            InventoryDetail inventoryDetail = inventoryDetailService.getOne(lambdaQueryWrapper);
            int qty =  inventoryDetail.getQty().subtract(inventoryDetail.getTaskQty()).intValue();
            if(shipmentMaterial.getQty() > qty) {
                return AjaxResult.error("出库数量必须小于库存数量");
            }
            shipmentCombination.setInventoryDetailId(inventoryDetail.getId());
            ShipmentContainerHeader shipmentContainerHeader = shipmentContainerHeaderService.combination(shipmentCombination);
            taskIds.add(shipmentContainerHeader.getId());
        }
        if(taskIds.size() > 0) {
            return AjaxResult.success(taskIds);
        } else {
            return AjaxResult.error("组盘失败");
        }
    }

    /**
     * 查询出库单主列表
     */
    @Log(title = "出库-出库单", operating="查看出库主单", action = BusinessType.GRANT)
    @PostMapping("/list")
    public AjaxResult list(@RequestBody @ApiParam(value = "出库单号-referCode、货主编码-companyCode、出库单类型-shipmentType") Map<String, String> param) {
        if (StringUtils.isEmpty(param.get("companyCode"))) {
            return AjaxResult.error("上游系统单号为空");
        } else if (StringUtils.isEmpty(param.get("shipmentType"))) {
            return AjaxResult.error("类型为空");
        } else if (StringUtils.isEmpty(param.get("referCode"))) {
            return AjaxResult.error("上游系统单号为空");
        }
        LambdaQueryWrapper<ShipmentHeader> lambdaQueryWrapper = Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(ShipmentHeader::getWarehouseCode, ShiroUtils.getWarehouseCode())
                .eq(ShipmentHeader::getDeleted,false)
                .in(ShipmentHeader::getCompanyCode, param.get("companyCode"))
                .eq(ShipmentHeader::getShipmentType,param.get("shipmentType"))
                .eq(ShipmentHeader::getReferCode, param.get("referCode"))
                .orderByDesc(ShipmentHeader::getId);
        ShipmentHeader shipmentHeader = shipmentHeaderService.getOne(lambdaQueryWrapper);

        if (shipmentHeader == null) {
            return AjaxResult.error("没有找到出库单");
        }
        LambdaQueryWrapper<ShipmentDetail> detailLambdaQueryWrapper = Wrappers.lambdaQuery();
        detailLambdaQueryWrapper.eq(ShipmentDetail::getShipmentId, shipmentHeader.getId());
        Shipment shipment = new Shipment();
        shipment.setShipmentHeader(shipmentHeader);
        List<ShipmentDetail> shipmentDetailList = shipmentDetailService.list(detailLambdaQueryWrapper);
        shipment.setShipmentDetailList(shipmentDetailList);
        return AjaxResult.success(shipment);
    }


    /**
     * 根据出库单号生成出库任务
     */
    @PostMapping("/createShipmentTask")
    @ResponseBody
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult createShipmentTask(@RequestBody List<TaskIds> taskDetails){
        List<Integer> ids = new ArrayList<>();
        for (TaskIds task : taskDetails) {
            ids.add(task.getTaskId());
        }
        List<Integer> listWithoutDuplicates = ids.stream().distinct().collect(Collectors.toList());
        ShipmentTaskCreateModel shipmentTask = new ShipmentTaskCreateModel();
        List<Integer> taskIds = new ArrayList<>();
        for (Integer id : listWithoutDuplicates) {
            shipmentTask.setShipmentContainerHeaderIds(id);
            AjaxResult ajaxResult = shipmentTaskService.createTaskFromShipmentContainers(shipmentTask);
            if(ajaxResult.hasErr()){
                return ajaxResult;
            }
            Integer taskId = (Integer)ajaxResult.getData();
            taskIds.add(taskId);
        }
        return AjaxResult.success(taskIds);
    }

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

        /* 查询入库单,如果数据库中不存在,则调用ERP接口拉取单据,成功后再次查询返回结果*/
        LambdaQueryWrapper<ShipmentHeader> shipmentLambdaQueryWrapper = Wrappers.lambdaQuery();
        shipmentLambdaQueryWrapper.eq(ShipmentHeader::getCode, shipmentCode)
                .eq(ShipmentHeader::getCompanyCode, companyCode);
        ShipmentHeader shipmentHeader = shipmentHeaderService.getOne(shipmentLambdaQueryWrapper);
        if(shipmentHeader == null) {
            return AjaxResult.error("没有找到出库单");
        }
        ShipmentDomain shipment = new ShipmentDomain();
        shipment.setShipmentHeader(shipmentHeader);

        LambdaQueryWrapper<ShipmentDetail> shipmentDetailQueryWrapper = Wrappers.lambdaQuery();
        shipmentDetailQueryWrapper.eq(ShipmentDetail::getShipmentId, shipmentHeader.getId());
        List<ShipmentDetail> shipmentDetailList = shipmentDetailService.list(shipmentDetailQueryWrapper);
        shipment.setShipmentDetails(shipmentDetailList);
        return AjaxResult.success(shipment);
    }

    @PostMapping("/searchShipment")
    @ApiOperation("移动端查询出库单")
    @Log(title = "移动端查询出库单", action = BusinessType.OTHER)
    public AjaxResult searchShipment(@RequestBody @ApiParam(value = "物料号") Map<String, String> param){
        String companyCode = param.get("companyCode");
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String now = df.format(new Date());
        Calendar c = Calendar.getInstance();
        c.setTime(new Date());
        c.add(Calendar.DATE, -7);
        Date first = c.getTime();
        String start = df.format(first);//前一天
        LambdaQueryWrapper<ShipmentHeader> shipmentHeaderQueryWrapper = Wrappers.lambdaQuery();
        shipmentHeaderQueryWrapper.eq(ShipmentHeader::getCompanyCode, companyCode)
                .eq(ShipmentHeader::getWarehouseCode, ShiroUtils.getWarehouseCode())
                .le(ShipmentHeader::getCreated, now)
                .gt(ShipmentHeader::getCreated, start)
                .orderByDesc(ShipmentHeader::getCreated);
        List<ShipmentHeader> receiptHeaderList = shipmentHeaderService.list(shipmentHeaderQueryWrapper);
        return AjaxResult.success(receiptHeaderList);
    }

    @PostMapping("/searchShipmentInCondition")
    @ApiOperation("移动端查询出库单")
    @Log(title = "移动端查询出库单", action = BusinessType.OTHER)
    public AjaxResult searchShipmentInCondition(@RequestBody @ApiParam(value = "物料号") Map<String, String> param){
        String companyCode = param.get("companyCode");
        String code = param.get("code");
        String shipmentType = param.get("shipmentType");
        String lastStatus = param.get("lastStatus");
        String startTime = param.get("startTime");
        String endTime = param.get("endTime");
        LambdaQueryWrapper<ShipmentHeader> shipmentQueryWrapper = Wrappers.lambdaQuery();
        shipmentQueryWrapper.eq(ShipmentHeader::getCompanyCode, companyCode)
                .eq(ShipmentHeader::getWarehouseCode, ShiroUtils.getWarehouseCode())
                .like(StringUtils.isNotEmpty(code), ShipmentHeader::getCode, code)
                .eq(StringUtils.isNotEmpty(shipmentType), ShipmentHeader::getShipmentType, shipmentType)
                .eq(StringUtils.isNotEmpty(lastStatus), ShipmentHeader::getLastStatus, lastStatus)
                .gt(StringUtils.isNotEmpty(startTime), ShipmentHeader::getCreated, startTime)
                .le(StringUtils.isNotEmpty(endTime), ShipmentHeader::getCreated, endTime)
                .orderByDesc(ShipmentHeader::getCreated);
        if(lastStatus.equals("200")) {
            shipmentQueryWrapper = Wrappers.lambdaQuery();
            shipmentQueryWrapper.lt(ShipmentHeader::getLastStatus, 900);
            shipmentQueryWrapper.eq(ShipmentHeader::getCompanyCode, companyCode)
                    .eq(ShipmentHeader::getWarehouseCode, ShiroUtils.getWarehouseCode())
                    .like(StringUtils.isNotEmpty(code), ShipmentHeader::getCode, code)
                    .eq(StringUtils.isNotEmpty(shipmentType), ShipmentHeader::getShipmentType, shipmentType)
                    .gt(StringUtils.isNotEmpty(startTime), ShipmentHeader::getCreated, startTime)
                    .le(StringUtils.isNotEmpty(endTime), ShipmentHeader::getCreated, endTime)
                    .orderByDesc(ShipmentHeader::getCreated);
        }
        List<ShipmentHeader>  shipmentHeaderList = shipmentHeaderService.list(shipmentQueryWrapper);
        return AjaxResult.success(shipmentHeaderList);
    }

    @PostMapping("/getShipmentType")
    @ApiOperation("移动端查询入库类型")
    @Log(title = "移动端查询字典信息", action = BusinessType.OTHER)
    public AjaxResult getShipmentType(@RequestBody @ApiParam(value = "物料号") Map<String, String> param){
        String companyCode = param.get("companyCode");
        LambdaQueryWrapper<ShipmentType> shipmentTypeLambda = Wrappers.lambdaQuery();
        shipmentTypeLambda.eq(ShipmentType::getCompanyCode, companyCode);
        shipmentTypeLambda.eq(ShipmentType::getWarehouseCode, ShiroUtils.getWarehouseCode());
        List<ShipmentType> shipmentTypes = shipmentTypeService.list(shipmentTypeLambda);
        return AjaxResult.success(shipmentTypes);
    }


    @PostMapping("/createShipmentCode")
    @ApiOperation("移动端创建出库单号")
    @Log(title = "移动端创建出库单号", action = BusinessType.OTHER)
    public AjaxResult createShipmentCode(@RequestBody @ApiParam(value = "物料号") Map<String, String> param){
        String companyCode = param.get("companyCode");
        String shipmentType =  param.get("shipmentType");
        String code = null;
        Date now = new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
        String maxCode = shipmentHeaderMapper.createCode(shipmentType);
        //如果指定类型的最后的code存在,并且日期一致。那么 code = 入库单类型 + 年月日 + (排序号 + 1)
        if (maxCode != null && maxCode.substring(maxCode.length() - 11, maxCode.length() - 3).equals(df.format(now))) {
            Integer Count = Integer.valueOf(maxCode.substring(maxCode.length() - 3, maxCode.length()));
            code = shipmentType + df.format(now) + String.format("%03d", Count + 1);
        } else {
            code = shipmentType + df.format(now) + "001";
        }
        return AjaxResult.success().setData(code);
    }

    @PostMapping("/createShipment")
    @ApiOperation("移动端创建出库单")
    @Log(title = "移动端创建出库单", action = BusinessType.OTHER)
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult createShipment(@RequestBody @ApiParam(value = "物料号")List<ShipmentBill> shipmentBills){
        String companyCode = shipmentBills.get(0).getCompanyCode();
        String shipmentCode = shipmentBills.get(0).getShipmentCode();
        String shipmentType = shipmentBills.get(0).getShipmentType();
        ShipmentHeader shipmentHeader = new ShipmentHeader();
        shipmentHeader.setId(null);
        shipmentHeader.setCode(shipmentCode);
        shipmentHeader.setShipmentType(shipmentType);
        shipmentHeader.setWarehouseCode(ShiroUtils.getWarehouseCode());
        shipmentHeader.setCreatedBy(ShiroUtils.getLoginName());
        shipmentHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
        shipmentHeader.setFirstStatus(200);
        shipmentHeader.setLastStatus(200);
        shipmentHeader.setCompanyCode(companyCode);
        shipmentHeaderService.save(shipmentHeader);
        List<Integer> shipmentdetailIds = insertTodayShipmentDetail(shipmentHeader.getId(), shipmentBills, false, companyCode);
        shipmentDetailService.updateShipmentHeader(shipmentHeader);
        if(shipmentdetailIds != null && shipmentdetailIds.size() > 0) {
            return AjaxResult.success("创建出库单成功");
        }
        return AjaxResult.error("创建出库单失败");
    }

    public List<Integer> insertTodayShipmentDetail(int headerId, List<ShipmentBill> shipmentBills, boolean isCompletedQty, String companyCode) {
        List<Integer> mShipmentDetailIds = new ArrayList<>();
        ShipmentHeader shipmentHeader = shipmentHeaderService.getById(headerId);

        for (ShipmentBill shipmentBill : shipmentBills) {
            ShipmentDetail shipmentDetail = new ShipmentDetail();
            shipmentDetail.setId(null);
            shipmentDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());
            shipmentDetail.setCompanyCode(companyCode);
            shipmentDetail.setShipmentId(headerId);
            shipmentDetail.setShipmentCode(shipmentHeader.getCode());
            shipmentDetail.setMaterialCode(shipmentBill.getMaterialCode());
            LambdaQueryWrapper<Material> lambdaQueryWrapper = Wrappers.lambdaQuery();
            lambdaQueryWrapper.eq(Material::getCode, shipmentBill.getMaterialCode())
                    .eq(Material::getWarehouseCode, ShiroUtils.getWarehouseCode());
            Material material = materialService.getOne(lambdaQueryWrapper);
            shipmentDetail.setMaterialName(material.getName());
            shipmentDetail.setMaterialUnit(material.getUnit());
            shipmentDetail.setInventorySts("good");
            shipmentDetail.setShipQty(shipmentBill.getQty());
            shipmentDetailService.save(shipmentDetail);
            mShipmentDetailIds.add(shipmentDetail.getId());
        }
        return mShipmentDetailIds;
    }

}