WinController.java 12.8 KB
package com.huaheng.api.erp.controller;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.google.zxing.WriterException;
import com.huaheng.api.erp.domain.MaterialDomain;
import com.huaheng.api.erp.domain.PDAInventory;
import com.huaheng.api.erp.domain.PrintDomain;
import com.huaheng.api.wcs.domain.LabelDomain;
import com.huaheng.api.wcs.domain.LabelingDomain;
import com.huaheng.common.constant.HttpConstant;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.QRCodeGenerator;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.http.OkHttpUtils;
import com.huaheng.framework.aspectj.lang.annotation.ApiLogger;
import com.huaheng.framework.web.controller.BaseController;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.framework.web.service.ConfigService;
import com.huaheng.pc.config.address.domain.Address;
import com.huaheng.pc.config.address.service.AddressService;
import com.huaheng.pc.config.proPackaging.domain.ProPackaging;
import com.huaheng.pc.config.proPackaging.service.IProPackagingService;
import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
import com.huaheng.pc.receipt.receiptContainerDetail.domain.ReceiptContainerDetail;
import com.huaheng.pc.receipt.receiptContainerDetail.service.ReceiptContainerDetailService;
import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerHeader;
import com.huaheng.pc.receipt.receiptContainerHeader.service.ReceiptContainerHeaderService;
import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService;
import com.huaheng.pc.shipment.shipmentHeader.domain.ShipmentHeader;
import com.huaheng.pc.shipment.shipmentHeader.service.ShipmentHeaderService;
import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
import io.swagger.annotations.ApiOperation;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * @author lty
 */
@RestController
@RequestMapping("/API/WMS/v2")
public class WinController extends BaseController {

    @Resource
    TaskHeaderService taskHeaderService;
    @Resource
    AddressService addressService;
    @Resource
    ShipmentHeaderService shipmentHeaderService;
    @Resource
    ReceiptContainerHeaderService receiptContainerHeaderService;
    @Resource
    ReceiptHeaderService receiptHeaderService;
    @Resource
    ReceiptContainerDetailService receiptContainerDetailService;
    @Resource
    private ConfigService configService;
    @Resource
    IProPackagingService proPackingService;

