package com.steerinfo.dil.service.impl;

import com.steerinfo.dil.mapper.AmsDispatchSaleOrderMapper;
import com.steerinfo.dil.mapper.AmsSaleOrderMaterialMapper;
import com.steerinfo.dil.model.AmsDispatchSaleOrder;
import com.steerinfo.dil.model.AmsSaleOrderMaterial;
import com.steerinfo.dil.service.IAmsDispatchSaleOrderService;
import com.steerinfo.dil.util.DataChange;
import com.steerinfo.framework.mapper.IBaseMapper;
import com.steerinfo.framework.service.impl.BaseServiceImpl;
import com.steerinfo.framework.service.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * AmsDispatchSaleOrder服务实现:
 * @author generator
 * @version 1.0-SNAPSHORT 2021-09-10 03:59
 * 类描述
 * 修订历史:
 * 日期:2021-09-10
 * 作者:generator
 * 参考:
 * 描述:AmsDispatchSaleOrder服务实现
 * @see null
 * @Copyright 湖南视拓信息技术股份有限公司. All rights reserved.
 */
@Service(value = "amsDispatchSaleOrderService")
public class AmsDispatchSaleOrderServiceImpl extends BaseServiceImpl<AmsDispatchSaleOrder, BigDecimal> implements IAmsDispatchSaleOrderService {

    @Autowired
    private AmsDispatchSaleOrderMapper amsDispatchSaleOrderMapper;
    @Autowired
    AmsSaleOrderMaterialMapper amsSaleOrderMaterialMapper;

    @Override
    protected IBaseMapper<AmsDispatchSaleOrder, BigDecimal> getMapper() {
        return amsDispatchSaleOrderMapper;
    }

    public List<Map<String, Object>> getOpenDispatchSaleOrder(Map<String, Object> mapValue) {
        return amsDispatchSaleOrderMapper.getOpenDispatchSaleOrder(mapValue);
    }

    /**
     * 查询最大id
     * @return
     */
    @Override
    public BigDecimal selectMaxId() {

        return amsDispatchSaleOrderMapper.selectOtherId();
    }

    public int insert(AmsDispatchSaleOrder ad) {
        ad.setDispatchTime(new Date());
        ad.setInsertTime(new Date());
        ad.setInsertUsername("admin");
        return amsDispatchSaleOrderMapper.insertSelective(ad);
    }

