package com.steerinfo.dil.service.impl;

import com.steerinfo.dil.mapper.AmsDispatchSaleOrderMapper;
import com.steerinfo.dil.mapper.AmsSaleOrderMapper;
import com.steerinfo.dil.mapper.AmsSaleOrderMaterialMapper;
import com.steerinfo.dil.mapper.AmsSaleTrucknoMaterialMapper;
import com.steerinfo.dil.model.AmsDispatchSaleOrder;
import com.steerinfo.dil.model.AmsSaleOrder;
import com.steerinfo.dil.model.AmsSaleOrderMaterial;
import com.steerinfo.dil.model.AmsSaleTrucknoMaterial;
import com.steerinfo.dil.service.IAmsSaleOrderService;
import com.steerinfo.dil.util.DataChange;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * AmsSaleOrder服务实现:
 *
 * @author generator
 * @version 1.0-SNAPSHORT 2021-09-06 07:10
 * 类描述
 * 修订历史:
 * 日期:2021-09-06
 * 作者:generator
 * 参考:
 * 描述:AmsSaleOrder服务实现
 * @Copyright 湖南视拓信息技术股份有限公司. All rights reserved.
 * @see null
 */
@Service(value = "amsSaleOrderService")
public class AmsSaleOrderServiceImpl implements IAmsSaleOrderService {

    @Autowired
    private AmsSaleOrderMapper amsSaleOrderMapper;
    @Autowired
    private AmsSaleOrderMaterialMapper amsSaleOrderMaterialMapper;
    @Autowired
    private AmsSaleTrucknoMaterialMapper trucknoMaterialMapper;
    @Autowired
    AmsDispatchSaleOrderMapper amsDispatchSaleOrderMapper;

    @Override
    public List<Map<String, Object>> getSaleOrderInfo(Map<String, Object> map) {
        return amsSaleOrderMapper.getSaleOrderInfo(map);
    }

    @Override
    public List<Map<String, Object>> getSaleOrderReported(Map<String, Object> map) {
        return amsSaleOrderMapper.getSaleOrderReported(map);
    }

    @Override
    public List<Map<String, Object>> getSaleOrderDetail(Map<String, Object> map) {
        return amsSaleOrderMapper.getSaleOrderDetail(map);
    }

    @Override
    public List<Map<String, Object>> getSalePlanName() {
        return amsSaleOrderMapper.getSalePlanName();
    }

    @Override
    public List<Map<String, Object>> getShipperName() {
        return amsSaleOrderMapper.getShipperName();
    }

    @Override
    public List<Map<String, Object>> getConsigneeCompanyName() {
        return amsSaleOrderMapper.getConsigneeCompanyName();
    }

