package com.huaheng.pc.receipt.receiptHeader.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.huaheng.api.srm.service.SrmReceiptService;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.DateUtils;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.Wrappers;
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.framework.web.page.PageDomain;
import com.huaheng.framework.web.page.TableDataInfo;
import com.huaheng.framework.web.page.TableSupport;
import com.huaheng.pc.config.company.domain.Company;
import com.huaheng.pc.config.company.service.CompanyService;
import com.huaheng.pc.config.receiptType.service.ReceiptTypeService;
import com.huaheng.pc.config.supplier.domain.Supplier;
import com.huaheng.pc.config.supplier.service.SupplierService;
import com.huaheng.pc.config.warehouse.domain.WarehouseU8;
import com.huaheng.pc.config.warehouse.service.WarehouseService;
import com.huaheng.pc.config.warehouse.service.WarehouseU8Service;
import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
import com.huaheng.pc.receipt.receiptDetail.service.ReceiptDetailService;
import com.huaheng.pc.receipt.receiptDetailHistory.service.ReceiptDetailHistoryService;
import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService;
import com.huaheng.pc.receipt.receiptHeaderHistory.service.ReceiptHeaderHistoryService;
import com.huaheng.pc.srm.service.FinishedProductService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.collections.MapUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Api(tags = "入库单")
@Controller
@RequestMapping("/receipt/receiptHeader")
public class ReceiptHeaderController extends BaseController {

    private String prefix = "receipt/receiptHeader";

    @Resource
    private ReceiptHeaderService receiptHeaderService;
    @Resource
    private ReceiptHeaderHistoryService receiptHeaderHistoryService;
    @Resource
    private ReceiptDetailService receiptDetailService;
    @Resource
    private CompanyService companyService;
    @Resource
    private ReceiptHeaderHistoryService receiptheaderhistoryService;
    @Resource
    private WarehouseService warehouseService;
    @Resource
    private WarehouseU8Service warehouseU8Service;
    @Resource
    private SupplierService supplierService;
    @Resource
    private ReceiptTypeService receiptTypeService;
    @Resource
    private FinishedProductService finishedProductService;
    @Resource
    private RedisTemplate redisTemplate;
    @Resource
    private SrmReceiptService srmReceiptService;

    private long totalSize = 0L;


    @RequiresPermissions("receipt:receiptHeader:view")
    @GetMapping("/{statusFirst}/{statusLast}")
    public String receiptHeader(ModelMap modelMap,
                                @PathVariable("statusFirst") Integer statusFirst,
                                @PathVariable("statusLast") Integer statusLast) {
        modelMap.put("statusFirst", statusFirst);
        modelMap.put("statusLast", statusLast);
        return prefix + "/receiptHeader";
    }
    @RequiresPermissions("receipt:receiptHeader:view")
    @GetMapping("/list")
    public String receiptHeaderlist(ModelMap modelMap) {

        return prefix + "/receiptHeader1";
    }

    @RequiresPermissions("receipt:receiptHeader:view")
    @GetMapping("/finishRList")
    public String finishRList(ModelMap modelMap) {
        return prefix + "/receiptHeaderFinish";
    }