    /**
     * 查询app端公开抢单
     * @return
     */
    @Override
    public List<Map<String, Object>> getDispatchSaleOrderList() {
        List<Map<String, Object>> dispatchSaleOrderList = amsDispatchSaleOrderMapper.getDispatchSaleOrderList();
        for (Map<String,Object> map: dispatchSaleOrderList) {
            Date dispatchDealTime = (Date) map.get("dispatchDealTime");
            BigDecimal dispatchId = (BigDecimal) map.get("dispatchId");
            String isDeal;
            if (dispatchDealTime == null) {
                isDeal = "已成交";
            }
            else {
                isDeal = "未成交";
            }
            map.put("isDeal",isDeal);
//            // 先把map中的key-value放到新的saleMap里面
//            Map<String,Object> saleMap = new HashMap<>();
//            saleMap.putAll(map);
            // 使用Map清空工具迭代删除map中的所有key-value
//            MapRemoveUtil.removeMap(map);
            List<Map<String, Object>> materialMessages = amsDispatchSaleOrderMapper.getMaterialMessages(dispatchId);
            String allMaterialName = "";
            String allMaterialNumber = "";
            String allMaterialTheoreticalWeight = "";
            String allMaterialSpecificationModel = "";
            for (Map<String,Object> materialMap : materialMessages) {
                if (materialMap != null) {
                    String materialName = (String) materialMap.get("materialName");
                    allMaterialName += materialName + "/";
                    String materialTheoreticalWeight = materialMap.get("materialTheoreticalWeight").toString();
                    if (materialTheoreticalWeight != null) {
                        allMaterialTheoreticalWeight += materialTheoreticalWeight + "/";
                    }
                    String saleOrderMaterialNumber = materialMap.get("saleOrderMaterialNumber").toString();
                    allMaterialNumber += saleOrderMaterialNumber + "/";
                    String specificationModel = materialMap.get("specificationModel").toString();
                    if (specificationModel != null) {
                        allMaterialSpecificationModel += specificationModel + "/";
                    }
                }
            }
            String subMaterialName = null;
            String subMaterialNumber = null;
            String subMaterialTheoreticalWeight = null;
            String subMaterialSpecificationModel = null;
            if (allMaterialName.length() >= 2) {
                subMaterialName = allMaterialName.substring(0, allMaterialName.length() - 1);
            }
            if (allMaterialName.length() < 2) {
                subMaterialName = allMaterialName;
            }
            if (allMaterialNumber.length() >= 2) {
                subMaterialNumber = allMaterialNumber.substring(0, allMaterialNumber.length() - 1);
            }
            if (allMaterialNumber.length() < 2) {
                subMaterialNumber = allMaterialNumber;
            }
            if (allMaterialTheoreticalWeight.length() >= 2) {
                subMaterialTheoreticalWeight = allMaterialTheoreticalWeight.substring(0, allMaterialTheoreticalWeight.length() - 1);
            }
            if (allMaterialTheoreticalWeight.length() < 2) {
                subMaterialTheoreticalWeight = allMaterialTheoreticalWeight;
            }
            if (allMaterialSpecificationModel.length() >= 2) {
                subMaterialSpecificationModel = allMaterialSpecificationModel.substring(0, allMaterialSpecificationModel.length() - 1);
            }
            if (allMaterialSpecificationModel.length() < 2) {
                subMaterialSpecificationModel = allMaterialSpecificationModel;
            }
            map.put("allMaterialName",subMaterialName);
            map.put("allMaterialNumber",subMaterialNumber);
            map.put("allMaterialTheoreticalWeight",subMaterialTheoreticalWeight);
            map.put("allMaterialSpecificationModel",subMaterialSpecificationModel);
        }
        return dispatchSaleOrderList;
    }

    /**
     * 抢单/接收订单
     * @param dispatchId
     * @param carrierSsoId
     * @return
     */
    @Override
    public int lockDispatchSaleOrder(BigDecimal dispatchId, String carrierSsoId) {
        Map<String,Object> map = new HashMap<>();
        map.put("carrierSsoId",carrierSsoId);
        List<Map<String,Object>> carrierIdList = amsDispatchSaleOrderMapper.getCarrierIdBySSO(map);
        AmsDispatchSaleOrder amsDispatchSaleOrder = amsDispatchSaleOrderMapper.selectByPrimaryKey(dispatchId);
        amsDispatchSaleOrder.setDispatchDealTime(new Date());
        if (carrierIdList != null && carrierIdList.size() == 1) {
            BigDecimal carrierId = (BigDecimal) carrierIdList.get(0).get("carrierId");
            amsDispatchSaleOrder.setCarrierId(carrierId);
        }
        amsDispatchSaleOrder.setDispatchStatus(new BigDecimal(0));
        amsDispatchSaleOrder.setUpdateTime(new Date());
        int result = amsDispatchSaleOrderMapper.updateByPrimaryKeySelective(amsDispatchSaleOrder);
        return result;
    }