    @Override
    /**
     * map存放为前端获取的amsSaleOrder基础数据以及selectionList物资信息
     * map1为基础数据包括,收货地址,收货人等
     * map2存放的从selectionList取出的数据,包括物资id,物资名称等。
     */
    public int addAmsSaleOrder(Map<String, Object> map) throws ParseException {
        //获取前端传过来的map,
        int i = 0;
        Map<String, Object> map1 = (Map<String, Object>) map.get("amsSaleOrder");
        AmsSaleOrder amsSaleOrder = new AmsSaleOrder();
        Integer id = (amsSaleOrderMapper.selectMaxId()).intValue();
        //生成主键id
        amsSaleOrder.setSaleOrderId(new BigDecimal(id));
        //WXSDD-年月日-8位数的顺序号
        String wxsdd = DataChange.generateEightDigitsNumber("WXSDD", id);
        amsSaleOrder.setSaleNumber(wxsdd);
        //获得是否自提
        amsSaleOrder.setSaleOrderIsselfMention((String) map1.get("saleOrderIsselfMention"));
        //获取收货地址id
        amsSaleOrder.setReceiveId(DataChange.dataToBigDecimal(map1.get("receiveId")));
        //获取发货单位id
        amsSaleOrder.setShipperId(DataChange.dataToBigDecimal(map1.get("shipperId")));
        //获取备注
        amsSaleOrder.setSaleRemark((String) map1.get("saleRemark"));
        //设置销售订单状态
        amsSaleOrder.setSaleOrderStatus(new BigDecimal(0));
        amsSaleOrder.setSaleUnitPrice(new BigDecimal(4000));
        amsSaleOrder.setSaleOrderTax("13%");
        amsSaleOrder.setInsertUsername("admin");
        amsSaleOrder.setInsertTime(new Date());
        amsSaleOrder.setUpdateUsername("admin");
        amsSaleOrder.setUpdateTime(new Date());
        amsSaleOrder.setInsertUpdateRemark("无");
        amsSaleOrder.setDeleted(new BigDecimal(0));
        amsSaleOrder.setSaleOrderStatus(new BigDecimal(0));
        //设置收款客户
        amsSaleOrder.setSaleOrderReceiveCustomer((String) map1.get("saleOrderReceiveCustomer"));
        i += amsSaleOrderMapper.insertSelective(amsSaleOrder);
        //获取车序号和物资信息进行新增车序号与物资中间表
        //一个销售订单对应多个车序号
        List<Map<String, Object>> selectionList = (List<Map<String, Object>>) map.get("selectionList");
        for (Map<String, Object> map2 : selectionList) {
            BigDecimal materialId = DataChange.dataToBigDecimal(map2.get("materialId"));
            Integer cxh = (Integer) map2.get("cxh");
            //生成车序号与物资实体
            AmsSaleOrderMaterial amsSaleOrderMaterial = new AmsSaleOrderMaterial();
            //生成主键
            amsSaleOrderMaterial.setSaleOrderMaterialId(amsSaleOrderMaterialMapper.selectMaxId());
            amsSaleOrderMaterial.setSaleOrderId(amsSaleOrder.getSaleOrderId());
            // 生成定向派单
            AmsDispatchSaleOrder amsDispatchSaleOrder = new AmsDispatchSaleOrder();
            amsDispatchSaleOrder.setDispatchId(amsDispatchSaleOrderMapper.selectOtherId());
            amsDispatchSaleOrder.setSaleOrderMaterialId(amsSaleOrderMaterial.getSaleOrderMaterialId());
            //获取收货地址
            Integer saleShipperAddressId =(Integer) map2.get("saleShipperAddressId");
            amsSaleOrderMaterial.setSaleShippingAddressId(new BigDecimal(saleShipperAddressId));
            //根据收货地址查询承运商
            Map<String,Object> map4 = amsSaleOrderMapper.selectProvince(saleShipperAddressId);
            BigDecimal carrierId = amsSaleOrderMapper.selectCarrierIdByprovince(map4);
            //获取收货方电话号码
            amsDispatchSaleOrder.setCarrierId(carrierId);
            amsDispatchSaleOrder.setDispatchTime(new Date());
            //设置成交类型
            amsDispatchSaleOrder.setDispatchType(new BigDecimal(0));
            //设置下发状态为未下发
            amsDispatchSaleOrder.setDispatchStatus(new BigDecimal(1));
            amsDispatchSaleOrder.setInsertTime(new Date());
            amsDispatchSaleOrder.setInsertUsername("admin");
            amsDispatchSaleOrderMapper.insertSelective(amsDispatchSaleOrder);
            amsSaleOrderMaterial.setSaleOrderConsigneeTel(map2.get("saleOrderConsigneeTel").toString());
            //获取收货日期
            String saleDateOfReceipt =(String) map2.get("saleDateOfReceipt");
            SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
            Date date = simpleDateFormat.parse(saleDateOfReceipt);
            amsSaleOrderMaterial.setSaleDateOfReceipt(date);
            //获取收货方姓名
            amsSaleOrderMaterial.setSaleOrderConsignee((String) map2.get("saleOrderConsignee"));
            //设置车序号
            amsSaleOrderMaterial.setSaleOrderMaterialTruckNo(new BigDecimal(cxh));
            //设置删除状态
            amsSaleOrderMaterial.setDeleted(new BigDecimal(0));
            i += amsSaleOrderMaterialMapper.insertSelective(amsSaleOrderMaterial);
            //新增车序号与物资中间表
            AmsSaleTrucknoMaterial trucknoMaterial = new AmsSaleTrucknoMaterial();
            trucknoMaterial.setTrucknoMaterialId(trucknoMaterialMapper.selectMaxId());
            //设置物资id
            trucknoMaterial.setMaterialId(materialId);
            //获取车序号物资id
            trucknoMaterial.setSaleOrderMaterialId(amsSaleOrderMaterial.getSaleOrderMaterialId());
            Integer orderPlanWeight = (Integer) map2.get("orderPlanWeight");
            trucknoMaterial.setSaleOrderMaterialNumber(DataChange.dataToBigDecimal(orderPlanWeight));
            //获取物资理重
            BigDecimal materialTheoreticalWeight = DataChange.dataToBigDecimal(map2.get("materialTheoreticalWeight"));
            //判断是否有物资理重
            if (materialTheoreticalWeight.intValue() != 0) {
                trucknoMaterial.setMaterialTheoreticalWeight(materialTheoreticalWeight);
            }
            //新增车序号与物资中间表
            i += trucknoMaterialMapper.insertSelective(trucknoMaterial);
        }
        return i;
    }

