package com.sunda.spmsweb.ordercontroller;


import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.sunda.spmscommon.ResponseResult;
import com.sunda.spmsorder.entity.MaterialSap;
import com.sunda.spmsorder.entity.OrderWorkshop;
import com.sunda.spmsorder.entity.vo.OrderWorkshopQueryVo;
import com.sunda.spmsorder.excel.OrderWorkshopDtlExcel;
import com.sunda.spmsorder.excel.OrderWorkshopExcel;
import com.sunda.spmsorder.service.*;
import com.sunda.spmsoversea.excel.OvereaWhsStorageInventoryExcel;
import com.sunda.spmsweb.oaservice.OaService;
import com.sunda.spmsweb.util.ExcelUtil;
import com.sunda.spmsweb.util.JWTUtil;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.web.bind.annotation.*;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.multipart.MultipartFile;
import springfox.documentation.annotations.ApiIgnore;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * <p>
 * 车间请购单 前端控制器
 * </p>
 *
 * @author Wayne
 * @since 2021-02-02
 */
@RestController
@RequestMapping("/orderWorkshop")
@Api(tags = "车间请购单接口", description = "车间请购订单接口")
public class OrderWorkshopController {

    @Autowired
    IOrderWorkshopService iOrderWorkshopService;

    @Autowired
    IOrderWorkshopDtlService iOrderWorkshopDtlService;

    @Autowired
    IOrderLogService iOrderLogService;

    @Autowired
    IFileOperationService iFileOperationService;

    @Autowired
    private IMaterialSapService iMaterialSapService;

    @RequestMapping("/getOrderWs")
    @ApiOperation(value = "获取车间请购单信息（表头 分页）", notes = "获取车间请购单信息\n" +
            "示例 用户工号必输：userId = 20001\n" +
            "可选字段-订单状态：orderStatus = 1，传空则默认查询所有状态。查看同工厂同车间下所有请购单。", httpMethod = "POST")
    @RequiresPermissions("orderWorkshop-getOrderWs")
    public ResponseResult getOrderWS(@RequestParam(required = false) String userId,
                                     @RequestParam(required = false) String orderStatus,
                                     @RequestParam(defaultValue = "1") int pageNo,
                                     @RequestParam(defaultValue = "20") int pageSize,
                                     @RequestParam(required = false) String applicationDateStart,
                                     @RequestParam(required = false) String applicationDateEnd,
                                     @RequestParam(required = false) String urgencyDegree,
                                     @RequestParam(required = false) String spmsWsId,
                                     @RequestParam(required = false) String authorId,
                                     @RequestParam(required = false) String userName,
                                     @RequestParam(required = false) String requestType) {
        try {if (StringUtils.isEmpty(userId)){
            userId = JWTUtil.getUserId(SecurityUtils.getSubject().getPrincipal().toString());
        }
            List<String> roles= JWTUtil.getUserRole(SecurityUtils.getSubject().getPrincipal().toString());
            boolean role1004 = false;
            boolean role1005 = false;
            boolean role1006 = false;
            if(roles.contains("SPMS0024")){//行政类需求审批员（本地采购）
                role1004 = true;
            }
            if(roles.contains("SPMS0025")){//备件需求审批员
                role1005 = true;
            }
            if(roles.contains("SPMS0026")){//劳保需求审批员
                role1006 = true;
            }
            if("2".equals(orderStatus)) {//查询已提交待审批的需求单
                if(StringUtils.isEmpty(requestType)){
                    throw new Exception("请选择提报类别！");
                }
                if("0".equals(requestType)){//查询备件的提报类别
                    if(!role1005){//没有备件权限
                        throw new Exception("您没有查询备品备件的权限，请联系管理员配置！");
                    }
                }
                if("1".equals(requestType)){//劳保的提报类别
                    if(!role1006){//没有劳保权限
                        throw new Exception("您没有查询劳保用品的权限，请联系管理员配置！");
                    }
                }
                if("2".equals(requestType)){//查询本地采购的提报类别
                    if(!role1004){//没有本地采购权限（需要行政类需求审批员的角色）
                        throw new Exception("您没有查询本地采购的权限，请联系管理员配置！");
                    }
                }
            }

            //requestType：0：备件；1：劳保
//            if("2".equals(orderStatus)){//查询已提交待审批的需求单
//                if(StringUtils.isNotEmpty(requestType)){//提报类别不为空
//                    if("1".equals(requestType)){//查询劳保数据
//                        if(!role1005){//必须有劳保需求审批员才能查询，不然只能查备件
//                            requestType = "0";
//                        }
//                    }
//                }else{//不选择提报类型进行查询
//                    if(role1005){//有劳保权限，就可以查所有的
//                        requestType = "";
//                    }else{//没有劳保权限，默认只能查备件的
//                        requestType = "0";
//                    }
//                }
//            }

            return ResponseResult.success().add("orderWorkshop", iOrderWorkshopService.getOrderWS(userId, orderStatus, pageNo, pageSize, applicationDateStart, applicationDateEnd, urgencyDegree, spmsWsId,authorId, userName,requestType));
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseResult.error("请求数据失败").add("error", e.getMessage());
        }
    }