    @PostMapping("/printLabel")
    @ApiOperation("请求打印数据")
    @ResponseBody
    @ApiLogger(apiName = "请求打印数据", from = "win or wcs")
    public AjaxResult printLabel(@RequestBody Map<String, String> map) {
        String containerCode = map.get("containerCode");
        String taskNo = map.get("taskNo");

        if (StringUtils.isEmpty(containerCode)) {
            containerCode = configService.getKey(QuantityConstant.LABEL_SCANNING);;
        }

        // 1.根据托盘找对应任务下发里面数据 再挖明细
        LambdaQueryWrapper<ReceiptContainerDetail> receiptContainerDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
        receiptContainerDetailLambdaQueryWrapper.eq(ReceiptContainerDetail::getContainerCode, containerCode);
        List<ReceiptContainerDetail> receiptContainerDetails = receiptContainerDetailService.list(receiptContainerDetailLambdaQueryWrapper);
        if (receiptContainerDetails.size() < 1) {
            return AjaxResult.error("!");
        }

        ReceiptHeader receiptHeader = receiptHeaderService.getById(receiptContainerDetails.get(0).getReceiptId());

        LambdaQueryWrapper<ShipmentHeader> shipmentHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
        shipmentHeaderLambdaQueryWrapper.eq(ShipmentHeader::getCode, receiptHeader.getShipmentCode());
        ShipmentHeader shipmentHeader = shipmentHeaderService.getOne(shipmentHeaderLambdaQueryWrapper);

        PrintDomain printDomain = new PrintDomain();
        if (StringUtils.isNotEmpty(shipmentHeader.getReferCode())) {
            // erp单号

            printDomain.setErpCode(shipmentHeader.getReferCode());
        } else {
            printDomain.setErpCode("不存在");
        }

        if (StringUtils.isNotEmpty(shipmentHeader.getCustomerName())) {
            // 客户名称
            printDomain.setName(shipmentHeader.getCustomerName());
        } else {
            printDomain.setName("不存在");
        }

        printDomain.setCode(shipmentHeader.getCode());
        printDomain.setContainerCode(containerCode);


        Map<String, Long> countMap =
            receiptContainerDetails.stream().collect(Collectors.groupingBy(detail -> detail.getMaterialCode() + "_" + detail.getBatch()
                            + "_" +detail.getColor() + "_" +detail.getProPackaging() + "_" +detail.getProductSchedule() + "_" +detail.getLevel(), Collectors.counting()));

        List<MaterialDomain> materialDomains = new ArrayList<>();
        List<LabelDomain> labelDomains = new ArrayList<>();

        // 订单号
        String A = "|A=" + shipmentHeader.getCode();
        String C = "", D = "", F = "", G = "", H = "", I = "", B = "", E = "";
        // 条码
        String J = "|J=" + containerCode;
        String M = "|M=" + containerCode;

        if (StringUtils.isNotEmpty(shipmentHeader.getCustomerName())) {
            // 规格
            B = "|B=" + shipmentHeader.getCustomerName();
        } else {
            B = "|B=不存在";
        }

        if (StringUtils.isNotEmpty(shipmentHeader.getReferCode())) {
            // 客户名称
            E = "|E=" + shipmentHeader.getReferCode();
        } else {
            E = "|E=不存在";
        }

        // 中转计数
        String s = "";

        for (String key : countMap.keySet()) {
            // 不可能为空
            Optional<ReceiptContainerDetail> receiptContainerDetailsList = receiptContainerDetails.stream()
                    .filter(d -> key.contains(d.getMaterialCode())
                            &&key.contains(d.getLevel())
                            &&key.contains(d.getColor())
                            &&key.contains(d.getProPackaging())
                            &&key.contains(d.getProductSchedule()))
                    .findFirst();

            ReceiptContainerDetail receiptContainerDetail = receiptContainerDetailsList.get();
            MaterialDomain materialDomain = new MaterialDomain();
            materialDomain.setMaterialCode(receiptContainerDetail.getMaterialCode());
            materialDomain.setMaterialName(receiptContainerDetail.getMaterialName());
            materialDomain.setLevel(receiptContainerDetail.getLevel());
            materialDomain.setColor(receiptContainerDetail.getColor());
            LambdaQueryWrapper<ProPackaging> proPackagingLambdaQueryWrapper = Wrappers.lambdaQuery();
            proPackagingLambdaQueryWrapper.eq(ProPackaging::getNumber, receiptContainerDetail.getProPackaging());
            ProPackaging proPackaging = proPackingService.getOne(proPackagingLambdaQueryWrapper);
            if (proPackaging == null) {
                return AjaxResult.error("没有包装信息");
            }
            int pieceBox = proPackaging.getPieceBox();
            materialDomain.setBox(countMap.get(key).intValue() * pieceBox);
            materialDomain.setScattered(countMap.get(key).intValue());
            materialDomains.add(materialDomain);

            LabelDomain labelDomain = new LabelDomain();
            labelDomain.setH(countMap.get(key).intValue());
            labelDomain.setI(countMap.get(key).intValue()* pieceBox);
            labelDomain.setC(receiptContainerDetail.getMaterialCode());
            labelDomain.setD(receiptContainerDetail.getMaterialName());
            labelDomain.setF(receiptContainerDetail.getLevel());
            labelDomain.setG(receiptContainerDetail.getColor());
            labelDomains.add(labelDomain);
        }

        for (int i = 0; i < labelDomains.size(); i++) {
            C = C + "|C" + s + "=" + labelDomains.get(i).getC();
            D = D + "|D" + s + "=" + labelDomains.get(i).getD();;
            F = F + "|F" + s + "=" + labelDomains.get(i).getF();
            G = G + "|G" + s + "=" + labelDomains.get(i).getG();
            H = H + "|H" + s + "=" + labelDomains.get(i).getH();
            I = I + "|I" + s + "=" + labelDomains.get(i).getI();
            s = "" + (i + 1);
        }
        printDomain.setMaterial(materialDomains);
        if (StringUtils.isNotEmpty(taskNo)) {

            LambdaQueryWrapper<TaskHeader> lambdaQueryWrapper= Wrappers.lambdaQuery();
            lambdaQueryWrapper.eq(TaskHeader::getContainerCode,containerCode)
                    .ne(TaskHeader::getPortGroup,QuantityConstant.PORTGROUP_P30);
            TaskHeader taskHeader = taskHeaderService.getOne(lambdaQueryWrapper);

            String IP = "";
            LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
            switch (taskHeader.getPortGroup()) {
                case "P11":
                    taskHeaderLambdaQueryWrapper.eq(TaskHeader::getPortGroup, "P1").ne(TaskHeader::getStatus, 100).orderByAsc(TaskHeader::getShipmentOrder)
                            .orderByAsc(TaskHeader::getSequence);
                    IP = addressService.selectAddress(QuantityConstant.PRINT_ADDRESS_11, taskHeader.getWarehouseCode(), null);
                    break;
                case "P12":
                    taskHeaderLambdaQueryWrapper.eq(TaskHeader::getPortGroup, "P2").ne(TaskHeader::getStatus, 100).orderByAsc(TaskHeader::getShipmentOrder)
                            .orderByAsc(TaskHeader::getSequence);
                    IP = addressService.selectAddress(QuantityConstant.PRINT_ADDRESS_12, taskHeader.getWarehouseCode(), null);
                    break;
                case "P13":
                    IP = addressService.selectAddress(QuantityConstant.PRINT_ADDRESS_13, taskHeader.getWarehouseCode(), null);
                    taskHeaderLambdaQueryWrapper.eq(TaskHeader::getPortGroup, "P3").ne(TaskHeader::getStatus, 100).orderByAsc(TaskHeader::getShipmentOrder)
                            .orderByAsc(TaskHeader::getSequence);
                    break;
                default : AjaxResult.error("不存在的出库口");
            }
            LabelingDomain labelingDomain = new LabelingDomain();
            labelingDomain.setIp(IP);
            String data = "";
            labelingDomain.setPort(QuantityConstant.PRINT_PORE);
            labelingDomain.setText("SLA|JIANYI1" + A + B + E + J + C + D + F + G + H + I + M + "|");

            String url = addressService.selectAddress(QuantityConstant.ADDRESS_WCS_TASK_LABEL, taskHeader.getWarehouseCode(), null);
            String jsonParam = JSON.toJSONString(labelingDomain);
            String result = OkHttpUtils.bodypost(url, jsonParam);
            if (StringUtils.isEmpty(result)) {
                throw new ServiceException("接口地址错误或返回为空,刷新贴标条码超时");
            }
            AjaxResult ajaxResult = JSON.parseObject(result, AjaxResult.class);
            if (ajaxResult.getCode() != HttpConstant.OK) {
                throw new ServiceException(ajaxResult.getMsg());
            }
            data = (String)ajaxResult.getData();
            if (!data.contains("ACK")) {
                throw new ServiceException("请求贴标机数据不成功");
            }
            return AjaxResult.success("OK");
        }
        return AjaxResult.success(printDomain);
    }

    /**
     * @author lty
     *         //生成dataMatrix类型二维码
     */

    @GetMapping(value = "/imageDmx/{text}")
    public ResponseEntity<byte[]> getImageDmx(@PathVariable("text") String text) {
        byte[] qrcode = null;
        try {
            qrcode = QRCodeGenerator.getDataMatrixImage(text, 210, 210);
        } catch (WriterException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // Set headers
        final HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.IMAGE_JPEG);
        return new ResponseEntity<byte[]>(qrcode, headers, HttpStatus.CREATED);
    }

}