    @Override
    public int uploadSaleOrder(BigDecimal saleOrderId) {
        AmsSaleOrder amsSaleOrder = amsSaleOrderMapper.selectByPrimaryKey(saleOrderId);
        amsSaleOrder.setSaleOrderStatus(new BigDecimal(1));
        return amsSaleOrderMapper.updateByPrimaryKey(amsSaleOrder);
    }

    @Override
    public List<Map<String, Object>> selectBySaleOrderId(BigDecimal saleOrderId) {
        return amsSaleOrderMapper.selectBySaleOrderId(saleOrderId);
    }

    /**
     * 修改订单信息、车序号表、车序号物资中间表
     *
     * @param map
     * @return
     */
    @Override
    @Transactional
    public int updateAmsSaleOrder(Map<String, Object> map) throws ParseException {
        int i = 0;
        int j = 0;
        Map<String, Object> map1 = (Map<String, Object>) map.get("amsSaleOrder");
        AmsSaleOrder amsSaleOrder = new AmsSaleOrder();
        //修改销售订单表  更新销售订单基础信息
        amsSaleOrder.setSaleOrderId(DataChange.dataToBigDecimal(map1.get("saleOrderId")));
        amsSaleOrder.setShipperId(DataChange.dataToBigDecimal(map1.get("shipperId")));
        amsSaleOrder.setReceiveId(DataChange.dataToBigDecimal(map1.get("reciveId")));
        amsSaleOrder.setSaleOrderIsselfMention((String) map1.get("saleOrderIsselfMention"));
        amsSaleOrder.setSaleOrderReceiveCustomer((String) map1.get("saleOrderReciveCustomer"));
        amsSaleOrder.setSaleRemark((String) map1.get("saleRemark"));
        amsSaleOrder.setUpdateTime(new Date());
        i += amsSaleOrderMapper.updateByPrimaryKeySelective(amsSaleOrder);
        //根据销售订单id查找销售车序号和车序号与物资中间表主键
        List<Map<String, Object>> map2 = amsSaleOrderMapper.selectSaleOrderMaterialIdBySaleOrderId(DataChange.dataToBigDecimal(map1.get("saleOrderId")));
         for (Map<String,Object> Id:map2){
             BigDecimal truckNoMaterialId =(BigDecimal) Id.get("TruckNoMaterialId");
             BigDecimal saleOrderMaterialId=(BigDecimal) Id.get("saleOrderMaterialId");
             //删除对应的车序号表与车序号与物资中间表
           j+=amsSaleOrderMaterialMapper.deleteByPrimaryKey(saleOrderMaterialId);
           j+=trucknoMaterialMapper.deleteByPrimaryKey(truckNoMaterialId);

         }
         //新增车序号和物资中间表
        //获取车序号和物资信息进行新增车序号与物资中间表
        //一个销售订单对应多个车序号
        List<Map<String, Object>> selectionList = (List<Map<String, Object>>) map.get("selectionList");
        for (Map<String, Object> map3 : selectionList) {
            BigDecimal materialId = DataChange.dataToBigDecimal(map3.get("materialId"));
            Integer cxh = (Integer) map3.get("cxh");
            //生成车序号与物资实体
            AmsSaleOrderMaterial amsSaleOrderMaterial = new AmsSaleOrderMaterial();
            //生成主键
            amsSaleOrderMaterial.setSaleOrderMaterialId(amsSaleOrderMaterialMapper.selectMaxId());
            amsSaleOrderMaterial.setSaleOrderId(DataChange.dataToBigDecimal(map1.get("saleOrderId")));
            //获取收货地址
            amsSaleOrderMaterial.setSaleShippingAddressId(DataChange.dataToBigDecimal(map3.get("saleShipperAddressId")));
            //获取收货方电话号码

            amsSaleOrderMaterial.setSaleOrderConsigneeTel(map3.get("saleOrderConsigneeTel").toString());
            //获取收货日期
            String saleDateOfReceipt =(String) map3.get("saleDateOfReceipt");
            SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
            Date date = simpleDateFormat.parse(saleDateOfReceipt);
            amsSaleOrderMaterial.setSaleDateOfReceipt(date);
            //获取收货方姓名
            amsSaleOrderMaterial.setSaleOrderConsignee((String) map3.get("saleOrderConsignee"));
            //设置车序号
            amsSaleOrderMaterial.setSaleOrderMaterialTruckNo(new BigDecimal(cxh));
            //设置删除状态
            amsSaleOrderMaterial.setDeleted(new BigDecimal(0));
            i += amsSaleOrderMaterialMapper.insertSelective(amsSaleOrderMaterial);
            // 生成定向派单
            AmsDispatchSaleOrder amsDispatchSaleOrder = new AmsDispatchSaleOrder();
            amsDispatchSaleOrder.setDispatchId(amsDispatchSaleOrderMapper.selectOtherId());
            amsDispatchSaleOrder.setSaleOrderMaterialId(amsSaleOrderMaterial.getSaleOrderMaterialId());
            //获取收货地址
            Integer saleShipperAddressId =(Integer) map3.get("saleShipperAddressId");
            amsSaleOrderMaterial.setSaleShippingAddressId(new BigDecimal(saleShipperAddressId));
            //根据收货地址查询承运商
            Map<String,Object> map4 = amsSaleOrderMapper.selectProvince(saleShipperAddressId);
            BigDecimal carrierId = amsSaleOrderMapper.selectCarrierIdByprovince(map4);
            //获取收货方电话号码
            amsDispatchSaleOrder.setCarrierId(carrierId);
            amsDispatchSaleOrder.setDispatchTime(new Date());
            //设置成交类型
            amsDispatchSaleOrder.setDispatchType(new BigDecimal(0));
            //设置下发状态为已下发
            amsDispatchSaleOrder.setDispatchStatus(new BigDecimal(0));
            amsDispatchSaleOrder.setInsertTime(new Date());
            amsDispatchSaleOrder.setInsertUsername("admin");
            //新增车序号与物资中间表
            AmsSaleTrucknoMaterial trucknoMaterial = new AmsSaleTrucknoMaterial();
            trucknoMaterial.setTrucknoMaterialId(trucknoMaterialMapper.selectMaxId());
            //设置物资id
            trucknoMaterial.setMaterialId(materialId);
            //获取车序号物资id
            trucknoMaterial.setSaleOrderMaterialId(amsSaleOrderMaterial.getSaleOrderMaterialId());
            Integer orderPlanWeight = (Integer) map3.get("orderPlanWeight");
            trucknoMaterial.setSaleOrderMaterialNumber(DataChange.dataToBigDecimal(orderPlanWeight));
            //获取物资理重
            BigDecimal materialTheoreticalWeight = DataChange.dataToBigDecimal(map3.get("materialTheoreticalWeight"));
            //判断是否有物资理重
            if (materialTheoreticalWeight.intValue() != 0) {
                trucknoMaterial.setMaterialTheoreticalWeight(materialTheoreticalWeight);
            }
            //新增车序号与物资中间表
            i += trucknoMaterialMapper.insertSelective(trucknoMaterial);
        }

//        List<Map<String, Object>> mapList = (List<Map<String, Object>>) map.get("mapList");
//        ArrayList<Integer> list = new ArrayList<>();
//        for (Map<String, Object> truckMesMap : mapList) {
//            //修改车序号表
//            BigDecimal saleOrderMaterialId = DataChange.dataToBigDecimal(truckMesMap.get("saleOrderMaterialId"));
//            if (!list.contains(saleOrderMaterialId.intValue())) {
//                //车序号表专用字段
//                BigDecimal saleShipperAddressId = DataChange.dataToBigDecimal(truckMesMap.get("saleShipperAddressId"));
//                String saleDateOfReceipt =(String) truckMesMap.get("saleDateOfReceipt");
//                SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
//                Date date = simpleDateFormat.parse(saleDateOfReceipt);
//                String saleOrderConsignee = (String) truckMesMap.get("saleOrderConsignee");
//                String saleOrderConsigneeTel = (String) truckMesMap.get("saleOrderConsigneeTel");
//                AmsSaleOrderMaterial amsSaleOrderMaterial = new AmsSaleOrderMaterial();
//                amsSaleOrderMaterial.setSaleOrderMaterialId(saleOrderMaterialId);
//                amsSaleOrderMaterial.setSaleOrderMaterialTruckNo(DataChange.dataToBigDecimal(truckMesMap.get("cxh")));
//                amsSaleOrderMaterial.setSaleShippingAddressId(saleShipperAddressId);
//                amsSaleOrderMaterial.setSaleDateOfReceipt(date);
//                amsSaleOrderMaterial.setSaleOrderConsignee(saleOrderConsignee);
//                amsSaleOrderMaterial.setSaleOrderConsigneeTel(saleOrderConsigneeTel);
//                i += amsSaleOrderMaterialMapper.updateByPrimaryKeySelective(amsSaleOrderMaterial);
//                list.add(saleOrderMaterialId.intValue());
//            }
//            //修改车车序号物资表
//            AmsSaleTrucknoMaterial amsSaleTrucknoMaterial = new AmsSaleTrucknoMaterial();
//            amsSaleTrucknoMaterial.setTrucknoMaterialId(DataChange.dataToBigDecimal(truckMesMap.get("trucknoMaterialId")));
//            amsSaleTrucknoMaterial.setSaleOrderMaterialNumber(DataChange.dataToBigDecimal(truckMesMap.get("orderPlanWeight")));
//            amsSaleTrucknoMaterial.setMaterialId(DataChange.dataToBigDecimal(truckMesMap.get("materialId")));
//            i += trucknoMaterialMapper.updateByPrimaryKeySelective(amsSaleTrucknoMaterial);
//        }

        return i;
    }

