Files
OMS/app/ome/controller/admin/order/lack.php
2025-12-28 23:13:25 +08:00

534 lines
19 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* Copyright © ShopeX http://www.shopex.cn. All rights reserved.
* See LICENSE file for license details.
*/
/**
* 缺货列表
*/
class ome_ctl_admin_order_lack extends desktop_controller {
var $workground = "order_center";
function __construct($app){
if(in_array($_GET['act'], ['createPurchase'])) {
$this->checkCSRF = false;
}
parent::__construct($app);
}
/**
* 缺货搜索
*
* @param void
* @return void
*/
function index() {
$params = array(
'title'=>'缺货列表',
'actions' => array(),
'use_buildin_new_dialog' => false,
'use_buildin_set_tag'=>false,
'use_buildin_recycle'=>false,
'use_buildin_export'=>false,
'use_buildin_import'=>false,
'use_buildin_filter'=>true,
);
$query_data = $_POST;
if ($_POST['shop_id']) {
$_POST['from']['shop_id'] = $_POST['shop_id'];
}
if ($_POST['branch_id']) {
$_POST['from']['branch_id'] = $_POST['branch_id'];
}
unset($query_data['act'],$query_data['ctl'],$query_data['app']);
$params['actions'][] = array(
'label'=>app::get('ome')->_('导出'),
'class'=>'export',
'icon'=>'add.gif',
'submit'=>'index.php?app=ome&ctl=admin_order_lack&act=export&'.http_build_query($query_data),
'target'=>'dialog::{width:400,height:170,title:\'导出\'}'
);
$is_export_purchase = kernel::single('desktop_user')->has_permission('order_lack_purchase');#增加商品导出权限
if ($is_export_purchase) {
$params['actions'][]= array(
'label' => '生成采购单',
'submit' => 'index.php?app=ome&ctl=admin_order_lack&act=createPurchase&'.http_build_query($query_data),
'target' => '_blank'
);
}
if(!isset($_GET['action'])) {
$panel = new desktop_panel($this);
$panel->setId('orderlack_finder_top');
$panel->setTmpl('admin/finder/finder_lackpanel_filter.html');
$panel->show('ome_mdl_order_lack', $params);
}
// 只加载发货模式为自发的
$params['base_filter'] = [
'filter_sql' => 'o.order_type <> "platform"',
];
$this->finder('ome_mdl_order_lack',$params);
}
/**
* 列表搜索.
* @
* @
* @access public
* @author cyyr24@sina.cn
*/
function search()
{
$oBranch = $this->app->model('branch');
$branch_list = $oBranch->getOnlineBranchs('branch_id,name');
$this->pagedata['branch_list'] = $branch_list;
unset($branch_list);
$filter = array('s_type'=>1, 'delivery_mode'=>'self');
//check shop permission
$organization_permissions = kernel::single('desktop_user')->get_organization_permission();
if($organization_permissions){
$filter['org_id'] = $organization_permissions;
}
#过滤o2o门店店铺
$oShop = $this->app->model('shop');
$shop_list = $oShop->getlist('shop_id,name', $filter, 0, -1);
$this->pagedata['shop_list'] = $shop_list;
unset($shop_list);
$this->page('admin/order/lack_search.html');
}
/**
* 查看商品冻结列表
* @param product_id
* @return
* @access public
* @author cyyr24@sina.cn
*/
function show_store_freeze_list($product_id)
{
$oOrder_lack = $this->app->model('order_lack');
$order_lack = $oOrder_lack->get_stocklist($product_id);
$this->pagedata['order_lack'] = $order_lack;
unset($order_lack);
$this->singlepage('admin/order/lack_list.html');
}
/**
* 订单冻结列表
* @param int product_id
* @return
* @access public
* @author cyyr24@sina.cn
*/
function show_order_freeze_list($product_id,$bn)
{
$oOrder_lack = $this->app->model('order_lack');
$count = count($oOrder_lack->get_order($product_id,$bn));
$page = $_GET['page'] ? $_GET['page'] : 1;
$pagelimit = 10;
$offset = ($page-1)*$pagelimit;
$total_page = ceil($count/$pagelimit);
$pager = $this->ui()->pager(array(
'current'=>$page,
'total'=>$total_page,
'link'=>'index.php?app=ome&ctl=admin_order_lack&act=show_order_freeze_list&p[0]='.$product_id.'&p[1]='.$bn.'&target=container&page=%d',
));
$order_lack = $oOrder_lack->get_orderlist($product_id,$bn,$pagelimit,$offset);
$this->pagedata['order_lack'] = $order_lack;
$this->pagedata['pager'] = $pager;
unset($order_lack);
if($_GET['target']){
return $this->display('admin/order/orderlack_list.html');
}
$this->singlepage('admin/order/orderlack_list.html');
}
/**
* 显示在途库存.
* @param product_id
* @return
* @access public
* @author cyyr24@sina.cn
*/
function show_arrive_store($product_id)
{
$oOrder_lack = $this->app->model('order_lack');
$count = $oOrder_lack->getArrivestore($product_id);
$page = $_GET['page'] ? $_GET['page'] : 1;
$pagelimit = 10;
$offset = ($page-1)*$pagelimit;
$total_page = ceil($count/$pagelimit);
$pager = $this->ui()->pager(array(
'current'=>$page,
'total'=>$total_page,
'link'=>'index.php?app=ome&ctl=admin_order_lack&act=show_arrive_store&p[0]='.$product_id.'&target=container&page=%d',
));
$order_lack = $oOrder_lack->getArrivestorelist($product_id,$pagelimit,$offset);
$this->pagedata['order_lack'] = $order_lack;
$this->pagedata['pager'] = $pager;
unset($order_lack);
if($_GET['target']){
return $this->display('admin/order/arrivestore_list.html');
}
$this->singlepage('admin/order/arrivestore_list.html');
}
/**
* 生成采购单
* @param product_id
* @return
* @access public
* @author cyyr24@sina.cn
*/
function createPurchase()
{
$filter = array();
// 商品查询参数
if($_POST['isSelectedAll']=='_ALL_') {
$product_ids = app::get('ome')->model('supply_product')->getList('*',$_POST,0,-1);
for($i=0;$i<sizeof($product_ids);$i++){
$product_id[] = $product_ids[$i]['product_id'];
}
}else{
$product_id = $_POST['product_id'];
}
$this->pagedata['product_ids'] = implode(',',$product_id);
// 获取供应商id
$sql = 'SELECT a.supplier_id FROM sdb_purchase_supplier_goods AS a
LEFT JOIN sdb_material_basic_material AS b ON a.bm_id=b.bm_id
WHERE b.bm_id IN ('.implode(',',$product_id).')
LIMIT 1';
$rs = kernel::database()->select($sql);
if($rs) $supplier_id = $rs[0]['supplier_id'];
$filter = $_GET;
unset($filter['act'],$filter['ctl'],$filter['app']);
$this->pagedata['filter'] = http_build_query($filter);
$suObj = app::get('purchase')->model('supplier');
$data = $suObj->getList('supplier_id, name','',0,-1);
$brObj = app::get('ome')->model('branch');
$row = $brObj->getList('branch_id, name','',0,-1);
/*
* 获取操作员管辖仓库
*/
$is_super = kernel::single('desktop_user')->is_super();
if (!$is_super){
$branch_list = $brObj->getBranchByUser();
}
$this->pagedata['branch_list'] = $branch_list;
$is_super = 1;
$this->pagedata['is_super'] = $is_super;
//获取设置的采购方式
$po_type = app::get('ome')->getConf('purchase.po_type');
if (!$po_type) $po_type = 'credit';
$this->pagedata['po_type'] = $po_type;
$supplier = $suObj->dump($supplier_id, 'supplier_id,name,arrive_days');
$operator = kernel::single('desktop_user')->get_name();
$this->pagedata['operator'] = $operator;
$this->pagedata['supplier'] = $supplier;
$this->pagedata['branchid'] = $branch_id;
$this->pagedata['branch'] = $row;
$this->pagedata['cur_date'] = date('Ymd',time()).'采购单';
$this->singlepage("admin/order/lack/purchase_create.html");
}
/**
* 获取需采购货品
* @param
* @return
* @access public
* @author cyyr24@sina.cn
*/
function getSafeStock($product_ids,$supplier_id)
{
if ($product_ids) {
$filter['product_id'] = explode(',',$product_ids);
}
$filter_data = $_GET;
unset($filter_data['act'],$filter_data['ctl'],$filter_data['app'],$filter_data['p']);
$filter = array_merge($filter,$filter_data);
$oOrder_lack = $this->app->model('order_lack');
$oPo = app::get('purchase')->model('po');
$basicMaterialExtObj = app::get('material')->model('basic_material_ext');
$data = $oOrder_lack->getlist('*',$filter);
$lack_data = array();
foreach ($data as $k=>$v ) {
if ($v['product_id']>0) {
$v['num'] = $v['product_lack'];
if($supplier_id > 0){
$v['price'] = $oPo->getPurchsePriceBySupplierId($supplier_id, $v['product_id'], 'desc');
if (!$v['price']){
$v['price'] = 0;
}
}else{
$product = $basicMaterialExtObj->dump(array('bm_id'=>$v['product_id']),'cost');
$v['price'] = $product['price']['cost']['price'];
}
$lack_data[] = $v;
}
}
echo json_encode($lack_data);
}
/**
* 供应商.
* @param
* @return
* @access public
* @author cyyr24@sina.cn
*/
function supplier()
{
}
/**
* 缺货商品导出
* @param array
* @return
* @access public
* @author cyyr24@sina.cn
*/
function export()
{
$filter = $_GET;
unset($filter['act'],$filter['ctl'],$filter['app']);
$this->pagedata['filter'] = $filter;
if( !$this->pagedata['thisUrl'] )
$this->pagedata['thisUrl'] = $this->url;
$ioType = array();
foreach( kernel::servicelist('desktop_io') as $aio ){
$ioType[] = $aio->io_type_name;
}
$this->pagedata['ioType'] = $ioType;
echo $_GET['change_type'];
if( $_GET['change_type'] )
$this->pagedata['change_type'] = $_GET['change_type'];
echo $this->fetch('admin/order/lack/export.html');
}
/**
* 缺货订单列表
*
* @return void
* @author
*/
public function olist()
{
$params = array(
'title' => '缺货订单',
'actions' => array(
array('label'=>'重新路由', 'submit' => 'index.php?app=ome&ctl=admin_order_lack&act=routerAgain', 'target' => 'dialog::{width:600,height:250,title:\'重新路由\'}')
),
'base_filter' => $this->_getOlistFilter(),
'use_buildin_new_dialog' => false,
'use_buildin_set_tag' => false,
'use_buildin_recycle' => false,
'use_buildin_export' => false,
'use_buildin_import' => false,
'use_buildin_filter' => true,
'finder_aliasname' => 'order_lack_olist',
'object_method' => [
'count' => 'finder_count',
'getlist' => 'finder_getList',
],
);
// 导出
$user = kernel::single('desktop_user');
if($user->has_permission('order_export')){
$params['use_buildin_export'] = true;
}
$this->finder('ome_mdl_orders',$params);
}
/**
* routerAgain
* @return mixed 返回值
*/
public function routerAgain() {
$batchLogModel = app::get('ome')->model('batch_log');
$old = $batchLogModel->db_dump(array('log_type' => 'ordertaking', 'status' => 0,'createtime|than'=>(time()-600)));
if ($old) {
echo '<div style="color:red">队列中已存在相关任务,请稍后再试.</div>';
exit();
}
$model = app::get('ome')->model('orders');
$pageData = array(
'billName' => '订单',
'request_url' => 'index.php?app=ome&ctl=admin_order_lack&act=routerSpilt',
'maxProcessNum' => 50,
'close' => true
);
$this->selectToPageRequest($model, $pageData, $this->_getOlistFilter());
}
protected function _getOlistFilter() {
$params = array(
'assigned' => 'assigned',
'abnormal' => 'false',
'is_fail' => 'false',
'status' => 'active',
'process_status' => array('unconfirmed','confirmed','splitting'),
'archive' => 0,
);
// $organization_permissions = kernel::single('desktop_user')->get_organization_permission();
// if($organization_permissions){
// $params['org_id'] = $organization_permissions;
// }
if(!kernel::single('desktop_user')->is_super()){
$op_id = kernel::single('desktop_user')->get_id();
$params['op_id'] = $op_id;
}
/*$flag = omeauto_auto_const::__STORE_CODE;
$params['order_confirm_filter'] = sprintf("(sdb_ome_orders.auto_status & %s = %s)", $flag, $flag); */
return $params;
}
/**
* routerSpilt
* @return mixed 返回值
*/
public function routerSpilt() {
// $key = 'ome-order-lack-router';
// cachecore::store($key, time(), 360);
$splitOrderId = explode(';', $_POST['ajaxParams']);
$retArr = array(
'total' => count($splitOrderId),
'succ' => count($splitOrderId),
'fail' => 0,
'fail_msg' => array()
);
// 重置一下路由次数
if ($splitOrderId) {
app::get('ome')->model('order_extend')->update(['router_num' => '0'],[
'order_id' => $splitOrderId,
]);
}
kernel::single('ome_batch_log')->split($splitOrderId);
$oOperation_log = $this->app->model('operation_log');
if ($splitOrderId) {
$oOperation_log->batch_write_log('order_dispatch@ome', ['order_id' => $splitOrderId], '手动触发重新路由', time());
}
echo json_encode($retArr);
}
/**
* apply
* @return mixed 返回值
*/
public function apply() {
$order_id = (int) $_GET['order_id'];
$order = app::get('ome')->model('orders')->db_dump($order_id, 'shop_type, order_source');
if (!($order['shop_type'] == 'taobao' && $order['order_source'] == 'maochao')) {
header("content-type:text/html; charset=utf-8");
echo "<script>alert('目前仅支持猫超国际缺货申请');window.close();</script>";
exit;
}
$order_objects = app::get('ome')->model('order_objects')->getList('*', ['order_id'=>$order_id, 'delete'=>'false']);
$store_code = $order_objects[0]['store_code'];
$order_objects = array_column($order_objects, null, 'obj_id');
$order_items = app::get('ome')->model('order_items')->getList('*', ['order_id'=>$order_id, 'delete'=>'false']);
$appointBranch = kernel::single('ome_branch_type')->getBranchIdByStoreCode([$store_code]);
if(empty($appointBranch)) {
header("content-type:text/html; charset=utf-8");
echo "<script>alert('没有指定仓{$store_code},不能进行缺货申请');window.close();</script>";
exit;
}
$bmIds = array_column($order_items, 'product_id');
$branch_id = current($appointBranch)['branch_id'];
$branch_product = app::get('ome')->model('branch_product')->getList('product_id, store, store_freeze',
['branch_id'=>$branch_id, 'product_id'=>$bmIds]);
$branch_product = array_column($branch_product, null, 'product_id');
$object_items = [];
foreach ($order_items as $v) {
$obj_quantity = $order_objects[$v['obj_id']]['quantity'];
$radio = $v['nums'] / $obj_quantity;
$v['valid_num'] = $branch_product[$v['product_id']]['store'] - $branch_product[$v['product_id']]['store_freeze'];
$objValid = bcdiv($v['valid_num'], $radio);
$outStockNum = $objValid < $obj_quantity ? ($obj_quantity - $objValid) : 0;
if($object_items[$v['obj_id']]) {
if($objValid < $object_items[$v['obj_id']]['valid_num']) {
$object_items[$v['obj_id']]['valid_num'] = $objValid;
$object_items[$v['obj_id']]['out_stock_num'] = $outStockNum;
}
$object_items[$v['obj_id']]['items'][$v['item_id']] = $v;
} else {
$object_items[$v['obj_id']] = $order_objects[$v['obj_id']];
$object_items[$v['obj_id']]['valid_num'] = $objValid;
$object_items[$v['obj_id']]['out_stock_num'] = $outStockNum;
$object_items[$v['obj_id']]['items'][$v['item_id']] = $v;
}
}
$this->pagedata['order_id'] = $order_id;
$this->pagedata['object_items'] = $object_items;
$this->singlepage('admin/order/lack/apply.html');
}
/**
* dealApply
* @return mixed 返回值
*/
public function dealApply() {
$order_id = (int) $_POST['order_id'];
$out_stock = $_POST['out_stock'];
if(empty($out_stock)) {
$this->splash('error', $this->url, '没有缺货商品, 可以重新审单');
}
$order = app::get('ome')->model('orders')->db_dump($order_id, 'shop_id, order_bn');
if(empty($order)) {
return;
}
$orderExtend = app::get('ome')->model('order_extend')->db_dump($order_id, 'extend_field');
$orderObject = app::get('ome')->model('order_objects')->getList('obj_id, oid, shop_goods_id', ['obj_id'=>array_keys($out_stock)]);
foreach ($orderObject as $key => $value) {
$orderObject[$key]['out_stock'] = $out_stock[$value['obj_id']];
}
$sdf = [
'order'=>$order,
'order_extend'=>$orderExtend,
'order_objects'=>$orderObject
];
$rs = kernel::single('erpapi_router_request')->set('shop', $order['shop_id'])->order_lackApply($sdf);
if($rs['rsp'] != 'succ') {
$this->splash('error', $this->url, '请求失败:'.json_encode($rs, JSON_UNESCAPED_UNICODE));
}
app::get('ome')->model('orders')->update(['is_delivery'=>'N'], ['order_id'=>$order_id]);
app::get('ome')->model('operation_log')->write_log('order_confirm@ome',$order_id,"订单缺货申请成功");
$this->splash('success', $this->url);
}
}