<?php
class Shipment_PickingController extends Ec_Controller_Action
{
    public function preDispatch()
    {
        $this->tplDirectory = "shipment/views/pickup/";
        $this->serviceClass = new Service_Picking();
    }

    public function listAction()
    {
        $wh = Common_DataCache::getWarehouseSimple();
        if ($this->_request->isPost()) {
            $page = $this->_request->getParam('page', 1);
            $pageSize = $this->_request->getParam('pageSize', 20);

            $page = $page ? $page : 1;
            $pageSize = $pageSize ? $pageSize : 20;

            $return = array(
                "state" => 0,
                "message" => "No Data"
            );

            $params = $this->_request->getParams();

            $condition = $this->serviceClass->getMatchFields($params);
            
            if('' !== trim($params['order_code'])){
                //凭订单号去picking_detail表匹配配货单号
                $pickingDetail = Service_PickingDetail::getByField(trim($params['order_code']),'order_code');
            
                //进入到$pickingDetail
                if($pickingDetail){
                    //配货单空，用订单号搜索
                    if('' === trim($condition['picking_code'])) {
                        $condition['picking_code'] = $pickingDetail['picking_code'];
                    }
                    elseif (trim($condition['picking_code']) !== $pickingDetail['picking_code']){
                        //配货单不匹配订单号,__NONE_PICKING_CODE_FIND__
                        $condition['picking_code'] = '__NONE_PICKING_CODE_FIND__';
                    }
                }
                else {
                    //空订单号，无配货单匹配
                    $condition['picking_code'] = '__NONE_PICKING_CODE_FIND__';
                }
            }
            
            $condition['dateFor'] = isset($params['dateFor'])?$params['dateFor']:'';
            $condition['dateTo'] = isset($params['dateTo'])?$params['dateTo']:'';
            if(!empty($condition['dateFor'])){
                $condition['dateFor']=date('Y-m-d H:i:s',strtotime($condition['dateFor'].' 00:00:00'));
            }
            if(!empty($condition['dateTo'])){
                $condition['dateTo']=date('Y-m-d H:i:s',strtotime($condition['dateTo'].' 23:59:59'));
            }
            $condition['picking_model'] = "0";
            $count = $this->serviceClass->getLeftJoinUserByCondition($condition, 'count(*)');
            $return['total'] = $count;

            if ($count) {
                $showFields = array(

                    'warehouse_id',
                    'picking_code',
                    'picker_id',
                    'creater_id',
                    'picking_order_cnt',
                    'picking_lc_cnt',
                    'picking_item_cnt',
                    'picking_status',
                    'is_assign',
                    'picking_type',
                    'picking_add_time',
                    'picking_update_time',
                    'picking_id',
                );
                $showFields = $this->serviceClass->getFieldsAlias($showFields);
                $rows = $this->serviceClass->getLeftJoinUserByCondition($condition, $showFields, $pageSize, $page, array('picking_id desc'));
                $return['data'] = $rows;
                $return['state'] = 1;
                $return['warehouse'] = $wh;
                $return['pickStatus'] = Common_Status::pickStatus('auto');
                $return['pickType'] = Common_Type::pickType('auto');
                $return['pickAssign'] = Common_Type::pickAssign('auto');
                $return['message'] = "";
            }
            die(Zend_Json::encode($return));
        }
        echo Ec::renderTpl($this->tplDirectory . "picking_index.tpl", 'layout');
    }

    public function editAction()
    {
        $return = array(
            'state' => 0,
            'message' => '',
            'errorMessage' => array('Fail.')
        );

        if ($this->_request->isPost()) {
            $params = $this->_request->getParams();
            $row = array(

                'picking_id' => '',
                'warehouse_id' => '',
                'picking_code' => '',
                'picker_id' => '',
                'creater_id' => '',
                'picking_order_cnt' => '',
                'picking_lc_cnt' => '',
                'picking_item_cnt' => '',
                'picking_status' => '',
                'is_assign' => '',
                'picking_type' => '',
                'picking_add_time' => '',
                'picking_update_time' => '',
            );
            $row = $this->serviceClass->getMatchEditFields($params, $row);
            $paramId = $row['picking_id'];
            if (!empty($row['picking_id'])) {
                unset($row['picking_id']);
            }
            $errorArr = $this->serviceClass->validator($row);

            if (!empty($errorArr)) {
                $return = array(
                    'state' => 0,
                    'message' => '',
                    'errorMessage' => $errorArr
                );
                die(Zend_Json::encode($return));
            }

            if (!empty($paramId)) {
                $result = $this->serviceClass->update($row, $paramId);
            } else {
                $result = $this->serviceClass->add($row);
            }
            if ($result) {
                $return['state'] = 1;
                $return['message'] = array('Success.');
            }

        }
        die(Zend_Json::encode($return));
    }

    public function getByJsonAction()
    {
        $result = array('state' => 0, 'message' => 'Fail', 'data' => array());
        $paramId = $this->_request->getParam('paramId', '');
        if (!empty($paramId) && $rows = $this->serviceClass->getByField($paramId, 'picking_id')) {
            $rows = $this->serviceClass->getVirtualFields($rows);
            $result = array('state' => 1, 'message' => '', 'data' => $rows);
        }
        die(Zend_Json::encode($result));
    }

