<?php
class Service_TakeStockProcess
{
	/**
	 * 盘点状态键值
	 * @author solar
	 * @return array
	 */
	public static function getStatusKV() {
		return array(
			1 => '一盘中',
			2 => '复盘中',
			3 => '确认中',
			4 => '已完成'
		);
	}
	
	/**
	 * 创建盘点单
	 * @author solar<solarzheng@cargofe.com.cn>
	 * @param int $warehouse_id
	 * @param array $users
	 * @param array $ib_ids
	 * @return boolean
	 */
    /* public static function createTakeStock($warehouse_id, $users, $ib_ids) {
    	$users = array_unique($users);
    	$ib_ids = array_unique($ib_ids);
    	$ts_code = Common_GetNumbers::getCode('','','PD');
    	$db = Common_Common::getAdapter();
    	$db->beginTransaction();
    	try{
    		$num = ceil(count($ib_ids)/count($users));
    		$i = 0;
    		$user_id = current($users);
    		foreach($ib_ids as $ib_id) {
    			++$i;
    			if($i>$num) { $i = 0; $user_id = next($users); }
    			$aInventoryBatch = Service_InventoryBatch::getByField($ib_id);
    			if(empty($aInventoryBatch)) throw new Exception('参数错误');
    			if($aInventoryBatch['warehouse_id'] != $warehouse_id) {
    				throw new Exception('货架仓库不一致');
    			}
    			//盘点行
    			$itemRow['ts_code'] = $ts_code;
    			$itemRow['customer_code'] = '';
    			$itemRow['lc_code'] = $aInventoryBatch['lc_code'];
    			$itemRow['product_barcode'] = $aInventoryBatch['product_barcode'];
    			$itemRow['product_id'] = $aInventoryBatch['product_id'];
    			$itemRow['tsi_current_quantity'] = $aInventoryBatch['ib_quantity'];
    			Service_TakeStockItem::add($itemRow);
    			//分配盘点人
    			$assignmentRow['ts_code'] = $ts_code;
    			$assignmentRow['tsi_id'] = $user_id;
    			$assignmentRow['user_id'] = $user_id;
    			$assignmentRow['tsa_add_time'] = date('Y-m-d H:i:s');
    			Service_TakeStockAssignment::add($assignmentRow);
    		}
    		$aTakeStock['ts_code'] = $ts_code;
    		$aTakeStock['warehouse_id'] = $warehouse_id;
    		$aTakeStock['user_id'] = Service_User::getUserId();
    		$aTakeStock['ts_add_time'] = date('Y-m-d H:i:s');
    		Service_TakeStock::add($aTakeStock);
    		
    		$db->commit();
    	} catch (Exception $e) {
    		$db->rollback();
    		return false;
    	}
    	return true;
    } */
	
