MobileTaskController.java 12.8 KB
package com.huaheng.task.mobile;

import cn.hutool.core.convert.Convert;
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.inventory.api.RemoteInventoryTransactionService;
import com.huaheng.inventory.api.domain.InventoryTransaction;
import com.huaheng.shipment.api.domain.ShipmentTaskCreateModel;
import com.huaheng.task.api.domain.TaskHeader;
import com.huaheng.task.task.service.TaskHeaderService;
import com.huaheng.task.task.service.impl.ShipmentTaskService;
import com.huaheng.task.task.service.impl.WorkTaskService;
import com.huaheng.task.taskDetails.domain.TaskDetail;
import com.huaheng.task.taskDetails.service.TaskDetailService;
import io.swagger.annotations.Api;
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.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;

/**
 *
 * @author Enzo Cotter
 * @date 2019/12/15
 */
@CrossOrigin
@RestController
@Api(tags = {"手持立体库库存相关"}, value = "手持立体库库存相关")
@RequestMapping("/mobile")
public class MobileTaskController  {

    @Autowired
    private TaskHeaderService taskHeaderService;
    @Autowired
    private TaskDetailService taskDetailService;
    @Resource
    private RemoteInventoryTransactionService inventoryTransactionService;
    @Resource
    private WorkTaskService workTaskService;
    @Resource
    private ShipmentTaskService shipmentTaskService;


    @PostMapping("/searchTask")
    @ApiOperation("移动端查询任务")
    public AjaxResult searchTask(@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<TaskHeader> taskHeaderQueryWrapper = Wrappers.lambdaQuery();
        taskHeaderQueryWrapper.eq(TaskHeader::getCompanyCode, companyCode)
                .eq(TaskHeader::getWarehouseCode, SecurityUtils.getWarehouseCode())
                .le(TaskHeader::getCreated, now)
                .gt(TaskHeader::getCreated, start)
                .orderByDesc(TaskHeader::getCreated);
        List<TaskHeader> taslHeaderList = taskHeaderService.list(taskHeaderQueryWrapper);
        return AjaxResult.success(taslHeaderList);
    }

    @PostMapping("/searchTaskInCondition")
    @ApiOperation("移动端查询任务")
    public AjaxResult searchTaskInCondition(@RequestBody @ApiParam(value = "物料号") Map<String, String> param){
        String companyCode = param.get("companyCode");
        String taskType = param.get("taskType");
        String containerCode = param.get("containerCode");
        String fromLocatrion = param.get("fromLocatrion");
        String toLocation = param.get("toLocation");
        String status = param.get("status");
        String startTime = param.get("startTime");
        String endTime = param.get("endTime");
        LambdaQueryWrapper<TaskHeader> taskHeaderQueryWrapper = Wrappers.lambdaQuery();
        taskHeaderQueryWrapper
                .eq(TaskHeader::getWarehouseCode, SecurityUtils.getWarehouseCode())
                .eq(StringUtils.isNotEmpty(taskType), TaskHeader::getTaskType, taskType)
                .eq(StringUtils.isNotEmpty(containerCode), TaskHeader::getContainerCode, containerCode)
                .eq(StringUtils.isNotEmpty(fromLocatrion), TaskHeader::getFromLocation, fromLocatrion)
                .eq(StringUtils.isNotEmpty(toLocation), TaskHeader::getToLocation, toLocation)
                .eq(StringUtils.isNotEmpty(status), TaskHeader::getStatus, status)
                .gt(StringUtils.isNotEmpty(startTime), TaskHeader::getCreated, startTime)
                .le(StringUtils.isNotEmpty(endTime), TaskHeader::getCreated, endTime)
                .orderByDesc(TaskHeader::getCreated);
        List<TaskHeader>  taskHeaderList = taskHeaderService.list(taskHeaderQueryWrapper);
        return AjaxResult.success(taskHeaderList);
    }


    @PostMapping("/findTask")
    @ApiOperation("移动端查询任务详情")
    public AjaxResult findTask(@RequestBody @ApiParam(value = "物料号") Map<String, String> param){
        String taskHeadId = param.get("taskHeadId");
        String companyCode = param.get("companyCode");
        if (StringUtils.isNull(taskHeadId)){
            return AjaxResult.error("任务id为空");
        } else if (StringUtils.isNull(companyCode)){
            return AjaxResult.error("公司编码为空");
        }

        /* 查询入库单,如果数据库中不存在,则调用ERP接口拉取单据,成功后再次查询返回结果*/
        LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
        taskHeaderLambdaQueryWrapper.eq(TaskHeader::getId, taskHeadId);
        TaskHeader taskHeader = taskHeaderService.getOne(taskHeaderLambdaQueryWrapper);
        if(taskHeader == null) {
            return AjaxResult.error("没有找到任务");
        }
        TaskDomain taskDomain = new TaskDomain();
        taskDomain.setTaskHeader(taskHeader);

        LambdaQueryWrapper<TaskDetail> taskDetailQueryWrapper = Wrappers.lambdaQuery();
        taskDetailQueryWrapper.eq(TaskDetail::getTaskId, taskHeader.getId());
        List<TaskDetail> taskDetailList = taskDetailService.list(taskDetailQueryWrapper);
        taskDomain.setTaskDetails(taskDetailList);
        return AjaxResult.success(taskDomain);
    }