    @RequestMapping("/getOrderWs1")
    @ApiOperation(value = "获取车间请购单信息（表头 分页）", notes = "获取车间请购单信息\n" +
            "示例 用户工号必输：userId = 20001\n" +
            "可选字段-订单状态：orderStatus = 1，传空则默认查询所有状态。查看同工厂同车间下所有请购单。", httpMethod = "POST")
    public ResponseResult getOrderWS1(@RequestBody OrderWorkshopQueryVo orderWorkshopQueryVo) {
        try {
            return ResponseResult.success().add("orderWorkshop", iOrderWorkshopService.getOrderWS1(orderWorkshopQueryVo));
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseResult.error("请求数据失败").add("error", e.getMessage());
        }
    }

    @RequestMapping("/getOrderWsDtl")
    @ApiOperation(value = "获取车间请购单详情（行项目 一个单）", notes = "获取一个车间请购单详情信息\n" +
            "示例 车间请购单号必输：spmsWsId = GH011002-20210204-0001\n" +
            "返回车间请购单详情，请购单行项目物料关联全部长协信息，车间请购单日志信息。", httpMethod = "POST")
    public ResponseResult getOrderWsDtl(String spmsWsId) {
        try {
            return ResponseResult.success()
                    .add("orderWorkshopDtl", iOrderWorkshopDtlService.getOrderWsDtl(spmsWsId))
                    .add("orderLogList", iOrderLogService.orderLogList(spmsWsId));
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseResult.error("请求数据失败").add("error", e.getMessage());
        }
    }

    @RequestMapping("/getOrderWsDtlWithInventory")
    @ApiOperation(value = "获取车间请购单详情(含在库、在途、安全库存)", notes = "获取车间请购单详情(含在库、在途、安全库存)\n" +
            "示例 车间请购单号必输：spmsWsId = GF31-EL-20210825-001, GF31-EL-20210811-001\n" +
            "返回车间请购单详情，请购单行项目物料关联全部长协信息，车间请购单日志信息。", httpMethod = "POST")
    @RequiresPermissions("orderWorkshop-getOrderWsDtlWithInventory")
    public ResponseResult getOrderWsDtlWithInventory(String spmsWsId) {
        try {
            return ResponseResult.success()
                    .add("orderWorkshopDtl", iOrderWorkshopDtlService.getOrderWsDtlWithInventory(spmsWsId))
                    .add("orderLogList", iOrderLogService.orderLogList(spmsWsId));
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseResult.error("请求数据失败").add("error", e.getMessage());
        }
    }