    /**
     * 查询app端已抢的销售订单
     * @param carrierId
     * @return
     */
    @Override
    public List<Map<String, Object>> getLockDispatchSaleOrderList(Integer carrierId) {
        List<Map<String,Object>> mapList = amsDispatchSaleOrderMapper.getLockDispatchSaleOrderList(new BigDecimal(carrierId));
        if (mapList == null) {
            return null;
        }
        for (Map<String, Object> map : mapList) {
            BigDecimal dispatchId = (BigDecimal) map.get("dispatchId");
            List<Map<String,Object>> orderIdList = amsDispatchSaleOrderMapper.getNullOrNotNull(dispatchId);
            if (orderIdList != null || orderIdList.size() != 0) {
                mapList.remove(map);
            }
            List<Map<String, Object>> materialMessages = amsDispatchSaleOrderMapper.getMaterialMessages(dispatchId);
            String allMaterialName = "";
            String allMaterialNumber = "";
            String allMaterialTheoreticalWeight = "";
            String allMaterialSpecificationModel = "";
            if (materialMessages != null) {
                for (Map<String, Object> materialMap : materialMessages) {
                    if (materialMap != null) {
                        String materialName = (String) materialMap.get("materialName");
                        allMaterialName += materialName + "/";
                        String materialTheoreticalWeight = materialMap.get("materialTheoreticalWeight").toString();
                        if (materialTheoreticalWeight != null) {
                            allMaterialTheoreticalWeight += materialTheoreticalWeight + "/";
                        }
                        String saleOrderMaterialNumber = materialMap.get("saleOrderMaterialNumber").toString();
                        allMaterialNumber += saleOrderMaterialNumber + "/";
                        String specificationModel = materialMap.get("specificationModel").toString();
                        if (specificationModel != null) {
                            allMaterialSpecificationModel += specificationModel + "/";
                        }
                    }
                }
                String subMaterialName = null;
                String subMaterialNumber = null;
                String subMaterialTheoreticalWeight = null;
                String subMaterialSpecificationModel = null;
                if (allMaterialName.length() >= 2) {
                    subMaterialName = allMaterialName.substring(0, allMaterialName.length() - 1);
                }
                if (allMaterialName.length() < 2) {
                    subMaterialName = allMaterialName;
                }
                if (allMaterialNumber.length() >= 2) {
                    subMaterialNumber = allMaterialNumber.substring(0, allMaterialNumber.length() - 1);
                }
                if (allMaterialNumber.length() < 2) {
                    subMaterialNumber = allMaterialNumber;
                }
                if (allMaterialTheoreticalWeight.length() >= 2) {
                    subMaterialTheoreticalWeight = allMaterialTheoreticalWeight.substring(0, allMaterialTheoreticalWeight.length() - 1);
                }
                if (allMaterialTheoreticalWeight.length() < 2) {
                    subMaterialTheoreticalWeight = allMaterialTheoreticalWeight;
                }
                if (allMaterialSpecificationModel.length() >= 2) {
                    subMaterialSpecificationModel = allMaterialSpecificationModel.substring(0, allMaterialSpecificationModel.length() - 1);
                }
                if (allMaterialSpecificationModel.length() < 2) {
                    subMaterialSpecificationModel = allMaterialSpecificationModel;
                }
                map.put("allMaterialName",subMaterialName);
                map.put("allMaterialNumber",subMaterialNumber);
                map.put("allMaterialTheoreticalWeight",subMaterialTheoreticalWeight);
                map.put("allMaterialSpecificationModel",subMaterialSpecificationModel);
            }
//            // 将已经清空的map里面put进一个map和一个list<Map>
//            map.put("materialMessages",materialMessages);
//            map.put("saleMap",saleMap);
            else {
                map.put("allMaterialName",allMaterialName);
                map.put("allMaterialNumber",allMaterialNumber);
                map.put("allMaterialTheoreticalWeight",allMaterialTheoreticalWeight);
                map.put("allMaterialSpecificationModel",allMaterialSpecificationModel);
            }
        }
        return mapList;
    }

