package com.yh.saas.plugin.yiliangyiyun.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.alipay.sofa.runtime.api.annotation.SofaReference;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.google.common.collect.Lists;
import com.winsea.svc.base.base.entity.CommonRoleResource;
import com.winsea.svc.base.base.exception.EnterpriseException;
import com.winsea.svc.base.base.service.ICommonRoleResourceService;
import com.winsea.svc.base.base.util.DateUtils;
import com.winsea.svc.base.security.entity.User;
import com.winsea.svc.base.security.util.AuthSecurityUtils;
import com.winsea.svc.base.workflow.entity.Workflow;
import com.yh.saas.common.support.util.IdGenerator;
import com.yh.saas.plugin.yiliangyiyun.constant.StatusEnum;
import com.yh.saas.plugin.yiliangyiyun.entity.*;
import com.yh.saas.plugin.yiliangyiyun.exception.YException;
import com.yh.saas.plugin.yiliangyiyun.exception.YExceptionEnum;
import com.yh.saas.plugin.yiliangyiyun.mapper.CollectionWarehousingRecordMapper;
import com.yh.saas.plugin.yiliangyiyun.service.*;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.httpclient.util.DateUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.net.URLDecoder;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;

/**
 * <p>
 * 代收入库记录 服务实现类
 * </p>
 *
 * @author Gdc
 * @since 2022-01-12
 */
@Service
@Slf4j
public class CollectionWarehousingRecordServiceImpl extends ServiceImpl<CollectionWarehousingRecordMapper, CollectionWarehousingRecord> implements ICollectionWarehousingRecordService {

    @Autowired
    private INewWorkflowService workflowService;
    @SofaReference
    private ICommonRoleResourceService roleResourceService;
    @Autowired
    private IIdentityAuthenticationInfoService iIdentityAuthenticationInfoService;
    @Autowired
    private IContractManagementInfoService contractManagementInfoService;
    @Autowired
    private IContractGoodsInfoService contractGoodsInfoService;

    @Value("${file-root-path}")
    private String localPath;


    /**
     * 代收记录列表
     *
     * @param collectionWarehousingRecord
     */
    @Override
    public Page<CollectionWarehousingRecord> selectCollectionWarehousingRecordPage(CollectionWarehousingRecord collectionWarehousingRecord) {
        Map<String, Object> pageView = new HashMap<>();
        pageView.put("startRecord", (collectionWarehousingRecord.getCurrentPage() - 1)
                * collectionWarehousingRecord.getPageSize());
        List<String> businessKeys = null;
        if ("2".equals(collectionWarehousingRecord.getSearchType())) {
            businessKeys = workflowService.getTaskBusinessKeysByCode("COLLECTION-WAREHOUSING-RECORD");
        }
        List<String> statusSet = new ArrayList<>();
        List<String> resourceIdList = this.getResourceIdList();
        if (resourceIdList.contains("saleOutReport-Edit")) { // 填写，提交    权限做完以后替换
            List<String> statusList = Lists.newArrayList(StatusEnum.PUR_RETURN.getFlag());
            statusSet.addAll(statusList);
        }
        Calendar cal = Calendar.getInstance();
        int yearNum = cal.get(Calendar.YEAR);
//        int month = cal.get(Calendar.MONTH) + 1;
//        if(month < 9){
//            yearNum --;
//        }

        SimpleDateFormat now = new SimpleDateFormat(yearNum +"-01-01 00:00:00");
        Calendar c = Calendar.getInstance();
        c.setTime(new java.util.Date());
        c.add(Calendar.YEAR, 0);
        Date y = c.getTime();
        String year = now.format(y);
        //公司id
        pageView.put("compId", collectionWarehousingRecord.getCompId());
        pageView.put("year", year);
        pageView.put("searchKeyWord", collectionWarehousingRecord.getSearchKeyWord());
        pageView.put("searchType", collectionWarehousingRecord.getSearchType());
        pageView.put("pageSize", collectionWarehousingRecord.getPageSize());
        pageView.put("currentPage", collectionWarehousingRecord.getCurrentPage());
        pageView.put("contractNo", collectionWarehousingRecord.getContractNo());
        pageView.put("businessKeys", businessKeys);
        pageView.put("statusSet", statusSet);
        // 查询总数
        Integer dataCount = baseMapper.getCountByCondition(pageView);
        List<CollectionWarehousingRecord> dataList = baseMapper.getListByCondition(pageView);
        if (!CollectionUtils.isEmpty(dataList)) {
            dataList.forEach(collectionWarehousingRecord1 -> {

                String taskId = "";
                // 只有待审核状态才有taskId
                if (StringUtils.isNotBlank(collectionWarehousingRecord1.getWorkflowId())) {
                    JSONObject jsonObject = workflowService.getActiveTask(Lists.newArrayList(collectionWarehousingRecord1.getWorkflowId()), collectionWarehousingRecord1.getId());
                    taskId = jsonObject.getString("taskId");
                    collectionWarehousingRecord1.setTaskId(taskId);
                }
            });

        }
        Page<CollectionWarehousingRecord> page = new Page<>();
        page.setRecords(dataList == null ? Lists.newArrayList() : dataList);
        page.setTotal(dataCount == null ? 0 : dataCount);
        page.setCurrent(collectionWarehousingRecord.getCurrentPage());
        page.setSize(collectionWarehousingRecord.getPageSize());
        return page;
    }




