package com.sunda.spmsorder.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.sunda.spmscommon.ResponseResult;
import com.sunda.spmscommon.entity.ZSapOrgClient;
import com.sunda.spmscommon.feign.IFeignServiceCommon;
import com.sunda.spmscommon.mapper.ZSapOrgClientMapper;
import com.sunda.spmsorder.mapper.OrderTraceMapper;
import com.sunda.spmsorder.service.IOrderTraceService;
import com.sunda.spmsorder.service.IOrderWerksService;
import com.sunda.spmsorder.service.IOrderWorkshopService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @program: spms
 * @description:
 * @author: Wayne Wu
 * @create: 2022-01-07 16:22
 **/
@Service
public class OrderTraceImpl implements IOrderTraceService {

    @Autowired
    IOrderWerksService iOrderWerksService;

    @Autowired
    IOrderWorkshopService iOrderWorkshopService;

    @Autowired
    OrderTraceMapper orderTraceMapper;

    @Autowired
    IFeignServiceCommon iFeignServiceCommon;

    @Autowired
    ZSapOrgClientMapper sapOrgClientMapper;


    /** SPMS系统有箱码但无操作日志且自管仓无库存，则认为自管仓待到货；日期参数为箱码在SPMS创建起止时间；*/
    /** 20220720新规则：SPMS系统有箱码自管仓无库存，则认为自管仓待到货；日期参数为箱码在SPMS创建起止时间；*/
    @Override
    public List<Map<String, Object>> getWaitingForArrivalBoxList(String beginDate, String endDate) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        if (StringUtils.isEmpty(beginDate)){
            beginDate = getMonthsAgo();
        }
        if (StringUtils.isEmpty(endDate)){
            endDate = sdf.format(new Date());
        }
        return orderTraceMapper.getWaitingForArrivalBoxList(beginDate, endDate);
    }

    /** 自管仓内的箱码列表，直接从储位库存获取，即自管仓库内箱码；werks = CN01 */
    @Override
    public List<Map<String, Object>> getCN01BoxList(String werks, String whsLocationCode, String beginDate, String endDate) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        if (StringUtils.isEmpty(beginDate)){
            beginDate = getMonthsAgo();
        }
        if (StringUtils.isEmpty(endDate)){
            endDate = sdf.format(new Date());
        }
        return orderTraceMapper.getCN01BoxList(werks, whsLocationCode, beginDate, endDate);
    }

    /** 海运/转储在途库存，从南沙箱码出库日志提取每个箱码最新一条，OPERATION_TYPE = 3, 16, 20，22 即为在途； */
    @Override
    public List<Map<String, Object>> getOverseaOnTheWayBoxList(String beginDate, String endDate) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        if (StringUtils.isEmpty(beginDate)){
            beginDate = getMonthsAgo();
        }
        if (StringUtils.isEmpty(endDate)){
            endDate = sdf.format(new Date());
        }
        return orderTraceMapper.getOverseaOnTheWayBoxList(beginDate, endDate);
    }

    /** 海外到货，按箱码到货日志获取；OPERATION_TYPE = 21 表示海外已到货 */
    @Override
    public List<Map<String, Object>> getOverseaArrivalBoxList(String beginDate, String endDate) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        if (StringUtils.isEmpty(beginDate)){
            beginDate = getMonthsAgo();
        }
        if (StringUtils.isEmpty(endDate)){
            endDate = sdf.format(new Date());
        }
        return orderTraceMapper.getOverseaArrivalBoxList(beginDate, endDate);
    }

    @Override
    public ResponseResult allTypeSyncSap(String werks, String whsLocationCode, String beginDate, String endDate) {
        try {
            //箱配柜接口：
//          采购在途1：POST请求URL为/orderTrace/getWaitingForArrivalBoxList
//          国内在途2：POST请求URL为/orderTrace/getCN01BoxList
//          海运在库3：POS请求URL为/orderTrace/getOverseaOnTheWayBoxList
//          海外在库4：POST请求URL为/orderTrace/getOverseaArrivalBoxList
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
            List<Map<String, Object>> list1 =  getWaitingForArrivalBoxList(beginDate,endDate );
            List<Map<String, Object>> list2 =  getCN01BoxList("CN01",null,beginDate,endDate  );
            List<Map<String, Object>> list3 =  getOverseaOnTheWayBoxList(beginDate,endDate );
            List<Map<String, Object>> list4 =  getOverseaArrivalBoxList(beginDate,endDate );
//          System.out.println("list1:"+list1.toString());
//          System.out.println("list2:"+list2.toString());
//          System.out.println("list3:"+list3.toString());
//          System.out.println("list4:"+list4.toString());

            list.addAll(list4);
            list.addAll(list3);
            list.addAll(list2);
            list.addAll(list1);
            List<Map<String, Object>> ZTPACKAGE_XHEAD_LIST = new ArrayList<Map<String, Object>>();
            String werksApi = "";
            if(list!=null && list.size()>0){
                Map<String, String> keyMap = new HashMap<String, String>();
                for (int i = 0; i < list.size(); i ++){
                    Map<String, Object> map = list.get(i);
                    if(map.get("boxNote")!=null && map.get("boxNote").toString().length()>0){
                        if(keyMap.get(map.get("boxNote").toString())!=null){
                            continue;
                        }else{
                            keyMap.put(map.get("boxNote").toString(), map.get("boxNote").toString());
                        }
                    }
                    Map<String, Object> ZTPACKAGE_XHEAD = new HashMap<String, Object>();
                    ZTPACKAGE_XHEAD.put("PACKAGE_NO", map.get("packageNote"));
                    ZTPACKAGE_XHEAD.put("PACKAGE_CODE", map.get("boxNote"));
                    ZTPACKAGE_XHEAD.put("WERKS_CF", map.get("werks"));
                    if(StringUtils.isEmpty(werksApi)){
                        if(map.get("werks")!=null && map.get("werks").toString().length()>0){
                            werksApi = map.get("werks").toString();
                        }
                    }
                    ZTPACKAGE_XHEAD.put("LGORT_CF", map.get("whsLocationCode"));
//                    if("1".equals(map.get("STATSU_PKCODE"))){
//                        ZTPACKAGE_XHEAD.put("DELIVERY_TIME", map.get("plannedAprivalDate"));//预计发货时间
//                    }
                    if("2".equals(map.get("STATSU_PKCODE"))){
                        ZTPACKAGE_XHEAD.put("INBOUND_TIME", sdf.format(map.get("updateTime")) );//国内入库时间
                    }else{
                        ZTPACKAGE_XHEAD.put("INBOUND_TIME", null);//箱码状态为国内在库2，获取国内入库时间，其它无
                    }
                    if("3".equals(map.get("STATSU_PKCODE"))){
                        ZTPACKAGE_XHEAD.put("OUTBOUND_TIME", sdf.format(map.get("logCreateTime")));//国内出库时间
                    }else{
                        ZTPACKAGE_XHEAD.put("OUTBOUND_TIME", null);//箱码状态为海运在途3，获取国内出库时间，其它无
                    }
                    if("4".equals(map.get("STATSU_PKCODE"))){
                        ZTPACKAGE_XHEAD.put("OVERSEAS_TIME", sdf.format(map.get("logCreateTime")));//海外到库时间
                    }else{
                        ZTPACKAGE_XHEAD.put("OVERSEAS_TIME", null);//箱码状态为海运在库4，获取海外在库时间，其它无
                    }
                    ZTPACKAGE_XHEAD.put("STATSU_PKCODE", map.get("STATSU_PKCODE"));
                    ZTPACKAGE_XHEAD_LIST.add(ZTPACKAGE_XHEAD);
                }

                Map<String,Object> data = new HashMap();
                Map<String,Object> request = new HashMap();
                Map<String,Object> esbAttrs = new HashMap();
                esbAttrs.put("App_ID", "SPMS");

                if(StringUtils.isEmpty(werksApi)){
                    throw new Exception("发送失败，缺少工厂数据！");
                }
                QueryWrapper<ZSapOrgClient> queryWrapper = new QueryWrapper<ZSapOrgClient>().eq("WERKS", werksApi);
                List<ZSapOrgClient> clients = sapOrgClientMapper.selectList(queryWrapper);
                if(clients!=null && clients.size()>0){
                    esbAttrs.put("Target_ID", "SAP-"+clients.get(0).getZmandt());//SAP的client编码
                }else{
                    throw new Exception("发送失败，"+werksApi+"工厂未找到client！");
                }
                
                esbAttrs.put("Application_ID", "00020000000004");
                esbAttrs.put("Transaction_ID", UUID.randomUUID().toString());
                Map<String,Object> requestData = new HashMap();
                //requestData.put("Items", ZTPACKAGE_XHEAD_LIST);

                Map<String, Object> tables = new HashMap<>();
                tables.put("IT_TAB", ZTPACKAGE_XHEAD_LIST);
                requestData.put("tables", tables);

                requestData.put("Operation", "Z_SPMS_SAVE_XHEAD");
                requestData.put("Type", "SAVE_XHEAD");
                request.put("ESB_ATTRS", esbAttrs);
                request.put("REQUEST_DATA", requestData);
                data.put("REQUEST", request);
                String s = JSON.toJSONString(data);
                JSONObject dataToSap = new JSONObject();
                dataToSap = JSONObject.parseObject(s);
                JSONObject sapReturnedData = JSONObject.parseObject(iFeignServiceCommon.sendRestToSapCommon(dataToSap));

//                JSONObject dataToSap = new JSONObject();
//                JSONObject REQUEST = new JSONObject();
//                JSONObject ESB_ATTRS = new JSONObject();
//                JSONObject REQUEST_DATA = new JSONObject();
//                JSONObject Head = new JSONObject();
//                ESB_ATTRS.put("App_ID", "SPMS");
//                ESB_ATTRS.put("Application_ID", "00020000000002");
//                ESB_ATTRS.put("Transaction_ID", UUID.randomUUID().toString());
//                REQUEST_DATA.put("Head", Head);
//                REQUEST_DATA.put("Items", ZTPACKAGE_XHEAD_LIST);
//                REQUEST_DATA.put("Operation", "Z_SPMS_SAVE_XHEAD");
//                REQUEST_DATA.put("Type", "SPMS_SAVE_XHEAD");
//                REQUEST.put("ESB_ATTRS", ESB_ATTRS);
//                REQUEST.put("REQUEST_DATA", REQUEST_DATA);
//                dataToSap.put("REQUEST", REQUEST);
//                JSONObject sapReturnedData = JSONObject.parseObject(iFeignServiceCommon.sendRestToSapCommon(dataToSap));
                JSONObject RETURN_DATA = sapReturnedData.getJSONObject("RESPONSE").getJSONObject("RETURN_DATA");
                if (StringUtils.isEmpty(RETURN_DATA.getString("O_TYPE")) || !"S".equals(RETURN_DATA.getString("O_TYPE"))){
                    return ResponseResult.error().add("dataToSap", dataToSap).add("sapReturnedData", sapReturnedData);
                }
            }
            return ResponseResult.success();
        }catch (Exception e){
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return ResponseResult.error("请求异常请重试:" + e);
        }
    }

    String getMonthsAgo(){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.MONTH, -6);
        Date date = calendar.getTime();
        return sdf.format(date);
    }
}


