//package com.prolog.cs.biz.inbound.service.impl.rcv;
//
//import java.math.BigDecimal;
//import java.util.Collections;
//import java.util.List;
//import java.util.Map;
//import java.util.Optional;
//import java.util.stream.Collectors;
//
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Transactional;
//
//import com.fasterxml.jackson.core.JsonProcessingException;
//import com.prolog.cs.biz.inbound.dao.rcv.RcvHeadersMapper;
//import com.prolog.cs.biz.inbound.dto.PageParam;
//import com.prolog.cs.biz.inbound.dto.rcv.RcvDTO;
//import com.prolog.cs.biz.inbound.dto.rcv.RcvHeadersDTO;
//import com.prolog.cs.biz.inbound.dto.rcv.RcvHeadersProfilesDTO;
//import com.prolog.cs.biz.inbound.dto.rcv.RcvHeadersSrcBillsDTO;
//import com.prolog.cs.biz.inbound.dto.rcv.RcvLinesDTO;
//import com.prolog.cs.biz.inbound.model.rcv.RcvHeaders;
//import com.prolog.cs.biz.inbound.service.impl.BaseServiceImpl;
//import com.prolog.cs.biz.inbound.service.rcv.RcvHeadersProfilesService;
//import com.prolog.cs.biz.inbound.service.rcv.RcvHeadersService;
//import com.prolog.cs.biz.inbound.service.rcv.RcvHeadersSrcBillsService;
//import com.prolog.cs.biz.inbound.service.rcv.RcvLinesService;
//import com.prolog.cs.biz.inbound.utils.ObjectUtils;
//import com.prolog.cs.biz.inbound.utils.UserUtils;
//import com.prolog.cs.biz.inbound.vo.RcvQueryVO;
//import com.prolog.cs.bpm.consume.ProcessService;
//import com.prolog.cs.bpm.core.dto.ProcessStartParam;
//import com.prolog.cs.bpm.core.exception.ProcessException;
//import com.prolog.framework.authority.core.dto.UserDTO;
//import com.prolog.framework.beans.BeanUtils;
//import com.prolog.framework.core.exception.BizException;
//import com.prolog.framework.core.pojo.Page;
//import com.prolog.framework.core.restriction.Criteria;
//import com.prolog.framework.core.restriction.Order;
//import com.prolog.framework.core.restriction.Restriction;
//import com.prolog.framework.core.restriction.Restrictions;
//import com.prolog.framework.dao.util.PageUtils;
//import com.prolog.framework.utils.AssertUtils;
//import com.prolog.framework.utils.JsonUtils;
//import com.prolog.framework.utils.MapUtils;
//
//@Service
//public class RcvHeadersServiceImplback extends BaseServiceImpl<RcvHeaders> implements RcvHeadersService {
//
//	@Resource
//	private RcvHeadersMapper mapper;
//
//	@Resource
//	private UserUtils userUtils;
//
//	@Resource
//	private RcvHeadersProfilesService rcvHeadersProfilesService;
//
//	@Resource
//	private RcvHeadersSrcBillsService rcvHeadersSrcBillsService;
//
//	@Resource
//	private RcvLinesService rcvLinesService;
//	
//	@Resource
//	private ProcessService processService;
//
//	private static Logger logger = LoggerFactory.getLogger(RcvHeadersServiceImplback.class);
//
//	@Override
//	public RcvDTO findByPkId(String pkId) {
//		logger.info("开始根据主键id[{}]查询信息.", pkId);
//		RcvHeaders rcvHeaders = this.findById(pkId);
//		AssertUtils.notNull(rcvHeaders, "查询数据为空!!");
//		RcvHeadersDTO rcvHeadersDTO = new RcvHeadersDTO();
//		BeanUtils.copyProperties(rcvHeaders, rcvHeadersDTO);
//		// TODO 是否带出其他信息看需求
//		// 暂时携带基础数据
//		RcvHeadersProfilesDTO profiles = rcvHeadersProfilesService.findByPkId(pkId);
//		RcvDTO rcvDTO = new RcvDTO();
//		rcvDTO.setRcvHeadersDTO(rcvHeadersDTO);
//		rcvDTO.setRcvHeadersProfilesDTO(profiles);
//		return rcvDTO;
//	}
//
//	@Override
//	@Transactional
//	public Object addWithRelated(RcvDTO rcvDTO) throws ProcessException, JsonProcessingException {
//		Map<String,Object> flowparam = MapUtils.put("inspect",false)
//				.put("inprocess",false)
//				.put("hosting",false)
//				.put("instock",false)
//				.put("reject",false).getMap();
//		// 没有草稿状态一说,直接保存
//		// 添加自身及其关联表
//		RcvHeadersDTO rcvHeadersDTO = rcvDTO.getRcvHeadersDTO();
//		try {
//			logger.info("开始级联保存收货信息:[{}]", JsonUtils.toString(rcvHeadersDTO));
//		} catch (JsonProcessingException e) {
//		}
//		rcvHeadersDTO.setAccessLevel("0"); // 默认数据级别0
//		String masterId = (String) this.add(rcvHeadersDTO);
//		
//		
//		AssertUtils.notNull(rcvHeadersDTO, "收货单主表不可为空!");
//		// TODO 根据收货的结论来走不同操作数据库的逻辑 以及收货的来源
//		// 收货,拒收,待处理,代管
//		UserDTO userDTO = userUtils.getUserDTO();
//
//		RcvHeadersProfilesDTO rcvHeadersProfilesDTO = rcvDTO.getRcvHeadersProfilesDTO();
//		List<RcvHeadersSrcBillsDTO> rcvHeadersSrcBillsDTOList = rcvDTO.getRcvHeadersSrcBillsDTOList();
//		List<RcvLinesDTO> rcvLinesDTOList = rcvDTO.getRcvLinesDTOList();
//		AssertUtils.notNull(rcvLinesDTOList, "收货单明细表不可为空!");
//		String mtlOwnerId = rcvHeadersDTO.getMtlOwnerId();
//		String warehouseId = rcvHeadersDTO.getWarehouseId();
//		
//		// 新增明细
//		rcvLinesService.batchAdd(rcvLinesDTOList, masterId, userDTO, mtlOwnerId, warehouseId,flowparam);
//		if (ObjectUtils.isNotNull(rcvHeadersProfilesDTO)) {
//			// 这里是否需要做更新?
//			rcvHeadersProfilesDTO.setRcvHeaderId(masterId);
//			rcvHeadersProfilesService.add(rcvHeadersProfilesDTO);
//		}
//		if (ObjectUtils.isNotNull(rcvHeadersSrcBillsDTOList)) {
//			rcvHeadersSrcBillsService.batchAdd(rcvHeadersSrcBillsDTOList, masterId, userDTO);
//		}
//		
//		ProcessStartParam pparam = new ProcessStartParam();
//		pparam.setBusinessKey(masterId);
//		pparam.setEnterpriseId(warehouseId);
//		pparam.setWarehouseId(warehouseId);
//		pparam.setOwnerId(mtlOwnerId);
//		pparam.setType("inbound");
//		pparam.setParam(flowparam);
//		processService.startProcess(pparam);
//		return true;
//	}
//
//	@Override
//	public Page<RcvHeadersDTO> findList(RcvQueryVO rcvQueryVO, PageParam pageParam) {
//
//		Criteria criteria = buildPageParam(pageParam, true, null, RcvHeaders.class);
//		Restriction r = buildCondition(rcvQueryVO);
//		criteria.setRestriction(r);
//		this.startPage(pageParam);
//		List<RcvHeaders> list = this.mapper.findByCriteria(criteria);
//		Page<RcvHeaders> page = PageUtils.getPage(list);
//		Page<RcvHeadersDTO> page2 = this.buildPage(page, (p) -> {
//			RcvHeadersDTO target = new RcvHeadersDTO();
//			BeanUtils.copyProperties(p, target);
//			return target;
//		});
//		return page2;
//	}
//
//	private RcvHeaders findById(String id) {
//		return this.mapper.findById(id, RcvHeaders.class);
//	}
//
//	private void buildField(RcvHeaders rcvHeaders, Boolean editFlag, UserDTO userDTO) {
//
//	}
//
//	private Restriction buildCondition(RcvQueryVO condition) {
//		if (ObjectUtils.isNull(condition))
//			return null;
//
//		// 构建查询条件
//		String autoBillNum = condition.getAutoBillNum();
//		String customBillNum = condition.getCustomBillNum();
//		String rcvHeaderId = condition.getRcvHeaderId();
//		String rcvType = condition.getRcvType();
//		String srcAsnAutoBullNums = condition.getSrcAsnAutoBullNums();
//		String status = condition.getStatus();
//		String enterpriseId = userUtils.getEnterpriseId();
//
//		Restriction r0 = Restrictions.eq("enterpriseId", enterpriseId);
//		Restriction r1 = ObjectUtils.isNull(rcvHeaderId) ? null : Restrictions.eq("rcvHeaderId", rcvHeaderId);
//		Restriction r2 = ObjectUtils.isNull(autoBillNum) ? null : Restrictions.eq("autoBillNum", autoBillNum);
//		Restriction r3 = ObjectUtils.isNull(rcvType) ? null : Restrictions.eq("rcvType", rcvType);
//		Restriction r4 = ObjectUtils.isNull(status) ? null : Restrictions.eq("status", status);
//		Restriction r5 = ObjectUtils.isNull(customBillNum) ? null
//				: Restrictions.like("customBillNum", "%" + customBillNum + "%");
//		Restriction r6 = ObjectUtils.isNull(srcAsnAutoBullNums) ? null
//				: Restrictions.like("srcAsnAutoBullNums", "%" + srcAsnAutoBullNums + "%");
//
//		return Restrictions.and(r0, r1, r2, r3, r4, r5, r6);
//	}
//
//	@Override
//	public Object add(RcvHeadersDTO rcvHeadersDTO) {
//		UserDTO userDTO = userUtils.getUserDTO();
//		RcvHeaders rcvHeaders = new RcvHeaders();
//		BeanUtils.copyProperties(rcvHeadersDTO, rcvHeaders);
//		this.vaildateModel(rcvHeaders, false, userDTO);
//		super.setBaseSysField(rcvHeaders, userDTO);
//		this.buildDefaultField(rcvHeaders, false);
//		this.mapper.save(rcvHeaders);
//		return rcvHeaders.getRcvHeaderId();
//	}
//
//	private void buildDefaultField(RcvHeaders rcvHeaders, boolean editFlag) {
//		String status = rcvHeaders.getStatus();
//		if (!editFlag && ObjectUtils.isNull(status))
//			rcvHeaders.setStatus("1"); // 默认状态0 启用
//		BigDecimal printCount = rcvHeaders.getPrintCount();
//		if (!editFlag && ObjectUtils.isNull(printCount))
//			rcvHeaders.setPrintCount(BigDecimal.ZERO); // 打印次数为0
//
//	}
//
//	@Override
//	public Object edit(String pkId, RcvHeadersDTO rcvHeadersDTO) {
//		UserDTO userDTO = userUtils.getUserDTO();
//		RcvHeaders rcvHeaders = new RcvHeaders();
//		BeanUtils.copyProperties(rcvHeadersDTO, rcvHeaders);
//		this.vaildateModel(rcvHeaders, true, userDTO);
//		super.setBaseSysField(rcvHeaders, true, userDTO);
//		this.mapper.updateWithValidate(rcvHeaders,
//				p -> ObjectUtils.isNotNull(p) && ObjectUtils.isNotNull(p.getValue()));
//		return rcvHeaders.getRcvHeaderId();
//	}
//
//	@Override
//	@Transactional
//	public Object delIds(List<String> pkIdList) {
//		pkIdList.stream().filter(p -> canEdit(p)).forEach(p -> this.mapper.deleteById(p, RcvHeaders.class));
//		return pkIdList.toString();
//	}
//
//	@Override
//	public Object deletePkId(String pkId) {
//		if (canEdit(pkId))
//			throw new BizException("can not del");
//		this.mapper.deleteById(pkId, RcvHeaders.class);
//		return pkId;
//	}
//
//	@Override
//	@Transactional
//	public Object batchAdd(List<RcvHeadersDTO> rcvHeadersDTOList) {
//		UserDTO userDTO = userUtils.getUserDTO();
//		for (RcvHeadersDTO rcvHeadersDTO : rcvHeadersDTOList) {
//			RcvHeaders rcvHeaders = new RcvHeaders();
//			BeanUtils.copyProperties(rcvHeadersDTO, rcvHeaders);
//			this.vaildateModel(rcvHeaders, false, userDTO);
//			this.buildField(rcvHeaders, false, userDTO);
//			this.mapper.save(rcvHeaders);
//		}
//		return true;
//	}
//
//	@Override
//	@Transactional
//	public Object batchEdit(List<RcvHeadersDTO> rcvHeadersDTOList) {
//		UserDTO userDTO = userUtils.getUserDTO();
//		for (RcvHeadersDTO rcvHeadersDTO : rcvHeadersDTOList) {
//			RcvHeaders rcvHeaders = new RcvHeaders();
//			BeanUtils.copyProperties(rcvHeadersDTO, rcvHeaders);
//			this.vaildateModel(rcvHeaders, true, userDTO);
//			this.buildField(rcvHeaders, true, userDTO);
//			this.mapper.updateWithValidate(rcvHeaders,
//					p -> ObjectUtils.isNotNull(p) && ObjectUtils.isNotNull(p.getValue()));
//		}
//		return true;
//	}
//
//	@Override
//	public List<RcvHeadersDTO> findAll(RcvQueryVO rcvQueryVO) {
//		Criteria criteria = Criteria.forClass(RcvHeaders.class);
//		RcvQueryVO condition = rcvQueryVO;
//		Restriction r = buildCondition(condition);
//		criteria.setRestriction(r);
//		Order order = Order.newInstance().desc("gmtModified");
//		criteria.setOrder(order);
//		List<RcvHeaders> list = this.mapper.findByCriteria(criteria);
//		List<RcvHeadersDTO> collect = Optional.ofNullable(list).orElse(Collections.emptyList()).stream().map(p -> {
//			RcvHeadersDTO target = new RcvHeadersDTO();
//			BeanUtils.copyProperties(p, target);
//			return target;
//		}).collect(Collectors.toList());
//		return collect;
//	}
//
//	@Override
//	public Object editWithRelated(RcvDTO rcvDTO) {
//		// 编辑
//
//		return null;
//	}
//
//	@Override
//	public Object batchAddWithRelated(List<RcvDTO> rcvDTOList) {
//		// TODO Auto-generated method stub
//		return null;
//	}
//
//	@Override
//	public Object batchEditWithRelated(List<RcvHeadersDTO> rcvHeadersDTOList) {
//		// TODO Auto-generated method stub
//		return null;
//	}
//
//	@Override
//	public Object submitConclusion(String pkId) {
//		// TODO Auto-generated method stub
//		return null;
//	}
//
//	private void vaildateModel(RcvHeaders rcvHeaders, Boolean editFlag, UserDTO userDTO) {
//		// 特殊校验
//		if (!editFlag) {
//			// TODO add
//		} else {
//			// TODO edit
//		}
//		vaildateModelRepeated(rcvHeaders, editFlag, userDTO);
//	}
//
//	private void vaildateModelRepeated(RcvHeaders rcvHeaders, Boolean editFlag, UserDTO userDTO) {
//		if (!editFlag) {
//			// TODO add
//		} else {
//			// TODO
//		}
//	}
//
//	private boolean canEdit(String pkId) {
//		boolean flag = false;
//		RcvHeaders rcvHeaders = this.findById(pkId);
//		AssertUtils.notNull(rcvHeaders, "查询数据为空!");
//		// TODO 根据特殊的逻辑来判断是否能够做编辑操作
//		if (true)
//			flag = true;
//		return flag;
//	}
//}