    /**
     * 查询入库单
     */
    @RequiresPermissions("receipt:receiptHeader:list")
    @Log(title = "入库-入库单头表", operating = "查看入库单列表", action = BusinessType.GRANT)
    @PostMapping("/list")
    @ResponseBody
    @ApiOperation("入库单查询接口")
    public TableDataInfo list(@ApiParam(name = "receiptHeader", value = "入库头表") ReceiptHeader receiptHeader,
                              @ApiParam(name = "createdBegin", value = "起止时间") String createdBegin,
                              @ApiParam(name = "createdEnd", value = "结束时间") String createdEnd,
                              Integer statusFirst, Integer statusLast) throws Exception {
        LambdaQueryWrapper<ReceiptHeader> lambdaQueryWrapper = Wrappers.lambdaQuery();
        PageDomain pageDomain = TableSupport.buildPageRequest();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();
//        if(StringUtils.isEmpty(createdBegin)){
//            createdBegin= DateUtils.getNowPreDays("yyyy-MM-dd HH:mm:ss", 150);
//        }
//        if(StringUtils.isEmpty(createdEnd)){
//            createdEnd= DateUtils.getNowPreDays("yyyy-MM-dd HH:mm:ss", 0);
//        }
        lambdaQueryWrapper.ge(StringUtils.isNotEmpty(createdBegin), ReceiptHeader::getCreated, createdBegin)
                .le(StringUtils.isNotEmpty(createdEnd), ReceiptHeader::getCreated, createdEnd)
                .in(StringUtils.isNotEmpty(receiptHeader.getCompanyCode()), ReceiptHeader::getCompanyCode, receiptHeader.getCompanyCode())
                .in(StringUtils.isEmpty(receiptHeader.getCompanyCode()), ReceiptHeader::getCompanyCode, ShiroUtils.getCompanyCodeList())
                .eq(ReceiptHeader::getWarehouseCode, ShiroUtils.getWarehouseCode())
                .eq(StringUtils.isNotEmpty(receiptHeader.getReceiptType()),
                        ReceiptHeader::getReceiptType, receiptHeader.getReceiptType())
                .eq(StringUtils.isNotEmpty(receiptHeader.getCode()), ReceiptHeader::getCode, receiptHeader.getCode())
//                .like(StringUtils.isNotEmpty(receiptHeader.getSupplierName()), ReceiptHeader::getCode, receiptHeader.getCode())
                .eq(StringUtils.isNotEmpty(receiptHeader.getCreatedBy()), ReceiptHeader::getCreatedBy, receiptHeader.getCreatedBy())
                .eq(StringUtils.isNotEmpty(receiptHeader.getReferCode()), ReceiptHeader::getReferCode, receiptHeader.getReferCode())
                .eq(StringUtils.isNotEmpty(receiptHeader.getUWarehouseCode()), ReceiptHeader::getUWarehouseCode, receiptHeader.getUWarehouseCode())

                .eq(ReceiptHeader::getDeleted, false)
                .notIn(ReceiptHeader::getReceiptType, QuantityConstant.U8_RECEIPT_TYPE_PCI, QuantityConstant.MES_RECEIPT_TYPE_SI,QuantityConstant.FINISHED_R)
//                .in(ReceiptHeader::getReceiptType,"PPI","SRI","TI","PI","QI","CI","AI","PPII","XNT","PPII","GT","PII","JJ","JJP")
                .eq(StringUtils.isNotNull(receiptHeader.getFirstStatus()),
                        ReceiptHeader::getFirstStatus, receiptHeader.getFirstStatus())
                .eq(StringUtils.isNotNull(receiptHeader.getLastStatus()),
                        ReceiptHeader::getLastStatus, receiptHeader.getLastStatus())
                .apply("(  lastStatus<800 or (lastStatus=800 and firstStatus=900) )");
//                .notIn(ReceiptHeader::getLastStatus, QuantityConstant.RECEIPT_HEADER_RETURN, QuantityConstant.RECEIPT_HEADER_POSTING);
        if (StringUtils.isNotEmpty(receiptHeader.getSupplierCode())) {
            lambdaQueryWrapper.apply(" supplierCode in(select code from supplier where name like '%" + receiptHeader.getSupplierCode() + "%' )");
        }
        lambdaQueryWrapper.orderByDesc(ReceiptHeader::getCreated);
        lambdaQueryWrapper.select(ReceiptHeader::getId,ReceiptHeader::getReceiptType,
                ReceiptHeader::getCode,ReceiptHeader::getCompanyCode,ReceiptHeader::getCreated,
                ReceiptHeader::getBackMsg,ReceiptHeader::getCreatedBy,ReceiptHeader::getFirstStatus,
                ReceiptHeader::getLastStatus,ReceiptHeader::getTotalLines,ReceiptHeader::getTotalQty,
                ReceiptHeader::getUWarehouseCode,ReceiptHeader::getReferCode,ReceiptHeader::getSupplierCode,ReceiptHeader::getWarehouseCode);
        if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) {
            Page<ReceiptHeader> page = new Page<>(pageNum, pageSize);
            IPage<ReceiptHeader> iPage = receiptHeaderService.page(page, lambdaQueryWrapper);
            Iterator<ReceiptHeader> iterator = iPage.getRecords().iterator();
            while (iterator.hasNext()) {
                ReceiptHeader r = iterator.next();
                if (!StringUtils.isAnyEmpty(r.getUWarehouseCode(), r.getWarehouseCode(), r.getCompanyCode())) {
                    WarehouseU8 warehouseU8 = warehouseU8Service.getOne(new LambdaQueryWrapper<WarehouseU8>()
                            .eq(WarehouseU8::getUWarehouseCode, r.getUWarehouseCode())
                            .eq(WarehouseU8::getWarehouseCode, r.getWarehouseCode())
                            .eq(WarehouseU8::getCompanyCode, r.getCompanyCode())
                            .last("limit 1")
                    );
                    if (warehouseU8 != null) {
                        r.setUWarehouseName(warehouseU8.getUWarehouseName());
                    }
                }
            }

            return setSupplyName(getMpDataTable(iPage.getRecords(), iPage.getTotal()));
        } else {
            List<ReceiptHeader> list = receiptHeaderService.list(lambdaQueryWrapper);
            return setSupplyName(getDataTable(list));
        }
    }
    /**
     * 查询入库单
     */
    @RequiresPermissions("receipt:receiptHeader:list")
    @Log(title = "入库-完工入库单", operating = "完工入库单", action = BusinessType.GRANT)
    @PostMapping("/finishRList")
    @ResponseBody
    @ApiOperation("入库单查询接口")
    public TableDataInfo finishRList(@ApiParam(name = "receiptHeader", value = "入库头表") ReceiptHeader receiptHeader,
                              @ApiParam(name = "createdBegin", value = "起止时间") String createdBegin,
                              @ApiParam(name = "createdEnd", value = "结束时间") String createdEnd,
                              Integer statusFirst, Integer statusLast) throws Exception {
        LambdaQueryWrapper<ReceiptHeader> lambdaQueryWrapper = Wrappers.lambdaQuery();
        PageDomain pageDomain = TableSupport.buildPageRequest();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();
        lambdaQueryWrapper.ge(StringUtils.isNotEmpty(createdBegin), ReceiptHeader::getCreated, createdBegin)
                .le(StringUtils.isNotEmpty(createdEnd), ReceiptHeader::getCreated, createdEnd)
                .eq(ReceiptHeader::getWarehouseCode, ShiroUtils.getWarehouseCode())
                .in(StringUtils.isNotEmpty(receiptHeader.getCompanyCode()), ReceiptHeader::getCompanyCode, receiptHeader.getCompanyCode())
                .in(StringUtils.isEmpty(receiptHeader.getCompanyCode()), ReceiptHeader::getCompanyCode, ShiroUtils.getCompanyCodeList())
                .eq(StringUtils.isNotEmpty(receiptHeader.getReceiptType()),
                        ReceiptHeader::getReceiptType, receiptHeader.getReceiptType())
                .eq(StringUtils.isNotEmpty(receiptHeader.getCode()), ReceiptHeader::getCode, receiptHeader.getCode())
                .eq(StringUtils.isNotEmpty(receiptHeader.getCreatedBy()), ReceiptHeader::getCreatedBy, receiptHeader.getCreatedBy())
                .eq(StringUtils.isNotEmpty(receiptHeader.getReferCode()), ReceiptHeader::getReferCode, receiptHeader.getReferCode())
                .eq(StringUtils.isNotEmpty(receiptHeader.getUWarehouseCode()), ReceiptHeader::getUWarehouseCode, receiptHeader.getUWarehouseCode())

                .eq(ReceiptHeader::getDeleted, false)
                .eq(ReceiptHeader::getReceiptType, QuantityConstant.FINISHED_R)
                .eq(StringUtils.isNotNull(receiptHeader.getFirstStatus()),
                        ReceiptHeader::getFirstStatus, receiptHeader.getFirstStatus())
                .eq(StringUtils.isNotNull(receiptHeader.getLastStatus()),
                        ReceiptHeader::getLastStatus, receiptHeader.getLastStatus())
                .apply("(  lastStatus<800 or (lastStatus=800 and firstStatus=900) )");
//                .notIn(ReceiptHeader::getLastStatus, QuantityConstant.RECEIPT_HEADER_RETURN, QuantityConstant.RECEIPT_HEADER_POSTING);
        if (StringUtils.isNotEmpty(receiptHeader.getSupplierCode())) {
            lambdaQueryWrapper.apply(" supplierCode in(select code from supplier where name like '%" + receiptHeader.getSupplierCode() + "%' )");
        }
        lambdaQueryWrapper.orderByDesc(ReceiptHeader::getCreated);
        lambdaQueryWrapper.select(ReceiptHeader::getId,ReceiptHeader::getReceiptType,
                ReceiptHeader::getCode,ReceiptHeader::getCompanyCode,ReceiptHeader::getCreated,
                ReceiptHeader::getBackMsg,ReceiptHeader::getCreatedBy,ReceiptHeader::getFirstStatus,
                ReceiptHeader::getLastStatus,ReceiptHeader::getTotalLines,ReceiptHeader::getTotalQty,
                ReceiptHeader::getUWarehouseCode,ReceiptHeader::getReferCode,ReceiptHeader::getSupplierCode,ReceiptHeader::getWarehouseCode);
        if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) {
            Page<ReceiptHeader> page = new Page<>(pageNum, pageSize);
            IPage<ReceiptHeader> iPage = receiptHeaderService.page(page, lambdaQueryWrapper);
            Iterator<ReceiptHeader> iterator = iPage.getRecords().iterator();
            while (iterator.hasNext()) {
                ReceiptHeader r = iterator.next();
                if (!StringUtils.isAnyEmpty(r.getUWarehouseCode(), r.getWarehouseCode(), r.getCompanyCode())) {
                    WarehouseU8 warehouseU8 = warehouseU8Service.getOne(new LambdaQueryWrapper<WarehouseU8>()
                            .eq(WarehouseU8::getUWarehouseCode, r.getUWarehouseCode())
                            .eq(WarehouseU8::getWarehouseCode, r.getWarehouseCode())
                            .eq(WarehouseU8::getCompanyCode, r.getCompanyCode())
                            .last("limit 1")
                    );
                    if (warehouseU8 != null) {
                        r.setUWarehouseName(warehouseU8.getUWarehouseName());
                    }
                }
            }

            return setSupplyName(getMpDataTable(iPage.getRecords(), iPage.getTotal()));
        } else {
            List<ReceiptHeader> list = receiptHeaderService.list(lambdaQueryWrapper);
            return setSupplyName(getDataTable(list));
        }
    }


    private TableDataInfo setSupplyName(TableDataInfo table){
        try {
            List<ReceiptHeader> list = (List<ReceiptHeader>) table.getData();
            List<String> codeList = list.stream().map(ReceiptHeader::getSupplierCode).distinct().collect(Collectors.toList());
            LambdaQueryWrapper<Supplier> query = new LambdaQueryWrapper<>();
//            query.eq(Supplier::getWarehouseCode,ShiroUtils.getWarehouseCode());
            query.in(Supplier::getCode, codeList);
//            query.last("limit 1");
            Map<String, String> map = supplierService.list(query).stream()
                    .collect(Collectors.toMap(
                            Supplier::getCode,
                            Supplier::getName,
                            (existingValue, newValue) -> existingValue // 保留第一个
                    ));
//            Map<String, String> map = supplierService.list(query).stream().collect(Collectors.toMap(Supplier::getCode, Supplier::getName));
            list.forEach(it->{
                it.setSupplierName(MapUtils.getString(map, it.getSupplierCode(),""));
            });

        }catch (Exception e){

        }finally {
            return table;
        }
    }

    /**
     * 新增入库单
     */
    @GetMapping("/add")
    public String add() {
        return prefix + "/add";
    }

    /**
     * 新增保存入库单
     */
    @ApiOperation(value = "新增入库单 ", notes = "新增入库单 ", httpMethod = "POST")
    @RequiresPermissions("receipt:receiptHeader:add")
    @Log(title = "入库-入库单 ", operating = "新增入库单 ", action = BusinessType.INSERT)
    @PostMapping("/add")
    @ResponseBody
    public AjaxResult addSave(ReceiptHeader receiptHeader) {
        return receiptHeaderService.saveReceiptHeader(receiptHeader);
    }

    /**
     * 修改入库单
     */
    @GetMapping("/edit/{id}")
    public String edit(@PathVariable("id") Integer id, ModelMap mmap) {
        ReceiptHeader receiptHeader = receiptHeaderService.getById(id);
        mmap.put("receiptHeader", receiptHeader);
        return prefix + "/edit";
    }

    /**
     * 修改保存入库单
     */
    @ApiOperation(value = "修改入库单", notes = "修改入库单", httpMethod = "POST")
    @RequiresPermissions("receipt:receiptHeader:edit")
    @Log(title = "入库-入库单 ", operating = "修改入库单 ", action = BusinessType.UPDATE)
    @PostMapping("/edit")
    @ResponseBody
    @Transactional
    public AjaxResult editSave(ReceiptHeader receiptHeader) {
        ReceiptHeader receiptHeader1 = receiptHeaderService.getById(receiptHeader.getId());
        if (!QuantityConstant.RECEIPT_TYPE_PPI.equals(receiptHeader1.getReceiptType()) && !QuantityConstant.MES_RECEIPT_TYPE_SI.equals(receiptHeader1.getReceiptType()) && !QuantityConstant.RECEIPT_TYPE_PPII.equals(receiptHeader1.getReceiptType())) {
//            return AjaxResult.error("只有手持入库单和產成品入庫可修改");
        }
        if(receiptHeader1.getFirstStatus()>100){
            return AjaxResult.error("已经超过订单池状态,不能修改");
        }
        //根据货主、u8仓库找到对应erp仓库code
        String erpCode=warehouseU8Service.getWarehouseErpCode(receiptHeader1.getWarehouseCode(),receiptHeader.getCompanyCode(),receiptHeader.getUWarehouseCode());
        receiptHeader.setErpWarehouseCode(erpCode);
//        List<ReceiptDetail> list = receiptDetailService.list(new LambdaQueryWrapper<ReceiptDetail>().eq(ReceiptDetail::getReceiptId, receiptHeader1.getId()));
//        list.forEach(l -> {
//            l.setCompanyCode(receiptHeader.getCompanyCode());
//            l.setUWarehouseCode(receiptHeader.getUWarehouseCode());
//            l.setErpWarehouseCode(erpCode);
//        });
//        if (list != null && list.size() > 0) {
//            receiptDetailService.updateBatchById(list);
//        }
        receiptHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
        Company company=companyService.getCompanyByCode(receiptHeader.getCompanyCode(),receiptHeader.getWarehouseCode());
        if(company!=null){
            receiptHeader.setErpCompanyCode(company.getErpCompany());
        }

        return toAjax(receiptHeaderService.updateById(receiptHeader));
    }

    /**
     * 入库单提交审核
     */
    @ApiOperation(value = "提交审核入库单", notes = "提交审核入库单", httpMethod = "POST")
    @RequiresPermissions("receipt:receiptHeader:approval")
    @Log(title = "入库-入库单 ", operating = "提交审核入库单 ", action = BusinessType.UPDATE)
    @PostMapping("/submitReview")
    @ResponseBody
    public AjaxResult submitReview(@ApiParam(name = "id", value = "入库头表id") String ids) {
        return receiptHeaderService.submitReview(ids);
    }

    /**
     * 审核入库单
     */
    @ApiOperation(value = "审核入库单", notes = "审核入库单", httpMethod = "POST")
    @RequiresPermissions("receipt:receiptHeader:review")
    @Log(title = "入库-入库单 ", operating = "审核入库单 ", action = BusinessType.UPDATE)
    @PostMapping("/approval")
    @ResponseBody
    public AjaxResult approval(@ApiParam(name = "id", value = "入库头表id") String ids,
                               @ApiParam(name = "approval", value = "审核结果值,10审核驳回,20作废,100审核成功") Integer approval) {

        return receiptDetailService.approval(ids, approval);
    }