    /**
     * 展示pc端司机已经抢到的订单
     * @param mapValue
     * @return
     */
    @Override
    public List<Map<String, Object>> getLockDispatchSaleOrderListForPc(Map<String,Object> mapValue) {
//        String carrierSsoId = (String) mapValue.get("carrierSsoId");

        List<Map<String, Object>> mapList = amsDispatchSaleOrderMapper.getLockDispatchSaleOrderListForPc(mapValue);
        if (mapList == null) {
            return null;
        }
        for (Map<String, Object> map : mapList) {
            BigDecimal dispatchId = (BigDecimal) map.get("dispatchId");
            BigDecimal orderId = (BigDecimal) map.get("orderId");
            if (orderId == null) {
                List<Map<String, Object>> materialMessages = amsDispatchSaleOrderMapper.getMaterialMessages(dispatchId);
                String allMaterialName = "";
                String allMaterialNumber = "";
                String allMaterialTheoreticalWeight = "";
                String allMaterialSpecificationModel = "";
                if (materialMessages != null) {
                    for (Map<String, Object> materialMap : materialMessages) {
                        if (materialMap != null) {
                            String materialName = (String) materialMap.get("materialName");
                            allMaterialName += materialName + "/";
                            BigDecimal materialTheoreticalWeight = (BigDecimal) materialMap.get("materialTheoreticalWeight");
                            if (materialTheoreticalWeight != null) {
                                allMaterialTheoreticalWeight += materialTheoreticalWeight + "/";
                            }
                            BigDecimal saleOrderMaterialNumber = (BigDecimal) materialMap.get("saleOrderMaterialNumber");
                            allMaterialNumber += saleOrderMaterialNumber + "/";
                            String specificationModel = (String) materialMap.get("specificationModel");
                            if (specificationModel != null) {
                                allMaterialSpecificationModel += specificationModel + "/";
                            }
                        }
                    }
                    String subMaterialName = null;
                    String subMaterialNumber = null;
                    String subMaterialTheoreticalWeight = null;
                    String subMaterialSpecificationModel = null;
                    if (allMaterialName.length() >= 2) {
                        subMaterialName = allMaterialName.substring(0, allMaterialName.length() - 1);
                    }
                    if (allMaterialName.length() < 2) {
                        subMaterialName = allMaterialName;
                    }
                    if (allMaterialNumber.length() >= 2) {
                        subMaterialNumber = allMaterialNumber.substring(0, allMaterialNumber.length() - 1);
                    }
                    if (allMaterialNumber.length() < 2) {
                        subMaterialNumber = allMaterialNumber;
                    }
                    if (allMaterialTheoreticalWeight.length() >= 2) {
                        subMaterialTheoreticalWeight = allMaterialTheoreticalWeight.substring(0, allMaterialTheoreticalWeight.length() - 1);
                    }
                    if (allMaterialTheoreticalWeight.length() < 2) {
                        subMaterialTheoreticalWeight = allMaterialTheoreticalWeight;
                    }
                    if (allMaterialSpecificationModel.length() >= 2) {
                        subMaterialSpecificationModel = allMaterialSpecificationModel.substring(0, allMaterialSpecificationModel.length() - 1);
                    }
                    if (allMaterialSpecificationModel.length() < 2) {
                        subMaterialSpecificationModel = allMaterialSpecificationModel;
                    }
                    map.put("allMaterialName", subMaterialName);
                    map.put("allMaterialNumber", subMaterialNumber);
                    map.put("allMaterialTheoreticalWeight", subMaterialTheoreticalWeight);
                    map.put("allMaterialSpecificationModel", subMaterialSpecificationModel);
                }
//            // 将已经清空的map里面put进一个map和一个list<Map>
//            map.put("materialMessages",materialMessages);
//            map.put("saleMap",saleMap);
                else {
                    map.put("allMaterialName", allMaterialName);
                    map.put("allMaterialNumber", allMaterialNumber);
                    map.put("allMaterialTheoreticalWeight", allMaterialTheoreticalWeight);
                    map.put("allMaterialSpecificationModel", allMaterialSpecificationModel);
                }
            }
        }
        return mapList;
    }

