//package com.prolog.cs.biz.inbound.service.impl.rcv;
//
//import java.util.Calendar;
//import java.util.Collections;
//import java.util.Date;
//import java.util.List;
//import java.util.Map;
//import java.util.Optional;
//import java.util.Random;
//import java.util.stream.Collectors;
//
//import javax.validation.Validator;
//
//import org.apache.commons.collections4.map.HashedMap;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Qualifier;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Transactional;
//
//import com.prolog.cs.biz.inbound.dao.rcv.RcvLinesMapper;
//import com.prolog.cs.biz.inbound.dto.PageParam;
//import com.prolog.cs.biz.inbound.dto.rcv.RcvLinesDTO;
//import com.prolog.cs.biz.inbound.dto.rcv.RcvLinesProfilesDTO;
//import com.prolog.cs.biz.inbound.model.rcv.RcvLines;
//import com.prolog.cs.biz.inbound.remote.BaseItemRemoteCaller;
//import com.prolog.cs.biz.inbound.service.impl.BaseServiceImpl;
//import com.prolog.cs.biz.inbound.service.impl.processor.Helper.TaskHelper;
//import com.prolog.cs.biz.inbound.service.impl.processor.enums.ConclusionEnum;
//import com.prolog.cs.biz.inbound.service.impl.processor.enums.RcvTypeStrategyEnum;
//import com.prolog.cs.biz.inbound.service.impl.processor.enums.RqcStrategyEnum;
//import com.prolog.cs.biz.inbound.service.impl.processor.factory.RcvSubjectFactory;
//import com.prolog.cs.biz.inbound.service.impl.processor.factory.RcvSubjectFactoryS1Impl;
//import com.prolog.cs.biz.inbound.service.impl.processor.handler.TaskHandler;
//import com.prolog.cs.biz.inbound.service.rcv.RcvLinesProfilesService;
//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.RcvLinesQueryVO;
//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.SnowFlakeUtils;
//import com.prolog.framework.utils.StringUtils;
//
//@Service
//public class RcvLinesServiceImpl extends BaseServiceImpl<RcvLines> implements RcvLinesService {
//
//	@Resource
//	private RcvLinesMapper mapper;
//
//	@Resource
//	private UserUtils userUtils;
//
//	@Resource
//	private RcvLinesProfilesService rcvLinesProfilesService;
//
//	@Resource
//	private TaskHelper taskHelper;
//
//	@Resource
//	private BaseItemRemoteCaller baseItemRemoteCaller;
//
//	@Resource
//	@Qualifier("rcvTaskHandler")
//	private TaskHandler handler;
//
//	@Override
//	public Page<RcvLinesDTO> findList(RcvLinesQueryVO queryVO, PageParam pageParam) {
//		// 此处还可继续优化
//		queryVO.setEnterpriseId(userUtils.getEnterpriseId());
//		this.startPage(pageParam);
//		List<RcvLinesDTO> list = this.mapper.findList(queryVO);
//		Page<RcvLinesDTO> page2 = PageUtils.getPage(list);
////		Criteria criteria = this.buildPageParam(pageParam, true, null, RcvLines.class);
////		RcvLinesDTO condition = new RcvLinesDTO();
////		BeanUtils.copyProperties(queryVO, condition);
////		Restriction r = buildCondition(condition);
////		criteria.setRestriction(r);
////		this.startPage(pageParam);
////		List<RcvLines> list = this.mapper.findByCriteria(criteria);
////		Page<RcvLines> page = PageUtils.getPage(list);
////		Page<RcvLinesDTO> page2 = this.buildPage(page, (p) -> {
////			RcvLinesDTO target = new RcvLinesDTO();
////			BeanUtils.copyProperties(p, target);
////			return target;
////		});
//		return page2;
//	}
//
//	@Override
//	public List<RcvLinesDTO> searchByIdList(List<String> rcvLineIdList) {
//		if (ObjectUtils.isNull(rcvLineIdList))
//			return null;
//
//		String[] array = rcvLineIdList.toArray(new String[rcvLineIdList.size()]);
//		List<RcvLines> list = this.mapper.findByIds(RcvLines.class, array, null);
//		List<RcvLinesDTO> collect = Optional.ofNullable(list).orElse(Collections.emptyList()).stream().map(p -> {
//			RcvLinesDTO target = new RcvLinesDTO();
//			BeanUtils.copyProperties(p, target);
//			return target;
//		}).collect(Collectors.toList());
//		return collect;
//
//	}
//
//	private Restriction buildCondition(RcvLinesDTO rcvLinesDTO) {
//		// 构建查询条件
//		if (ObjectUtils.isNull(rcvLinesDTO))
//			return null;
//
//		String rcvHeaderId = rcvLinesDTO.getRcvHeaderId();
//		String asnHeaderId = rcvLinesDTO.getAsnHeaderId();
//		String itemId = rcvLinesDTO.getItemId();
//		String batchNum = rcvLinesDTO.getBatchNum();
//		String stockStatus = rcvLinesDTO.getStockStatus();
//
//		Restriction r0 = Restrictions.eq("enterpriseId", userUtils.getEnterpriseId());
//		Restriction r1 = StringUtils.isBlank(rcvHeaderId) ? null : Restrictions.eq("rcvHeaderId", rcvHeaderId);
//		Restriction r2 = StringUtils.isBlank(asnHeaderId) ? null : Restrictions.eq("asnHeaderId", asnHeaderId);
//		Restriction r3 = StringUtils.isBlank(itemId) ? null : Restrictions.eq("itemId", itemId);
//		Restriction r4 = StringUtils.isBlank(batchNum) ? null : Restrictions.like("batchNum", "%" + batchNum + "%"); // 批号模糊
//		Restriction r5 = StringUtils.isBlank(stockStatus) ? null : Restrictions.eq("rcvStockStatus", stockStatus);
//
//		return Restrictions.and(r0, r1, r2, r3, r4, r5);
//	}
//
//	@Override
//	@Transactional
//	public Object batchAdd(List<RcvLinesDTO> rcvLinesDTOList, String masterId, UserDTO userDTO, String mtlOwnerId,
//			String warehouseId) {
//		if (null == userDTO)
//			userDTO = userUtils.getUserDTO();
//		int i = 0;
//		boolean editFlag = Boolean.FALSE;
//		Date now = new Date();
//		// TODO 需要在这里远程查询商品服务 商品加货主 然后取商品的是否双人质检来保存
//		// 这里先使用模拟的默认字段z
//		Integer doubleCheckFlag = new Random().nextInt(2); // 随机0和1 单人0双人1
//		// 加入商品规格,助记码,批准文号
//
//// 		用code换id
//
////		Set<String> itemIds = rcvLinesDTOList.stream().distinct().map(RcvLinesDTO::getItemId)
////				.collect(Collectors.toSet());
////		ItemMstQueryVO itemVO = new ItemMstQueryVO();
////		itemVO.setItemIds(itemIds);
////		itemVO.setCargoOwnerId(mtlOwnerId);
////		RestMessage<Page<ItemMstVO>> page = baseItemRemoteCaller.getPage(itemVO);
////		RestMessage<Page<ItemMstVO2>> page = baseItemRemoteCaller.pagebyRelated(itemVO);
////		boolean success = page.isSuccess();
////		List<ItemMstVO> list = null;
////		if (success)
////			list = page.getData().getList();
////		AssertUtils.notNull(list, "远程商品数据查询失败!");
////		Map<String, List<ItemMstVO>> collect = Optional.ofNullable(list).orElse(Collections.emptyList()).stream()
////				.distinct().collect(Collectors.groupingBy(ItemMstVO::getItemId));
//		for (RcvLinesDTO rcvLinesDTO : rcvLinesDTOList) {
//			i++;
//			// 加入双人质检字段
////			String itemId = rcvLinesDTO.getItemId();
////			if (ObjectUtils.isNotNull(itemId)) {
////				List<ItemMstVO> list2 = collect.get(itemId);
////				if (ObjectUtils.isNotNull(list2)) {
////					Integer itemHealthIsDouble = list2.get(0).getItemHealthIsDouble();
////					rcvLinesDTO.setItemHealthIsDouble(itemHealthIsDouble);
////				}
////			}
//
//			// TODO 这里后期判断是否是更新或者更新
//			// 头表id
//			rcvLinesDTO.setRcvHeaderId(masterId);
//			// 构建默认字段
//			this.buildDefaultField(rcvLinesDTO, editFlag, userDTO);
//			// 校验基础数据
//			this.vaildateModel(rcvLinesDTO, editFlag, userDTO, i, validator, "保存的收货行操作");
//			RcvLines lines = new RcvLines();
//			BeanUtils.copyProperties(rcvLinesDTO, lines);
//			// 设置系统级字段
//			super.setBaseSysField(lines, editFlag, userDTO, now);
//			// 校验数据库重复
//			this.vaildateModelRepeated(lines, editFlag, userDTO);
//			lines.setMtlOwnerId(mtlOwnerId);
//			lines.setWarehouseId(warehouseId);
//			lines.setItemHealthIsDouble(doubleCheckFlag);
//			// 批号判断 为*或空增加当前时间100年
//			if (lines.getManufacturerBatchNum().equals("*") || "".equals(lines.getManufacturerBatchNum())) {
//				Date date = new Date();
//				Calendar cal = Calendar.getInstance();
//				cal.setTime(date);// 设置起时间
//				cal.add(Calendar.YEAR, 100);// 增加100年
//				Date time = cal.getTime();
//				lines.setBatchProductionDate(time);
//				lines.setBatchExpiredDate(time);
//			}
//			this.mapper.save(lines);
//			rcvLinesDTO.setRcvLineId(lines.getRcvLineId());
//			excuteSaveOthers(rcvLinesDTO, lines, userDTO, i);
//		}
//		// 根据结论退不同的任务池,可考虑是否异步
//		Map<String, List<RcvLinesDTO>> collect = Optional.ofNullable(rcvLinesDTOList).orElse(Collections.emptyList())
//				.stream().distinct().collect(Collectors.groupingBy(RcvLinesDTO::getStockStatus));
//		AssertUtils.notNull(collect, "收货行数据根据收货结论分组为空!");
//
//		RcvTypeStrategyEnum rcvTypeStrategyEnum = taskHelper.getRcvTypeStrategyEnum(masterId);
//		RqcStrategyEnum rqcStrategyEnum = taskHelper.getRqcStrategyEnum(masterId);
//
//		for (List<RcvLinesDTO> rcvLinesDTO : collect.values()) {
//
//			String rcvStockStatus = rcvLinesDTO.get(0).getStockStatus();
//			// 调用策略工厂来组织执行器执行任务
//			RcvSubjectFactory factory = new RcvSubjectFactoryS1Impl();
//			Map<String, Object> map = new HashedMap<>();
//			map.put("data", rcvLinesDTO);
//			map.put("mtlOwnerId", mtlOwnerId);
//			map.put("warehouseId", warehouseId);
//			ConclusionEnum conclusionEnum = taskHelper.getConclusionEnum(rcvStockStatus);
//			factory.excuteTask(map, handler, rcvTypeStrategyEnum, rqcStrategyEnum, conclusionEnum);
//		}
//		return true;
//	}
//
//	private void excuteSaveOthers(RcvLinesDTO rcvLinesDTO, RcvLines lines, UserDTO userDTO, int row) {
//		// 保存收货行其他属性
//		String rcvLineId = lines.getRcvLineId();
//		AssertUtils.isNotBlank(rcvLineId, "保存的收货行主键id为空(rcvLineId)!");
//		String rcvHeaderId = lines.getRcvHeaderId();
//		RcvLinesProfilesDTO rcvLinesProfilesDTO = rcvLinesDTO.getRcvLinesProfilesDTO();
//
//		if (ObjectUtils.isNotNull(rcvLinesProfilesDTO)) {
//			rcvLinesProfilesDTO.setRcvHeaderId(rcvHeaderId);
//			rcvLinesProfilesDTO.setRcvLineId(rcvLineId);
//			rcvLinesProfilesService.add(rcvLinesProfilesDTO, userDTO, row);
//		}
//	}
//
//	private void buildDefaultField(RcvLinesDTO rcvLinesDTO, boolean editFlag, UserDTO userDTO) {
//		// 构建基础默认字段
//		String batchId = rcvLinesDTO.getBatchId();
//		if (!editFlag && ObjectUtils.isNull(batchId)) {
//			rcvLinesDTO.setBatchId(String.valueOf(SnowFlakeUtils.getId()));
//		}
//		String executorUser = rcvLinesDTO.getExecutorUser();
//		String rcvStockStatus = rcvLinesDTO.getStockStatus();
//		if (ObjectUtils.isNull(executorUser))
//			rcvLinesDTO.setExecutorUser(userDTO.getUsername());
//		if (ObjectUtils.isNull(rcvStockStatus))
//			rcvLinesDTO.setStockStatus("0"); // 默认结论为收货成功
//	}
//
//	@Override
//	@Transactional
//	public Object batchAdd(List<RcvLinesDTO> rcvLinesDTOList) {
//		// TODO
//		UserDTO userDTO = userUtils.getUserDTO();
//		for (RcvLinesDTO rcvLinesDTO : rcvLinesDTOList) {
//			RcvLines rcvLines = new RcvLines();
//			BeanUtils.copyProperties(rcvLinesDTO, rcvLines);
//			this.vaildateModel(rcvLines, false, userDTO);
//			this.setBaseSysField(rcvLines, false, userDTO);
//			this.vaildateModelRepeated(rcvLines, false, userDTO);
//			this.mapper.save(rcvLines);
//		}
//		return "";
//	}
//
//	@Override
//	@Transactional
//	public Object batchEdit(List<RcvLinesDTO> rcvLinesDTOList) {
//		// TODO
//		UserDTO userDTO = userUtils.getUserDTO();
//		for (RcvLinesDTO rcvLinesDTO : rcvLinesDTOList) {
//			RcvLines rcvLines = new RcvLines();
//			BeanUtils.copyProperties(rcvLinesDTO, rcvLines);
//			this.vaildateModel(rcvLines, true, userDTO);
//			this.setBaseSysField(rcvLines, true, userDTO);
//			this.vaildateModelRepeated(rcvLines, true, userDTO);
//			this.mapper.updateWithValidate(rcvLines,
//					p -> ObjectUtils.isNotNull(p) && ObjectUtils.isNotNull(p.getValue()));
//		}
//		return true;
//	}
//
//	@Override
//	public List<RcvLinesDTO> findAll(RcvLinesDTO rcvLinesDTO) {
//		// TODO
//		Criteria criteria = Criteria.forClass(RcvLines.class);
//		RcvLinesDTO condition = rcvLinesDTO;
//		Restriction r = buildCondition(condition);
//		criteria.setRestriction(r);
//		Order order = Order.newInstance().desc("gmtModified");
//		criteria.setOrder(order);
//		List<RcvLines> list = this.mapper.findByCriteria(criteria);
//		List<RcvLinesDTO> collect = Optional.ofNullable(list).orElse(Collections.emptyList()).stream().map(p -> {
//			RcvLinesDTO target = new RcvLinesDTO();
//			BeanUtils.copyProperties(p, target);
//			return target;
//		}).collect(Collectors.toList());
//		return collect;
//	}
//
//	@Override
//	public RcvLinesDTO findByPkId(String pkId) {
//		AssertUtils.isNotBlank(pkId, "查询的主键id为空!");
//		// TODO
////		RcvLines rcvLines = this.findById(pkId);
////		AssertUtils.notNull(rcvLines, "model empty!");
////		RcvLinesDTO rcvLinesDTO = new RcvLinesDTO();
////		BeanUtils.copyProperties(rcvLines, rcvLinesDTO);
//		// 原生sql实现
//		return this.mapper.findByPkId(pkId);
//	}
//
//	private RcvLines findById(String id) {
//		return this.mapper.findById(id, RcvLines.class);
//	}
//
//	private void vaildateModel(RcvLines rcvLines, Boolean editFlag, UserDTO userDTO) {
//		if (!editFlag) {
//			// TODO add
//		} else {
//			// TODO
//		}
//	}
//
//	private void vaildateModelRepeated(RcvLines rcvLines, Boolean editFlag, UserDTO userDTO) {
//		if (!editFlag) {
//			// TODO add
//		} else {
//			// TODO
//		}
//	}
//
//	private boolean canEdit(String pkId) {
//		boolean flag = false;
//		RcvLines rcvLines = this.findById(pkId);
//		AssertUtils.notNull(rcvLines, "model empty!");
//		// TODO
//		if (true)
//			flag = true;
//		return flag;
//	}
//
//	@Override
//	public Object add(RcvLinesDTO rcvLinesDTO) {
//		// TODO vaildate
//		UserDTO userDTO = userUtils.getUserDTO();
//		RcvLines rcvLines = new RcvLines();
//		BeanUtils.copyProperties(rcvLinesDTO, rcvLines);
//		this.vaildateModel(rcvLines, false, userDTO);
//		this.setBaseSysField(rcvLines, userDTO);
//		this.vaildateModelRepeated(rcvLines, false, userDTO);
//		this.mapper.save(rcvLines);
//		return "";
//	}
//
//	@Override
//	public Object edit(String pkId, RcvLinesDTO rcvLinesDTO) {
//		// TODO
//		UserDTO userDTO = userUtils.getUserDTO();
//		RcvLines rcvLines = new RcvLines();
//		BeanUtils.copyProperties(rcvLinesDTO, rcvLines);
//		this.vaildateModel(rcvLines, true, userDTO);
//		this.setBaseSysField(rcvLines, true, userDTO);
//		this.vaildateModelRepeated(rcvLines, true, userDTO);
//		this.mapper.updateWithValidate(rcvLines, p -> ObjectUtils.isNotNull(p) && ObjectUtils.isNotNull(p.getValue()));
//		return "";
//	}
//
//	@Override
//	@Transactional
//	public Object delIds(List<String> pkIdList) {
//		// TODO
//		pkIdList.stream().filter(p -> canEdit(p)).forEach(p -> this.mapper.deleteById(p, RcvLines.class));
//		return "";
//	}
//
//	@Override
//	public Object deletePkId(String pkId) {
//		// TODO
//		if (canEdit(pkId))
//			throw new BizException("can not del");
//		this.mapper.deleteById(pkId, RcvLines.class);
//		return "";
//	}
//
//	@Resource
//	private Validator validator;
//
//	@Override
//	public Object batchAdd(List<RcvLinesDTO> rcvLinesDTOList, String masterId, UserDTO userDTO, String mtlOwnerId,
//			String warehouseId, Map<String, Object> flowparam) {
//		// TODO Auto-generated method stub
//		return null;
//	}
//
//}