//    /**
//     * 提交审核入库单
//     */
//    @ApiOperation(value="提交审核入库单", notes="提交审核入库单", httpMethod = "POST")
//    @RequiresPermissions("receipt:receiptHeader:approval")
//    @Log(title = "入库-入库单 ",operating = "提交审核入库单 ", action = BusinessType.UPDATE)
//    @PostMapping("/submitReview")
//    @ResponseBody
//    public AjaxResult submitReview(@ApiParam(name="id",value="入库头表id") Integer id) {
//        ReceiptHeader receiptHeader = new ReceiptHeader();
//        receiptHeader.setId(id);
//        receiptHeader.setFirstStatus(5);
//        receiptHeader.setLastStatus(5);
//        return toAjax(receiptHeaderService.updateById(receiptHeader));
//    }

    /**
     * 删除入库单
     */
    @ApiOperation(value = "删除入库单", notes = "删除入库单", httpMethod = "POST")
    @RequiresPermissions("receipt:receiptHeader:remove")
    @Log(title = "入库-入库单 ", operating = "入库单删除", action = BusinessType.UPDATE)
    @PostMapping("/remove")
    @Transactional(rollbackFor = Exception.class)
    @ResponseBody
    public AjaxResult remove(@ApiParam(name = "id", value = "入库头表id字符串") String ids) {
        if (StringUtils.isNull(ids)) {
            return AjaxResult.error("id为空");
        }

        return receiptHeaderService.deleteHeaderAndDetail(ids);
    }

    /**
     * 入库预约
     */
    @GetMapping("/arrival/{id}")
    public String reservation(@PathVariable("id") Integer id, ModelMap map) {
        LambdaQueryWrapper<ReceiptDetail> receiptDetailLambda = Wrappers.lambdaQuery();
        receiptDetailLambda.eq(ReceiptDetail::getReceiptId, id)
                .eq(ReceiptDetail::getProcessStamp, "120");
        List<ReceiptDetail> list = receiptDetailService.list(receiptDetailLambda);
        if (list == null) {
            throw new ServiceException("没有需要预约入库的单据");
        }
        ReceiptHeader receiptHeader = receiptHeaderService.getById(id);
        map.put("receiptHeader", receiptHeader);
        return prefix + "/reservation";
    }

    /**
     * 保存入库预约
     */
    @ApiOperation(value = "保存入库预约", notes = "保存入库预约", httpMethod = "POST")
    @RequiresPermissions("receipt:receiptHeader:reservation")
    @Log(title = "入库-入库单 ", operating = "入库单预约", action = BusinessType.UPDATE)
    @PostMapping("/arrival")
    @ResponseBody
    public AjaxResult reservation(ReceiptHeader receiptHeader) {
        return receiptHeaderService.reservation(receiptHeader);
    }

    @RequiresPermissions("receipt:receiptHeader:view")
    @GetMapping("/receiving")
    public String receiving() {
        return prefix + "/receiving";
    }

    /**
     * 入库质检
     */
    @ApiOperation(value = "入库质检", notes = "入库质检", httpMethod = "POST")
    @RequiresPermissions("receipt:receiptHeader:check")
    @Log(title = "入库-入库单质检", operating = "入库质检", action = BusinessType.OTHER)
    @PostMapping("/check")
    @ResponseBody
    public AjaxResult check(@ApiParam(name = "id", value = "入库头表id") Integer id) {
        if (StringUtils.isNull(id)) {
            return AjaxResult.error("id为空");
        }
        return receiptHeaderService.check(id);
    }

    /**
     * 入库单打印
     */
    @ApiOperation(value = "打印入库单报表", notes = "打印入库单报表", httpMethod = "POST")
    @RequiresPermissions("receipt:receiptHeader:report")
    @Log(title = "入库-入库单", operating = "打印入库单报表", action = BusinessType.OTHER)
    @GetMapping("/report/{id}")
    public String report(@ApiParam(name = "id", value = "入库头表id")
                         @PathVariable("id") Integer id, ModelMap mmap) {
        ReceiptHeader receiptHeader = receiptHeaderService.getById(id);
        String warehouseName = warehouseService.getWarehouseNameByCode(receiptHeader.getWarehouseCode());
        receiptHeader.setWarehouseName(warehouseName);
        String supplierName = supplierService.getSuppierNameByCode(receiptHeader.getSupplierCode(), receiptHeader.getWarehouseCode());
        receiptHeader.setSupplierName(supplierName);
        String receiptTypeName = receiptTypeService.getReceiptTypeNameByCode(receiptHeader.getReceiptType());
        receiptHeader.setReceiptTypeName(receiptTypeName);
        mmap.put("receiptHeader", receiptHeader);

        //查询对应入库明细
        LambdaQueryWrapper<ReceiptDetail> lambdaQueryWrapper = Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(ReceiptDetail::getReceiptId, id);
        List<ReceiptDetail> details = receiptDetailService.list(lambdaQueryWrapper);
        mmap.put("details", details);

        return prefix + "/reportV";
    }

    /**
     * 查询入库单
     */
    @ApiOperation(value = "查询入库单 ", notes = "查询入库单 ", httpMethod = "POST")
    @RequiresPermissions("receipt:receiptDetail:add")
    @Log(title = "入库-入库单 ", operating = "查询入库单 ", action = BusinessType.OTHER)
    @PostMapping("/getReceiptHeader")
    @ResponseBody
    public AjaxResult<ReceiptHeader> getReceiptHeader(String id) {
        if (StringUtils.isEmpty(id)) {
            return AjaxResult.success("");
        }
        return AjaxResult.success(receiptHeaderService.getById(id));
    }

    /**
     * 到货通知
     */
    @ApiOperation(value = "到货通知 ", notes = "到货通知 ", httpMethod = "POST")
    @RequiresPermissions("receipt:receiptDetail:add")
    @Log(title = "入库-入库单 ", operating = "到货通知 ", action = BusinessType.OTHER)
    @PostMapping("/arrivalNotice")
    @ResponseBody
    public AjaxResult arrivalNotice(String id) {
        if (StringUtils.isEmpty(id)) {
            return AjaxResult.success("");
        }
        return AjaxResult.success(receiptHeaderService.arrivalNotice(id));
    }

    /**
     * 加入订单池
     */
    @ApiOperation(value = "加入订单池 ", notes = "加入订单池 ", httpMethod = "POST")
    @RequiresPermissions("receipt:receiptHeader:addPool")
    @Log(title = "入库-入库单", operating = "加入订单池 ", action = BusinessType.OTHER)
    @PostMapping("/addPool")
    @ResponseBody
    public AjaxResult addPool(String ids) {
        if (StringUtils.isEmpty(ids)) {
            return AjaxResult.error("id不能为空");
        }
        return AjaxResult.success(receiptHeaderService.addPool(ids));
    }

    @ApiOperation(value = "越库", notes = "越库", httpMethod = "POST")
    @RequiresPermissions("receipt:receiptHeader:cross")
    @Log(title = "入库-入库单", operating = "越库", action = BusinessType.OTHER)
    @PostMapping("/crossLocation")
    @ResponseBody
    public AjaxResult crossLocation(String ids) {

        return AjaxResult.success(receiptHeaderService.crossLocation(ids));
    }

    /**
     * 越货
     */
    @Log(title = "入库-入库单", operating = "越库", action = BusinessType.OTHER)
    @PostMapping("/yueku")
    @ResponseBody
    public synchronized AjaxResult yueku(String ids) throws Exception {
        return receiptHeaderService.yueku(ids);
    }


    /**
     * 回传
     */
    @ApiOperation(value = "回传 ", notes = "回传 ", httpMethod = "POST")
    @Log(title = "入库-入库单", operating = "回传 ", action = BusinessType.OTHER)
    @PostMapping("/backERP")
    @ResponseBody
    public AjaxResult backERP(String id) {
        if (StringUtils.isEmpty(id)) {
            return AjaxResult.error("id不能为空");
        }
        ReceiptHeader receiptHeader = receiptHeaderService.getById(id);
        if (receiptHeader == null) {
            return AjaxResult.error("没有找到入库单");
        }

        receiptHeader.setFirstStatus(QuantityConstant.RECEIPT_HEADER_RETURN);
        receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_RETURN);
        receiptHeaderService.updateById(receiptHeader);
        return AjaxResult.success("回传成功");
    }
    /*@RequiresPermissions("receipt:bill:add")
    @Log(title = "ruku-入库单", operating="入库回传", action = BusinessType.OTHER)
    @PostMapping("/huichuan")
    @ResponseBody
    //@ApiLogger(from = "WMS",to = "U8",apiName = "入库单手动回传")
    public AjaxResult huichuan(String ids) {
        if (StringUtils.isEmpty(ids)){
            return AjaxResult.error("id不能为空");
        }

        String receiptUrl = addressService.getUrl("U8")+"InStorage/u";
        List<Integer> idList = Arrays.asList(Convert.toIntArray(ids));
        for (Integer id : idList) {
            return receiptHeaderService.huichuan(id,receiptUrl);
        }
        return AjaxResult.success("成功");
    }*/

    /**
     * 获取产成品入库单据
     */
    @GetMapping("/getReceiptSI")
    public String getReceiptSI() {
        return prefix + "/getReceiptSI";
    }


    /**
     * 获取产成品入库单据
     */
    @RequiresPermissions("receipt:receiptHeader:cross")
    @Log(title = "入库-入库单", operating = "产成品入库单获取", action = BusinessType.OTHER)
    @PostMapping("/getReceiptSI")
    @ResponseBody
    public synchronized AjaxResult getReceiptSI(String code, String companyCode, String uWarehouseCode) {
        if (StringUtils.isEmpty(code) || StringUtils.isEmpty(companyCode)) {
            return AjaxResult.error("编码为空");
        }
        return finishedProductService.getReceipt(code, companyCode, uWarehouseCode);
    }

    @PostMapping("/getwarehouse")
    @ResponseBody
    public TableDataInfo WarehouseList(String code) {
        WarehouseU8 warehouseWu = new WarehouseU8();
        LambdaQueryWrapper<WarehouseU8> lambdaQueryWrapper = Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(WarehouseU8::getWarehouseCode, ShiroUtils.getWarehouseCode());
        if (!code.equals("")) {
            lambdaQueryWrapper.eq(WarehouseU8::getCompanyCode, code);
        }
        List<WarehouseU8> list = warehouseU8Service.list(lambdaQueryWrapper);
        return getDataTable(list);
    }


    public AjaxResult sendSrmReceipt(String id) {
        if(id==null){
            return AjaxResult.error("参数为空");
        }
        ReceiptHeader receiptHeader=receiptHeaderService.getById(id);
        return srmReceiptService.sendSrmReceipt(receiptHeader);
    }
}