    /**
     * 查询PC端公开抢单
     * @param mapValue
     * @return
     */
    @Override
    public List<Map<String, Object>> getPCDispatchSaleOrderList(Map<String, Object> mapValue) {
        String carrierSsoId = (String) mapValue.get("carrierSsoId");
        List<Map<String,Object>> carrierIdList = amsDispatchSaleOrderMapper.getCarrierIdBySSO(mapValue);
        if (carrierIdList != null && carrierIdList.size() == 1) {
            BigDecimal carrierId = (BigDecimal) carrierIdList.get(0).get("carrierId");
            mapValue.put("carrierId", carrierId);
        }
        else {
            mapValue.put("carrierId",null);
        }
        int pageNum=Integer.parseInt(mapValue.get("pageNum")+"");
        int pageSize=Integer.parseInt(mapValue.get("pageSize")+"");
        PageHelper.startPage(pageNum,pageSize);
        List<Map<String, Object>> dispatchSaleOrderList = amsDispatchSaleOrderMapper.getPCDispatchSaleOrderList(mapValue);
        for (Map<String,Object> map: dispatchSaleOrderList) {
//            Date dispatchDealTime = (Date) map.get("dispatchDealTime");
            BigDecimal dispatchId = (BigDecimal) map.get("dispatchId");
//            String isDeal;
//            if (dispatchDealTime == null) {
//                isDeal = "已成交";
//            }
//            else {
//                isDeal = "未成交";
//            }
//            map.put("isDeal",isDeal);
//            // 先把map中的key-value放到新的saleMap里面
//            Map<String,Object> saleMap = new HashMap<>();
//            saleMap.putAll(map);
            // 使用Map清空工具迭代删除map中的所有key-value
//            MapRemoveUtil.removeMap(map);
            List<Map<String, Object>> materialMessages = amsDispatchSaleOrderMapper.getMaterialMessages(dispatchId);
            String allMaterialName = "";
            String allMaterialNumber = "";
            String allMaterialTheoreticalWeight = "";
            String allMaterialSpecificationModel = "";
            for (Map<String,Object> materialMap : materialMessages) {
                if (materialMap != null) {
                    String materialName = (String) materialMap.get("materialName");
                    allMaterialName += materialName + "/";
                    BigDecimal materialTheoreticalWeight = (BigDecimal)materialMap.get("materialTheoreticalWeight");
                    if (materialTheoreticalWeight != null) {
                        allMaterialTheoreticalWeight += materialTheoreticalWeight + "/";
                    }
                    BigDecimal saleOrderMaterialNumber = (BigDecimal) materialMap.get("saleOrderMaterialNumber");
                    allMaterialNumber += saleOrderMaterialNumber + "/";
                    String specificationModel = (String) materialMap.get("specificationModel");
                    if (specificationModel != null) {
                        allMaterialSpecificationModel += specificationModel + "/";
                    }
                }
            }
            String subMaterialName = null;
            String subMaterialNumber = null;
            String subMaterialTheoreticalWeight = null;
            String subMaterialSpecificationModel = null;
            if (allMaterialName.length() >= 2) {
                subMaterialName = allMaterialName.substring(0, allMaterialName.length() - 1);
            }
            if (allMaterialName.length() < 2) {
                subMaterialName = allMaterialName;
            }
            if (allMaterialNumber.length() >= 2) {
                subMaterialNumber = allMaterialNumber.substring(0, allMaterialNumber.length() - 1);
            }
            if (allMaterialNumber.length() < 2) {
                subMaterialNumber = allMaterialNumber;
            }
            if (allMaterialTheoreticalWeight.length() >= 2) {
                subMaterialTheoreticalWeight = allMaterialTheoreticalWeight.substring(0, allMaterialTheoreticalWeight.length() - 1);
            }
            if (allMaterialTheoreticalWeight.length() < 2) {
                subMaterialTheoreticalWeight = allMaterialTheoreticalWeight;
            }
            if (allMaterialSpecificationModel.length() >= 2) {
                subMaterialSpecificationModel = allMaterialSpecificationModel.substring(0, allMaterialSpecificationModel.length() - 1);
            }
            if (allMaterialSpecificationModel.length() < 2) {
                subMaterialSpecificationModel = allMaterialSpecificationModel;
            }
            map.put("allMaterialName",subMaterialName);
            map.put("allMaterialNumber",subMaterialNumber);
            map.put("allMaterialTheoreticalWeight",subMaterialTheoreticalWeight);
            map.put("allMaterialSpecificationModel",subMaterialSpecificationModel);
        }
        return dispatchSaleOrderList;
    }

    /**
     * 接收定向派单
     * @param dispatchId
     * @return
     */
    @Override
    public int receiveDispatchOrder(BigDecimal dispatchId) {
        return 0;
    }