    private List<String> getResourceIdList() {
        User currentUser = AuthSecurityUtils.getCurrentUserInfo();
        // 当前登录人主要角色
        return roleResourceService.getBindResourcesByUserId(currentUser.getUserId()).stream()
                .map(CommonRoleResource::getResourceId).collect(Collectors.toList());

    }
    /**
     * 添加代收合同入库记录
     *
     * @param collectionWarehousingRecord
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public String insertCollectionWarehousingRecord(CollectionWarehousingRecord collectionWarehousingRecord) {
        List<CollectionWarehousingRecord> collectionWarehousingRecord1 = collectionWarehousingRecord.getExcelList();
        ContractManagementInfo contractManagementInfo=contractManagementInfoService.selectOne(new EntityWrapper<ContractManagementInfo>()
                .eq("contract_no",collectionWarehousingRecord.getContractNo())
                .eq("comp_id",collectionWarehousingRecord.getCompId()));
        ContractGoodsInfo contractGoodsInfo=contractGoodsInfoService.selectOne(new EntityWrapper<ContractGoodsInfo>()
        .eq("contract_id",contractManagementInfo.getId()));
        if(!CollectionUtils.isEmpty(collectionWarehousingRecord1)){
            for(CollectionWarehousingRecord warehousingRecord:collectionWarehousingRecord1){
                //新增主键id
                warehousingRecord.setId(IdGenerator.generateUUID());
                warehousingRecord.setCompId(contractManagementInfo.getCompId());
                warehousingRecord.setContractNo(contractManagementInfo.getContractNo());
                warehousingRecord.setGoodsName(contractGoodsInfo.getGoodsName());
                //单价x净重=应付
                warehousingRecord.setAmountIngPayable(warehousingRecord.getUnitHave()*warehousingRecord.getNetWeight());
                warehousingRecord.setAmountNotPayable(warehousingRecord.getUnitHave()*warehousingRecord.getNetWeight());
                //收购单价+代收费=销售单价
                warehousingRecord.setUnitDeduction(warehousingRecord.getUnitHave()+contractManagementInfo.getAgencyCharge());
                //销售单价x净重=应收
                warehousingRecord.setAmountNotCollectable(warehousingRecord.getUnitDeduction()*warehousingRecord.getNetWeight());
                IdentityAuthenticationInfo identityAuthenticationInfo=iIdentityAuthenticationInfoService.selectOne(new EntityWrapper<IdentityAuthenticationInfo>()
                        .eq("customer_number_card",warehousingRecord.getCustomerNumberCard())
                        .eq("authentication_status_key","7"));
                if (identityAuthenticationInfo!=null){
                    warehousingRecord.setIdentityId(identityAuthenticationInfo.getId());
                    if (!warehousingRecord.getCustomerName().equals(identityAuthenticationInfo.getCustomerName())){
                        warehousingRecord.setCustomerName("");
                    }
                    warehousingRecord.setCustomerPhone(identityAuthenticationInfo.getCustomerPhone());
                    this.insert(warehousingRecord);
                }
                else{
                    throw new EnterpriseException(warehousingRecord.getCustomerName()+""+warehousingRecord.getCustomerNumberCard(),"身份证号有误或未认证");
                }

                boolean isStartWorkflow = org.apache.commons.lang3.StringUtils.isBlank(warehousingRecord.getWorkflowId());
                // 不是退回的单子
                if (isStartWorkflow) {
                    Workflow workflow = workflowService
                            .findLatestWorkflowByBusinessCodeByApp(warehousingRecord.getCompId(), "COLLECTION-WAREHOUSING-RECORD");
                    // 没配置审核流程，直接结束并处理信息
                    if (workflow == null) {
                        throw new YException(YExceptionEnum.PURCHASE_ORDER_ERROR);
                    }
                    // 开启审核流
                    else {

                        // 设置状态 已提交审核
                        warehousingRecord.setWorkflowId(workflow.getId());
                        this.updateById(warehousingRecord);
                        workflowService.startInstance(workflow.getId(), warehousingRecord.getId());
                    }
                }
                // 退回的单子 再启用
                else {

                    this.updateById(warehousingRecord);
                    workflowService.activateInstance(warehousingRecord.getWorkflowId(), warehousingRecord.getId());
                }
            }

        }
//        // 插入操作历史
//        String staffName = this.billOperateHisService.getStaffAndName();
        // 插入操作历史
//        this.billOperateHisService.saveBillOperateHis(salePlanInfo.getId(), NumberConstant.CONSTANT_PURCHASE, staffName, null,
//                salePlanInfo.getStatus(), null, "");
        return "ok";
    }

    /**
     * 删除
     *
     * @param id
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteCollectionWarehousingRecord(String id) {
        //查询代收记录信息
        CollectionWarehousingRecord collectionWarehousingRecord = this.selectById(id);
        if (collectionWarehousingRecord != null) {
            //删除代收记录信息
            this.deleteById(collectionWarehousingRecord.getId());
        }
    }


    /**
     * 编辑
     *
     * @param collectionWarehousingRecord
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public String editCollectionWarehousingRecord(CollectionWarehousingRecord collectionWarehousingRecord) {
        boolean one = this.updateById(collectionWarehousingRecord);
        if (StatusEnum.TASK_RETURN.getFlag().equals(collectionWarehousingRecord.getStatusFlag())) {
            boolean isStartWorkflow = org.apache.commons.lang3.StringUtils.isBlank(collectionWarehousingRecord.getWorkflowId());
            // 不是退回的单子
            if (isStartWorkflow) {
                Workflow workflow = workflowService
                        .findLatestWorkflowByBusinessCodeByApp(collectionWarehousingRecord.getCompId(), "COLLECTION-WAREHOUSING-RECORD");
                // 没配置审核流程，直接结束并处理信息
                if (workflow == null) {
                    throw new YException(YExceptionEnum.PURCHASE_ORDER_ERROR);
                }
                // 开启审核流
                else {

                    // 设置状态 已提交审核
                    collectionWarehousingRecord.setWorkflowId(workflow.getId());
                    this.updateById(collectionWarehousingRecord);
                    workflowService.startInstance(workflow.getId(), collectionWarehousingRecord.getId());
                }
            }
            // 退回的单子 再启用
            else {

                this.updateById(collectionWarehousingRecord);
                workflowService.activateInstance(collectionWarehousingRecord.getWorkflowId(), collectionWarehousingRecord.getId());
            }
        }
        if (one) {
            return "OK";
        } else {
            return "NG";
        }
    }

    /**
     * 查看代收记录信息
     *
     * @param id
     * @return
     */
    @Override
    public CollectionWarehousingRecord getCollectionWarehousingRecord(String id) {
        //查看代收记录信息
        CollectionWarehousingRecord collectionWarehousingRecord = this.selectById(id);
        ContractManagementInfo contractManagementInfo=contractManagementInfoService.selectOne(new EntityWrapper<ContractManagementInfo>()
            .eq("contract_no",collectionWarehousingRecord.getContractNo())
            .eq("comp_id",collectionWarehousingRecord.getCompId()));
        //合同代收费
        collectionWarehousingRecord.setAgencyCharge(contractManagementInfo.getAgencyCharge());
        collectionWarehousingRecord.setBuyer(contractManagementInfo.getBuyer());
        return collectionWarehousingRecord;
    }