	/**
	 * 创建盘点单
	 * @author solar
	 * @param int $warehouse_id
	 * @param int $user_id
	 * @param array $ib_ids
	 * @param mix $is_product
	 * @param mix $is_quantity
	 * @return true|string
	 */
    /* public static function createTakeStock($warehouse_id, $user_id, $ib_ids, $is_product, $is_quantity) {
    	$ib_ids = array_unique($ib_ids);
    	$ts_code = Common_GetNumbers::getCode('','','PD');
    	$db = Common_Common::getAdapter();
    	$db->beginTransaction();
    	try {
    		$list = Service_InventoryBatch::getTakeStockAll($ib_ids);
    		if(empty($list)) throw new Exception('找不到盘点记录');
    		foreach($list as $row) {
    			if($row['warehouse_id'] != $warehouse_id) {
    				throw new Exception('货架仓库不一致');
    			}
    			if($row['ib_hold_status']!=0) {
    				throw new Exception('货架号['.$row['lc_code'].']产品代码['.$row['product_barcode'].']不是无锁状态，不能盘点');
    			}
    			//盘点行
    			$itemRow['ts_code'] = $ts_code;
    			$itemRow['customer_code'] = $row['customer_code'];
    			$itemRow['lc_code'] = $row['lc_code'];
    			$itemRow['product_barcode'] = $row['product_barcode'];
    			$itemRow['product_id'] = $row['product_id'];
    			$itemRow['tsi_current_quantity'] = $row['ib_quantity'];
    			$tsi_id = Service_TakeStockItem::add($itemRow);
    			//分配盘点人
    			$assignmentRow['ts_code'] = $ts_code;
    			$assignmentRow['tsi_id'] = $tsi_id;
    			$assignmentRow['user_id'] = $user_id;
    			$assignmentRow['tsa_add_time'] = date('Y-m-d H:i:s');
    			Service_TakeStockAssignment::add($assignmentRow);
    		}
    		$aTakeStock['ts_code'] = $ts_code;
    		$aTakeStock['warehouse_id'] = $warehouse_id;
    		$aTakeStock['user_id'] = Service_User::getUserId();
    		$aTakeStock['ts_add_time'] = date('Y-m-d H:i:s');
    		if($is_product) $aTakeStock['ts_is_product'] = 1;
    		if($is_quantity) $aTakeStock['ts_is_quantity'] = 1;
    		Service_TakeStock::add($aTakeStock);
    
    		$db->commit();
    	} catch (Exception $e) {
    		$db->rollback();
    		return false;
    	}
    	return true;
    } */
    public static function createTakeStock($warehouse_id, $user_id, $lcodes, $pcodes, $is_product, $is_quantity) {    	
    	if(count($lcodes) != count($pcodes)) return '参数错误';
    	$ts_code = Common_GetNumbers::getCode('','','PD');
    	$db = Common_Common::getAdapter();
    	$db->beginTransaction();
    	try {
    		foreach($lcodes as $i=>$lc_code) {
    			$ibList = Service_InventoryBatch::listByWhere(array('warehouse_id'=>$warehouse_id, 'lc_code'=>$lc_code, 'product_barcode'=>$pcodes[$i]));
    			$isBreak = false;
    			$itemRow = $ib_ids = array();
    			foreach($ibList as $ibRow) {
    				if($ibRow['warehouse_id'] != $warehouse_id || $ibRow['ib_status']==0 || $ibRow['ib_hold_status']!=0) {
    					$isBreak = true;
    					break;
    				}
    				if(empty($itemRow)) {
    					$itemRow['ts_code'] = $ts_code;
    					$itemRow['customer_code'] = $ibRow['customer_code'];
    					$itemRow['lc_code'] = $ibRow['lc_code'];
    					$itemRow['product_barcode'] = $ibRow['product_barcode'];
    					$itemRow['product_id'] = $ibRow['product_id'];
    					$itemRow['tsi_current_quantity'] = $ibRow['ib_quantity'];
    				} else $itemRow['tsi_current_quantity'] += $ibRow['ib_quantity'];
    				$ib_ids[] = $ibRow['ib_id'];
    			}
    			if($isBreak == true) continue;
    			//盘点行
    			$tsi_id = Service_TakeStockItem::add($itemRow);
    			//分配盘点人
    			$assignmentRow['ts_code'] = $ts_code;
    			$assignmentRow['tsi_id'] = $tsi_id;
    			$assignmentRow['user_id'] = $user_id;
    			$assignmentRow['tsa_add_time'] = date('Y-m-d H:i:s');
    			Service_TakeStockAssignment::add($assignmentRow);
    			foreach($ib_ids as $ib_id) Service_InventoryBatch::update(array('ib_hold_status'=>1), $ib_id);
    		}
    		$aTakeStock['ts_code'] = $ts_code;
    		$aTakeStock['warehouse_id'] = $warehouse_id;
    		$aTakeStock['user_id'] = Service_User::getUserId();
    		$aTakeStock['ts_add_time'] = date('Y-m-d H:i:s');
    		if($is_product) $aTakeStock['ts_is_product'] = 1;
    		if($is_quantity) $aTakeStock['ts_is_quantity'] = 1;
    		Service_TakeStock::add($aTakeStock);
    		//提交
    		$db->commit();
    	} catch (Exception $e) {
    		$db->rollback();
    		return false;
    	}
    	return true;
    }
    