    @Override
    public int deleteAmsSaleOrderBySaleOrderId(BigDecimal saleOrderId) {
        //删除所有从表信息
        //amsSaleOrderMapper.deleteBySaleOrderId(saleOrderId);
        AmsSaleOrder amsSaleOrder = amsSaleOrderMapper.selectByPrimaryKey(saleOrderId);
        amsSaleOrder.setDeleted(new BigDecimal(1));
        return amsSaleOrderMapper.updateByPrimaryKey(amsSaleOrder);
    }

    @Override
    public List<Map<String, Object>> getSaleOrderUpdateLog(Map<String, Object> map) {
        return amsSaleOrderMapper.getSaleOrderUpdateLog(map);
    }

    /**
     * 销售公司查询已审核的订单
     * @param map
     * @return
     */
    @Override
    public List<Map<String, Object>> getSaleOrderListBySaleCompany(Map<String, Object> map) {
        return amsSaleOrderMapper.getSaleOrderListBySaleCompany(map);
    }

    @Override
    public List<Map<String, Object>> getAmsSaleOrderApproved(Map<String, Object> map) {
        return amsSaleOrderMapper.getAmsSaleOrderApproved(map);
    }

    @Override
    public List<Map<String, Object>> getSaleOrderList(Map<String, Object> mapValue) {
        return amsSaleOrderMapper.getSaleOrderList(mapValue);
    }