    @Override
    public void export(CollectionWarehousingRecord collectionWarehousingRecord, HttpServletResponse response) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        // 1.Excel的头部信息
        String headerTitle = "";

        // 2.创建一个webbook 对应一个Excel文件
        HSSFWorkbook wb = new HSSFWorkbook();

        // 3.在webbook中添加一个sheet，对应Excel文件中的sheet
        HSSFSheet sheet;

        sheet = wb.createSheet("代收合同入库信息");
        headerTitle = "代收合同入库信息";

        // 4.设置打印参数
        sheet.setMargin(HSSFSheet.TopMargin, (short) 1);// 页边距（上）
        sheet.setMargin(HSSFSheet.BottomMargin, (short) 1);// 页边距（下）
        sheet.setMargin(HSSFSheet.LeftMargin, (short) 1);// 页边距（左）
        sheet.setMargin(HSSFSheet.RightMargin, (short) 1);// 页边距（右）

        // 不显示网格
        sheet.setDisplayGridlines(false);
        // 设置水平居中
        sheet.setHorizontallyCenter(true);

        /**************** 数据行样式 start ****************/
        HSSFFont fontTitle = wb.createFont();
        fontTitle.setFontName("宋体");
        fontTitle.setFontHeightInPoints((short) 14);
        // 设置字体加粗
        fontTitle.setBold(true);

        HSSFFont fontComp = wb.createFont();
        fontComp.setFontName("宋体");
        fontComp.setFontHeightInPoints((short) 16);
        // 设置字体加粗
        fontComp.setBold(true);

        HSSFFont fontDetail = wb.createFont();
        fontDetail.setFontName("宋体");
        fontDetail.setFontHeightInPoints((short) 12);