    /**
     * 首次盘点
     * @author solar
     * @param array $aTakeStock
     * @param array $tsi_ids
     * @param array $quantitys
     * @return true|string
     */
    public static function firstTakeStock($aTakeStock, $tsi_ids, $quantitys) {
    	$ts_code = $aTakeStock['ts_code'];
    	$itemList = Service_TakeStockItem::listWithAssignment($tsi_ids);
    	if(empty($itemList)) return '盘点单['.$ts_code.']的盘点项为空';
    	$db = Common_Common::getAdapter();
    	$db->beginTransaction();
    	try {
    		$stat = 0;
    		$lcodes = $pcodes = array();
    		foreach($itemList as $k=>$item) {
    			if($item['ts_code'] != $ts_code) throw new Exception('盘点项['.$item['tsi_id'].']不属于盘点单'.$ts_code);
    			$quantity = trim($quantitys[$k]);
    			if($quantity === '') throw new Exception('请填完盘点结果再提交表单');
    			if(!preg_match("/^\d+$/", $quantity)) throw new Exception('盘点数量必须是数字');
    			$quantity = intval($quantity);
    			Service_TakeStockAssignment::update(array('tsa_quantity'=>$quantity), $item['tsa_id']);
    			if(intval($item['tsi_current_quantity'])===$quantity) {
    				Service_TakeStockItem::update(array('tsi_quantity'=>$quantity), $item['tsi_id']);
    				$lcodes[] = $item['lc_code'];
    				$pcodes[] = $item['product_barcode'];
    			} else {    				
    				//添加复盘记录
    				$second['ts_code'] = $item['ts_code'];
    				$second['tsi_id'] = $item['tsi_id'];
    				$second['user_id'] = 0;
    				$second['tsa_type'] = 2;
    				$second['tsa_add_time'] = date('Y-m-d H:i:s');
    				Service_TakeStockAssignment::add($second);
    				++$stat;
    			}
    		}
    		if($stat > 0) $uTakeStock['ts_status'] = 2;
    		else {
    			$uTakeStock['ts_status'] = 4;
    			
    			foreach($lcodes as $i=>$lc_code) {
    				$ibList = Service_InventoryBatch::listByWhere(array('warehouse_id'=>$aTakeStock['warehouse_id'], 'lc_code'=>$lc_code, 'product_barcode'=>$pcodes[$i]));
    				foreach($ibList as $ibRow) {
    					Service_InventoryBatch::update(array('ib_hold_status'=>0), $ibRow['ib_id']);
    				}
    			}
    		}
    		$uTakeStock['ts_last_update_user_id'] = Service_User::getUserId();
    		$uTakeStock['ts_update_time'] = date('Y-m-d H:i:s');
    		Service_TakeStock::update($uTakeStock, $aTakeStock['ts_id']);
    		//提交
    		$db->commit();
    	} catch(Exception $e) {
    		$db->rollback();
    		return $e->getMessage();
    	}
    	return true;
    }
    