    /**
     * 销售新增定向派单且直接下发
     * @param mapValue
     * @return
     */
    @Transactional
    @Override
    public int addDispatchSaleOrder(Map<String, Object> mapValue) {
        int result = 0;
        List<Map<String,Object>> mapList = (List<Map<String, Object>>) mapValue.get("mapList");
        // 承运商id
        BigDecimal carrierId = DataChange.dataToBigDecimal(mapValue.get("carrierId"));
        for (Map<String, Object> map : mapList) {
            // 车序号表id
            BigDecimal saleOrderMaterialId = DataChange.dataToBigDecimal(map.get("saleOrderMaterialId"));
            AmsDispatchSaleOrder amsDispatchSaleOrder = new AmsDispatchSaleOrder();
            amsDispatchSaleOrder.setDispatchId(amsDispatchSaleOrderMapper.selectOtherId());
            amsDispatchSaleOrder.setSaleOrderMaterialId(saleOrderMaterialId);
            amsDispatchSaleOrder.setCarrierId(carrierId);
            amsDispatchSaleOrder.setDispatchTime(new Date());
            // 设置为定向派单
            amsDispatchSaleOrder.setDispatchType(new BigDecimal(0));
            amsDispatchSaleOrder.setDispatchStatus(new BigDecimal(0));
            amsDispatchSaleOrder.setInsertTime(new Date());
            amsDispatchSaleOrder.setInsertUsername("admin");
            amsDispatchSaleOrder.setInsertUpdateRemark("无");
            // 将车序号表改为已选承运商状态
            AmsSaleOrderMaterial amsSaleOrderMaterial = new AmsSaleOrderMaterial();
            amsSaleOrderMaterial.setSaleOrderMaterialId(saleOrderMaterialId);
            amsSaleOrderMaterial.setIssueStatus(new BigDecimal(2));
            result += amsDispatchSaleOrderMapper.insertSelective(amsDispatchSaleOrder);
            result += amsSaleOrderMaterialMapper.updateByPrimaryKeySelective(amsSaleOrderMaterial);
        }
        return result;
    }

    /**
     * 展示销售派单物资信息
     * @param dispatchId
     * @return
     */
    @Override
    public List<Map<String, Object>> getDispatchMaterialList(BigDecimal dispatchId) {
        List<Map<String, Object>> mapList = amsDispatchSaleOrderMapper.getDispatchMaterialList(dispatchId);
        return mapList;
    }

    /**
     * 批量接收定向派单
     * @param mapValue
     * @return
     */
    @Override
    public int lockDispatchSaleOrderList(Map<String, Object> mapValue) {
        String carrierSsoId = (String) mapValue.get("carrierSsoId");
        List<Map<String,Object>> carrierIdList = amsDispatchSaleOrderMapper.getCarrierIdBySSO(mapValue);
        BigDecimal carrierId = null;
        if (carrierIdList != null && carrierIdList.size() == 1) {
            carrierId = (BigDecimal) carrierIdList.get(0).get("carrierId");
        }
        int result = 0;
        List<Map<String,Object>> mapList = (List<Map<String, Object>>) mapValue.get("mapList");
        for (Map<String, Object> map : mapList) {
            AmsDispatchSaleOrder amsDispatchSaleOrder = new AmsDispatchSaleOrder();
            BigDecimal dispatchId = DataChange.dataToBigDecimal(map.get("dispatchId"));
            amsDispatchSaleOrder.setDispatchId(dispatchId);
            if (carrierId != null) {
                amsDispatchSaleOrder.setCarrierId(carrierId);
            }
            amsDispatchSaleOrder.setDispatchStatus(new BigDecimal(0));
            amsDispatchSaleOrder.setUpdateTime(new Date());
            amsDispatchSaleOrder.setDispatchDealTime(new Date());
            result += amsDispatchSaleOrderMapper.updateByPrimaryKeySelective(amsDispatchSaleOrder);
        }
        return result;
    }

    /**
     * 批量拒绝定向派单
     * @param mapList
     * @return
     */
    @Override
    public int refuseDispatchSaleOrderList(List<Map<String, Object>> mapList) {
        int result = 0;
        for (Map<String, Object> map : mapList) {
            AmsDispatchSaleOrder amsDispatchSaleOrder = new AmsDispatchSaleOrder();
            BigDecimal dispatchId = DataChange.dataToBigDecimal(map.get("dispatchId"));
            amsDispatchSaleOrder.setDispatchId(dispatchId);
            amsDispatchSaleOrder.setDispatchStatus(new BigDecimal(3));
            result += amsDispatchSaleOrderMapper.updateByPrimaryKeySelective(amsDispatchSaleOrder);
        }
        return result;
    }

    public List<Map<String, Object>> getCarrierIdBySSO(Map<String, Object> mapValue) {
        return amsDispatchSaleOrderMapper.getCarrierIdBySSO(mapValue);
    }
}