        // title
        HSSFCellStyle styleTitle = wb.createCellStyle();
        // 指定单元格居中对齐
        styleTitle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        // 指定单元格垂直居中对齐
        styleTitle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        // 指定单元格自动换行
        styleTitle.setWrapText(true);
        // 设置单元格字体
        styleTitle.setFont(fontTitle);
        // 右边框
        styleTitle.setBorderRight(HSSFCellStyle.BORDER_NONE);
        // 左边框
        styleTitle.setBorderLeft(HSSFCellStyle.BORDER_NONE);
        // 上边框
        styleTitle.setBorderTop(HSSFCellStyle.BORDER_NONE);
        // 下边框
        styleTitle.setBorderBottom(HSSFCellStyle.BORDER_NONE);

        HSSFCellStyle contextstyle = wb.createCellStyle();
        // 指定单元格居中对齐
        contextstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        // 指定单元格垂直居中对齐
        contextstyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        // 指定单元格自动换行
        contextstyle.setWrapText(true);
        // 设置单元格字体
        contextstyle.setFont(fontDetail);
        // 右边框
        contextstyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        // 左边框
        contextstyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        // 上边框
        contextstyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
        // 下styleDetailTitle
        contextstyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);

        // title
        HSSFCellStyle styleComp = wb.createCellStyle();
        // 指定单元格居中对齐
        styleComp.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        // 指定单元格垂直居中对齐
        styleComp.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        // 指定单元格自动换行
        styleComp.setWrapText(true);
        // 设置单元格字体
        styleComp.setFont(fontComp);
        // 右边框
        styleComp.setBorderRight(HSSFCellStyle.BORDER_NONE);
        // 左边框
        styleComp.setBorderLeft(HSSFCellStyle.BORDER_NONE);
        // 上边框
        styleComp.setBorderTop(HSSFCellStyle.BORDER_NONE);
        // 下边框
        styleComp.setBorderBottom(HSSFCellStyle.BORDER_NONE);

        HSSFCellStyle styleInfo = wb.createCellStyle();
        // 指定单元格居中对齐
        styleInfo.setAlignment(HSSFCellStyle.ALIGN_LEFT);
        // 指定单元格垂直居中对齐
        styleInfo.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        // 指定单元格自动换行
        styleInfo.setWrapText(true);
        // 设置单元格字体
        styleInfo.setFont(fontDetail);
        // 右边框
        styleInfo.setBorderRight(HSSFCellStyle.BORDER_NONE);
        // 左边框
        styleInfo.setBorderLeft(HSSFCellStyle.BORDER_NONE);
        // 上边框
        styleInfo.setBorderTop(HSSFCellStyle.BORDER_NONE);
        // 下边框
        styleInfo.setBorderBottom(HSSFCellStyle.BORDER_NONE);

        HSSFCellStyle styleDetail = wb.createCellStyle();
        // 指定单元格居中对齐
        styleDetail.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        // 指定单元格垂直居中对齐
        styleDetail.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        // 指定单元格自动换行
        styleDetail.setWrapText(true);
        // 设置单元格字体
        styleDetail.setFont(fontDetail);
        // 右边框
        styleDetail.setBorderRight(HSSFCellStyle.BORDER_THIN);
        // 左边框
        styleDetail.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        // 上边框
        styleDetail.setBorderTop(HSSFCellStyle.BORDER_THIN);
        // 下styleDetailTitle
        styleDetail.setBorderBottom(HSSFCellStyle.BORDER_THIN);

        HSSFCellStyle styleDetailYellow = wb.createCellStyle();
        // 指定单元格居中对齐
        styleDetailYellow.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        // 指定单元格垂直居中对齐
        styleDetailYellow.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        // 指定单元格自动换行
        styleDetailYellow.setWrapText(true);
        // 设置单元格字体
        styleDetailYellow.setFont(fontDetail);
        // 右边框
        styleDetailYellow.setBorderRight(HSSFCellStyle.BORDER_THIN);
        // 左边框
        styleDetailYellow.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        // 上边框
        styleDetailYellow.setBorderTop(HSSFCellStyle.BORDER_THIN);
        // 下styleDetailTitle
        styleDetailYellow.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        styleDetailYellow.setFillForegroundColor(IndexedColors.YELLOW.getIndex());
        styleDetailYellow.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);


        HSSFCellStyle styleDetailLeft = wb.createCellStyle();
        // 指定单元格居中对齐
        styleDetailLeft.setAlignment(HSSFCellStyle.ALIGN_LEFT);
        // 指定单元格垂直居中对齐
        styleDetailLeft.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        // 指定单元格自动换行
        styleDetailLeft.setWrapText(true);
        // 设置单元格字体
        styleDetailLeft.setFont(fontDetail);
        // 右边框
        styleDetailLeft.setBorderRight(HSSFCellStyle.BORDER_THIN);
        // 左边框
        styleDetailLeft.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        // 上边框
        styleDetailLeft.setBorderTop(HSSFCellStyle.BORDER_THIN);
        // 下styleDetailTitle
        styleDetailLeft.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        /**************** 数据行样式 end ****************/

        // 设置列宽
        sheet.setColumnWidth(0, 1 * 256 + 184);
        sheet.setColumnWidth(1, 12 * 256 + 184);
        sheet.setColumnWidth(2, 12 * 256 + 184);
        sheet.setColumnWidth(3, 12 * 256 + 184);
        sheet.setColumnWidth(4, 12 * 256 + 184);
        sheet.setColumnWidth(5, 12 * 256 + 184);
        sheet.setColumnWidth(6, 12 * 256 + 184);
        sheet.setColumnWidth(7, 12 * 256 + 184);
        sheet.setColumnWidth(8, 12 * 256 + 184);
        sheet.setColumnWidth(9, 12 * 256 + 184);
        sheet.setColumnWidth(10, 12 * 256 + 184);
        sheet.setColumnWidth(11, 12 * 256 + 184);
        sheet.setColumnWidth(12, 12 * 256 + 184);
        sheet.setColumnWidth(13, 12 * 256 + 184);
        sheet.setColumnWidth(14, 12 * 256 + 184);
        sheet.setColumnWidth(15, 12 * 256 + 184);
        sheet.setColumnWidth(16, 1 * 256 + 184);

        // 创建单元格对象
        HSSFCell cell = null;

        // 创建打印设置对象
        HSSFPrintSetup ps = sheet.getPrintSetup();
        // 打印方向，true：横向，false：纵向(默认)
        ps.setLandscape(false);
        // // 打印质量
        // ps.setVResolution((short) 700)
        // 设置缩放比例
        ps.setScale((short) 80);
        // 纸张类型
        ps.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE);


        int rownum = 1;
        HSSFRow row0 = sheet.createRow((int) rownum);
        row0.setHeightInPoints(25);
        cell = row0.createCell(1);
        cell.setCellStyle(styleTitle);
        cell.setCellValue("代收合同入库信息");
        sheet.addMergedRegion(new CellRangeAddress(rownum, rownum, (short) 1, (short) 22));
        cell = row0.createCell(2);
        cell.setCellStyle(styleTitle);
        cell = row0.createCell(3);
        cell.setCellStyle(styleTitle);
        cell = row0.createCell(4);
        cell.setCellStyle(styleTitle);
        cell = row0.createCell(5);
        cell.setCellStyle(styleTitle);
        cell = row0.createCell(6);
        cell.setCellStyle(styleTitle);
        cell = row0.createCell(7);
        cell.setCellStyle(styleTitle);
        cell = row0.createCell(8);
        cell.setCellStyle(styleTitle);
        cell = row0.createCell(9);
        cell.setCellStyle(styleTitle);
        cell = row0.createCell(10);
        cell.setCellStyle(styleTitle);
        cell = row0.createCell(11);
        cell.setCellStyle(styleTitle);
        cell = row0.createCell(12);
        cell.setCellStyle(styleTitle);
        cell = row0.createCell(13);
        cell.setCellStyle(styleTitle);
        cell = row0.createCell(14);
        cell.setCellStyle(styleTitle);
        cell = row0.createCell(15);
        cell.setCellStyle(styleTitle);
        rownum++;

        HSSFRow row1 = sheet.createRow((int) rownum);
        row1.setHeightInPoints(30);
        cell = row1.createCell(1);
        cell.setCellValue("采购公司");
        cell.setCellStyle(styleDetail);
        cell = row1.createCell(2);
        cell.setCellValue("开票日期");
        cell.setCellStyle(styleDetail);
        cell = row1.createCell(3);
        cell.setCellValue("合同编号");
        cell.setCellStyle(styleDetail);
        cell = row1.createCell(4);
        cell.setCellValue("客户");
        cell.setCellStyle(styleDetail);
        cell = row1.createCell(5);
        cell.setCellValue("供应商");
        cell.setCellStyle(styleDetail);
        cell = row1.createCell(6);
        cell.setCellValue("货名");
        cell.setCellStyle(styleDetail);
        cell = row1.createCell(7);
        cell.setCellValue("类型");
        cell.setCellStyle(styleDetail);
        cell = row1.createCell(8);
        cell.setCellValue("等级");
        cell.setCellStyle(styleDetail);
        cell = row1.createCell(9);
        cell.setCellValue("车牌号");
        cell.setCellStyle(styleDetail);
        cell = row1.createCell(10);
        cell.setCellValue("收购单价");
        cell.setCellStyle(styleDetail);
        cell = row1.createCell(11);
        cell.setCellValue("净重");
        cell.setCellStyle(styleDetail);
        cell = row1.createCell(12);
        cell.setCellValue("应付");
        cell.setCellStyle(styleDetail);
        cell = row1.createCell(13);
        cell.setCellValue("姓名");
        cell.setCellStyle(styleDetail);
        cell = row1.createCell(14);
        cell.setCellValue("卡号");
        cell.setCellStyle(styleDetail);
        cell = row1.createCell(15);
        cell.setCellValue("开户支行");
        cell.setCellStyle(styleDetail);


        rownum++;
        // 详情信息
        if (!CollectionUtils.isEmpty(collectionWarehousingRecord.getCollectionWarehousingRecordList())) {
            for (int i = 0; i < collectionWarehousingRecord.getCollectionWarehousingRecordList().size(); i++) {
                CollectionWarehousingRecord collectionWarehousingRecord1 = collectionWarehousingRecord.getCollectionWarehousingRecordList().get(i);
                ContractManagementInfo contractManagementInfo=contractManagementInfoService.selectOne(new EntityWrapper<ContractManagementInfo>()
                        .eq("contract_no",collectionWarehousingRecord1.getContractNo())
                        .eq("comp_id",collectionWarehousingRecord1.getCompId()));
                IdentityAuthenticationInfo identityAuthenticationInfo=iIdentityAuthenticationInfoService.selectOne(new EntityWrapper<IdentityAuthenticationInfo>()
                        .eq("customer_number_card",collectionWarehousingRecord1.getCustomerNumberCard()));
                if (identityAuthenticationInfo!=null){
                    collectionWarehousingRecord1.setIdentityAuthenticationInfo(identityAuthenticationInfo);
                }
                HSSFRow rowx = sheet.createRow((int) rownum);
                rowx.setHeightInPoints(20);
                cell = rowx.createCell(1);
                cell.setCellValue(contractManagementInfo.getBuyer());
                cell.setCellStyle(styleDetail);
                cell = rowx.createCell(2);
                String date = addDateOneDay(collectionWarehousingRecord1.getInvoicingDate()!=null?collectionWarehousingRecord1.getInvoicingDate():new Date());
                cell.setCellValue(date);
                cell.setCellStyle(styleDetail);
                cell = rowx.createCell(3);
                cell.setCellValue(collectionWarehousingRecord1.getContractNo());
                cell.setCellStyle(styleDetail);
                HSSFDataFormat df = wb.createDataFormat(); // 此处设置数据格式
                contextstyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("#,##0.00"));//保留两位小数点
                cell = rowx.createCell(4);
                cell.setCellValue(collectionWarehousingRecord1.getCustomerName());
                cell.setCellStyle(styleDetail);
                cell = rowx.createCell(5);
                cell.setCellValue(collectionWarehousingRecord1.getIdentityAuthenticationInfo().getSupplier());
                cell.setCellStyle(styleDetail);
                cell = rowx.createCell(6);
                cell.setCellValue(collectionWarehousingRecord1.getGoodsName());
                cell.setCellStyle(styleDetail);
                String type="";
                if (collectionWarehousingRecord1.getGoodsName().contains("潮")){
                    type="潮粮";
                }
                else {
                    type="干粮";
                }
                cell = rowx.createCell(7);
                cell.setCellValue(type);
                cell.setCellStyle(styleDetail);
                cell = rowx.createCell(8);
                cell.setCellValue(collectionWarehousingRecord1.getGrade());
                cell.setCellStyle(styleDetail);
                cell = rowx.createCell(9);
                cell.setCellValue(collectionWarehousingRecord1.getCarNo());
                cell.setCellStyle(styleDetail);
                cell = rowx.createCell(10);
                cell.setCellValue(editDouble(collectionWarehousingRecord1.getUnitHave()));
                cell.setCellStyle(contextstyle);
                cell = rowx.createCell(11);
                cell.setCellValue(editFloat(collectionWarehousingRecord1.getNetWeight()));
                cell.setCellStyle(contextstyle);
                cell = rowx.createCell(12);
                cell.setCellValue(editDouble(collectionWarehousingRecord1.getAmountIngPayable()));
                cell.setCellStyle(contextstyle);
                cell = rowx.createCell(13);
                cell.setCellValue(collectionWarehousingRecord1.getIdentityAuthenticationInfo().getPayeeName());
                cell.setCellStyle(styleDetail);
                cell = rowx.createCell(14);
                cell.setCellValue(collectionWarehousingRecord1.getIdentityAuthenticationInfo().getBankCard());
                cell.setCellStyle(styleDetail);
                cell = rowx.createCell(15);
                cell.setCellValue(collectionWarehousingRecord1.getIdentityAuthenticationInfo().getBankDeposit()+"-"+collectionWarehousingRecord1.getIdentityAuthenticationInfo().getBankDepositBranch());
                cell.setCellStyle(styleDetail);
                rownum++;
            }
        }



        String path = null;
        String tempPath = null;
        String excelPath = null;

        try {

            // 取得绝对路径
            tempPath = URLDecoder.decode((localPath), "utf-8");

            // EXCEL路径
            excelPath = "/web/temp/pay/" + DateUtil.formatDate(new Date(), DateUtils.DATE_FMT_YYYYMMDD_NS) + '/'
                    + UUID.randomUUID().toString().replaceAll("-", "");

            path = tempPath + excelPath + '/' + "合同信息"
                    + ".xls";

        } catch (Exception e) {
            log.debug(e.getMessage());
        }
        // 下载
        download(path, response, wb);

    }

    /**
     * 批量开发票
     * @param collectionWarehousingRecord
     * @return
     */
    @Override
    public String openInvoiceList(CollectionWarehousingRecord collectionWarehousingRecord) {
        List<CollectionWarehousingRecord> collectionWarehousingRecordList = collectionWarehousingRecord.getCollectionWarehousingRecordList();
        //批量
        if (!CollectionUtils.isEmpty(collectionWarehousingRecordList)) {
            //开自采发票
            if("1".equals(collectionWarehousingRecord.getFlag())){
                for (CollectionWarehousingRecord collectionWarehousingRecord1 : collectionWarehousingRecordList) {
                    collectionWarehousingRecord1.setInvoicing("1");
                    collectionWarehousingRecord1.setInvoicingDate(new Date());
                    this.updateById(collectionWarehousingRecord1);
                }
            }
            //开销售发票
            else {
                for (CollectionWarehousingRecord collectionWarehousingRecord1 : collectionWarehousingRecordList) {
                    collectionWarehousingRecord1.setInvoicingSale("1");
                    this.updateById(collectionWarehousingRecord1);
                }
            }

        }
        return "ok";
    }

    /**
     * 付款
     * @param collectionWarehousingRecord
     * @return
     */
    @Override
    public String payMoney(CollectionWarehousingRecord collectionWarehousingRecord) {
        List<CollectionWarehousingRecord> collectionWarehousingRecordList = collectionWarehousingRecord.getCollectionWarehousingRecordList();
        Double money = collectionWarehousingRecord.getMoney();
        //付款多条
        if (!CollectionUtils.isEmpty(collectionWarehousingRecordList)) {
            for (CollectionWarehousingRecord collectionWarehousingRecord1 : collectionWarehousingRecordList) {
                CollectionWarehousingRecord collectionWarehousingRecord2 = this.selectById(collectionWarehousingRecord1.getId());
                //付款金额大于本次循环未付金额
                if (money >= collectionWarehousingRecord1.getAmountNotPayable()) {
                    money=money-collectionWarehousingRecord1.getAmountNotPayable();
                    //全部付款
                    collectionWarehousingRecord1.setStatus(StatusEnum.PUR_PAYaLL.getName());
                    collectionWarehousingRecord1.setStatusFlag(StatusEnum.PUR_PAYaLL.getFlag());
                    collectionWarehousingRecord1.setPaymentDate(collectionWarehousingRecord.getPaymentDate());
                    collectionWarehousingRecord1.setPaymentScreenshot(collectionWarehousingRecord2.getPaymentScreenshot() != null ? collectionWarehousingRecord2.getPaymentScreenshot() + '$' + collectionWarehousingRecord.getPaymentScreenshot() : collectionWarehousingRecord.getPaymentScreenshot());
                    collectionWarehousingRecord1.setAmountEdPayable(collectionWarehousingRecord1.getAmountEdPayable() + collectionWarehousingRecord1.getAmountNotPayable());
                    collectionWarehousingRecord1.setAmountNotPayable(0.0d);
                    this.updateById(collectionWarehousingRecord1);
                } else if (money > 0) {
                    Double moneyTmp =money-collectionWarehousingRecord1.getAmountNotPayable();
                    //部分付款
                    collectionWarehousingRecord1.setStatus(StatusEnum.PUR_PAY.getName());
                    collectionWarehousingRecord1.setStatusFlag(StatusEnum.PUR_PAY.getFlag());
                    collectionWarehousingRecord1.setPaymentDate(collectionWarehousingRecord.getPaymentDate());
                    collectionWarehousingRecord1.setPaymentScreenshot(collectionWarehousingRecord2.getPaymentScreenshot() != null ? collectionWarehousingRecord2.getPaymentScreenshot() + '$' + collectionWarehousingRecord.getPaymentScreenshot() : collectionWarehousingRecord.getPaymentScreenshot());
                    collectionWarehousingRecord1.setAmountEdPayable(collectionWarehousingRecord1.getAmountEdPayable() + money);
                    collectionWarehousingRecord1.setAmountNotPayable(collectionWarehousingRecord1.getAmountNotPayable() - money);
                    this.updateById(collectionWarehousingRecord1);
                    money = moneyTmp;
                } else {
                    break;
                }
            }
        }
        return "ok";
    }

    /**
     * 收款
     * @param collectionWarehousingRecord
     * @return
     */
    @Override
    public String collectMoney(CollectionWarehousingRecord collectionWarehousingRecord) {
        List<CollectionWarehousingRecord> collectionWarehousingRecordList = collectionWarehousingRecord.getCollectionWarehousingRecordList();
        Double money = collectionWarehousingRecord.getMoney();
        //收款多条
        if (!CollectionUtils.isEmpty(collectionWarehousingRecordList)) {
            for (CollectionWarehousingRecord collectionWarehousingRecord1 : collectionWarehousingRecordList) {
                CollectionWarehousingRecord collectionWarehousingRecord2 = this.selectById(collectionWarehousingRecord1.getId());
                //收款金额大于本次循环未收金额
                if (money >= collectionWarehousingRecord1.getAmountNotCollectable()) {
                    money = money - collectionWarehousingRecord1.getAmountNotCollectable();
                    //全部收款
                    collectionWarehousingRecord1.setStatus(StatusEnum.PUR_COLLECTaLL.getName());
                    collectionWarehousingRecord1.setStatusFlag(StatusEnum.PUR_COLLECTaLL.getFlag());
                    collectionWarehousingRecord1.setCollectionDate(collectionWarehousingRecord.getCollectionDate());
                    collectionWarehousingRecord1.setCollectionScreenshot(collectionWarehousingRecord2.getCollectionScreenshot() != null ? collectionWarehousingRecord2.getCollectionScreenshot() + '$' + collectionWarehousingRecord.getCollectionScreenshot() : collectionWarehousingRecord.getCollectionScreenshot());
                    collectionWarehousingRecord1.setAmountEdCollectionable(collectionWarehousingRecord1.getAmountEdCollectionable() + collectionWarehousingRecord1.getAmountNotCollectable());
                    collectionWarehousingRecord1.setAmountNotCollectable(0.0d);
                    this.updateById(collectionWarehousingRecord1);
                } else if (money > 0) {
                    Double moneyTmp = money - collectionWarehousingRecord1.getAmountNotCollectable();
                    //部分收款
                    collectionWarehousingRecord1.setStatus(StatusEnum.PUR_COLLECT.getName());
                    collectionWarehousingRecord1.setStatusFlag(StatusEnum.PUR_COLLECT.getFlag());
                    collectionWarehousingRecord1.setCollectionDate(collectionWarehousingRecord.getCollectionDate());
                    collectionWarehousingRecord1.setCollectionScreenshot(collectionWarehousingRecord2.getCollectionScreenshot() != null ? collectionWarehousingRecord2.getCollectionScreenshot() + '$' + collectionWarehousingRecord.getCollectionScreenshot() : collectionWarehousingRecord.getCollectionScreenshot());
                    collectionWarehousingRecord1.setAmountEdCollectionable(collectionWarehousingRecord1.getAmountEdCollectionable() + money);
                    collectionWarehousingRecord1.setAmountNotCollectable(collectionWarehousingRecord1.getAmountNotCollectable() - money);
                    this.updateById(collectionWarehousingRecord1);
                    money = moneyTmp;
                } else {
                    break;
                }
            }
        }
        return "OK";
    }


    private String addDateOneDay(Date date) {
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
        return sdf.format(date);
    }

    /**
     * 判断浮点数
     *
     * @param example
     * @return
     */
    private Float editFloat(Float example) {
        Float exampleOne = example != null ? example : 0f;
        return exampleOne;
    }
    /**
     * 判断浮点数
     *
     * @param example
     * @return
     */
    private Double editDouble(Double example) {
        Double exampleOne = example != null ? example : 0d;
        return exampleOne;
    }

    /**
     * 判断字符串
     *
     * @param example
     * @return
     */
    private String editString(String example) {
        String exampleOne = example != null ? example : "";
        return exampleOne;
    }

    /**
     * 下载
     *
     * @param path
     * @param response
     */
    private void download(String path, HttpServletResponse response, Workbook wb) {

        try {

            // path是指欲下载的文件的路径。
            File file = new File(path);
            // 取得文件名。
            String fileName = file.getName();
            // 给文件名编码
            fileName = new String(fileName.getBytes("GBK"), "ISO-8859-1");

            response.setContentType("application/vnd.ms-excel");
            response.addHeader("Content-Disposition", "attachment;filename=" + fileName);

            // 定义byte输出流
            ByteArrayOutputStream out = new ByteArrayOutputStream();

            // 写导出文件
            wb.write(out);

            // 取得模板文件中的数据
            byte[] result = out.toByteArray();

            // 设置输出数据类型
            response.setContentType("application/vnd.ms-excel");
            // 设置输出数据长度
            response.setContentLength(result.length);

            // 设置文件名称
            response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
            // 将文件流输出到画面
            response.getOutputStream().write(result);

            out.flush();
            out.close();

        } catch (IOException ex) {
            log.debug(ex.getMessage());
        }
    }

}