    /**
     * 导出车间请购单详情
     */
    @RequestMapping("/exportOrderWsWithInv")
    @ApiOperation(value = "导出车间请购单详情", notes = "获取车间请购单详情(含在库、在途、安全库存)\n" +
            "示例 车间请购单号必输：spmsWsId = GF31-EL-20210825-001\n" +
            "返回车间请购单详情，请购单行项目物料关联全部长协信息，车间请购单日志信息。", httpMethod = "POST")
    public void exportOrderWsWithInv(String spmsWsId, HttpServletResponse response) {
        try {
            List<OrderWorkshopExcel> headList = new ArrayList<OrderWorkshopExcel>();
            List<OrderWorkshopDtlExcel> itemList = new ArrayList<OrderWorkshopDtlExcel>();
            OrderWorkshop orderWorkshop = iOrderWorkshopService.getOrderBySpmsId(spmsWsId);
            if(orderWorkshop!=null) {
                OrderWorkshopExcel headReport = JSONObject.parseObject(JSONObject.toJSONString(orderWorkshop), OrderWorkshopExcel.class);
                headList.add(headReport);

                List<Map<String, Object>> result = iOrderWorkshopDtlService.getOrderWsDtlWithInventory(spmsWsId);
                for (int i = 0; i < result.size(); i++) {
                    Map<String,Object> map = (Map<String,Object>) result.get(i);
                    OrderWorkshopDtlExcel report = JSONObject.parseObject(JSONObject.toJSONString(map), OrderWorkshopDtlExcel.class);
                    itemList.add(report);
                }
            }
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
            String dateTime = sdf.format(new Date() );
            ExcelUtil.exportMore(response, "OrderWsWithInv" + dateTime, headList, OrderWorkshopExcel.class, itemList, OrderWorkshopDtlExcel.class);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @RequestMapping("/getOrderWsDtls")
    @ApiOperation(value = "获取车间请购单详情（行项目 多个单）", notes = "获取多个车间请购单详情信息，用于机电主任合单审批。\n" +
            "示例请求参数：\n" +
            "{\n" +
            "\t\"spmsWsIds\": [\"GH011002-20210203-0004\", \"GH011002-20210203-0005\"]\n" +
            "}\n" +
            "返回车间请购单详情，不包括车间请购单日志信息。", httpMethod = "POST")
    public ResponseResult getOrderWsDtls(@RequestBody JSONObject jsonObject) {
        try {
            return ResponseResult.success()
                    .add("orderWorkshopDtl", iOrderWorkshopDtlService.getOrderWsDtls(jsonObject));
        } catch (Exception e) {
            return ResponseResult.error("请求数据失败").add("error", e.getMessage());
        }
    }

    @RequestMapping("/getOrderWsDtlList")
    @ApiOperation(value = "获取多个车间请购单详情(含在库、在途、安全库存)", notes = "获取多个车间请购单详情(含在库、在途、安全库存)，用于机电主任合单审批。\n" +
            "获取多个车间请购单明细信息，包含 在库库存、在途库存、安全库存等信息；\n" +
            "示例请求参数：\n" +
            "{\n" +
            "\t\"spmsWsIds\": [\"GH011002-20210203-0004\", \"GH011002-20210203-0005\"]\n" +
            "}\n" +
            "返回车间请购单详情，不包括车间请购单日志信息。", httpMethod = "POST")
    @RequiresPermissions("orderWorkshop-getOrderWsDtlList")
    public ResponseResult getOrderWsDtlList(@RequestBody JSONObject jsonObject) {
        try {
            return ResponseResult.success()
                    .add("orderWorkshopDtl", iOrderWorkshopDtlService.getOrderWsDtlList(jsonObject));
        } catch (Exception e) {
            return ResponseResult.error("请求数据失败").add("error", e.getMessage());
        }
    }


    @RequestMapping("/getOrderWsFileList")
    @ApiOperation(value = "获取多个车间请购单文件列表", notes = "获取多个车间请购单文件列表，用于合单审批。\n" +
            "获取多个车间请购单文件列表；车间请购单的SPMS ID ，提报类型，附件名，附件url；\n" +
            "示例请求参数：\n" +
            "{\n" +
            "\t\"spmsWsIds\": [\"GH011002-20210203-0004\", \"GH011002-20210203-0005\"]\n" +
            "}\n" +
            "返回车间请购单文件信息。", httpMethod = "POST")
    public ResponseResult getOrderWsFileList(@RequestBody JSONObject jsonObject) {
        try {
            return ResponseResult.success()
                    .add("orderWorkshopDtl", iOrderWorkshopDtlService.getOrderWsFileList(jsonObject));
        } catch (Exception e) {
            return ResponseResult.error("请求数据失败").add("error", e.getMessage());
        }
    }


    @Transactional(rollbackFor = Exception.class)
    @RequestMapping("/addOrderWorkshop")
    @ApiOperation(value = "新建车间请购单及详情", notes = "新建车间请购单及详情\n" +
            "表头字段 status: 车间请购单SPMS状态（0已删除；1车间主任创建可修改；2车间已提交不可改；3机电主任审批不通过；4机电主任审批通过提交OA；5OA审批通过；6提交SRM；）\n" +
            "uuid 为Java生成用于车间请购单表头和行项目关联的标记；表头车间单号由数据库按规则自动生成；行项目车间单号由行项目新建时通过uuid关联从表头获取；\n" +
            "车间请购单号 GH011002-20210202-0001 生成规则：工厂代码 + 车间代码 + 创建人当地系统日期（createDate） + 序列号；" +
            "createDate格式前端传给后端为 yyyy-mm-dd；单号生成日期中横线由数据库自动去除；\n" +
            "orderWorkshopDtl.brand: 取自 srm 长协信息中的 brand；\n" +
            "{\n" +
            "\t\"orderWorkshop\": {\n" +
            "\t\t\"userId\": \"20001\",\n" +
            "\t\t\"lastName\": \"20001\",\n" +
            "\t\t\"subject\": \"GF011002-20210201-车间请购单\",\n" +
            "\t\t\"projectType\": \"1\",\n" +
            "\t\t\"werks\": \"GH01\",\n" +
            "\t\t\"workshopCode\": \"1002\",\n" +
            "\t\t\"projectStatus\": \"1\",\n" +
            "\t\t\"dateRequired\": \"2021-05-01\",\n" +
            "\t\t\"urgency\": \"2\",\n" +
            "\t\t\"projectCode\": \"\",\n" +
            "\t\t\"justification\": \"申请原因\",\n" +
            "\t\t\"applicationDate\": \"2021-02-10\",\n" +
            "\t\t\"status\": \"1\",\n" +
            "\t\t\"createDate\": \"2021-02-02\",\n" +
            "\t\t\"purchaseLocation\": \"0\"\n" +
            "\t\t\"projectOaNumber\": \"3130-2021080009_乌干达婴裤厂一期\"\n" +
            "\t\t\"country\": \"加纳\"\n" +
            "\t\t\"moduleType\": \"所属模块\"\n" +
            "\t},\n" +
            "\t\"orderWorkshopDtl\": [{\n" +
            "\t\t\t\"rowId\": 10,\n" +
            "\t\t\t\"materialNo\": \"130011853\",\n" +
            "\t\t\t\"materialZhDesc\": \"马克杯 端底白瓷花13 普通包装 48PCS/CTN\",\n" +
            "\t\t\t\"materialEnDesc\": \"MUG\",\n" +
            "\t\t\t\"requestQty\": 4,\n" +
            "\t\t\t\"approvalQty\": 4,\n" +
            "\t\t\t\"basicUnit\": \"PCS\",\n" +
            "\t\t\t\"brand\": \"\",\n" +
            "\t\t\t\"rowStatus\": \"\",\n" +
            "\t\t\t\"rowComment\": \"\",\n" +
            "\t\t\t\"deviceId\": \"\",\n" +
            "\t\t\t\"deviceCategory\": \"\",\n" +
            "\t\t\t\"deviceType\": \"\",\n" +
            "\t\t\t\"materialCategory\": \"\",\n" +
            "\t\t\t\"longContractCode\": \"\"\n" +
            "\t\t},\n" +
            "\t\t{\n" +
            "\t\t\t\"rowId\": 20,\n" +
            "\t\t\t\"materialNo\": \"130011854\",\n" +
            "\t\t\t\"materialZhDesc\": \"马克杯 端底白瓷花14 普通包装 48PCS/CTN\",\n" +
            "\t\t\t\"materialEnDesc\": \"MUG\",\n" +
            "\t\t\t\"requestQty\": 5,\n" +
            "\t\t\t\"approvalQty\": 5,\n" +
            "\t\t\t\"basicUnit\": \"PCS\",\n" +
            "\t\t\t\"brand\": \"\",\n" +
            "\t\t\t\"rowStatus\": \"\",\n" +
            "\t\t\t\"rowComment\": \"\",\n" +
            "\t\t\t\"deviceId\": \"\",\n" +
            "\t\t\t\"deviceCategory\": \"\",\n" +
            "\t\t\t\"deviceType\": \"\",\n" +
            "\t\t\t\"materialCategory\": \"\",\n" +
            "\t\t\t\"longContractCode\": \"\"\n" +
            "\t\t}\n" +
            "\t]\n" +
            "}", httpMethod = "POST")
    @RequiresPermissions("orderWorkshop-addOrderWorkshop")
    public ResponseResult addOrderWorkshop(@RequestBody JSONObject jsonObject) {
        try {
            return iOrderWorkshopService.addOrderWorkshop(jsonObject);
        } catch (Exception e) {
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return ResponseResult.error("请求异常请重试:" + e);
        }
    }

    @RequestMapping("/updateOrderWorkshop")
    @Transactional(rollbackFor = Exception.class)
    @ApiOperation(value = "更新车间请购单（表头）", notes = "更新车间请购单表头\n" +
            "示例请求json对象数据，唯一性字段 uuid，请求体至少包含以下字段：\n" +
            "{\n" +
            "\t\"orderWorkshop\": {\n" +
            "\t\t\"uuid\": \"6013cbd70b6d47debeaa83a77f23657a\",\n" +
            "\t\t\"spmsWsId\": \"GH011002-20210203-0005\",\n" +
            "\t\t\"subject\": \"GF011002-20210201-车间请购单\",\n" +
            "\t\t\"userId\": \"20001\",\n" +
            "\t\t\"projectType\": \"1\",\n" +
            "\t\t\"projectStatus\": \"1\",\n" +
            "\t\t\"dateRequired\": \"2021-05-01\",\n" +
            "\t\t\"urgency\": \"2\",\n" +
            "\t\t\"projectCode\": null,\n" +
            "\t\t\"workshopCode\": \"1002\",\n" +
            "\t\t\"justification\": \"申请原因\",\n" +
            "\t\t\"status\": \"1\",\n" +
            "\t\t\"projectOaNumber\": \"3130-2021080009_乌干达婴裤厂一期\"\n" +
            "\t\t\"country\": \"加纳\"\n" +
            "\t\t\"purchaseLocation\": \"0\"\n" +
            "\t}\n" +
            "}", httpMethod = "POST")
    @RequiresPermissions("orderWorkshop-updateOrderWorkshop")
    public ResponseResult updateOrderWorkshop(@RequestBody JSONObject jsonObject) {
        try {
            return iOrderWorkshopService.updateOrderWorkshop(jsonObject);
        } catch (Exception e) {
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return ResponseResult.error("请求异常请重试:" + e);
        }
    }


    @RequestMapping("/updateOrderWorkshopDtl")
    @Transactional(rollbackFor = Exception.class)
    @ApiOperation(value = "更新车间请购单（行项目）", notes = "更新车间请购单行项目，更新规则：整体详情删除重建详情数据\n" +
            "示例请求json对象数据，唯一性字段 uuid，请求体至少包含以下字段：\n" +
            "{\n" +
            "\t\"uuid\": \"6013cbd70b6d47debeaa83a77f23657a\",\n" +
            "\t\"spmsWsId\": \"GH011002-20210203-0005\",\n" +
            "\t\"userId\": \"20001\",\n" +
            "\t\"orderWorkshopDtl\": [{\n" +
            "\t\t\"rowId\": 10,\n" +
            "\t\t\"materialNo\": \"130011853\",\n" +
            "\t\t\"materialZhDesc\": \"马克杯 端底白瓷花13 普通包装 48PCS/CTN\",\n" +
            "\t\t\"materialEnDesc\": \"MUG\",\n" +
            "\t\t\"requestQty\": 4,\n" +
            "\t\t\"approvalQty\": 4,\n" +
            "\t\t\"basicUnit\": \"PCS\",\n" +
            "\t\t\"brand\": \"\",\n" +
            "\t\t\"rowStatus\": \"\",\n" +
            "\t\t\"supplementOrNot\": \"\",\n" +
            "\t\t\"rowComment\": \"\",\n" +
            "\t\t\"deviceId\": \"\",\n" +
            "\t\t\"deviceCategory\": \"\",\n" +
            "\t\t\"deviceType\": \"\",\n" +
            "\t\t\"materialCategory\": \"\",\n" +
            "\t\t\"longContractCode\": \"\"\n" +
            "\t}]\n" +
            "}", httpMethod = "POST")
    public ResponseResult updateOrderWorkshopDtl(@RequestBody JSONObject jsonObject) {
        try {
            return iOrderWorkshopDtlService.updateOrderWorkshopDtl(jsonObject);
        } catch (Exception e) {
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return ResponseResult.error("请求异常请重试:" + e);
        }
    }

    @RequestMapping("/getOrderWSList")
    @ApiOperation(value = "获取待审批提交的车间请购单及详情", notes = "获取当前用户所属工厂下各车间提交到机电主任的待审批车间请购单，及行项目信息。" +
            "前端需控制此接口仅机电主任可访问。", httpMethod = "POST")
    public ResponseResult getOrderWSList(@RequestParam(defaultValue = "1") int pageNo,
                                         @RequestParam(defaultValue = "20") int pageSize) {
        try {
            String userId = JWTUtil.getUserId(SecurityUtils.getSubject().getPrincipal().toString());
            /** 已保存待提交的状态 = 2 */
            String orderStatus = "2";
            return ResponseResult.success().add("orderWorkshop", iOrderWorkshopService.getOrderWSList(userId, orderStatus, pageNo, pageSize));
        } catch (Exception e) {
            return ResponseResult.error("请求数据失败").add("error", e.getMessage());
        }
    }

    @RequestMapping("/getOrderLogWByUuid")
    @ApiOperation(value = "根据车间请购单uuid查询工厂单日志", notes = "根据车间请购单UUID查询对应工厂请购单SPMS日志信息，" +
            "示例 ：uuid = 788e02c58f1b426991932616433f285f", httpMethod = "POST")
    public ResponseResult getOrderLogWByUuid(String orderWorkshopUuid) {
        try {
            return ResponseResult.success().add("orderWerksLog", iOrderWorkshopService.getOrderLogWByUuid(orderWorkshopUuid));
        } catch (Exception e) {
            return ResponseResult.error("请求数据失败").add("error", e.getMessage());
        }
    }

    @RequestMapping("/getOrderLogOaByUuid")
    @ApiOperation(value = "根据车间请购单uuid查询OA日志", notes = "根据车间请购单UUID查询对应工厂请购单OA日志信息，" +
            "示例 ：uuid = 788e02c58f1b426991932616433f285f", httpMethod = "POST")
    public ResponseResult getOrderLogOaByUuid(String orderWorkshopUuid) {
        try {
            String oaBianhao = iOrderWorkshopService.getOrderLogOaByUuid(orderWorkshopUuid);
            System.out.println("oaBianhao ====== " + oaBianhao);
            if (oaBianhao == null || oaBianhao.length() == 0) {
                return ResponseResult.error();
            }
            OaService oaService = new OaService();
            return ResponseResult.success().add("orderWerksOALog", oaService.getOALog(oaBianhao));
        } catch (Exception e) {
            return ResponseResult.error("请求数据失败").add("error", e.getMessage());
        }
    }

    @RequestMapping("/uploadWorkShopDtl")
    @ApiOperation(value = "上传车间请购单物料Excel文件导入", notes = "请求参数示例：{ avatar: file}", httpMethod = "POST")
    @ResponseBody
    public ResponseResult uploadWorkShopDtl(@RequestParam(value = "avatar") MultipartFile avatar){
        if (avatar.isEmpty()) {
            return ResponseResult.error("不能上传空文件");
        }else {
            Sheet sheet = null;
            Row row;
            File temp = null;
            InputStream is;
            try {
                // 另存文件名
                SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
                Calendar calendar = Calendar.getInstance();
                String fileName = df.format(calendar.getTime()) + avatar.getOriginalFilename();
                // 1.附件缓存路径
                String filePath = iFileOperationService.saveMaterialApplicationPic(avatar, fileName);
                System.out.println("fileName" + filePath);
                // 2.上传附件至minIO文件服务器
                //String fileUrl = iFileOperationService.fileUploader(fileName, filePath);
                //return ResponseResult.success().add("imageUrl",fileUrl);
                temp = new File(filePath);
                is = new FileInputStream(temp);
                Workbook wb;
                Map<String, PictureData> sheetIndexPicMap;
                if (temp.getName().toLowerCase().endsWith(".xls")) {
                    wb = new HSSFWorkbook(is);
                    sheet = wb.getSheetAt(0);// 读取第一个sheet
                } else if (temp.getName().toLowerCase().endsWith(".xlsx")) {
                    wb = new XSSFWorkbook(is);
                    sheet = wb.getSheetAt(0);// 读取第一个sheet
                } else {
                    return ResponseResult.error("只支持excel格式文件！");
                }
                // 得到总行数
                int rowNum = sheet.getLastRowNum();
                if (rowNum <= 1) {
                    return ResponseResult.error("请检查文件内容是否为空！");
                }
                try {
                    List<Map<String, Object>> whsStorages = new ArrayList<Map<String, Object>>();
                    for (int i = 2; i <= rowNum; i++) {//
                        row = sheet.getRow(i);
                        // 手工转化
                        if (row == null){
                            continue;
                        }
                        Map<String, Object> orderWsDtl=new HashMap<String, Object>();
                        if(row.getCell(0)!=null){
                            row.getCell(0).setCellType(CellType.STRING);
                            orderWsDtl.put("materialNo", row.getCell(0).getRichStringCellValue().getString());//物料编码
                            ResponseResult materialSapXM = iMaterialSapService.getMaterialSapXM(row.getCell(0).getRichStringCellValue().getString());
                            Map<String, Object> materialMap = materialSapXM.getData();
                            if (MapUtils.isEmpty(materialMap)) {
                                return ResponseResult.error("第"+(i)+"行“物料编码”不存在！");
                            }
                            List<MaterialSap> materialList = (List<MaterialSap>) materialMap.get("materialList");
                            if (CollectionUtils.isEmpty(materialList)) {
                                return ResponseResult.error("第"+(i)+"行“物料编码”不存在！");
                            }
                            orderWsDtl.put("materialZhDesc", materialList.get(0).getMaterialZhDesc());//物料描述
                            orderWsDtl.put("materialEnDesc", materialList.get(0).getMaterialEnDesc());//物料描述
                            orderWsDtl.put("basicUnit", materialList.get(0).getBasicUnit());//基本单位
                            orderWsDtl.put("purchaseLocation", materialList.get(0).getPurchaseLocation());//基本单位

                            List<Map<String, Object>> materialSap = iMaterialSapService.searchMaterialSapByNo(row.getCell(0).getRichStringCellValue().getString());
                            if(materialSap!=null && materialSap.size()>0){
                                orderWsDtl = materialSap.get(0);
                            }
                        }else{
                            return ResponseResult.error("第"+i+"行“物料编码”不能为空！");
                        }
//                        if(row.getCell(1)!=null){
//                            row.getCell(1).setCellType(CellType.STRING);
//                            orderWsDtl.put("materialZhDesc", row.getCell(1).getRichStringCellValue().getString());//物料描述
//                        }else{
//                            //return ResponseResult.error("第"+i+"行“物料描述”不能为空！");
//                        }
                        if(row.getCell(2)!=null){
                            row.getCell(2).setCellType(CellType.STRING);
                            orderWsDtl.put("requestQty", row.getCell(2).getRichStringCellValue().getString());//申请数量
                        }else{
                            return ResponseResult.error("第"+i+"行“申请数量”不能为空！");
                        }
//                        if(row.getCell(3)!=null){
//                            row.getCell(3).setCellType(CellType.STRING);
//                            orderWsDtl.put("basicUnit", row.getCell(3).getRichStringCellValue().getString());//基本单位
//                        }else{
//                            //return ResponseResult.error("第"+i+"行“基本单位”不能为空！");
//                        }
                        if(row.getCell(4)!=null){
                            row.getCell(4).setCellType(CellType.STRING);
                            orderWsDtl.put("rowComment", row.getCell(4).getRichStringCellValue().getString());//行备注
                        }
                        whsStorages.add(orderWsDtl);
                    }
                    return ResponseResult.success().add("orderWorkshopDtl", whsStorages);
                }catch (Exception e) {
                    return ResponseResult.error(e.getMessage());
                }
            }catch (Exception e) {
                return ResponseResult.error(e.getMessage());
            } finally {
                if (temp != null) {
                    boolean newFile = temp.delete();
                    if(!newFile){
                        //log.error(temp+"删除失败");
                    }
                }
            }

           // return ResponseResult.success().add("msg","S");
        }
    }
    
    @RequestMapping("/getZaiTuDtls")
    @ApiOperation(value = "根据工厂、物料查询在途数量", notes = "根据工厂、物料查询在途数量\n" +
            "示例请求参数：\n" +
            "{\n" +
            "\t\"werks\": \"CN01\", \n" +
            "\t\"materialNo\": \"170003418\",\n" +
            "\t\"materialNoList\": \"[\"170003418\",\"170003418\"]\"\n" +
            "}", httpMethod = "POST")
    public ResponseResult getZaiTuDtls(@RequestBody JSONObject jsonObject) {
        try {
            return iOrderWorkshopDtlService.getZaiTuDtls(jsonObject);
        } catch (Exception e) {
            return ResponseResult.error("请求数据失败:"+e.getMessage());
        }
    }
}
