* @version 1.0 vopick.php 2017-02-23 */ class console_ctl_admin_vopick extends desktop_controller{ var $workground = "console_purchasecenter"; function _views() { $pickObj = app::get('console')->model('pick_bills'); $base_filter = array(); $sub_menu = array( 0 => array('label'=>__('全部'),'filter'=>$base_filter), 1 => array('label'=>__('未审核'),'filter'=>array('status'=>1), 'optional'=>false), 2 => array('label'=>__('已审核'),'filter'=>array('status'=>2), 'optional'=>false), 3 => array('label'=>__('已取消'),'filter'=>array('status'=>3), 'optional'=>false), 4 => array('label'=>__('未拉取订单'),'filter'=>array('pull_status'=>'none'), 'optional'=>false), 5 => array('label'=>__('拉取订单失败'),'filter'=>array('pull_status'=>array('running','fail')), 'optional'=>false), ); foreach($sub_menu as $k => $v) { $sub_menu[$k]['filter'] = $v['filter'] ? $v['filter'] : null; $sub_menu[$k]['addon'] = $pickObj->viewcount($v['filter']); $sub_menu[$k]['href'] = 'index.php?app=console&ctl=admin_vopick&act=index&view='. $k; } return $sub_menu; } function index() { $this->title = '拣货单列表'; $actions = array(); //button $buttonList = array(); $buttonList['pullOrder'] = array( 'label' => '批量拉取订单', 'submit' => $this->url.'&act=batchPullOrder', 'target' => 'dialog::{width:600,height:230,title:\'批量拉取订单\'}' ); //view $_GET['view'] = (empty($_GET['view']) ? '0' : $_GET['view']); switch ($_GET['view']) { case '4': case '5': $actions[] = $buttonList['pullOrder']; break; default: //--- } //params $params = array('title'=>$this->title, 'use_buildin_set_tag'=>false, 'use_buildin_filter'=>true, 'use_buildin_export'=>false, 'use_buildin_import'=>false, 'use_buildin_recycle'=>false, 'actions'=> $actions, ); $this->finder('console_mdl_pick_bills', $params); } /** * 审核 */ function check($bill_id) { if(empty($bill_id)){ $error_msg = '无效操作,请检查!'; header("content-type:text/html; charset=utf-8"); echo ""; exit; } $purchaseLib = kernel::single('purchase_purchase_order'); $pickInfo = array(); $pickObj = app::get('console')->model('pick_bills'); $pickInfo = $pickObj->dump(array('bill_id'=>$bill_id, 'status'=>1), '*'); if(empty($pickInfo)){ $error_msg = '没有相关记录,请检查!'; header("content-type:text/html; charset=utf-8"); echo ""; exit; } if($pickInfo['status'] == 2){ $error_msg = '拣货单已审核,禁止操作!'; header("content-type:text/html; charset=utf-8"); echo ""; exit; }elseif($pickInfo['status'] == 3){ $error_msg = '拣货单已取消,禁止操作!'; header("content-type:text/html; charset=utf-8"); echo ""; exit; } //OMS仓库(只支持自有仓储、伊藤忠仓储) $branch_list = $purchaseLib->get_branch_list(); $this->pagedata['branchList'] = $branch_list; //唯品会仓库 $branchInfo = $purchaseLib->getWarehouse($pickInfo['to_branch_bn']); $pickInfo['in_branch_name'] = $branchInfo['branch_name']; //同仓拣货单 $pickLib = kernel::single('purchase_purchase_pick'); $combinePicks = $pickLib->fetchCombinePick($pickInfo); $this->pagedata['jsonCombinePicks'] = json_encode($combinePicks); //去除本身 unset($combinePicks[$bill_id]); $this->pagedata['combinePicks'] = $combinePicks; $pickInfo['create_time'] = date('Y-m-d H:i:s', $pickInfo['create_time']); $this->pagedata['pickInfo'] = $pickInfo; $this->singlepage('admin/vop/vopick_check.html'); } /** * 保存审核 */ function doCheck() { $this->begin('index.php?app=console&ctl=admin_vopick&act=index'); $pickObj = app::get('console')->model('pick_bills'); $pickItemsObj = app::get('purchase')->model('pick_bill_items'); $pickLib = kernel::single('purchase_purchase_pick'); $logObj = app::get('ome')->model('operation_log'); $bill_id = intval($_POST['bill_id']); $out_branch_id = intval($_POST['out_branch_id']); $bill_ids = $_POST['bill_ids']; $bill_ids[] = $bill_id; $bill_ids = array_filter($bill_ids); unset($_POST, $bill_id); if(empty($bill_ids) || empty($out_branch_id)) { $this->end(false, "无效操作,请检查!"); } //拣货单信息 $pickList = $pickObj->getList('*', array('bill_id'=>$bill_ids)); if(empty($pickList)) { $this->end(false, "拣货单不存在,请检查!"); } //检查 $itemList = array(); $to_branch_bn = $pickList[0]['to_branch_bn']; $true_num = 0; $is_reissue = false;//是否补发 $error_msg = ''; foreach ($pickList as $p_key => $p_val) { if ($p_val['is_download_finished'] != '1') { $this->end(false, sprintf('[%s]拣货单未下载完成,请检查!', $p_val['pick_no'])); } $bill_id = $p_val['bill_id']; $pick_num = $p_val['pick_num']; $branch_send_num = $p_val['branch_send_num']; $true_num += ($pick_num - $branch_send_num); //是否同入仓 if($to_branch_bn != $p_val['to_branch_bn']) { $this->end(false, "不是同入库仓拣货单不能合并!"); } //状态 if($p_val['status'] == 2) { if($p_val['delivery_status'] == 1) { $this->end(false, "拣货单已审核过,不能重复操作!"); }elseif($branch_send_num > $pick_num) { $this->end(false, "拣货单已完成发货,不能重复操作!"); } $is_reissue = true; }elseif($p_val['status'] == 3){ $this->end(false, "拣货单已取消,不能操作!"); } //检查是否存在未出库的出库单 $sql = "SELECT a.stockout_id FROM sdb_purchase_pick_stockout AS a LEFT JOIN sdb_purchase_pick_stockout_bills AS b ON a.stockout_id=b.stockout_id WHERE a.bill_id=". $bill_id ." AND b.status=1"; $stockoutInfo = $pickObj->db->selectrow($sql); if($stockoutInfo) { $this->end(false, "出库单已存在或者需要确认出库,请检查!"); } //拣货单明细 $pickDetail = $pickItemsObj->getList('*', array('bill_id'=>$bill_id)); if(empty($pickDetail)){ $this->end(false, '拣货单号: '. $p_val['pick_no'] .' 没有明细,请检查!'); } foreach ($pickDetail as $i_key => $item) { //货号是否存在并检查仓库供货关系 $productInfo = $pickLib->checkProduct($item['barcode'], $out_branch_id, $error_msg); if(!$productInfo) { $this->end(false, $error_msg); } if (!$item['product_id']) { $this->end(false, sprintf('拣货单号: %s 货号: %s 不存在', $p_val['pick_no'], $item['bn'])); } $num = $item['num']; //补发计算剩余未发货数量 if($is_reissue) { $sql = "SELECT sum(actual_num) as num FROM sdb_purchase_pick_stockout_bill_items WHERE po_id=". $p_val['po_id'] ." AND bill_id=". $bill_id. " AND barcode='". $item['barcode'] ."'"; $actual_num = $pickObj->db->selectrow($sql); $num = $num - intval($actual_num['num']); if($num <= 0) { continue;//货品数量已发完,跳过 } } //组织数据 $itemList[] = array( 'po_id'=>$p_val['po_id'],//采购单ID 'bill_id'=>$bill_id,//拣货单ID 'product_name' => $item['product_name'], 'bn' => $productInfo['bn'],//OMS货号 'barcode' => $item['barcode'], 'size' => $item['size'], 'item_num' => $num,//拣货数量 'num' => $num,//申请数量 'actual_num' => 0,//实际出库数量 'price' => $item['price'], 'market_price' => $item['market_price'], 'bill_item_id' => $item['bill_item_id'], 'product_id' => $item['product_id'], 'po_bn' => $p_val['po_bn'], 'pick_no' => $p_val['pick_no'], ); } } //组织数据 $data = array( 'branch_id' => $out_branch_id,//出库仓库 'pick_num' => $true_num,//拣货数量 'dly_mode' => 1,//配送方式 默认:1 'bill_ids'=>$bill_ids, 'detail'=>$itemList, ); //创建 $stockLib = kernel::single('purchase_purchase_stockout'); $stockout_no = $stockLib->create_stockout($data); if(!$stockout_no) { $this->end(true, '创建出库单失败'); } //更新审核状态 $pickObj->update(array('status'=>2), array('bill_id'=>$bill_ids)); //日志 $log_str = '审核完成,'; $log_str .= (count($bill_ids)> 1 ? '合并' : '') .'创建出库单号:'. $stockout_no; foreach ($bill_ids as $key => $bill_id) { $logObj->write_log('check_vopick@ome', $bill_id, $log_str); } $this->end(true, '审核完成'); } /** * 补发 */ function recheck($bill_id) { if(empty($bill_id)){ $error_msg = '无效操作,请检查!'; header("content-type:text/html; charset=utf-8"); echo ""; exit; } $purchaseLib = kernel::single('purchase_purchase_order'); $pickInfo = array(); $pickObj = app::get('console')->model('pick_bills'); $pickInfo = $pickObj->dump(array('bill_id'=>$bill_id, 'status'=>2, 'delivery_status'=>2), '*'); if(empty($pickInfo)){ $error_msg = '没有相关记录,请检查!'; header("content-type:text/html; charset=utf-8"); echo ""; exit; } if($pickInfo['pick_num'] <= $pickInfo['branch_send_num']){ $error_msg = '拣货单已完成发货,禁止操作!'; header("content-type:text/html; charset=utf-8"); echo ""; exit; } //OMS仓库(只支持自有仓储、伊藤忠仓储) $branch_list = $purchaseLib->get_branch_list(); $this->pagedata['branchList'] = $branch_list; //唯品会仓库 $branchInfo = $purchaseLib->getWarehouse($pickInfo['to_branch_bn']); $pickInfo['in_branch_name'] = $branchInfo['branch_name']; //同仓拣货单 $pickLib = kernel::single('purchase_purchase_pick'); $combinePicks = $pickLib->fetchCombinePick($pickInfo, true); $this->pagedata['jsonCombinePicks'] = json_encode($combinePicks); //去除本身 unset($combinePicks[$bill_id]); $this->pagedata['combinePicks'] = $combinePicks; $pickInfo['create_time'] = date('Y-m-d H:i:s', $pickInfo['create_time']); $pickInfo['is_delivery'] = true; $this->pagedata['pickInfo'] = $pickInfo; $this->singlepage('admin/vop/vopick_check.html'); } /** * 获取PickBillsCheckItems * @param mixed $bill_id ID * @return mixed 返回结果 */ public function getPickBillsCheckItems($bill_id) { if(empty($bill_id)){ return ''; } $pickItemObj = app::get('purchase')->model('pick_bill_check_items'); $dataList = $pickItemObj->getList('*', array('bill_id'=>$bill_id)); foreach ($dataList as $k => $v) { if ($pickItemObj->order_label[$v['order_label']]) { $dataList[$k]['order_label'] = $pickItemObj->order_label[$v['order_label']]; } } echo(json_encode($dataList)); } /** * 获取拣货单明细 */ function getPickBillsItems($bill_id) { $pickObj = app::get('purchase')->model('pick_bills'); $pickItemObj = app::get('purchase')->model('pick_bill_items'); if(empty($bill_id)) { return ''; } //拣货单信息 $row = $pickObj->dump(array('bill_id'=>$bill_id), 'po_id, bill_id, status, delivery_status'); //拣货单明细 $dataList = $pickItemObj->getList('*', array('bill_id'=>$bill_id)); $billItemIdArr = array_column($dataList, 'bill_item_id'); $labelList = kernel::single('ome_bill_label')->getLabelFromOrder($billItemIdArr, 'pick_bill_item'); foreach ($dataList as $k => $v){ if ($labelList[$v['bill_item_id']]) { $dataList[$k]['order_label'] = ''; foreach ($labelList[$v['bill_item_id']] as $lk => $lv) { $dataList[$k]['order_label'] .= sprintf("%s", $lv['label_name'], $lv['label_color'], $lv['label_name']); } } } //计算已出库数量 if($row['status'] == 2) { $sql = "SELECT a.stockout_id FROM sdb_purchase_pick_stockout AS a LEFT JOIN sdb_purchase_pick_stockout_bills AS b ON a.stockout_id=b.stockout_id WHERE a.bill_id=". $bill_id ." AND b.confirm_status=2 AND b.o_status in(2,3)"; $stockoutInfo = $pickObj->db->select($sql); if($stockoutInfo) { $stockout_ids = array(); foreach ($stockoutInfo as $key => $val) { $stockout_ids[] = $val['stockout_id']; } foreach ($dataList as $key => $val) { $sql = "SELECT stockout_item_id FROM sdb_purchase_pick_stockout_bill_items WHERE stockout_id in(". implode(',', $stockout_ids) .") AND po_id=". $row['po_id'] ." AND bill_id=". $row['bill_id'] . " AND barcode='". $val['barcode'] ."'"; $item_ids = array(); $stockItem = $pickObj->db->select($sql); foreach ($stockItem as $key_i => $val) { $item_ids[] = $val['stockout_item_id']; } if($item_ids) { $sql = "SELECT sum(num) AS send_num FROM sdb_purchase_pick_stockout_bill_item_boxs WHERE stockout_item_id in(". implode(',', $item_ids) .")"; $boxItem = $pickObj->db->selectrow($sql); $dataList[$key]['send_num'] = $boxItem['send_num']; } } } } echo(json_encode($dataList)); } /** * cancel * @param mixed $bill_id ID * @return mixed 返回值 */ public function cancel($bill_id) { $this->begin($this->url); $pickMdl = app::get('purchase')->model('pick_bills'); $pick = $pickMdl->dump($bill_id, 'status, delivery_status'); if ($pick['delivery_status'] == '3' || $pick['delivery_status'] == '2') { $this->end(false, '该拣货单已发货,不能取消'); } if ($pick['status'] == '2') { $this->end(false, '该拣货单已审核,不能取消'); } $affect_rows = $pickMdl->update(['status' => '3'], [ 'bill_id' => $bill_id, 'status' => '1', 'delivery_status' => '1', ]); $logObj = app::get('ome')->model('operation_log'); $logObj->write_log('check_vopick@ome', $bill_id, '单据取消'); $this->end($affect_rows === 1 ? true : false); } /** * 批量同步定制订单 * * @return void */ public function batchPullOrder() { @ini_set('memory_limit','512M'); set_time_limit(0); $pickObj = app::get('console')->model('pick_bills'); //post $ids = $_POST['bill_id']; //check if($_POST['isSelectedAll'] == '_ALL_'){ die('不能使用全选功能,每次最多选择500条!'); } if(empty($ids)){ die('请选择需要操作的订单!'); } if(count($ids) > 500){ die('每次最多只能选择500条!'); } //data $filter = ['bill_id'=>$ids, 'pull_status'=>['none','running','fail']]; $dataList = $pickObj->getList('bill_id,pick_no,po_bn,pull_status,shop_id', $filter, 0, -1); if(empty($dataList)){ die('没有可操作的订单,请检查同步状态!'); } $this->pagedata['GroupList'] = json_encode($ids); $this->pagedata['request_url'] = $this->url .'&act=ajaxPullOrder'; //调用desktop公用进度条(第4个参数是增量传offset,否则默认一直为0) parent::dialog_batch('console_mdl_pick_bills', false, 50, 'incr'); } /** * ajaxPullOrder * @return mixed 返回值 */ public function ajaxPullOrder() { $pickObj = app::get('console')->model('pick_bills'); $jitOrderLib = kernel::single('console_inventory_orders'); //setting $retArr = array( 'itotal' => 0, 'isucc' => 0, 'ifail' => 0, 'err_msg' => array(), ); //获取查询条件 parse_str($_POST['primary_id'], $postdata); //check if(empty($postdata['f'])) { echo 'Error: 请选择需要操作的订单!'; exit; } //filter $filter = $postdata['f']; $offset = intval($postdata['f']['offset']); $limit = intval($postdata['f']['limit']); //check if(empty($filter)){ echo 'Error: 没有找到查询条件'; exit; } //data $pickList = $pickObj->getList('bill_id,pick_no,po_bn,pull_status,shop_id', $filter, $offset, $limit); if(empty($pickList)){ echo 'Error: 没有获取到拣货单'; exit; } //count $retArr['itotal'] = count($pickList); //list foreach ($pickList as $dataKey => $pickInfo) { $pick_no = $pickInfo['pick_no']; //pull $result = $jitOrderLib->getJitorderdetail($pickInfo); if($result['rsp'] != 'succ'){ //fail $retArr['err_msg'][] = '拣货单:'. $pick_no .'同步失败:'. $result['error_msg']; $retArr['ifail'] += 1; }else{ //succ $retArr['isucc'] += 1; } } echo json_encode($retArr, JSON_UNESCAPED_UNICODE),'ok.'; exit; } }