    public Map<String, Object> getCarrier(Integer addressId) {
        return amsSaleOrderMapper.selectProvince(addressId);
    }



    /**
     * 根据销售订单id查找信息
     */
    @Override
    public Map<String, Object> selectInfoBySaleOrderId(BigDecimal saleOrderId) {
        return amsSaleOrderMapper.selectInfoBySaleOrderId(saleOrderId);
    }

    /**
     * 根据销售订单id查找物资信息
     *
     * @param saleOrderId
     * @return
     */
    @Override
    public List<Map<String, Object>> selectMaterialInfoBySaleOrderId(BigDecimal saleOrderId) {
        return amsSaleOrderMapper.selectMaterialInfoBySaleOrderId(saleOrderId);
    }


    @Override
    public int addAmsDispatchSaleOrder(List<Map<String, Object>> mapValue) {
        int result = 0;
        for (Map<String,Object> map : mapValue) {
            Integer dispatchId = (Integer)map.get("dispatchId");
            AmsDispatchSaleOrder amsDispatchSaleOrder = amsDispatchSaleOrderMapper.selectByPrimaryKey(new BigDecimal(dispatchId));
            amsDispatchSaleOrder.setDispatchStatus(new BigDecimal(0));
            result = amsDispatchSaleOrderMapper.updateByPrimaryKeySelective(amsDispatchSaleOrder);
        }
        return result;
    }

