package com.sunda.spmsorder.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sunda.spmscommon.ResponseResult;
import com.sunda.spmsorder.entity.MaterialDeliveryBoards;
import com.sunda.spmsorder.entity.MaterialSap;
import com.sunda.spmsorder.entity.MaterialSpms;
import com.sunda.spmsorder.entity.vo.MaterialDeliveryBoardsQueryVO;
import com.sunda.spmsorder.mapper.MaterialSpmsMapper;
import com.sunda.spmsorder.service.IMaterialSapService;
import com.sunda.spmsorder.service.IMaterialSpmsService;
import com.sunda.spmswms.entity.SapDeliveryNote;
import com.sunda.spmswms.service.ISapDeliveryNoteService;

import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

/**
 * <p>
 * 物料表SPMS 服务实现类
 * </p>
 *
 * @author Wayne
 * @since 2020-11-23
 */
@Service
public class MaterialSpmsServiceImpl extends ServiceImpl<MaterialSpmsMapper, MaterialSpms> implements IMaterialSpmsService {
	
	@Autowired
	private IMaterialSapService iMaterialSapService;
	
	@Autowired
    private ISapDeliveryNoteService iSapDeliveryNoteService;

	@Override
	public ResponseResult getMaterialDeliveryBoardsList(MaterialDeliveryBoardsQueryVO record) {
		IPage<Map<String, Object>> iPage = new Page<>(record.getPageNo(), record.getPageSize());
		List<Map<String, Object>> list = this.baseMapper.selectMaterialBoardsList(iPage, record);
		iPage.setRecords(list);
		return ResponseResult.success().add("list", iPage);
	}

	@Override
	public ResponseResult updateMaterialDeliverBoards(MaterialDeliveryBoards record, String userId) {
		if (StringUtils.isNotBlank(record.getMaterialNo()) && StringUtils.isNotBlank(record.getDeliveryNoteSap())) {
			return ResponseResult.error("物料号跟交货单号二选一填写");
		}
		if (StringUtils.isBlank(record.getMaterialNo()) && StringUtils.isBlank(record.getDeliveryNoteSap())) {
			return ResponseResult.error("物料号跟交货单号二选一填写");
		}
		// 验证物料号或者交货单号是否存在
		if (StringUtils.isNotBlank(record.getMaterialNo())) {
			MaterialSap materialInfo = iMaterialSapService.getMaterialInfo(record.getMaterialNo());
			if (materialInfo == null) {
				return ResponseResult.error(record.getMaterialNo()+"在物料表中不存在，请检查输入的物料号是否正确！");
			}
			// 看物料号或者交货单号在物料/交货单仓租计费板位数表中是否存在，不存在新增、存在就更新
			Map<String, Object> selectMaterialAndDelivery = this.baseMapper.selectMaterialAndDelivery(record.getMaterialNo(), null);
			if (selectMaterialAndDelivery == null) {
				record.setCreateUser(userId);
				record.setCreateTime(new Date());
				record.setDeliveryNoteSap("");
				this.baseMapper.insertMaterialAndDelivery(record);
			} else {
				record.setUpdateUser(userId);
				record.setUpdateTime(new Date());
				this.baseMapper.updateMaterialAndDelivery(record);
			}
		} else if (StringUtils.isNotBlank(record.getDeliveryNoteSap())) {
			SapDeliveryNote sapDnByDn = iSapDeliveryNoteService.getSapDnByDn(record.getDeliveryNoteSap());
			if (sapDnByDn == null) {
				return ResponseResult.error(record.getDeliveryNoteSap()+"在交货单表中不存在，请检查输入的交货单号是否正确！");
			}
			// 看物料号或者交货单号在物料/交货单仓租计费板位数表中是否存在，不存在新增、存在就更新
			Map<String, Object> selectMaterialAndDelivery = this.baseMapper.selectMaterialAndDelivery(null, record.getDeliveryNoteSap());
			if (selectMaterialAndDelivery == null) {
				record.setCreateUser(userId);
				record.setCreateTime(new Date());
				record.setMaterialNo("");
				this.baseMapper.insertMaterialAndDelivery(record);
			} else {
				record.setUpdateUser(userId);
				record.setUpdateTime(new Date());
				this.baseMapper.updateMaterialAndDelivery(record);
			}
		}
		return ResponseResult.success().add("record", record);
	}

	@Override
	public Map<String, Object> selectMaterialAndDelivery(String materialNo, String deliveryNoteSap) {
		return this.baseMapper.selectMaterialAndDelivery(materialNo, deliveryNoteSap);
	}

	@Override
	public int insertMaterialAndDelivery(MaterialDeliveryBoards materialVO) {
		return this.baseMapper.insertMaterialAndDelivery(materialVO);
	}

	@Override
	public int updateMaterialAndDelivery(MaterialDeliveryBoards materialVO) {
		return this.baseMapper.updateMaterialAndDelivery(materialVO);
	}

	@Override
	@Transactional
	public ResponseResult deleteByMaterialNoList(List<String> list) {
		if (CollectionUtils.isEmpty(list)) {
			return ResponseResult.error("物料号不能为空，操作失败");
		}
		this.baseMapper.deleteListByMaterialNos(list);
		return ResponseResult.success();
	}

}
