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

import java.io.File;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.springframework.transaction.annotation.Transactional;

import com.dev.swms.server.model.abstractEntity.AutoProduction;
import com.dev.swms.server.model.abstractEntity.BigItem;
import com.dev.swms.server.model.abstractEntity.BomAccount;
import com.dev.swms.server.model.abstractEntity.BomList;
import com.dev.swms.server.model.abstractEntity.ItemList;
import com.dev.swms.server.model.abstractEntity.ModelPlan;
import com.dev.swms.server.model.abstractEntity.Pinfan;
import com.dev.swms.server.model.abstractEntity.PlanAssembly;
import com.dev.swms.server.model.abstractEntity.ProduceMonthPlan;
import com.dev.swms.server.model.abstractEntity.ProductionPlan;
import com.dev.swms.server.model.base.BOMComponent;
import com.dev.swms.server.model.base.Item;
import com.dev.swms.server.model.base.ItemKey;
import com.dev.swms.server.model.base.ItemRelation;
import com.dev.swms.server.model.base.LotInfo;
import com.dev.swms.server.model.base.NewLotInfo;
import com.dev.swms.server.model.base.PackageUnit;
import com.dev.energy.server.service.BaseManager;

@Transactional(readOnly = true)
public interface ItemManager extends BaseManager {
	/**
	 * 根据传入的参数创建或修改商品资料，并自动创建或修改商品的最小包装单位
	 * @param item 待保存商品
	 * @param packageUnit 待保存商品的最小包装单位
	 */
	@Transactional
	void storeItem(Item item) throws Exception;
	@Transactional
	void storePinfan(Pinfan pinfan,String locCode);
	@Transactional
	void storeItemRelation(ItemRelation ir);
	@Transactional
    void autoItem();
	@Transactional
    void autoAsn();
	@Transactional
	void returnAsn(List<Long> ids);
	@Transactional
	void addComponents(Long BOMId,BOMComponent component);
	
	@Transactional
	void deleteComponents(Long BOMId,List<Long> ids);

	@Transactional
	void queryBOM(Long BOMId,double quantity);

	/**
	 * 增加或修改商品包装单位
	 * @param itemId 待增加包装的商品ID
	 * @param packageUnit 待增加或修改的商品包装
	 */
	@Transactional
	void addPackageUnit(Long itemId, PackageUnit packageUnit);
	
	/**
	 * 删除商品包装单位
	 * 商品最小包装单位和已使用的商品包装单位不允许删除
	 * @param itemId 待移除包装的商品ID
	 * @param packageUnitIds 待删除的商品包装ID集合
	 */
	@Transactional
	void removePackageUnit(Long itemId, List<Long> packageUnitIds);

	/**
	 * 供前台调用，用于获取指定商品的最小包装单位
	 * @param map
	 * @return 商品最小包装单位
	 */
	String getSmallestPackageUnit(Map map);

	/**
	 * 删除商品
	 * 库存日志和收发货单明细中有记录的商品不允许删除
	 * @param itemIds　待删除商品的ＩＤ集合
	 */
	@Transactional
	void deleteAll(List<Long> itemIds);
	
	/**
	 * 恢复商品
	 * @param itemIds
	 */
	@Transactional
	void activeItem(List<Long> itemIds);
	
	@Transactional
	void inActionPinfan(List<Long> pfIds);
	
	/**
	 * 恢复品番关联
	 * @param itemIds
	 */
	@Transactional
	void activePinfan(List<Long> pfIds);
	
	/**
	 * 创建itemKey信息
	 */
	
	@Transactional
	ItemKey getItemKey(ItemKey itemKey, Boolean verifyLot,String soi);
/**
 * 库存货主转换
 * @param itemKey
 * @param receiveDate
 * @param soi
 * @param itemB：目标货品
 * @return
 */
	@Transactional
	ItemKey getItemKeyForCompanyTrans(ItemKey itemKey, Date receiveDate, String soi, Item itemB);

	/**
	 * 对lotInfo进行格式化处理
	 * @param lotInfo
	 */
	@Transactional
	public void formatLotInfo(Item item, LotInfo lotInfo, Boolean verifyLot);
	
	/**
	 * 移除关联供应商
	 * @param orgIds
	 * @param itemId
	 */
	@Transactional
	void delSuppliers(List<Long> orgIds, Long itemId);
	
	/**
	 * 添加关联供应商
	 * @param orgIds
	 * @param itemId
	 */
	@Transactional
	void addSuppliers(List<Long> orgIds, Long itemId);

	/**
	 * 获取货品对应批次规则开关（供eventListener调用）
	 * @param itemId
	 * @return
	 */
	List<Boolean> getLotRuleTackers(Long itemId);
	
	/**
	 * 根据页面信息获取货品批次规则（供initListener调用）
	 * @param map
	 * @return
	 */
	List<Boolean> getLotRuleTackersByPageMap(Map map);
	@Transactional
	void formatNewLotInfo(NewLotInfo lotInfo);
	
	@Transactional
	void addItemKey(ItemKey key);
	@Transactional
	void importItem(File file);
	@Transactional
	void importItem2(File file);
	
	/**
	 * 获取离过期天数
	 * @param map
	 */
	@Transactional
	 String getLeaveDueDay(Map map) throws Exception;
	
	/**
	 * @author  dev
	 * 删除回单影像
	 */
	@Transactional
	void deleteSignFile(List<Long> ids);
	
	@Transactional
	void packChange(Item item);
	
	@Transactional
	void importPinfan(File file,String type);
	@Transactional
	void importPinfanSx(File file);
	/**
	 * 常备预备导入
	 * @param file
	 */
	@Transactional
	void importCbYb (File file);
	@Transactional
	void storeBomList(BomList bl);
	@Transactional
	void importBomList(File file);
	@Transactional
	void importBigItem(File file);
	@Transactional
	void storeBomAccount(BomAccount bl,String zzkw,String hckw);
	@Transactional
	void importBomAccount(File file);
	@Transactional
	void  importBomAccountLoc(File file);
	@Transactional
	void storeProductionPlan(ProductionPlan p,Long id);
	@Transactional
	void storeModelPlan(ModelPlan m,Long id);
	@Transactional
	void storeProduceMonthPlan(ProduceMonthPlan pm);
	@Transactional
	void deleteItemRelation(List<Long> ids);
	@Transactional
	void deleteBomAccount(List<Long> ids);
	@Transactional
	void deleteBomList(List<Long> ids);
	@Transactional
	void deletePinfan(List<Long> ids);
	@Transactional
	void storeBigItem(BigItem bi);
	@Transactional
	void deleteBigItem(List<Long> ids);
	@Transactional
	void importProduceMonthPlan(File file,String type);
	@Transactional
	void storePlanAssembly(PlanAssembly p);
	@Transactional
	void storeAutoProduction(AutoProduction p);
	@Transactional
	void deleteAutoProduction(List<Long> ids);
	//导入拖拉机计划
	@Transactional
	void importProductionPlan(File file,String type);
	@Transactional
	void importModelPlan(File file,String type);
	@Transactional
	void storeItemList(ItemList itemList);
	@Transactional
	void deleteItemList(List<Long> ids);
	@Transactional
	void importItemListn(File file,String type);
	@Transactional
	void importModelChagePage(File file,String type);
	
	/**获取吊装数据*/
	@Transactional
	String getDzData(Date date);
	/**获取下线数据*/
	@Transactional
	String getXxData(Date date);
	
	@Transactional
	void createData(String type ,Date date);
	//查询数据
	List<Object[]> queryData(String type ,String query_date);
}