    @PostMapping("/searchTodayInfo")
    @ApiOperation("移动端查询今天信息")
    public AjaxResult searchTodayInfo(@RequestBody @ApiParam(value = "物料号") Map<String, String> param){
        TodayInfo todayInfo = new TodayInfo();
        String companyCode = param.get("companyCode");
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        String now = df.format(new Date());
        now = now + " 23:59:59";
        Calendar c = Calendar.getInstance();
        c.setTime(new Date());
        c.add(Calendar.DATE, 0);
        Date first = c.getTime();
        String start = df.format(first);//前一天
        start = start + " 00:00:00";
        LambdaQueryWrapper<TaskHeader> taskHeaderQueryWrapper = Wrappers.lambdaQuery();
        taskHeaderQueryWrapper.eq(TaskHeader::getCompanyCode, companyCode)
                .eq(TaskHeader::getWarehouseCode, SecurityUtils.getWarehouseCode())
                .le(TaskHeader::getCreated, now)
                .gt(TaskHeader::getCreated, start)
                .orderByDesc(TaskHeader::getCreated);
        List<TaskHeader> taslHeaderList = taskHeaderService.list(taskHeaderQueryWrapper);
        todayInfo.setTodayTAask(taslHeaderList.size());

        InventoryTransaction inventoryTransaction2 = new InventoryTransaction();
        inventoryTransaction2.setCompanyCode(companyCode);
        inventoryTransaction2.setWarehouseCode(SecurityUtils.getWarehouseCode());
        inventoryTransaction2.setUserDef1(now);
        inventoryTransaction2.setUserDef2(start);
        int todayReceipt = 0, todayShipment = 0;
        List<InventoryTransaction> inventoryTransactionList = inventoryTransactionService.getList(inventoryTransaction2);
        if(inventoryTransactionList != null) {
            for (InventoryTransaction inventoryTransaction : inventoryTransactionList) {
                if(inventoryTransaction.getTransactionType() == 10) {
                    todayReceipt = todayReceipt + inventoryTransaction.getTaskQty().intValue();
                } else  if(inventoryTransaction.getTransactionType() == 20) {
                    todayShipment = todayShipment + inventoryTransaction.getTaskQty().intValue();
                }
            }
        }
        todayInfo.setTodayReceipt(todayReceipt);
        todayInfo.setTodayShipment(todayShipment);
        return AjaxResult.success(todayInfo);
    }

    @PostMapping( "/completeTaskByWMS")
    @ApiOperation("完成立库任务")
    @ResponseBody
    public AjaxResult completeTaskByWMS(@RequestBody @ApiParam(value="任务id") Map<String, String> param) throws Exception {
        String taskId = param.get("taskId");
        if (StringUtils.isEmpty(taskId)) {
            return AjaxResult.error("taskId不能为空");
        }

        AjaxResult ajaxResult = taskHeaderService.completeTaskByWMS(Convert.toIntArray(taskId), null);
        return ajaxResult;
    }

    @PostMapping( "/completeTaskListByWMS")
    @ApiOperation("完成立库任务")
    @ResponseBody
    public AjaxResult completeTaskListByWMS(@RequestBody List<TaskIds> taskDetails) throws Exception {
        Integer[] taskIds = new Integer[taskDetails.size()];
        for(int i=0; i<taskDetails.size() ; i++) {
            TaskIds taskDetail = taskDetails.get(i);
            taskIds[i] = taskDetail.getTaskId();
        }
        AjaxResult ajaxResult = taskHeaderService.completeTaskByWMS(taskIds, null);
        return ajaxResult;
    }

    /**
     * 移动端根据容器编码获取盘点任务
     * @param param
     * @return
     */
    @ResponseBody
    @PostMapping("/findTransferByContainerCode")
    public AjaxResult findTransferByContainerCode(@RequestBody Map<String, String> param) {
        String containCode = param.get("containCode");
        if (StringUtils.isEmpty(containCode)){
            return AjaxResult.error("容器编码为空");
        } else {
            return AjaxResult.success(taskHeaderService.mobileFindTransferTask(containCode));
        }
    }

    @PostMapping("/createEmptyIn")
    @ApiOperation("移动端空托入库")
    public AjaxResult createEmptyIn(@RequestBody Map<String, String> param) {
        if  (param.get("containerCode") == null || param.get("containerCode").trim().length() < 1) {
            throw new JSONException("容器号不能为空");
        }
        String containerCode = param.get("containerCode");
        String destinationLocation = param.get("destinationLocation");
        String companyCode = param.get("companyCode");
        return  workTaskService.createEmptyIn(containerCode, destinationLocation);
    }

    @PostMapping("/createEmptyOut")
    @ApiOperation("移动端空托出库")
    public AjaxResult createEmptyOut(@RequestBody Map<String, String> param) {
        if  (param.get("containerCode") == null || param.get("containerCode").trim().length() < 1){
            throw new JSONException("容器号不能为空");
        }
        if  (param.get("sourceLocation") == null || param.get("sourceLocation").trim().length() < 1) {
            throw new JSONException("源库位不能为空");
        }
        String containerCode = param.get("containerCode");
        String sourceLocation = param.get("sourceLocation");
        return  workTaskService.createEmptyOut(containerCode, sourceLocation);
    }

    /**
     * 根据出库单号生成出库任务
     */
    @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(id);
            if(ajaxResult.hasErr()){
                return ajaxResult;
            }
            Integer taskId = (Integer)ajaxResult.getData();
            taskIds.add(taskId);
        }
        return AjaxResult.success(taskIds);
    }

    @PostMapping( "/executeList")
    @ApiOperation("执行立库任务")
    public AjaxResult executeList(@RequestBody List<TaskIds> taskDetails) {
        Integer[] taskIds = new Integer[taskDetails.size()];
        for(int i=0; i<taskDetails.size() ; i++) {
            TaskIds taskDetail = taskDetails.get(i);
            taskIds[i] = taskDetail.getTaskId();
        }
        AjaxResult ajaxResult = taskHeaderService.sendTaskToWcs(taskIds);
        if(!ajaxResult.hasErr()) {
            return AjaxResult.success("执行任务成功");
        }
        return ajaxResult;
    }
}