    /**
     * 复盘
     * @author solar
     * @param array $aTakeStock
     * @param array $tsi_ids
     * @param array $quantitys
     * @return true|string
     */
    public static function secondTakeStock($aTakeStock, $tsi_ids, $quantitys) {
    	$ts_code = $aTakeStock['ts_code'];
    	$itemList = Service_TakeStockAssignment::listSecondItem($ts_code);
    	if(empty($itemList)) return '盘点单['.$ts_code.']的盘点项为空';
    	$db = Common_Common::getAdapter();
    	$db->beginTransaction();
    	try {
    		foreach($itemList as $k=>$item) {
    			if($item['ts_code'] != $ts_code) throw new Exception('盘点项['.$item['tsi_id'].']不属于盘点单'.$ts_code);
    			$quantity = trim($quantitys[$k]);
    			if($quantity === '') throw new Exception('请填完盘点结果再提交表单');
    			if(!preg_match("/^\d+$/", $quantity)) throw new Exception('盘点数量必须是数字');
    			$quantity = intval($quantity);
    			$uAssignment['tsa_quantity'] = $quantity;
    			$uAssignment['user_id'] = Service_User::getUserId();
    			Service_TakeStockAssignment::update($uAssignment, $item['tsa_id']);
    			Service_TakeStockItem::update(array('tsi_status'=>1), $item['tsi_id']);
    		}
    		$uTakeStock['ts_status'] = 3;
    		$uTakeStock['ts_last_update_user_id'] = Service_User::getUserId();
    		$uTakeStock['ts_update_time'] = date('Y-m-d H:i:s');
    		Service_TakeStock::update($uTakeStock, $aTakeStock['ts_id']);
    		//提交
    		$db->commit();
    	} catch(Exception $e) {
    		$db->rollback();
    		return $e->getMessage();
    	}
    	return true;
    }
    
    /**
     * 确认库存
     * @author solar
     * @param array $aTakeStockItem
     * @param int $quantity
     * @param string $reason
     * @return true|string
     */
    public static function confirm($aTakeStockItem, $quantity, $reason) {
    	if($quantity < 0) return '修改的库存不能小于0';
    	
    	if($aTakeStockItem['tsi_status']!=1) return '盘点行不是待确认状态';
    	$aTakeStock = Service_TakeStock::getByField($aTakeStockItem['ts_code'], 'ts_code');
    	if(empty($aTakeStock) || $aTakeStock['ts_status']!=3) return '盘点单不是确认中的状态';
    	//修改
    	$db = Common_Common::getAdapter();
    	$db->beginTransaction();
    	try {
    		//调整库存
    		$piProcess = new Service_ProductInventoryProcess();
    		$result = $piProcess->changeSellable($aTakeStock['warehouse_id'], $aTakeStockItem['lc_code'], $aTakeStockItem['product_id'], $quantity, '仓库盘点', $aTakeStock['ts_code']);
    		if($result !== true) throw new Exception($result);
    		$uItem['tsi_quantity'] = $quantity;
    		$uItem['tsi_note'] = $reason;
    		$uItem['tsi_status'] = 2;
    		Service_TakeStockItem::update($uItem, $aTakeStockItem['tsi_id']);
    		//提交
    		$db->commit();
    	} catch(Exception $e) {
    		$db->rollback();
    		return $e->getMessage();
    	}
    	return true;
    }
    
    /**
     * 完成盘点单
     * @author solar
     * @param string $ts_code
     * @return boolean
     */
    public static function complete($ts_code) {
    	$aTakeStock = Service_TakeStock::getByField($ts_code, 'ts_code');
    	if($aTakeStock['ts_status'] != 3) return '盘点单不是确认中的状态';
    	$num = Service_TakeStockItem::countConfirming($ts_code);
    	if($num > 0) return true;
    	$itemList = Service_TakeStockItem::getList($ts_code);
    	$db = Common_Common::getAdapter();
    	$db->beginTransaction();
    	try {
    		foreach($itemList as $item) {
    			$field = array(
    				'warehouse_id'=>$aTakeStock['warehouse_id'],
    				'lc_code'=>$item['lc_code'],
    				'product_barcode'=>$item['product_barcode']
    			);
    			Service_InventoryBatch::updateByField(array('ib_hold_status'=>0), $field);
    		}
    		$uTakeStock['ts_status'] = 4;
    		$uTakeStock['ts_last_update_user_id'] = Service_User::getUserId();
    		$uTakeStock['ts_update_time'] = date('Y-m-d H:i:s');
    		Service_TakeStock::update($uTakeStock, $aTakeStock['ts_id']);
    		//提交
    		$db->commit();
    	} catch(Exception $e) {
    		$db->rollback();
    		return $e->getMessage();
    	}
    	return true;
    }
    
}