    /**
     * @desc 获取配货员名单
     * @return  Json array
     */
    public function getPickerAction()
    {
        $result = array('state' => 0, 'message' => 'Fail,No data.', 'data' => array());
        if ($this->_request->isPost()) {
            $userWarehouse = isset($this->_userAuth->warehouseId) ? $this->_userAuth->warehouseId : '';
            //配货员
            $configRow = Service_Config::getByField('PICKPOSITIONID', 'config_attribute');
            $pickPositionId = isset($configRow['config_value']) ? $configRow['config_value'] : '';
            $rows = Service_User::getByCondition(array('user_status' => 1, 'warehouse_id' => $userWarehouse, 'up_id' => $pickPositionId), array('user_id', 'user_name', 'user_name_en'));
            if (!empty($rows)) {
                $result = array('state' => 1, 'message' => '', 'data' => $rows);
            } else {
                $result['message'] = '请添加配货员.';
            }
        }
        die(Zend_Json::encode($result));
    }


    /**
     * @desc 绑定配货员
     * @return  Json array
     */
    public function bindPickerAction()
    {
        $result = array('state' => 0, 'message' => array());
        if ($this->_request->isPost()) {
            $pickCodes = $this->_request->getParam('pickCodes');
            $pickerId = $this->_request->getParam('pickerId', '');
            $errorArr = array();
            if (empty($pickerId)) {
                $errorArr[] = '请选择配货员.';
            }
            if (!is_array($pickCodes) || count($pickCodes) == '0') {
                $errorArr[] = '请选择配货单.';
            }
            if (!empty($errorArr)) {
                $result['message'] = $errorArr;
            } else {
                $obj = new Service_PickProcess();
                $return = $obj->bindPickerTransaction($pickCodes, $pickerId);
                if (isset($return['state']) && $return['state'] == '1') {
                    $result = array('state' => 1, 'message' => $return['message']);
                } else {
                    $result['message'][] = 'Internal error.500';
                }
            }
        }
        die(Zend_Json::encode($result));
    }


    /**
     * @desc 确认下架单
     * @return  Json array
     */
    public function confirmPickAction()
    {
        $result = array('state' => 0, 'message' => array());
        if ($this->_request->isPost()) {
            $pickCodes = $this->_request->getParam('pickCodes');
            if (!is_array($pickCodes) || count($pickCodes) == '0') {
                $errorArr[] = '请选择配货单.';
            }
            if (!empty($errorArr)) {
                $result['message'] = $errorArr;
            } else {
                $obj = new Service_PickProcess();
                $return = $obj->confirmPickerTransaction($pickCodes);
                if (isset($return['state']) && $return['state'] == '1') {
                    $result = array('state' => 1, 'message' => $return['message']);
                    if(isset($return['qcCodeArr'])){
                        $result['qcCodeArr'] = $return['qcCodeArr'];
                    }
                } else {
                    $result['message'][] = 'Internal error.500';
                }
            }
        }
        die(Zend_Json::encode($result));
    }