    @Override
    public List<Map<String, Object>> getSaleOrderInfoes(Map<String, Object> map) {
        return amsSaleOrderMapper.getSaleOrderInfoes(map);
    }

    @Override
    public List<Map<String, Object>> getSaleOrderReportedes(Map<String, Object> map) {
        return amsSaleOrderMapper.getSaleOrderReportedes(map);
    }

    @Override
    public List<Map<String, Object>> getSaleOrderListBySaleCompanyes(Map<String, Object> map) {
        List<Map<String, Object>> resultList = amsSaleOrderMapper.getSaleOrderListBySaleCompanyes(map);
        String statusStr;
        for (Map<String, Object> resultMap : resultList) {
            BigDecimal saleOrderStatus = (BigDecimal) resultMap.get("saleOrderStatus");
//            if (saleOrderStatus.intValue() == 2) {
//                statusStr = "销售公司已审核";
//            }
//            else {
//                statusStr = "财务已审核";
//            }
            statusStr = saleOrderStatus.intValue() == 2 ? "销售公司已审批" : "财务已审批";
            resultMap.put("statusStr",statusStr);
        }
        return resultList;
    }

    @Override
    public List<Map<String, Object>> getAmsSaleOrderApprovedes(Map<String, Object> map) {
        return amsSaleOrderMapper.getAmsSaleOrderApprovedes(map);
    }

    /*
     *  根据销售订单主键展示销售基本信息、物资信息
     * */
    @Override
    public List<Map<String, Object>> getSaleOrderAndMaterialById(Map<String,Object> mapValue) {
        List<Map<String, Object>> mapList=amsSaleOrderMapper.getSaleOrderAndMaterialById(mapValue);
        for (Map<String, Object> map : mapList) {
            BigDecimal number;
            BigDecimal materialNumber = (BigDecimal) map.get("materialNumber");
            BigDecimal materialWeight = (BigDecimal) map.get("materialWeight");
            if (materialNumber != null && materialNumber.toString().length() != 0) {
                number = materialNumber;
            }
            else {
                number = materialWeight;
            }
            map.put("number",number);
        }
        return mapList;
    }
}