package com.dev.swms.server.service.count;

import java.util.List;
import java.util.Map;

import org.springframework.transaction.annotation.Transactional;

import com.dev.swms.server.model.count.CountPlan;
import com.dev.swms.server.model.count.CountRecord;
import com.dev.swms.server.model.count.CreatCountPlanPackage;
import com.dev.energy.client.ui.table.RowData;
import com.dev.energy.server.service.BaseManager;

@Transactional(readOnly = false)
public interface CountPlanManager extends BaseManager {
	/**
	 * 激活盘点计划
	 * 允许激活打开状态的盘点计划，根据盘点计划明细生成盘点记录表
	 * @param countPlanId 盘点计划ID
	 */
	@Transactional
	public void active(RowData rowData);
	
	/**
	 * 取消激活盘点计划
	 * 删除盘点计划对应的盘点记录表，修改盘点计划状态为未激活状态
	 * 如果盘点记录表中的实盘数量大于0，则不能取消激活盘点计划
	 * @param countPlanId
	 */
	@Transactional
	public void inactive(RowData rowData);
	
	/**
	 * 取消盘点计划
	 * 取消未激活的盘点计划
	 * @param countPlanId 待取消盘点计划IDD
	 */
	@Transactional
	public void cancel(RowData rowData);

	/**
	 * 关闭已激活的盘点计划
	 * @param countPlanId 待关闭盘点计划IDD
	 */
	@Transactional
	public void close(RowData rowData);
	
	/**
	 * 删除盘点计划
	 * 删除未激活的盘点计划
	 * @param countPlanId 待删除盘点计划IDD
	 */
	@Transactional
	public void delete(RowData rowData);
	
	/**
	 * 实盘数据录入
	 * 根据实盘记录查找盘点记录中是否存在，如存在，则修改其deltaQuantity；否则新增盘点记录
	 * 主键相同的盘点记录可多次输入，每次输入时自动修改对应的deltaQuantity
	 * 实盘录入时要校验对应的countReocrd的盘点数量不能小于0；
	 * @param countPlanId 盘点计划ID
	 * @param countRecord 实际盘点记录
	 */
	@Transactional
	public void record(Long countPlanId, CountRecord countRecord);

	/**
	 * 记录盘点数量
	 * @param countPlanId  盘点计划ID
	 */
	@Transactional
	public void adjust(Long countPlanId, Map records);
	
	/**
	 * 盘点计划差异调整
	 * 根据盘点计划对应盘点表中的差异进行差异调整，修改库存数量并在虚拟盈亏库位上记录差异数量
	 * @param countPlanId 待调整盘点计划
	 */
	@Transactional
	public void adjust(Long countPlanId);

	/**
	 * 新增盘点明细－库位
	 * @param countPlanId 盘点计划ID
	 * @param locationIds 盘点库位ID集合
	 */
	@Transactional
	void addDetailLocations(Long countPlanId, List<Long> locationIds);
	
	/**
	 * 新增盘点明细－货主
	 * @param countPlanId 盘点计划ID
	 * @param companyIds 货主ID集合
	 */
	@Transactional
	void addDetailCompanys(Long countPlanId, List<Long> companyIds);
	
	/**
	 * 新增盘点明细－货品
	 * @param countPlanId 盘点计划ID
	 * @param itemIds 盘点库位ID集合
	 */
	@Transactional
	void addDetailItems(Long countPlanId, List<Long> itemIds);
	
	/**
	 * 删除盘点明细
	 * @param countPlanId 盘点计划ID
	 * @param countDetailIds 盘点明细ID集合
	 */
	@Transactional
	void deleteDetails(Long countPlanId, List<Long> countDetailIds);

	/**
	 * 保存盘点计划
	 * @param countPlan 
	 */
	@Transactional
	void storeCountPlan(CountPlan countPlan);

	/**
	 * 新的盘点算法
	 * @param companyId
	 * @param toCountLocsCounts
	 */
	@Transactional
	void newStoreCountPlan(CreatCountPlanPackage ccpp);

	/**
	 * 根据货主提取待盘点库位数
	 * @param map
	 * @return
	 */
	String getUnCountLocationsByCompany(Map map);
	
	boolean isExistCount(Long userId);
	
	@Transactional
	void backCounts(List<Long> counts);
	
	
	@Transactional
	boolean createCountRecord(Map<String,Object> values);
}