    /**
     * @desc 打印配货单
     * @return  Json array
     */
    public function printPickingAction()
    {
        $errorArr = $result = array();
        $pickCodes = $this->_request->getParam('pickCodes');
        $pickType = $this->_request->getParam('pickType', '');
        $tpl = '';
        if (empty($pickType)) {
            die('pickType Err');
        }
        if (!is_array($pickCodes) || count($pickCodes) == '0') {
            $errorArr[] = '请选择配货单.';
        } else {
            if ($pickType == 'more') {
                $tpl = "print_picking.tpl";
                $pickRow = Service_Picking::getByField($pickCodes[0],"picking_code","*");
                if($pickRow['picking_model']=="1"){
                    $this->view->picking_model = $pickRow['picking_model'];
                    $tpl = "print_picking_sw.tpl";
                }
                foreach ($pickCodes as $pickCode) {
                    $return = Service_PickProcess::getPacking($pickCode);
                    if ($return['state'] == '1') {
                        $result[] = $return['data'];
                    } else {
                        $errorArr = $return['message'];
                    }
                }
            } else {
                $tpl = "print_down_goods_shelves.tpl";
                foreach ($pickCodes as $pickCode) {
                    $return = Service_PickProcess::downGoodsShelves($pickCode);
                    if ($return['state'] == '1') {
                        $result[] = $return['data'];
                    } else {
                        $errorArr = $return['message'];
                    }
                }
            }
        }
        $this->view->error = $errorArr;
        $this->view->result = $result;
        echo Ec::renderTpl($this->tplDirectory . $tpl, 'layout');
    }
	/**
	 * @todo 自动打包 
	 */
    public function createdbAction(){
    	header("Content-type:text/html;charset=utf-8");
    	//echo "觉得";exit;
    	set_time_limit(0);
    	
    	$condition = array(
    		'warehouse_id'=>'',
    		'picking_status'=>0,
    		'picking_type'=>0,
    	);
    	
    	//$page = $this->_request->getParam('page', 1);
    	//$pageSize = $this->_request->getParam('pageSize', 20);
    	 
    	$page = 1;
    	$pageSize = 20;
    	
    	
    	
    	
    	
    	$count = $this->serviceClass->getLeftJoinUserByCondition($condition, 'count(*)');
    	
    	
    	$showFields = array(
    	
    			'warehouse_id',
    			'picking_code',
    			'picker_id',
    			'creater_id',
    			'picking_order_cnt',
    			'picking_lc_cnt',
    			'picking_item_cnt',
    			'picking_status',
    			'is_assign',
    			'picking_type',
    			'picking_add_time',
    			'picking_update_time',
    			'picking_id',
    	);

    	
    	
    	/* $showFieldsList = $this->serviceClass->getFieldsAlias($showFieldsList);
    	$rows = $this->serviceClass->getLeftJoinUserByCondition($condition, $showFieldsList, 20, 1, array('picking_id desc')); */
    	
    	/* print_r($rows);
    	exit; */
    	
    	//echo '<pre>';
    	
    	$pages = ceil($count/$pageSize);
    	$succ=0;
    	for($page=1;$page<$pages;$page++){
    		
    		
    		$showFields = $this->serviceClass->getFieldsAlias($showFields);
    		$rows = $this->serviceClass->getLeftJoinUserByCondition($condition, $showFields, $pageSize, $page, array('picking_id desc'));
    		
    		foreach($rows as $kr=>$vr){
    			
    			$detailObj = new Service_PickingDetail();
    			
    			
    			$pageSizedetail = 20;
    			$pageSizedetail = $pageSizedetail ? $pageSizedetail : 20;
    			
    			$return = array(
    					"state" => 0,
    					"message" => "No Data"
    			);
    			
    			
    			$showFieldsList = array(
    			
    					'warehouse_id',
    					'picking_code',
    					'picker_id',
    					'creater_id',
    					'picking_order_cnt',
    					'picking_lc_cnt',
    					'picking_item_cnt',
    					'picking_status',
    					'is_assign',
    					'picking_type',
    					'picking_add_time',
    					'picking_update_time',
    					'picking_id',
    			);
    			$showFieldsList = $this->serviceClass->getFieldsAlias($showFieldsList);
    			
    			
    			$params = array(
    					'page'=>'1',
    					'pageSize'=>'20',
    					'E01'=>$vr['E2']
    			);
    			
    			
    			$detailobj =  new Service_PickingDetail();
    			
    			$conditiondetail  = $detailobj->getMatchFields($params);
    			//print_r($conditiondetail);
    			
    			
    			$countdetail = $detailobj->getByCondition($conditiondetail, 'count(*)');
    			
    			
    			if ($countdetail) {
    				$showFields=array(
    						'picking_id',
    						'picking_code',
    						'product_barcode',
    						'order_code',
    						'pd_status',
    						'pd_quantity',
    						'lc_code',
    						'pd_add_time',
    						'pd_id',
    				);
    				 
    				$totalPageDetails = ceil($countdetail/$pageSizedetail);
    				 
    				$conditionDetail  = $detailobj->getMatchFields($params);
    				 
    				 
    				$rows = $detailobj->getByCondition($conditiondetail,$showFields, 200, 1, array('pd_id desc'));
    				 
    				foreach($rows as $key=>$value){
    					$packObj = new Service_PackProcess();
    					//$return = $packObj->assignOrderTransaction($pickingCode,$packageCode,$productBarcode,null);
    			
    					$return = $packObj->assignOrderTransaction($value['picking_code'],'P000001',$value['product_barcode'],null);
    					if($return['state']=='1'){
    						$succ++;
    					}
    					//print_r($return);
    				}
    				 
    				 
    				 
    				/* for($pagedetail=1;$pagedetail<$totalPageDetails;$pagedetail++){
    			
    				$showFields = $detailobj->getFieldsAlias($showFields);
    				$rows = $detailobj->getByCondition($conditiondetail,$showFields, $pageSizedetail, $pagedetail, array('pd_id desc'));
    			
    				print_r($rows);
    				}
    				*/
    			
    				 
    				 
    				//print_r($rows);
    				 
    				 
    				if($succ%1000==0){
    					$buffer_size = 4096;
    					//$timenow =  microtime_float();
    					//$timeuser = $timenow - $time_start;
    					echo str_pad( "<p>创建了第ss一千订单(})</p>", $buffer_size);
    					ob_flush();
    					flush();
    					//sleep(1);
    				}
    				 
    				 
    				 
    				 
    			}
    			
    		}
    		
    		
    		
    		
    		

    		/* print_r($condition);
    		exit; */
    		
    		//print_r($rows);
    		
    		
    		
    		
    		
    		
    		$page++;
    	}
    	
    	
    	//echo $count;
    	//$return['total'] = $count;
    	
    	
    	//echo "</pre>";
    	
    	
    	
    	exit('sss');
    }
}