model('platform_orders');
$jxObjectMdl = app::get('dealer')->model('platform_order_objects');
$jxItemMdl = app::get('dealer')->model('platform_order_items');
$logMdl = app::get('ome')->model('operation_log');
$regionLib = kernel::single('eccommon_regions');
$basicMStockLib = kernel::single('material_basic_material_stock');
$basicMStockFreezeLib = kernel::single('material_basic_material_stock_freeze');
//判断订单号是否重复
if($jxOrderMdl->dump(array('plat_order_bn'=>$sdf['plat_order_bn'], 'shop_id'=>$sdf['shop_id']))){
$error_msg = $sdf['plat_order_bn'].':订单号重复';
return $this->error($error_msg);
}
//开启事务(防止订单创建失败,但是冻结却预占的问题)
$jxOrderMdl->db->exec('begin');
//收货人/发货人地区转换
$area = $sdf['consignee']['area'];
$regionLib->region_validate($area);
$sdf['consignee']['area'] = $area;
$consigner_area = $sdf['consigner']['area'];
$regionLib->region_validate($consigner_area);
$sdf['consigner']['area'] = $consigner_area;
//格式化订单明细
foreach($sdf['order_objects'] as $key => $object)
{
$object['bn'] = trim($object['bn']);
if($object['order_items']){
foreach($object['order_items'] as $k => $item)
{
$item['bn'] = trim($item['bn']);
$object['order_items'][$k] = $item;
}
}
$sdf['order_objects'][$key] = $object;
}
//计算实付
//@todo:现在使用的销售物料表是sdb_dealer_sales_material,不能调用ome此方法;
//$orderLib = kernel::single('ome_order');
//$orderLib->create_divide_pay($sdf);
!$sdf['splited_num'] && $sdf['splited_num'] = 0;
//save订单主数据
if(!$jxOrderMdl->save($sdf)){
//事务回滚
$error_msg = $sdf['plat_order_bn'].'平台订单创建失败:'. $jxOrderMdl->db->errorinfo();
$jxOrderMdl->db->rollBack();
return $this->error($error_msg);
}
//order_id
$plat_order_id = $sdf['plat_order_id'];
//保存订单明细
foreach($sdf['order_objects'] as $objKey => $objVal)
{
$objVal['plat_order_id'] = $plat_order_id;
$objVal['is_delete'] = $objVal['delete'];
//子订单支付状态
$objVal['pay_status'] = $sdf['pay_status'];
//insert
$plat_obj_id = $jxObjectMdl->insert($objVal);
if(!$plat_obj_id){
//事务回滚
$error_msg = $sdf['plat_order_bn'].'平台订单创建object明细失败:'. $jxOrderMdl->db->errorinfo();;
$jxOrderMdl->db->rollBack();
return $this->error($error_msg);
}
//items
foreach($objVal['order_items'] as $itemKey => $itemVal)
{
$itemVal['plat_order_id'] = $plat_order_id;
$itemVal['plat_obj_id'] = $plat_obj_id;
$itemVal['is_delete'] = $itemVal['delete'];
//insert
$plat_item_id = $jxItemMdl->insert($itemVal);
if(!$plat_item_id){
//事务回滚
$error_msg = $sdf['plat_order_bn'].'平台订单创建items明细失败:'. $jxOrderMdl->db->errorinfo();;
$jxOrderMdl->db->rollBack();
return $this->error($error_msg);
}
}
}
//事务确认
$jxOrderMdl->db->commit();
//添加订单预占
$needFreezeItems = [];
foreach($sdf['order_objects'] as $objKey => $object)
{
//[刷单]brush特殊订单,不用预占库存
if($sdf['order_type'] == 'brush'){
continue;
}
//check
if(empty($object['order_items'])){
continue;
}
//order_items
$store_code = '';
$branch_id = 0;
foreach($object['order_items'] as $itemKey => $item)
{
$nums = intval($item['nums']);
$product_id = $item['product_id'];
//只有发货方式为:代发货,才允许冻结库存
if($item['is_shopyjdf_type'] != '2'){
continue;
}
//data
if($product_id > 0 && $nums > 0 && $item['delete'] != 'true'){
$item['store_code'] = $store_code;
$item['branch_id'] = $branch_id;
$needFreezeItems[] = $item;
}
}
}
if($needFreezeItems) {
//库存预占类型
$freeze_obj_type = material_basic_material_stock_freeze::__ORDER;
$bmsq_id = material_basic_material_stock_freeze::__SHARE_STORE;
$bill_type = material_basic_material_stock_freeze::__DEALER_ORDER;
//对数组排序
uasort($needFreezeItems, [kernel::single('console_iostockorder'), 'cmp_productid']);
//items
foreach($needFreezeItems as $item)
{
$nums = intval($item['nums']);
$product_id = $item['product_id'];
//增加基础物料冻结数
$basicMStockLib->freeze($product_id, $nums);
//修改预占库存流水
$freezeData = array(
'bm_id' => $product_id,
'obj_type' => $freeze_obj_type,
'bill_type' => $bill_type,
'obj_id' => $sdf['plat_order_id'],
'shop_id' => $sdf['shop_id'],
'branch_id' => $item['branch_id'],
'bmsq_id' => $bmsq_id,
'num' => $nums,
'log_type' => '',
'store_code' => $item['store_code'],
'obj_bn' => $sdf['plat_order_bn'], //平台订单号
);
$basicMStockFreezeLib->freeze($freezeData);
}
}
//log_msg
$log_msg = ($sdf['source'] == 'local' ? '本地创建订单成功' : '平台订单创建成功');
//logs
$logMdl->write_log('order_create@dealer', $sdf['plat_order_id'], $log_msg);
return $this->succ();
}
/**
* 获取指定平台订单主表信息
*
* @param $filter 查询条件
* @param $fields 字段名(默认*表示所有)
* @return array
*/
public function getOrderMainInfo($filter, $fields='*')
{
$jxOrderMdl = app::get('dealer')->model('platform_orders');
//filter
$filter = array_filter($filter);
if(empty($filter)){
return array();
}
//order
$orderInfo = $jxOrderMdl->dump($filter, $fields);
if(empty($orderInfo)){
return array();
}
return $orderInfo;
}
/**
* 获取指定平台订单信息(包含:objects、items商品明细)
*
* @param $filter 查询条件
* @return array
*/
public function getOrderDetail($filter)
{
$jxOrderMdl = app::get('dealer')->model('platform_orders');
$jxObjectMdl = app::get('dealer')->model('platform_order_objects');
$jxItemMdl = app::get('dealer')->model('platform_order_items');
//filter
$filter = array_filter($filter);
if(empty($filter)){
return array();
}
//order
$orderInfo = $jxOrderMdl->dump($filter, '*');
if(empty($orderInfo)){
return array();
}
//items
$itemList = array();
$tempList = $jxItemMdl->getList('*', array('plat_order_id'=>$orderInfo['plat_order_id']));
foreach ((array)$tempList as $key => $itemVal)
{
$plat_obj_id = $itemVal['plat_obj_id'];
$plat_item_id = $itemVal['plat_item_id'];
$itemList[$plat_obj_id][$plat_item_id] = $itemVal;
}
// //merge
// $orderInfo['platform_order_items'] = $itemList;
//objects
$objectList = array();
$tempList = $jxObjectMdl->getList('*', array('plat_order_id'=>$orderInfo['plat_order_id']));
foreach ((array)$tempList as $key => $itemVal)
{
$plat_obj_id = $itemVal['plat_obj_id'];
//platform_order_items
$itemVal['order_items'] = (isset($itemList[$plat_obj_id]) ? $itemList[$plat_obj_id] : array());
//失败订单:销售物料找不到的
if($itemVal['goods_id'] <= 0){
$itemVal['obj_fail'] = 1;
}elseif(!isset($itemVal['order_items'])){
$itemVal['obj_item_fail'] = 1;
}
//merge
$objectList[$plat_obj_id] = $itemVal;
}
//merge
$orderInfo['order_objects'] = $objectList;
//format consignee
$orderInfo['consignee'] = array(
'name' => $orderInfo['ship_name'],
'area' => $orderInfo['ship_area'],
'mobile' => $orderInfo['ship_mobile'],
'tel' => $orderInfo['ship_tel'],
'zip' => $orderInfo['ship_zip'],
'addr' => $orderInfo['ship_addr'],
);
//unset
unset($tempList, $itemList, $objectList);
return $orderInfo;
}
/**
* 获取基础物料的发货方式(自发、代发)、所属产品线、所属贸易公司
* @todo:只有基础物料设置了发货方式为:代发,其它情况都是:自发;
*
* @param $productList
* @param $businessInfo 经销商信息
* @return array
*/
public function getProductDespatchType($productList, $businessInfo)
{
$seriesMdl = app::get('dealer')->model('series');
$seProductMdl = app::get('dealer')->model('series_endorse_products');
//product_id
$productIds = array_column($productList, 'product_id');
//产品授权信息
$dataList = $seProductMdl->getList('*', array('bm_id'=>$productIds, 'shop_id'=>$businessInfo['shop_id']));
if(empty($dataList)){
return $productList;
}
$seriesIds = array_column($dataList, 'series_id');
//产品线列表
$seriesList = $seriesMdl->getList('*', array('series_id'=>$seriesIds));
$seriesList = array_column($seriesList, null, 'series_id');
//format
foreach ($dataList as $key => $val)
{
$bm_id = $val['bm_id'];
$series_id = intval($val['series_id']);
//获取发货方式(自发or代发)
$getProductMode = $this->getProductShopyjdfType($val);
$productList[$bm_id]['is_shopyjdf_type'] = $getProductMode['is_shopyjdf_type'];
$productList[$bm_id]['remark'] = $getProductMode['remark'];
//贸易公司ID
$productList[$bm_id]['betc_id'] = intval($seriesList[$series_id]['betc_id']);
}
return $productList;
}
/**
* 获取发货方式(1:自发,2:代发)
*
* @param $productInfo
* @return array
*/
public function getProductShopyjdfType($productInfo)
{
$dateline = time();
$result = array('is_shopyjdf_type'=>'1', 'remark'=>'');
//自发
if($productInfo['is_shopyjdf_type'] != '2'){
$result['remark'] = '发货方式是:自发货';
return $result;
}
//检查代发货开始时间
if($productInfo['from_time'] && $productInfo['from_time'] > $dateline){
$result['remark'] = '代发开始时间是:'.date('Y-m-d H:i:s', $productInfo['from_time']);
return $result;
}
//检查代发货结束时间
if($productInfo['end_time'] && $productInfo['end_time'] < $dateline){
$result['remark'] = '代发结束时间是:'.date('Y-m-d H:i:s', $productInfo['end_time']);
return $result;
}
//代发
$result['is_shopyjdf_type'] = '2';
return $result;
}
/**
* 设置订单Hold单时间
* @todo:创建订单完成后,根据配置项设置hold单时间,防止避免发货前退款;
*
* @param $plat_order_id
* @return void
*/
public function setOrderHoldTime($plat_order_id)
{
$jxOrderMdl = app::get('dealer')->model('platform_orders');
//默认6小时(后面可在店铺中配置hold时间选项)
$hold_time = 60 * 60 * 6;
$hold_msg = '系统默认';
//获取HOLD单规则
$result = kernel::single('dealer_platform_order_hold')->process($plat_order_id);
if($result['rsp'] == 'succ' && $result['data']){
$hours = $result['data']['hours'];
if($hours > 0){
$hold_time = 60 * 60 * $hours;
$hold_msg = 'hold单规则';
}
}
$timing_confirm = time() + $hold_time;
//update
$updateData = array('timing_confirm'=>$timing_confirm);
$jxOrderMdl->update($updateData, array('plat_order_id'=>$plat_order_id));
//放入misc_task任务里,延迟自动审单
$task = array(
'obj_id' => $plat_order_id,
'obj_type' => 'timing_dealer_order',
'exec_time' => $timing_confirm,
);
app::get('ome')->model('misc_task')->saveMiscTask($task);
//logs
$logMdl = app::get('ome')->model('operation_log');
$logMdl->write_log('order_modify@dealer', $plat_order_id, '设置hold单时间('. $hold_msg .'):'. date('Y-m-d H:i:s', $timing_confirm) .' 延迟自动审单');
return true;
}
/**
* 审核经销商订单
* @todo: 根据基础物料发货方式,创建OMS订单(多个SKU对应多个分销商,拆分成多个OMS订单);
*
* @param array $params
* @return array
*/
public function confirmOrder($params)
{
$jxOrderMdl = app::get('dealer')->model('platform_orders');
$logMdl = app::get('ome')->model('operation_log');
//setting
$updateData = array('convert_status'=>'fail', 'last_modified'=>time());
$error_msg = '';
//plat_order_id
if(isset($params[0]) && $params[0]){
$plat_order_id = $params[0];
}elseif(isset($params['obj_id']) && $params['obj_id']){
$plat_order_id = $params['obj_id'];
}else{
return false;
}
//平台订单信息
$filter = array('plat_order_id'=>$plat_order_id);
$orderInfo = $this->getOrderDetail($filter);
//check检查订单主数据
$isCheck = $this->checkConfirmOrder($orderInfo, $error_msg);
if(!$isCheck){
$error_msg = '审核订单失败:'. $error_msg;
//fail
$updateData['dispose_msg'] = $error_msg;
$jxOrderMdl->update($updateData, array('plat_order_id'=>$plat_order_id));
//logs
$logMdl->write_log('order_confirm@dealer', $plat_order_id, $error_msg);
return $this->error($error_msg);
}
//按照[贸易公司]进行分组,获取需要代发货的objects数据
$getObjectResult = $this->getConfirmObjects($orderInfo, $error_msg);
if($getObjectResult['rsp'] != 'succ'){
$error_msg = '审核代发货商品失败,'. $getObjectResult['error_msg'];
//fail
$updateData['dispose_msg'] = $error_msg;
$jxOrderMdl->update($updateData, array('plat_order_id'=>$plat_order_id));
//logs
$logMdl->write_log('order_confirm@dealer', $plat_order_id, $error_msg);
return $this->error($error_msg);
}else{
//订单发货方式
// if(isset($getObjectResult['data']['dispose_status'])){
// $updateData['dispose_status'] = $getObjectResult['data']['dispose_status'];
// }
//succ没有贸易公司分组数据,直接返回succ
if(!isset($getObjectResult['data']['betcGroup'])){
$updateData['convert_status'] = 'needless';
$updateData['dispose_msg'] = ($getObjectResult['msg'] ? $getObjectResult['msg'] : $getObjectResult['error_msg']);
//update
$jxOrderMdl->update($updateData, array('plat_order_id'=>$plat_order_id));
//logs
$logMdl->write_log('order_confirm@dealer', $plat_order_id, $updateData['dispose_msg']);
return $this->succ('审核订单成功:不需要创建OMS订单;'. $updateData['dispose_msg']);
}
}
//贸易公司分组数据
$betcGroup = $getObjectResult['data']['betcGroup'];
//[按贸易公司纬度]获取OMS订单结构数据
$responseOrders = $this->formatResponseOrders($orderInfo, $betcGroup);
if($responseOrders['rsp'] != 'succ'){
$error_msg = '获取OMS订单结构数据失败:'. $getObjectResult['error_msg'];
//fail
$updateData['dispose_msg'] = $error_msg;
$jxOrderMdl->update($updateData, array('plat_order_id'=>$plat_order_id));
//logs
$logMdl->write_log('order_confirm@dealer', $plat_order_id, $error_msg);
return $this->error($error_msg);
}
$responseOrders = $responseOrders['data'];
//批量创建OMS订单
$result = $this->batchCreateErpOrders($orderInfo, $responseOrders);
if($result['rsp'] != 'succ'){
$error_msg = '请求创建OMS订单失败,'. $result['error_msg'];
//fail
$updateData['dispose_msg'] = $error_msg;
$jxOrderMdl->update($updateData, array('plat_order_id'=>$plat_order_id));
//不需要记录logs(请求OMS创建订单失败时,已经记录了)
//$logMdl->write_log('order_confirm@dealer', $plat_order_id, $error_msg);
return $this->error($error_msg);
}elseif(!isset($result['data']['erp_orders'])){
$error_msg = '请求创建OMS订单失败:没有创建成功的OMS订单';
//fail
$updateData['dispose_msg'] = $error_msg;
$jxOrderMdl->update($updateData, array('plat_order_id'=>$plat_order_id));
//logs
$logMdl->write_log('order_confirm@dealer', $plat_order_id, $error_msg);
return $this->error($error_msg);
}
//后续业务处理
$erpOrderBns = array();
foreach ($result['data']['erp_orders'] as $erpKey => $erpVal)
{
$erp_order_bn = $erpVal['erp_order_bn'];
//order_bn
$erpOrderBns[$erp_order_bn] = $erp_order_bn;
//按erp订单号更新关联信息
$this->updateOrderRelevanceInfo($orderInfo, $erp_order_bn);
}
//释放经销商订单库存预占
$this->unOrderFreeze($orderInfo);
//update
$updateData['convert_status'] = 'converted';
$updateData['dispose_msg'] = '';
$jxOrderMdl->update($updateData, array('plat_order_id'=>$plat_order_id));
//logs
$error_msg = '创建OMS订单成功:'.implode(',', $erpOrderBns);
$logMdl->write_log('order_confirm@dealer', $plat_order_id, $error_msg);
//请求smart业务处理
foreach ($result['data']['erp_orders'] as $erpKey => $erpVal)
{
$erp_order_bn = $erpVal['erp_order_bn'];
//按erp订单号请求smart接口获取价格
$this->requestSmart($erp_order_bn);
}
return $this->succ('审核经销商订单成功');
}
/**
* 检查订单信息
*
* @param $orderInfo
* @param $error_msg
* @return bool
*/
public function checkConfirmOrder($orderInfo, &$error_msg=null)
{
if(empty($orderInfo)){
$error_msg = '经销商订单信息不存在';
return false;
}
//check
if($orderInfo['pay_status'] != '1'){
$error_msg = '订单不是已支付状态';
return false;
}
if($orderInfo['is_fail'] == 'true'){
$error_msg = '失败订单请先修正';
return false;
}
if(!in_array($orderInfo['convert_status'], array('unconvert', 'splitting', 'fail'))){
$error_msg = '订单转单状态不允许操作';
return false;
}
if(!in_array($orderInfo['dispose_status'], array('all_daifa', 'part_daifa'))){
$error_msg = '订单允许代发';
return false;
}
if(empty($orderInfo['order_objects'])){
$error_msg = '没有订单商品object明细';
return false;
}
return true;
}
/**
* 按照[贸易公司]进行分组,获取需要代发货的objects数据
*
* @param $orderInfo
* @return array
*/
public function getConfirmObjects($orderInfo)
{
//check
if(empty($orderInfo['order_objects'])){
$error_msg = '订单object数据不存在';
return $this->error($error_msg);
}
//format
$objectList = array();
$betcIds = array();
$abnormalList = array();
$shopyjdf_types = array();
foreach ($orderInfo['order_objects'] as $objKey => $objVal)
{
$plat_obj_id = $objVal['plat_obj_id'];
//已删除
if($objVal['is_delete'] == 'true'){
continue;
}
//商品有退款
if(!in_array($objVal['pay_status'], array('0', '1'))){
continue;
}
//items
foreach ($objVal['order_items'] as $itemKey => $itemVal)
{
$betc_id = $itemVal['betc_id'];
$plat_item_id = $itemVal['plat_item_id'];
$is_shopyjdf_type = $itemVal['is_shopyjdf_type'];
//已删除
if($itemVal['is_delete'] == 'true'){
continue;
}
//未转换的item明细
if($is_shopyjdf_type == '0'){
//异常-基础物料未转换发货方式
$abnormalList['item_transition'][$plat_item_id] = $itemVal['bn'];
continue;
}
//不是代发货方式,则跳过
if($is_shopyjdf_type != '2'){
$shopyjdf_types[$is_shopyjdf_type] = $is_shopyjdf_type;
continue;
}
//明细已经被处理过
if($itemVal['process_status'] != 'unconfirmed'){
//异常-有部分明细被处理过
$abnormalList['item_process'][$plat_item_id] = $itemVal['bn'];
continue;
}
//代发货方式
$abnormalList['despatch_object'][$plat_obj_id][$is_shopyjdf_type] = $plat_item_id;
$shopyjdf_types[$is_shopyjdf_type] = $is_shopyjdf_type;
//检查贸易公司ID
if(empty($betc_id)){
//异常-贸易公司ID为空
$abnormalList['betc_empty'][$plat_item_id] = $itemVal['bn'];
continue;
}
//按照[贸易公司]进行分组
if(!isset($betcIds[$betc_id][$plat_obj_id])){
$betcIds[$betc_id][$plat_obj_id] = $objVal;
}
$betcIds[$betc_id][$plat_obj_id]['order_items'][$plat_item_id] = $itemVal;
//统计object层分组的贸易公司
$abnormalList['betc_object'][$plat_obj_id][$betc_id] = $plat_item_id;
}
$objectList[$plat_obj_id] = $objVal;
}
//检查几种异常
if($abnormalList){
$errorMsgs = array();
//item_transition
if(isset($abnormalList['item_transition'])){
$abnormalBns = array();
foreach ($abnormalList['item_transition'] as $plat_item_id => $product_bn)
{
$abnormalBns[] = $product_bn;
}
if($abnormalBns){
$errorMsgs[] = '基础物料编码:'. implode(',', $abnormalBns) .'没有转换发货方式';
}
}
//item_process
if(isset($abnormalList['item_process'])){
$abnormalBns = array();
foreach ($abnormalList['item_process'] as $plat_item_id => $product_bn)
{
$abnormalBns[] = $product_bn;
}
if($abnormalBns){
$errorMsgs[] = '基础物料编码:'. implode(',', $abnormalBns) .'已经被处理过';
}
}
//检测PKG组合:一个商品关联多个基础物料时,有多种发货方式
if(isset($abnormalList['despatch_object'])){
$abnormalBns = array();
foreach ($abnormalList['despatch_object'] as $plat_obj_id => $betcItems)
{
if(count($betcItems) > 1){
$abnormalBns[] = $objectList[$plat_obj_id]['bn'];
}
}
if($abnormalBns){
$errorMsgs[] = '销售物料编码:'. implode(',', $abnormalBns) .'有多种发货方式';
}
}
//betc_empty
if(isset($abnormalList['betc_empty'])){
$abnormalBns = array();
foreach ($abnormalList['betc_empty'] as $plat_item_id => $product_bn)
{
$abnormalBns[] = $product_bn;
}
if($abnormalBns){
$errorMsgs[] = '基础物料编码:'. implode(',', $abnormalBns) .'贸易公司ID为空';
}
}
//检测PKG组合:一个商品关联多个基础物料时,有多个贸易公司
if(isset($abnormalList['betc_object'])){
$abnormalBns = array();
foreach ($abnormalList['betc_object'] as $plat_obj_id => $betcItems)
{
if(count($betcItems) > 1){
$abnormalBns[] = $objectList[$plat_obj_id]['bn'];
}
}
if($abnormalBns){
$errorMsgs[] = '销售物料编码:'. implode(',', $abnormalBns) .'有多个贸易公司';
}
}
//error
if($errorMsgs){
$error_msg = '转换创建OMS订单失败,'. implode(';', $errorMsgs);
return $this->error($error_msg);
}
}
//[自发货方式]代发货方式的商品为空,则返回成功,无需处理订单;
if(!isset($shopyjdf_types['2'])){
//全部自发货
$data = array('dispose_status'=>'zifa');
return $this->succ('没有代发货的商品', $data);
}
//check
if(empty($betcIds)){
$error_msg = '没有可处理的贸易公司';
return $this->error($error_msg);
}
//发货方式
$dispose_status = 'zifa';
if(count($shopyjdf_types) > 1){
$dispose_status = 'part_daifa'; //部分代发货
}else{
$is_shopyjdf_type = current($shopyjdf_types);
if($is_shopyjdf_type == '2'){
$dispose_status = 'all_daifa'; //全部代发货
}elseif($is_shopyjdf_type == '1'){
$dispose_status = 'zifa'; //全部自发货
}
}
$msg = '获取代发货的objects数据成功';
return $this->succ($msg, array('betcGroup'=>$betcIds, 'dispose_status'=>$dispose_status));
}
/**
* [按贸易公司纬度]格式化OMS订单结构数据
*
* @param $orderInfo
* @param $betcGroup
* @return array
*/
public function formatResponseOrders($orderInfo, $betcGroup)
{
$plat_order_id = $orderInfo['plat_order_id'];
$plat_order_bn = $orderInfo['plat_order_bn'];
$bs_id = $orderInfo['bs_id'];
$cos_id = $orderInfo['cos_id'];
//贸易公司分组
$responseOrders = array();
foreach ($betcGroup as $betc_id => $objList)
{
foreach ($objList as $plat_obj_id => $objVal)
{
//check
if(empty($objVal['order_items'])){
unset($objList[$plat_obj_id]);
}
}
//check
if(empty($objList)){
continue;
}
//params
$requestParams = array(
'plat_order_id' => $plat_order_id,
'plat_order_bn' => $plat_order_bn,
'betc_id' => $betc_id,
'bs_id' => $bs_id,
'cos_id' => $cos_id,
);
//格式化平台订单数据(删除掉自发商品明细)
$originResult = $this->formatOriginaOrder($requestParams, $objList);
if($originResult['rsp'] != 'succ'){
//update
$error_msg = '格式化平台订单数据失败:'. $originResult['error_msg'];
return $this->error($error_msg);
}
//data
$responseOrders[$betc_id] = $originResult['data'];
}
return $this->succ('按贸易公司纬度,格式化OMS订单结构数据成功', $responseOrders);
}
/**
* 格式化平台推送过来的订单原数据(删除掉自发商品明细)
* @todo:object层所有商品金额固定为0元,创建OMS订单后,请求smart接口获取价格,再更新订单明细上的所有金额及创建支付单;
*
* @param $params
* @param $objectList 需要处理的订单明细
* @return array
*/
public function formatOriginaOrder($params, $objectList)
{
$extendMdl = app::get('dealer')->model('platform_order_extend');
//params
$betc_id = intval($params['betc_id']);
$bs_id = intval($params['bs_id']);
$cos_id = intval($params['cos_id']);
$plat_order_id = intval($params['plat_order_id']);
$plat_order_bn = $params['plat_order_bn'];
//check
if(empty($plat_order_id) || empty($betc_id) || empty($objectList)){
$error_msg = '订单ID、贸易公司ID、订单明细列表为空,请检查';
return $this->error($error_msg);
}
//获取平台订单原数据
$extendInfo = $extendMdl->dump(array('plat_order_id'=>$plat_order_id), '*');
if(empty($extendInfo) || empty($extendInfo['extend_info'])){
$error_msg = '平台订单数据不存在';
return $this->error($error_msg);
}
//data
$originalInfo = json_decode($extendInfo['extend_info'], true);
if(empty($originalInfo)){
$error_msg = '平台订单json数据为空';
return $this->error($error_msg);
}
$originalInfo['order_objects'] = json_decode($originalInfo['order_objects'], true);
// $originalInfo['payments'] = json_decode($originalInfo['payments'], true);
// $originalInfo['payment_detail'] = json_decode($originalInfo['payment_detail'], true);
// $originalInfo['pmt_detail'] = json_decode($originalInfo['pmt_detail'], true);
//check
if(empty($originalInfo['order_objects'])){
$error_msg = '平台订单商品明细不存在';
return $this->error($error_msg);
}
//goods_bn
$goodsBns = array_column($objectList, 'bn');
//format
foreach ($originalInfo['order_objects'] as $objKey => $objVal)
{
$goods_bn = $objVal['bn'];
//check过滤掉自发商品
if(!in_array($goods_bn, $goodsBns)){
unset($originalInfo['order_objects'][$objKey]);
continue;
}
//金额固定为0元
$originalInfo['order_objects'][$objKey]['price'] = 0;
$originalInfo['order_objects'][$objKey]['sale_price'] = 0;
$originalInfo['order_objects'][$objKey]['amount'] = 0;
$originalInfo['order_objects'][$objKey]['divide_order_fee'] = 0;
$originalInfo['order_objects'][$objKey]['pmt_price'] = 0;
$originalInfo['order_objects'][$objKey]['part_mjz_discount'] = 0;
//items
$originalInfo['order_objects'][$objKey]['order_items'] = array();
}
//check
if(empty($originalInfo['order_objects'])){
$error_msg = '没有可处理的平台订单object明细';
return $this->error($error_msg);
}
//金额固定为0元、支付状态为:未支付
//@todo:所有商品都是0元,创建OMS订单成功会请求smart接口,再更新价格创建支付单;
$originalInfo['cur_amount'] = 0;
$originalInfo['payed'] = 0;
$originalInfo['credit_card_fee'] = 0;
$originalInfo['total_amount'] = 0;
$originalInfo['cost_item'] = 0;
$originalInfo['pmt_order'] = 0;
$originalInfo['pmt_goods'] = 0;
$originalInfo['pay_status'] = '0'; //支付状态
$originalInfo['payments'] = array(); //支付信息
$originalInfo['payment_detail'] = array(); //支付单
$originalInfo['pmt_detail'] = array(); //订单优惠方案
$originalInfo['coupon_field'] = array(); //优惠明细平台原始字段
//json_encode
$originalInfo['order_objects'] = json_encode($originalInfo['order_objects']);
$originalInfo['payments'] = json_encode($originalInfo['payments']);
$originalInfo['payment_detail'] = json_encode($originalInfo['payment_detail']);
$originalInfo['pmt_detail'] = json_encode($originalInfo['pmt_detail']);
$originalInfo['coupon_field'] = json_encode($originalInfo['coupon_field']);
//平台订单号
$originalInfo['platform_order_bn'] = $plat_order_bn;
//贸易公司、组织架构ID
$originalInfo['betc_id'] = $betc_id;
$originalInfo['cos_id'] = $cos_id;
//flag
$originalInfo['delivery_mode'] = 'shopyjdf'; //发货模式:一件代发
$originalInfo['is_dealer_order'] = 'true'; //经销商订单
$error_msg = '格式化平台订单数据成功';
return $this->succ($error_msg, $originalInfo);
}
/**
* 批量创建OMS订单
*
* @param $orderInfo
* @param $error_msg
* @return array
*/
public function batchCreateErpOrders($params, $responseOrders)
{
$orderMdl = app::get('ome')->model('orders');
$logMdl = app::get('ome')->model('operation_log');
//params
$plat_order_id = $params['plat_order_id'];
$plat_order_bn = $params['plat_order_bn'];
//setting
$prefix = 'JX';
$sign_check = false;
//模拟推送erpapi_response创建OMS订单
$reStatus = array();
foreach ($responseOrders as $postKey => $postData)
{
$node_id = $postData['node_id'];
$erp_order_bn = $orderMdl->gen_id($prefix);
//重置OMS订单号
$postData['order_bn'] = $erp_order_bn;
// //生成支付单号
// //@todo:一个订单有多个基础物料,多个贸易公司创建多个OMS订单时,支付单号不能重复;
// $paymentObj = app::get('ome')->model('payments');
// $trade_no = 'JX'. $paymentObj->gen_id();
// $trade_no = $postData['order_bn']; //直接使用经销订单号
//response
$result = kernel::single('erpapi_router_response')->set_node_id($node_id)->set_api_name('daifa.order.add')->dispatch($postData, $sign_check);
if($result['rsp'] != 'succ'){
$error_msg = 'ERP订单号:'. $erp_order_bn .'创建失败('. $result['msg'] .')';
//flag
$reStatus['fail'][$postKey] = $error_msg;
//logs
$logMdl->write_log('order_confirm@dealer', $plat_order_id, $error_msg);
continue;
}
//flag
$error_msg = 'ERP订单号:'. $erp_order_bn .'创建成功';
$reStatus['succ'][$postKey] = array('erp_order_bn'=>$erp_order_bn, 'error_msg'=>$error_msg);
//logs
$logMdl->write_log('order_confirm@dealer', $plat_order_id, $error_msg);
}
//check
if(!isset($reStatus['succ'])){
//全部失败
$error_msg = implode(';', $reStatus['fail']);
return $this->error($error_msg);
}elseif(isset($reStatus['fail']) && isset($reStatus['succ'])){
//部分失败
$error_msg = implode(';', $reStatus['fail']);
return $this->error($error_msg);
}
return $this->succ('请求erpapi创建OMS订单成功', array('erp_orders'=>$reStatus['succ']));
}
/**
* 释放订单库存冻结
*
* @param $orderInfo
* @return bool
*/
public function unOrderFreeze($orderInfo)
{
$basicMStockLib = kernel::single('material_basic_material_stock');
$basicMStockFreezeLib = kernel::single('material_basic_material_stock_freeze');
//库存预占类型
$freeze_obj_type = material_basic_material_stock_freeze::__ORDER;
$bmsq_id = material_basic_material_stock_freeze::__SHARE_STORE;
$bill_type = material_basic_material_stock_freeze::__DEALER_ORDER;
//params
$plat_order_id = $orderInfo['plat_order_id'];
//objects
foreach($orderInfo['order_objects'] as $objKey => $objVal)
{
//items
foreach($objVal['order_items'] as $itemKey => $itemVal)
{
$product_id = $itemVal['product_id'];
$nums = $itemVal['nums'];
//check
if(empty($product_id) || empty($nums)){
continue;
}
//释放基础物料冻结数
$basicMStockLib->unfreeze($product_id, $nums);
//释放基础物料库存冻结流水
$basicMStockFreezeLib->unfreeze($product_id, $freeze_obj_type, $bill_type, $plat_order_id, '', $bmsq_id, $nums);
}
}
//清除经销商订单预占流水
// unfreezeBatch已经清除
// $basicMStockFreezeLib->delOrderFreeze($plat_order_id, $bill_type);
return true;
}
/**
* 按erp订单号:更新订单关联信息
* 更新数据包括:
* 1、更新分销商平台订单items层:erp_order_id、erp_order_bn
* 2、更新order_objects层:obj_line_no
* 3、更新order_items层:item_line_no
*
* @param $orderInfo
* @param $erp_order_bn
* @return array
*/
public function updateOrderRelevanceInfo($orderInfo, $erp_order_bn)
{
$orderMdl = app::get('dealer')->model('orders');
$jxObjectMdl = app::get('dealer')->model('platform_order_objects');
$jxItemMdl = app::get('dealer')->model('platform_order_items');
$orderObjMdl = app::get('dealer')->model('order_objects');
$orderItemMdl = app::get('dealer')->model('order_items');
//params
$plat_order_id = $orderInfo['plat_order_id'];
$plat_order_bn = $orderInfo['plat_order_bn'];
//info
$erpOrderInfo = $orderMdl->dump(array('order_bn'=>$erp_order_bn), '*', array('order_objects'=>array('*', array('order_items'=>array('*')))));
if(empty($erpOrderInfo)){
$error_msg = 'ERP订单号:'. $erp_order_bn .'数据不存在';
return $this->error($error_msg);
}
if(empty($erpOrderInfo['order_objects'])){
$error_msg = 'ERP订单号:'. $erp_order_bn .'商品明细不存在';
return $this->error($error_msg);
}
//[经销商订单]获取订单明细
$platOidList = array();
foreach($orderInfo['order_objects'] as $objKey => $objVal)
{
$plat_oid = $objVal['plat_oid'];
//check
if(empty($plat_oid)){
continue;
}
$platOidList[$plat_oid] = $objVal;
//items
foreach ($objVal['order_items'] as $itemKey => $itemVal)
{
$product_bn = $itemVal['bn'];
$platOidList[$plat_oid]['order_items'][$product_bn] = $itemVal;
}
}
//[OMS订单]objects
$erpOids = array();
foreach($erpOrderInfo['order_objects'] as $objKey => $objVal)
{
$oid = $objVal['oid'];
//check
if(empty($oid)){
continue;
}
$erpOids[$oid] = $oid;
//经销商订单商品信息
$platObjInfo = $platOidList[$oid];
//items
foreach ($objVal['order_items'] as $itemKey => $itemVal)
{
$product_bn = $itemVal['bn'];
//update items
if(isset($platObjInfo['order_items'][$product_bn])){
$orderItemMdl->update(array('item_line_no'=>$platObjInfo['order_items'][$product_bn]['plat_item_id']), array('item_id'=>$itemVal['item_id']));
}
}
//update objects
if(isset($platObjInfo['plat_obj_id'])){
$orderObjMdl->update(array('obj_line_no'=>$platObjInfo['plat_obj_id']), array('obj_id'=>$objVal['obj_id']));
}
}
//获取objects层
$tempList = $jxObjectMdl->getList('plat_obj_id,plat_oid', array('plat_order_id'=>$plat_order_id, 'plat_oid'=>$erpOids));
if(empty($tempList)){
$error_msg = '经销商订单号:'. $plat_order_bn .'关联oid子单不存在';
return $this->error($error_msg);
}
//ids
$plat_obj_ids = array_column($tempList, 'plat_obj_id');
//update objects
$updateData = array('erp_order_id'=>$erpOrderInfo['order_id'], 'erp_order_bn'=>$erpOrderInfo['order_bn'], 'process_status'=>'confirmed', 'last_modified'=>time());
$jxObjectMdl->update($updateData, array('plat_obj_id'=>$plat_obj_ids));
//update items
$updateData = array('erp_order_id'=>$erpOrderInfo['order_id'], 'erp_order_bn'=>$erpOrderInfo['order_bn'], 'process_status'=>'confirmed', 'last_modified'=>time());
$jxItemMdl->update($updateData, array('plat_obj_id'=>$plat_obj_ids));
return $this->succ();
}
/**
* 请求smart接口获取经销商品价格
*
* @param $erp_order_bn
* @return void
*/
public function requestSmart($erp_order_bn)
{
$orderMdl = app::get('ome')->model('orders');
$logMdl = app::get('ome')->model('operation_log');
//info
$orderInfo = $orderMdl->dump(array('order_bn'=>$erp_order_bn), '*', array('order_objects'=>array('*', array('order_items'=>array('*')))));
if(empty($orderInfo)){
$error_msg = 'ERP订单号:'. $erp_order_bn .'数据不存在';
return $this->error($error_msg);
}
//check
if($orderInfo['pay_status'] != '0'){
$error_msg = 'ERP订单号:'. $erp_order_bn .'支付状态:'. $orderInfo['pay_status'] .'不支持处理(已经获取SMART价格)';
return $this->error($error_msg);
}
//channel_id
//@todo:现在没有真实的smart报价授权,后面可以在(系统集成-->报价系统授权)绑定使用对应的渠道ID;
$channel_id = 1;
//request
$result = kernel::single('erpapi_router_request')->set('smart', $channel_id)->order_addOrder($orderInfo);
if($result['rsp'] != 'succ'){
$error_msg = '请求Smart接口失败:'. $result['error_msg'];
//logs
$logMdl->write_log('order_confirm@ome', $orderInfo['order_id'], $error_msg);
return $this->error($error_msg);
}
// //获取smart订单价格
// $result = $this->updateOmsOrderMoney($orderInfo);
// if($result['rsp'] != 'succ'){
// $error_msg = '获取Smart订单价格失败:'. $result['error_msg'];
//
// //logs
// $logMdl->write_log('order_confirm@ome', $orderInfo['order_id'], $error_msg);
//
// return $this->error($error_msg);
// }
//获取smart订单价格
$result = $this->updateSmartOrderMoney($orderInfo);
if($result['rsp'] != 'succ'){
$error_msg = '获取Smart订单价格失败:'. $result['error_msg'];
//logs
$logMdl->write_log('order_confirm@ome', $orderInfo['order_id'], $error_msg);
return $this->error($error_msg);
}
return $this->succ();
}
/**
* 更新订单明细发货方式
*
* @param $params
* @return array
*/
public function updateOrderShopyjdfType($sdf)
{
$jxOrderMdl = app::get('dealer')->model('platform_orders');
$jxObjectMdl = app::get('dealer')->model('platform_order_objects');
$jxItemMdl = app::get('dealer')->model('platform_order_items');
$logMdl = app::get('ome')->model('operation_log');
$basicMStockLib = kernel::single('material_basic_material_stock');
$basicMStockFreezeLib = kernel::single('material_basic_material_stock_freeze');
//params
$plat_order_id = $sdf['plat_order_id'];
//平台订单信息
$filter = array('plat_order_id'=>$plat_order_id);
$orderInfo = $this->getOrderDetail($filter);
if(empty($orderInfo)){
$error_msg = '订单:'. $sdf['plat_order_bn'] .'未找到';
return $this->error($error_msg);
}
//objects
$productList = array();
foreach($orderInfo['order_objects'] as $objKey => $objVal)
{
//check
if(empty($objVal['order_items'])){
continue;
}
//items
foreach ($objVal['order_items'] as $itemKey => $itemVal)
{
$product_id = $itemVal['product_id'];
$material_bn = $itemVal['bn'];
//products
$productList[$product_id] = array(
'product_id' => $product_id,
'product_bn' => $material_bn,
'betc_id' => 0, //贸易公司ID
'is_shopyjdf_type' => '0', //发货方式
);
}
}
//check
if(empty($productList)){
$error_msg = '订单:'. $orderInfo['plat_order_bn'] .'没有可操作的明细';
return $this->error($error_msg);
}
//通过基础物料获取发货方式:自发、代发,所属贸易公司ID;
$businessInfo = array('shop_id'=>$orderInfo['shop_id']);
$productList = $this->getProductDespatchType($productList, $businessInfo);
//format
$needFreezeItems = array();
foreach ($orderInfo['order_objects'] as $objKey => $objVal)
{
//check
if(empty($objVal['order_items'])){
continue;
}
//items
$shopyjdf_types = array();
foreach ($objVal['order_items'] as $itemKey => $itemVal)
{
$product_id = $itemVal['product_id'];
$betc_id = 0; //贸易公司ID
$is_shopyjdf_type = '1'; //发货方式(默认自发)
//发货方式
if(isset($productList[$product_id])){
$betc_id = intval($productList[$product_id]['betc_id']);
$is_shopyjdf_type = $productList[$product_id]['is_shopyjdf_type'];
}
//记录发货方式发生变更的基础物料
if($itemVal['is_shopyjdf_type'] != $is_shopyjdf_type && $is_shopyjdf_type == '2'){
if($itemVal['is_delete'] != 'true'){
$item['store_code'] = '';
$item['branch_id'] = 0;
$needFreezeItems[] = $itemVal;
}
}
//汇总发货方式
$shopyjdf_types[$is_shopyjdf_type] = $is_shopyjdf_type;
//update item
$itemSdf = array(
'betc_id' => $betc_id,
'is_shopyjdf_type' => $is_shopyjdf_type,
'last_modified' => time(),
);
$jxItemMdl->update($itemSdf, array('plat_item_id'=>$itemVal['plat_item_id']));
}
//object层发货方式
if(count($shopyjdf_types) > 1){
$objVal['is_shopyjdf_type'] = '3'; //部分代发货,即有自发货,也有代发货;
}else{
$objVal['is_shopyjdf_type'] = current($shopyjdf_types);
}
//转换状态
if($objVal['is_shopyjdf_type'] == '' || $objVal['is_shopyjdf_type'] == '0'){
$objVal['is_shopyjdf_step'] = '0';
}else{
$objVal['is_shopyjdf_step'] = '2';
}
//update object
$objectSdf = array(
'is_shopyjdf_step' => $objVal['is_shopyjdf_step'], //转换状态
'is_shopyjdf_type' => $objVal['is_shopyjdf_type'], //发货方式
'last_modified' => time(),
);
$jxObjectMdl->update($objectSdf, array('plat_obj_id'=>$objVal['plat_obj_id']));
}
//update order
$dispose_status = 'zifa';
if(count($shopyjdf_types) > 1){
$dispose_status = 'part_daifa'; //部分代发货
}else{
$is_shopyjdf_type = current($shopyjdf_types);
if($is_shopyjdf_type == '2'){
$dispose_status = 'all_daifa'; //全部代发货
}elseif($is_shopyjdf_type == '1'){
$dispose_status = 'zifa'; //全部自发货
}
}
$orderSdf = array(
'dispose_status' => $dispose_status, //转换状态
'last_modified' => time(),
);
$jxOrderMdl->update($orderSdf, array('plat_order_id'=>$plat_order_id));
//库存冻结
if($needFreezeItems) {
//库存预占类型
$freeze_obj_type = material_basic_material_stock_freeze::__ORDER;
$bmsq_id = material_basic_material_stock_freeze::__SHARE_STORE;
$bill_type = material_basic_material_stock_freeze::__DEALER_ORDER;
//对数组排序
uasort($needFreezeItems, [kernel::single('console_iostockorder'), 'cmp_productid']);
//items
foreach($needFreezeItems as $item)
{
$nums = intval($item['nums']);
$product_id = $item['product_id'];
//增加基础物料冻结数
$basicMStockLib->freeze($product_id, $nums);
//修改预占库存流水
$freezeData = array(
'bm_id' => $product_id,
'obj_type' => $freeze_obj_type,
'bill_type' => $bill_type,
'obj_id' => $orderInfo['plat_order_id'],
'shop_id' => $orderInfo['shop_id'],
'branch_id' => $item['branch_id'],
'bmsq_id' => $bmsq_id,
'num' => $nums,
'log_type' => '',
'store_code' => $item['store_code'],
'obj_bn' => $orderInfo['plat_order_bn'], //平台订单号
);
$basicMStockFreezeLib->freeze($freezeData);
}
}
//logs
$log_msg = '没有需要转换的基础物料';
if($needFreezeItems){
$productBns = array_column($needFreezeItems, 'bn');
$log_msg = '基础物料编码:'. implode('、', $productBns) .'转换发货方式成功';
}
$logMdl->write_log('order_modify@dealer', $plat_order_id, $log_msg);
return $this->succ();
}
/**
* 修复经销商失败订单
*
* @param $params
* @return array
*/
public function repairOrder($sdf)
{
$jxOrderMdl = app::get('dealer')->model('platform_orders');
$jxObjectMdl = app::get('dealer')->model('platform_order_objects');
$jxItemMdl = app::get('dealer')->model('platform_order_items');
$logMdl = app::get('ome')->model('operation_log');
$deMaterialLib = kernel::single('dealer_material');
$basicMStockLib = kernel::single('material_basic_material_stock');
$basicMStockFreezeLib = kernel::single('material_basic_material_stock_freeze');
//params
$plat_order_id = $sdf['plat_order_id'];
//平台订单信息
$filter = array('plat_order_id'=>$plat_order_id);
$orderInfo = $this->getOrderDetail($filter);
if(empty($orderInfo)){
$error_msg = '订单:'. $sdf['plat_order_bn'] .'未找到';
return $this->error($error_msg);
}
if($orderInfo['is_fail'] != 'true'){
$error_msg = '订单:'. $sdf['plat_order_bn'] .'不是失败订单';
return $this->error($error_msg);
}
$shop_id = $orderInfo['shop_id'];
//items
$is_fail_order = false;
$succGoods = array();
$failGoods = array();
$productList = array();
foreach($orderInfo['order_objects'] as $objKey => $objVal)
{
$plat_obj_id = $objVal['plat_obj_id'];
$obj_quantity = $objVal['quantity'];
$obj_sale_price = $objVal['sale_price'];
$obj_amount = $objVal['amount'];
//check
if($objVal['is_delete'] == 'true'){
continue;
}
//有items明细,则跳过
if($objVal['order_items']){
continue;
}
//检查货品是否存在销售物料中
$salesMInfo = $deMaterialLib->getSaleMaterialInfo($shop_id, $objVal['bn']);
if(empty($salesMInfo)){
$is_fail_order = true;
$failGoods[] = $objVal['bn'];
continue;
}
//check
$smIds = array($salesMInfo['sm_id']);
$bmList = $deMaterialLib->getBasicMatBySmIds($smIds);
//check
if(empty($bmList)){
$is_fail_order = true;
$failGoods[] = $objVal['bn'];
continue;
}
//组织item数据
$obj_type = 'goods';
switch ($salesMInfo['sales_material_type']) {
case "2":
$obj_type = 'pkg';
//根据促销总价格计算每个物料的贡献金额值
$deMaterialLib->calProSaleMatPriceByRate($obj_sale_price, $bmList);
//根据优惠价格计算每个物料的贡献金额值
$pmt_price_rate = $deMaterialLib->getPmtPriceByRate($objVal['pmt_price'], $bmList);
break;
case "3":
$obj_type = 'gift';
break;
}
//items
foreach ($bmList as $k => $basicMInfo)
{
$product_id = $basicMInfo['bm_id'];
$material_bn = $basicMInfo['material_bn'];
//type
if ($obj_type == 'pkg') {
$cost = $basicMInfo['cost'];
$pmt_price = $pmt_price_rate[$material_bn] ? ($pmt_price_rate[$material_bn]['rate_price'] > 0 ? $pmt_price_rate[$material_bn]['rate_price'] : 0) : 0.00;
$sale_price = $basicMInfo['rate_price'] > 0 ? $basicMInfo['rate_price'] : 0;
$amount = bcadd((float)$pmt_price, (float)$sale_price, 2);
$price = bcdiv($amount, $basicMInfo['number'] * $obj_quantity, 2);
$weight = $basicMInfo['weight'];
$shop_product_id = 0;
$divide_order_fee = 0;
$part_mjz_discount = 0;
$item_type = 'pkg';
$item_nums = $basicMInfo['number'] * $obj_quantity;
} else {
$cost = (float) $objVal['cost'] ? $objVal['cost'] : $basicMInfo['cost'];
$price = (float) $objVal['price'];
$pmt_price = (float) $objVal['pmt_price'];
$sale_price = $objVal['sale_price'];
$amount = $obj_amount;
$weight = (float) $objVal['weight'] ? $objVal['weight'] : ($basicMInfo['weight'] ? $basicMInfo['weight'] : 0.00);
$shop_product_id = $objVal['shop_product_id'] ? $objVal['shop_product_id'] : 0;
$item_type = $obj_type == 'goods' ? 'product' : $obj_type;
$divide_order_fee = $objVal['divide_order_fee'];
$part_mjz_discount = $objVal['part_mjz_discount'];
$item_nums = $basicMInfo['number'] * $obj_quantity;
}
//insert
$itemSdf = array(
'plat_order_id' => $plat_order_id,
'plat_obj_id' => $plat_obj_id,
'shop_goods_id' => $objVal['shop_goods_id'] ? $objVal['shop_goods_id'] : 0,
'product_id' => $product_id,
'shop_product_id' => $shop_product_id,
'bn' => $material_bn,
'name' => $basicMInfo['material_name'],
'cost' => $cost ? $cost : 0.00,
'price' => $price ? $price : 0.00,
'pmt_price' => $pmt_price,
'sale_price' => $sale_price ? $sale_price : 0.00,
'amount' => $amount ? $amount : 0.00,
'weight' => $weight ? $weight : 0.00,
'nums' => $item_nums, //购买数量
'addon' => '',
'item_type' => $item_type,
'delete' => ($objVal['status'] == 'close') ? 'true' : 'false',
'divide_order_fee' => $divide_order_fee,
'part_mjz_discount' => $part_mjz_discount,
'product_attr' => $objVal['product_attr'] ? $objVal['product_attr'] : "",
);
$jxItemMdl->insert($itemSdf);
//products
$productList[$product_id] = array(
'product_id' => $product_id,
'product_bn' => $material_bn,
'betc_id' => 0, //贸易公司ID
'is_shopyjdf_type' => '0', //发货方式
);
}
//update
$jxObjectMdl->update(array('goods_id'=>$salesMInfo['sm_id']), array('plat_obj_id'=>$plat_obj_id));
//succ
$succGoods[] = $objVal['bn'];
}
//修复失败
if($is_fail_order){
//logs
$error_msg = ($succGoods ? '订单部分商品修复失败' : '订单修复失败,商品编码:'. implode(',', $failGoods) .'不存在');
$logMdl->write_log('order_modify@dealer', $sdf['plat_order_id'], $error_msg);
return $this->error($error_msg);
}
//重新读取订单信息
$filter = array('plat_order_id'=>$plat_order_id);
$orderInfo = $this->getOrderDetail($filter);
//通过基础物料获取发货方式:自发、代发,所属贸易公司ID;
$businessInfo = array('shop_id'=>$shop_id);
$productList = $this->getProductDespatchType($productList, $businessInfo);
//objects
$needFreezeItems = array();
foreach($orderInfo['order_objects'] as $objKey => $object)
{
//check
if(empty($object['order_items'])){
continue;
}
if($object['is_delete'] == 'true'){
continue;
}
//items
$shopyjdf_types = array();
foreach($object['order_items'] as $itemKey => $itemVal)
{
$product_id = $itemVal['product_id'];
$betc_id = 0; //贸易公司ID
$is_shopyjdf_type = '1'; //发货方式(默认自发)
//check
if($itemVal['is_delete'] == 'true'){
continue;
}
//已经转换过的则跳过
if($itemVal['is_shopyjdf_type'] != '0'){
continue;
}
//发货方式
if(isset($productList[$product_id])){
$betc_id = intval($productList[$product_id]['betc_id']);
$is_shopyjdf_type = $productList[$product_id]['is_shopyjdf_type'];
}
$itemVal['betc_id'] = $betc_id;
$itemVal['is_shopyjdf_type'] = $is_shopyjdf_type;
//汇总发货方式
$shopyjdf_types[$is_shopyjdf_type] = $is_shopyjdf_type;
//update
$jxItemMdl->update(array('betc_id'=>$betc_id, 'is_shopyjdf_type'=>$is_shopyjdf_type, 'last_modified'=>time()), array('plat_item_id'=>$itemVal['plat_item_id']));
//freeze
if($is_shopyjdf_type == '2'){
$itemVal['store_code'] = '';
$itemVal['branch_id'] = 0;
$needFreezeItems[] = $itemVal;
}
}
//check
if(empty($shopyjdf_types)){
continue;
}
//object层发货方式
if(count($shopyjdf_types) > 1){
$obj_is_shopyjdf_type = '3'; //部分代发货,即有自发货,也有代发货;
}else{
$obj_is_shopyjdf_type = current($shopyjdf_types);
}
//转换状态
if($obj_is_shopyjdf_type == '0'){
$is_shopyjdf_step = '0';
}else{
$is_shopyjdf_step = '2';
}
//update
$jxObjectMdl->update(array('is_shopyjdf_step'=>$is_shopyjdf_step, 'is_shopyjdf_type'=>$obj_is_shopyjdf_type, 'last_modified'=>time()), array('plat_obj_id'=>$object['plat_obj_id']));
}
//订单转换状态
$dispose_status = 'zifa';
$convert_status = '';
if(count($shopyjdf_types) > 1){
$dispose_status = 'part_daifa'; //部分代发货
}else{
$is_shopyjdf_type = current($shopyjdf_types);
if($is_shopyjdf_type == '2'){
$dispose_status = 'all_daifa'; //全部代发货
}elseif($is_shopyjdf_type == '1'){
$dispose_status = 'zifa'; //全部自发货
$convert_status = 'needless'; //无需转单
}
}
//update order
$updateSdf = array('is_fail'=>'false', 'dispose_status'=>$dispose_status, 'last_modified'=>time());
//转单状态
if($convert_status){
$updateSdf['convert_status'] = $convert_status;
}
$jxOrderMdl->update($updateSdf, array('plat_order_id'=>$plat_order_id));
//添加订单预占
if($needFreezeItems) {
//库存预占类型
$freeze_obj_type = material_basic_material_stock_freeze::__ORDER;
$bmsq_id = material_basic_material_stock_freeze::__SHARE_STORE;
$bill_type = material_basic_material_stock_freeze::__DEALER_ORDER;
//对数组排序
uasort($needFreezeItems, [kernel::single('console_iostockorder'), 'cmp_productid']);
//items
foreach($needFreezeItems as $item)
{
$nums = intval($item['nums']);
$product_id = $item['product_id'];
//增加基础物料冻结数
$basicMStockLib->freeze($product_id, $nums);
//增加预占库存流水
$freezeData = array(
'bm_id' => $product_id,
'obj_type' => $freeze_obj_type,
'bill_type' => $bill_type,
'obj_id' => $sdf['plat_order_id'],
'shop_id' => $sdf['shop_id'],
'branch_id' => $item['branch_id'],
'bmsq_id' => $bmsq_id,
'num' => $nums,
'log_type' => '',
'store_code' => $item['store_code'],
'obj_bn' => $sdf['plat_order_bn'], //平台订单号
);
$basicMStockFreezeLib->freeze($freezeData);
}
//[延迟自动审单]设置hold单,防止避免发货前退款;并且放入队列任务里,延迟自动审单;
$this->setOrderHoldTime($plat_order_id);
}
//logs
$logMdl->write_log('order_modify@dealer', $sdf['plat_order_id'], '失败订单修复成功');
return $this->succ();
}
/**
* 取消订单
* 参考OMS取消订单:kernel::single('ome_batch_order')->create_refund($sdf['order_id']);
*
* @param $sdf
* @return void
*/
public function closeOrder($sdf)
{
$jxOrderMdl = app::get('dealer')->model('platform_orders');
$logMdl = app::get('ome')->model('operation_log');
//params
$plat_order_id = $sdf['plat_order_id'];
//平台订单信息
$filter = array('plat_order_id'=>$plat_order_id);
$orderInfo = $jxOrderMdl->dump($filter, '*');
if(empty($orderInfo)){
$error_msg = '订单:'. $sdf['plat_order_bn'] .'未找到';
return $this->error($error_msg);
}
//check
if($orderInfo['status'] == 'dead'){
$error_msg = '订单:'. $sdf['plat_order_bn'] .'已经是:已作废的状态';
return $this->error($error_msg);
}
if($orderInfo['pay_status'] == '5' || $orderInfo['process_status'] == 'cancel'){
$error_msg = '订单:'. $sdf['plat_order_bn'] .'已经是:全额退款、已取消的状态';
return $this->error($error_msg);
}
//更新已付金额
if($orderInfo['payed'] > 0){
$updateSql ="UPDATE sdb_dealer_platform_orders SET payed=IF((CAST(payed AS char)-IFNULL(0,cost_payment)-". $orderInfo['payed'] .")>=0,payed-IFNULL(0,cost_payment)-". $orderInfo['payed'] .",0) ";
$updateSql .= " WHERE order_id=". $plat_order_id;
$jxOrderMdl->db->exec($updateSql);
}
//更新订单支付状态
$isUpdate = $this->update_dealer_order_pay_status($plat_order_id);
//logs
$logMdl->write_log('order_modify@dealer', $sdf['plat_order_id'], '取消订单成功');
return $this->succ();
}
/**
* 更新订单支付状态&&打回发货单
*
* @param $plat_order_id
* @return bool
*/
public function update_dealer_order_pay_status($plat_order_id)
{
$jxOrderMdl = app::get('dealer')->model('platform_orders');
$apLogMdl = app::get('ome')->model('api_log');
//setting
$updateSdf = array();
$logTitle = '更新经销商订单支付状态[订单ID:' . $plat_order_id . ']';
$logInfo = '更新经销商订单ID:'. $plat_order_id .'
';
$payStatusList = array(
0 => '未支付',
1 => '已支付',
2 => '处理中',
3 => '部分付款',
4 => '部分退款',
5 => '全额退款',
6 => '退款申请中',
7 => '退款中',
8 => '支付中',
);
//获取订单详细信息
$filter = array('plat_order_id'=>$plat_order_id);
$orderInfo = $this->getOrderDetail($filter);
$payed = strval($orderInfo['payed']);
$total_amount = strval($orderInfo['total_amount']);
//金额相减运算
$total_amount = kernel::single('eccommon_math')->number_minus(array($total_amount, $orderInfo['refund_money']));
//logInfo
$logInfo .= '订单信息:
' . var_export($orderInfo, true) . '
';
$logInfo .= '当前支付金额:' . $payed . '(支付状态:' . $payStatusList[$orderInfo['pay_status']] .')
';
$logInfo .= '当前总计金额:' . $total_amount . '
';
//支付状态
$pay_status = '';
if ($payed == '0' && $total_amount > '0') {
$pay_status = '0'; //未支付
} elseif ($payed < $total_amount) {
$pay_status = '3'; //部分支付
} elseif ($payed >= $total_amount) {
$pay_status = '1'; //已支付
}
//退款状态
if ($payed == '0') {
//全额退款
$pay_status = '5';
//取消经销商订单
$cancelRs = $this->canceldealerOrder($orderInfo);
if($cancelRs['rsp'] != 'succ'){
$logInfo .= '取消订单失败:'. $cancelRs['error_msg'];
}
$logInfo .= '全额退款并且未发货的取消订单ID:' . $plat_order_id . '
';
} elseif ($payed < $total_amount) {
//部分退款
$pay_status = '4';
//取消取消OMS订单、OMS发货单(取消失败时需要打标异常)
$cancelResult = $this->cancelOmsOrder($orderInfo);
if($cancelResult['rsp'] != 'succ'){
//打标异常
$updateSdf['is_abnormal'] = 'true';
//异常类型
$abnormal_status = $orderInfo['abnormal_status'];
$abnormal_status = $abnormal_status | dealer_operation_const::__CANCEL_OMS_ORDER;
$updateSdf['abnormal_status'] = $abnormal_status;
}else{
//去除异常标识
$updateSdf['is_abnormal'] = 'false';
//清除异常类型
$orderInfo['abnormal_status'] = $orderInfo['abnormal_status'] ^ dealer_operation_const::__CANCEL_OMS_ORDER;
$updateSdf['abnormal_status'] = $orderInfo['abnormal_status'];
}
}
//订单支付状态
if($pay_status && $pay_status != $orderInfo['pay_status']){
$updateSdf['pay_status'] = $pay_status;
$logInfo .= '更新支付状态为:' . $payStatusList[$pay_status] .'
';
}
//更新订单数据
if($updateSdf){
$updateSdf['last_modified'] = time();
$jxOrderMdl->update($updateSdf, array('plat_order_id'=>$plat_order_id));
}
//logs
$logsdf = array(
'log_id' => $apLogMdl->gen_id(),
'task_name' => $logTitle,
'status' => 'success',
'worker' => '',
'params' => json_encode([$logInfo], JSON_UNESCAPED_UNICODE),
'transfer' => '[]',
'response' => '[]',
'msg' => '支付状态更新成功',
'log_type' => '',
'api_type' => 'response',
'memo' => '',
'original_bn' => $orderInfo['plat_order_bn'],
'createtime' => time(),
'last_modified' => time(),
'msg_id' => '',
'spendtime' => '0',
);
$apLogMdl->insert($logsdf);
return true;
}
/**
* 取消经销商订单产生的OMS订单、OMS发货单
*
* @param $orderInfo
* @return void
*/
public function cancelOmsOrder($orderInfo)
{
$orderMdl = app::get('ome')->model('orders');
$logMdl = app::get('ome')->model('operation_log');
//params
$plat_order_id = $orderInfo['plat_order_id'];
//format
$erpOrders = array();
foreach($orderInfo['order_objects'] as $objKey => $objVal)
{
//check
if(empty($objVal['order_items'])){
continue;
}
//items
foreach($objVal['order_items'] as $itemKey => $itemVal)
{
$erp_order_id = $itemVal['erp_order_id'];
//check
if($itemVal['is_shopyjdf_type'] != '2'){
continue;
}
if(empty($itemVal['erp_order_bn'])){
continue;
}
$erpOrders[$erp_order_id] = $itemVal['erp_order_bn'];
}
}
//check没有关联的OMS订单
if(empty($erpOrders)){
return $this->succ('没有ERP订单');
}
//ERP订单列表
$orderList = $orderMdl->getList('order_id,order_bn,process_status', array('order_bn'=>$erpOrders));
if(empty($orderList)){
return $this->succ('没有查找到ERP订单');
}
//orders
$cancelMsgs = array();
foreach ($orderList as $key => $orderRow)
{
$order_id = $orderRow['order_id'];
$order_bn = $orderRow['order_bn'];
//check
if(!in_array($orderRow['process_status'], array('confirmed','splitting','splited'))){
continue;
}
//取消发货单
$cancelDlyResult = $orderMdl->cancel_delivery($order_id);
if($cancelDlyResult['rsp'] != 'succ'){
if($cancelDlyResult['succ_num'] > 0){
//只有部分发货单取消成功
$cancelMsgs[] = 'ERP订单号:'. $order_bn .'取消发货单部分失败';
}else{
//发货单取消失败
$cancelMsgs[] = 'ERP订单号:'. $order_bn .'取消发货单失败';
}
}else{
//发货单取消成功
$cancelMsgs[] = 'ERP订单号:'. $order_bn .'取消发货单成功';
}
}
//logs取消发货单日志
if($cancelMsgs){
$log_msg = implode(';', $cancelMsgs);
$logMdl->write_log('order_back@dealer', $plat_order_id, $log_msg);
}
//取消OMS订单
$cancelFail = array();
$cancelSucc = array();
foreach ($orderList as $key => $orderRow)
{
$order_id = $orderRow['order_id'];
$order_bn = $orderRow['order_bn'];
//check
if(in_array($orderRow['process_status'], array('cancel'))){
continue;
}
//获取订单关联未取消的发货单(包含:已经完成发货的发货单)
$deliveryList = array();
if(!in_array($orderRow['process_status'], array('unconfirmed'))){
$sql = "SELECT d.delivery_id,d.delivery_bn,d.is_bind,d.status FROM sdb_ome_delivery_order AS dord
LEFT JOIN sdb_ome_delivery AS d ON(dord.delivery_id=d.delivery_id)
WHERE dord.order_id=". $order_id ." AND d.disabled='false' AND d.parent_id=0 AND d.status NOT IN('cancel','back','return_back')";
$deliveryList = $orderMdl->db->select($sql);
}
//有发货单则异常
if($deliveryList){
$cancelFail[] = $order_bn;
continue;
}
//取消OMS订单
$cancelResult = $orderMdl->cancel($order_id, '经销商订单请求取消OMS订单', false, 'async');
$cancelResult['rsp'] = ($cancelResult['rsp'] == 'success' ? 'succ' : $cancelResult['rsp']);
if($cancelResult['rsp'] != 'succ'){
//fail
$cancelFail[] = $order_bn;
}else{
//succ
$cancelSucc[] = $order_bn;
}
}
//check
if($cancelFail){
$error_msg = '取消失败的OMS订单:'. implode('、', $cancelFail);
//logs
$log_msg = '';
if($cancelSucc){
$log_msg .= '取消成功的OMS订单:'. implode('、', $cancelSucc) .';';
}
$log_msg .= $error_msg;
$logMdl->write_log('order_back@dealer', $plat_order_id, $log_msg);
return $this->error($error_msg, $cancelFail);
}
//logs
$log_msg = '取消成功的OMS订单:'. implode('、', $cancelSucc) .';';
$logMdl->write_log('order_back@dealer', $plat_order_id, $log_msg);
return $this->succ($log_msg, $cancelSucc);
}
/**
* 取消经销商订单产生的OMS发货单
*
* @param $orderInfo
* @return void
*/
public function cancelOrderDelivery($orderInfo)
{
return $this->succ();
}
/**
* 取消经销商订单
*
* @param $orderInfo
* @return void
*/
public function canceldealerOrder($orderInfo)
{
$jxOrderMdl = app::get('dealer')->model('platform_orders');
$orderMdl = app::get('ome')->model('orders');
$logMdl = app::get('ome')->model('operation_log');
//params
$plat_order_id = $orderInfo['plat_order_id'];
$updateSdf = array();
//先取消OMS订单、OMS发货单(取消失败时需要打标异常)
$cancelResult = $this->cancelOmsOrder($orderInfo);
if($cancelResult['rsp'] != 'succ'){
$error_msg = '取消OMS订单、发货单失败:'. $cancelResult['error_msg'];
//打标异常
$updateSdf['is_abnormal'] = 'true';
//异常类型
$abnormal_status = $orderInfo['abnormal_status'];
$abnormal_status = $abnormal_status | dealer_operation_const::__CANCEL_OMS_ORDER;
$updateSdf['abnormal_status'] = $abnormal_status;
$updateSdf['last_modified'] = time();
//update
$jxOrderMdl->update($updateSdf, array('plat_order_id'=>$plat_order_id));
//logs
$logMdl->write_log('order_back@dealer', $plat_order_id, $error_msg);
return $this->error($error_msg);
}
//[取消OMS订单成功]去除异常标识
$updateSdf['is_abnormal'] = 'false';
//[取消OMS订单成功]清除异常类型
$orderInfo['abnormal_status'] = $orderInfo['abnormal_status'] ^ dealer_operation_const::__CANCEL_OMS_ORDER;
$updateSdf['abnormal_status'] = $orderInfo['abnormal_status'];
//format
$erpOrders = array();
foreach($orderInfo['order_objects'] as $objKey => $objVal)
{
//check
if(empty($objVal['order_items'])){
continue;
}
//items
foreach($objVal['order_items'] as $itemKey => $itemVal)
{
$erp_order_id = $itemVal['erp_order_id'];
//check
if($itemVal['is_shopyjdf_type'] != '2'){
continue;
}
if(empty($itemVal['erp_order_bn'])){
continue;
}
$erpOrders[$erp_order_id] = $itemVal['erp_order_bn'];
}
}
//ERP订单列表
$orderList = array();
if($erpOrders){
$orderList = $orderMdl->getList('order_id,order_bn,process_status', array('order_bn'=>$erpOrders));
foreach ((array)$orderList as $key => $orderRow)
{
//已经取消的订单
if(in_array($orderRow['process_status'], array('cancel'))){
unset($orderList[$key]);
}
}
}
//check
if($orderList){
$orderBns = array_column($orderList, 'order_bn');
$error_msg = '无法取消订单,存在OMS订单号:'. implode('、', $orderBns);
//打标异常
$updateSdf['is_abnormal'] = 'true';
//异常类型
$abnormal_status = $orderInfo['abnormal_status'];
$abnormal_status = $abnormal_status | dealer_operation_const::__CANCEL_DEALER_ORDER;
$updateSdf['abnormal_status'] = $abnormal_status;
//update
$jxOrderMdl->update($updateSdf, array('plat_order_id'=>$plat_order_id));
//logs
$logMdl->write_log('order_back@dealer', $plat_order_id, $error_msg);
return $this->error($error_msg, $orderBns);
}else{
//所有OMS订单都已经取消成功
//清除异常类型
$orderInfo['abnormal_status'] = $orderInfo['abnormal_status'] ^ dealer_operation_const::__CANCEL_DEALER_ORDER;
$updateSdf['abnormal_status'] = $orderInfo['abnormal_status'];
//更新状态
$updateSdf['process_status'] = 'cancel';
$updateSdf['convert_status'] = 'fail';
$updateSdf['status'] = 'dead';
$updateSdf['archive'] = 1; //订单归档
//update
$jxOrderMdl->update($updateSdf, array('plat_order_id'=>$plat_order_id));
//释放经销商订单库存预占
$this->unOrderFreeze($orderInfo);
//logs
$error_msg = '取消经销订单成功';
$logMdl->write_log('order_back@dealer', $plat_order_id, $error_msg);
}
return $this->succ();
}
/**
* 订单暂停
*
* @param int $order_id
* @return array
*/
public function pauseDealerOrder($plat_order_id)
{
$jxOrderMdl = app::get('dealer')->model('platform_orders');
$logMdl = app::get('ome')->model('operation_log');
//平台订单信息
$filter = array('plat_order_id'=>$plat_order_id);
$orderInfo = $this->getOrderDetail($filter);
if(empty($orderInfo)){
$error_msg = '订单信息不存在';
return $this->error($error_msg);
}
//订单已经是暂停状态,直接返回
if ($orderInfo['pause'] != 'false'){
$error_msg = '订单已经是暂停状态,直接返回成功';
return $this->succ($error_msg);
}
//取消OMS订单并且撤消发货单
$cancelResult = $this->cancelOmsOrder($orderInfo);
if($cancelResult['rsp'] != 'succ'){
$updateSdf = array();
//打标异常
$updateSdf['is_abnormal'] = 'true';
//异常类型
$abnormal_status = $orderInfo['abnormal_status'];
$abnormal_status = $abnormal_status | dealer_operation_const::__PAUSE_DEALER_ORDER;
$updateSdf['abnormal_status'] = $abnormal_status;
$jxOrderMdl->update($updateSdf, array('plat_order_id'=>$plat_order_id));
return $this->error($cancelResult['error_msg']);
}
//更新订单状态
$updateSdf = array();
$updateSdf['process_status'] = 'unconfirmed';
$updateSdf['convert_status'] = 'unconvert';
$updateSdf['pause'] = 'true';
$jxOrderMdl->update($updateSdf, array('plat_order_id'=>$plat_order_id));
//logs
$log_msg = '暂停订单成功';
$logMdl->write_log('order_modify@dealer', $plat_order_id, $log_msg);
return $this->succ($log_msg);
}
/**
* 订单恢复
*
* @param int $plat_order_id
* @return boolean
*/
public function renewDealerOrder($plat_order_id)
{
$jxOrderMdl = app::get('dealer')->model('platform_orders');
$logMdl = app::get('ome')->model('operation_log');
//平台订单信息
$filter = array('plat_order_id'=>$plat_order_id);
$orderInfo = $this->getOrderDetail($filter);
if(empty($orderInfo)){
$error_msg = '订单信息不存在';
return $this->error($error_msg);
}
//订单已经是暂停状态,直接返回
if ($orderInfo['pause'] != 'true'){
$error_msg = '订单不是暂停状态,直接返回成功';
return $this->succ($error_msg);
}
//更新订单状态
$updateSdf = array();
$updateSdf['pause'] = 'false';
$jxOrderMdl->update($updateSdf, array('plat_order_id'=>$plat_order_id));
//logs
$log_msg = '暂停恢复成功';
$logMdl->write_log('order_modify@dealer', $plat_order_id, $log_msg);
return $this->succ($log_msg);
}
/**
* OMS订单发货后更新经销订单数据
*
* @param $orderIds
* @return void
*/
public function updateDlyOrders($orderIds)
{
$orderMdl = app::get('ome')->model('orders');
$jxOrderMdl = app::get('dealer')->model('platform_orders');
$jxItemMdl = app::get('dealer')->model('platform_order_items');
//check
if(empty($orderIds)){
$error_msg = '无效的更新操作';
return $this->error($error_msg);
}
//ERP订单
$orderList = $orderMdl->getList('order_id,order_bn,platform_order_bn,process_status,ship_status', array('order_id'=>$orderIds), 0, -1);
if(empty($orderList)){
$error_msg = '没有查询到ERP订单';
return $this->error($error_msg);
}
//按ERP订单号进行更新明细发货状态
foreach ($orderList as $key => $val)
{
$order_bn = $val['order_bn'];
//update
$update_sql = "UPDATE sdb_dealer_platform_order_items SET ship_status='". $val['ship_status'] ."', sendnum=nums WHERE erp_order_bn='". $order_bn ."'";
$orderMdl->db->exec($update_sql);
}
//经销订单
$platOrderBns = array_column($orderList, 'platform_order_bn');
$jxOrderList = $jxOrderMdl->getList('plat_order_id,plat_order_bn', array('plat_order_bn'=>$platOrderBns));
if(empty($jxOrderList)){
$error_msg = '没有关联的经销订单';
return $this->error($error_msg);
}
$platOrderIds = array_column($jxOrderList, 'plat_order_id');
//汇总经销订单明细
$filter = array('plat_order_id'=>$platOrderIds, 'is_delete'=>'false', 'is_shopyjdf_type'=>'2');
$jxItemList = $jxItemMdl->getList('plat_item_id,plat_order_id,plat_obj_id,ship_status', $filter, 0, -1);
//items
$orderShipStatus = array();
foreach ((array)$jxItemList as $itemKey => $itemVal)
{
$plat_order_id = $itemVal['plat_order_id'];
$ship_status = $itemVal['ship_status'];
//order
$orderShipStatus[$plat_order_id][$ship_status] = $ship_status;
}
//更新经销订单发货状态
foreach ($orderShipStatus as $plat_order_id => $shipItem)
{
if(count($shipItem) > 1){
$ship_status = '2';
}else{
$ship_status = current($shipItem);
}
//data
$updateData = array('ship_status'=>$ship_status, 'last_modified'=>time());
if(in_array($ship_status, array('1','4'))){
$updateData['status'] = 'finish'; //已完成
}
//update
$jxOrderMdl->update($updateData, array('plat_order_id'=>$plat_order_id));
}
return $this->succ('更新经销订单成功');
}
/**
* 获取支付状态名称
*
* @return string
*/
public function getPayStatusName($pay_status)
{
$payStatusList = array(
0 => '未支付',
1 => '已支付',
2 => '处理中',
3 => '部分付款',
4 => '部分退款',
5 => '全额退款',
6 => '退款申请中',
7 => '退款中',
8 => '支付中',
);
return $payStatusList[$pay_status];
}
/**
* 获取订单状态名称
*
* @return string
*/
public function getShipStatusName($ship_status)
{
$shipStatusList = array(
0 => '未发货',
1 => '已发货',
2 => '部分发货',
3 => '部分退货',
4 => '已退货',
);
return $shipStatusList[$ship_status];
}
/**
* 生成本地经销订单号
*
* @param $flag
* @return string
*/
public function gen_plat_order_bn($flag='local')
{
$jxOrderMdl = app::get('dealer')->model('platform_orders');
$i = rand(0,9999);
do{
if(9999==$i){
$i=0;
}
$i++;
$prefix = '';
if ($flag == 'local'){
$prefix = 'L';
}elseif ($flag == 'change'){
$prefix = 'C';
}elseif ($flag == 'bufa'){
$prefix = 'B';
}elseif($flag){
$prefix = $flag;
}
//order_bn
$plat_order_bn = $prefix . date('YmdH') .'90'. str_pad($i,6,'0',STR_PAD_LEFT);
//select
$row = $jxOrderMdl->dump(array('plat_order_bn'=>$plat_order_bn), 'plat_order_id');
}while($row);
return $plat_order_bn;
}
/**
* [已经作废]获取smart订单价格(直接使用基础物料的销售价)
*
* @param $orderInfo
* @return array|void
*/
public function updateOmsOrderMoney($orderInfo)
{
$orderMdl = app::get('ome')->model('orders');
$orderObjMdl = app::get('ome')->model('order_objects');
$orderItemMdl = app::get('ome')->model('order_items');
$basicMaterialExtObj = app::get('material')->model('basic_material_ext');
$logMdl = app::get('ome')->model('operation_log');
//objects
$productIds = array();
foreach ($orderInfo['order_objects'] as $objKey => $objVal)
{
//items
foreach ($objVal['order_items'] as $itemKey => $itemVal)
{
$product_id = $itemVal['product_id'];
$productIds[$product_id] = $product_id;
}
}
//获取基础物料价格
$materialList = $basicMaterialExtObj->getList('bm_id,cost,retail_price,weight,unit', array('bm_id'=>$productIds));
$materialList = array_column($materialList, null, 'bm_id');
if(empty($materialList)){
$error_msg = '获取基础物料价格失败:';
//logs
$logMdl->write_log('order_confirm@ome', $orderInfo['order_id'], $error_msg);
return $this->error($error_msg);
}
//objects
foreach ($orderInfo['order_objects'] as $objKey => $objVal)
{
$obj_quantity = $objVal['quantity'];
//check
if($objVal['delete'] == 'true'){
continue;
}
//items
foreach ($objVal['order_items'] as $itemKey => $itemVal)
{
$product_id = $itemVal['product_id'];
$item_nums = $itemVal['nums'];
//check
if($itemVal['delete'] == 'true'){
continue;
}
//check
if(empty($materialList[$product_id])){
$error_msg = '基础物料编码:'. $itemVal['bn'] .'相关金额不存在';
//logs
$logMdl->write_log('order_confirm@ome', $orderInfo['order_id'], $error_msg);
return $this->error($error_msg);
}
//基础物料金额
$retail_price = ($materialList[$product_id]['retail_price'] ? $materialList[$product_id]['retail_price'] : 0.00);
$material_cost = ($materialList[$product_id]['cost'] ? $materialList[$product_id]['cost'] : 0.00);
//amount
$cost = $material_cost; //成本价
$price = $retail_price; //零售价
$pmt_price = 0.00; //优惠小计
$amount = $price * $item_nums; //零售小计 = price * nums
$sale_price = $amount - $pmt_price; //销售小计 = amount - pmt_price
$part_mjz_discount = 0.00; //优惠分摊
$divide_order_fee = $sale_price - $part_mjz_discount; //订单实付金额 = sale_price - part_mjz_discount
//更新订单items层明细金额
$updateItemData = array(
'cost' => $cost,
'price' => $price,
'pmt_price' => $pmt_price,
'amount' => $amount,
'sale_price' => $sale_price,
'part_mjz_discount' => $part_mjz_discount,
'divide_order_fee' => $divide_order_fee,
);
$orderItemMdl->update($updateItemData, array('item_id'=>$itemVal['item_id']));
//计算object层明细金额
$objVal['amount'] += $amount;
$objVal['pmt_price'] += $pmt_price;
$objVal['sale_price'] += $sale_price;
$objVal['part_mjz_discount'] += $part_mjz_discount;
$objVal['divide_order_fee'] += $divide_order_fee;
}
//更新订单objects层明细金额
$updateObjectData = array(
'price' => number_format($objVal['amount'] / $obj_quantity, 2, '.', ' '),
'pmt_price' => $objVal['pmt_price'],
'amount' => $objVal['amount'],
'sale_price' => $objVal['sale_price'],
'part_mjz_discount' => $objVal['part_mjz_discount'],
'divide_order_fee' => $objVal['divide_order_fee'],
);
$orderObjMdl->update($updateObjectData, array('obj_id'=>$objVal['obj_id']));
//计算订单总金额
$orderInfo['cost_item'] += $updateObjectData['amount'];
$orderInfo['pmt_goods'] += $updateObjectData['pmt_price'];
$orderInfo['total_amount'] += $updateObjectData['sale_price'];
$orderInfo['payed'] += $updateObjectData['divide_order_fee'];
}
//更新订单总金额
$updateOrderData = array(
'pay_status' => '1',
'cost_item' => $orderInfo['cost_item'], //商品金额
'pmt_goods' => $orderInfo['pmt_goods'], //订单商品优惠
'total_amount' => $orderInfo['total_amount'], //订单总额
'final_amount' => $orderInfo['total_amount'], //订单换算汇率后总额
'payed' => $orderInfo['payed'], //已付金额
'discount' => 0.00, //订单折扣
'pmt_order' => 0.00, //订单优惠
);
$orderMdl->update($updateOrderData, array('order_id'=>$orderInfo['order_id']));
//创建支付单
$paymentData = array(
'order_id' => $orderInfo['order_id'],
'shop_id' => $orderInfo['shop_id'],
'money' => $orderInfo['payed'],
'memo' => $orderInfo['platform_order_bn'],
);
kernel::single('ome_order')->_paymentadd($paymentData);
//logs
$logMdl->write_log('order_confirm@ome', $orderInfo['order_id'], '请求Smart成功:更新订单金额并创建支付单成功');
return $this->succ();
}
/**
* 获取smart订单价格(使用平台订单明细上的金额)
*
* @param $orderInfo
* @return array|void
*/
public function updateSmartOrderMoney($orderInfo)
{
$orderMdl = app::get('ome')->model('orders');
$orderObjMdl = app::get('ome')->model('order_objects');
$orderItemMdl = app::get('ome')->model('order_items');
$logMdl = app::get('ome')->model('operation_log');
//平台订单信息
$filter = array('plat_order_bn'=>$orderInfo['platform_order_bn']);
$dealerOrderInfo = $this->getOrderDetail($filter);
if(empty($dealerOrderInfo)){
$error_msg = '平台订单信息不存在';
return $this->error($error_msg);
}
//objects
$dealerObjects = array();
foreach($dealerOrderInfo['order_objects'] as $objKey => $objVal)
{
$goods_bn = $objVal['bn'];
//check
if(empty($objVal['order_items'])){
continue;
}
if($objVal['is_delete'] == 'true'){
continue;
}
//obj
$dealerObjects[$goods_bn] = $objVal;
unset($dealerObjects[$goods_bn]['order_items']);
//items
foreach ($objVal['order_items'] as $itemKey => $itemVal)
{
$product_bn = $itemVal['bn'];
$dealerObjects[$goods_bn]['order_items'][$product_bn] = $itemVal;
}
}
//objects
foreach ($orderInfo['order_objects'] as $objKey => $objVal)
{
$goods_bn = $objVal['bn'];
$obj_quantity = $objVal['quantity'];
//check
if($objVal['delete'] == 'true'){
continue;
}
//items
foreach ($objVal['order_items'] as $itemKey => $itemVal)
{
$product_bn = $itemVal['bn'];
//$product_id = $itemVal['product_id'];
//$item_nums = $itemVal['nums'];
//itemInfo
$dealerItemInfo = $dealerObjects[$goods_bn]['order_items'][$product_bn];
//check
if($itemVal['delete'] == 'true'){
continue;
}
//amount
$cost = $dealerItemInfo['cost']; //成本价
$price = $dealerItemInfo['price']; //零售价
$amount = $dealerItemInfo['amount']; //零售小计 = price * nums
$sale_price = $dealerItemInfo['sale_price']; //销售小计 = amount - pmt_price
$divide_order_fee = $dealerItemInfo['divide_order_fee']; //订单实付金额 = sale_price - part_mjz_discount
$pmt_price = $dealerItemInfo['pmt_price'] + $dealerItemInfo['part_mjz_discount']; //优惠小计
$part_mjz_discount = 0; //优惠分摊
//更新订单items层明细金额
$updateItemData = array(
'cost' => $cost,
'price' => $price,
'pmt_price' => $pmt_price,
'amount' => $amount,
'sale_price' => $sale_price,
'part_mjz_discount' => $part_mjz_discount,
'divide_order_fee' => $divide_order_fee,
);
$orderItemMdl->update($updateItemData, array('item_id'=>$itemVal['item_id']));
//计算object层明细金额
$objVal['amount'] += $amount;
$objVal['pmt_price'] += $pmt_price;
$objVal['sale_price'] += $sale_price;
$objVal['part_mjz_discount'] += $part_mjz_discount;
$objVal['divide_order_fee'] += $divide_order_fee;
}
//更新订单objects层明细金额
$updateObjectData = array(
'price' => number_format($objVal['amount'] / $obj_quantity, 2, '.', ''),
'pmt_price' => $objVal['pmt_price'],
'amount' => $objVal['amount'],
'sale_price' => $objVal['sale_price'],
'part_mjz_discount' => $objVal['part_mjz_discount'],
'divide_order_fee' => $objVal['divide_order_fee'],
);
$orderObjMdl->update($updateObjectData, array('obj_id'=>$objVal['obj_id']));
//计算订单总金额
$orderInfo['cost_item'] += $updateObjectData['amount'];
$orderInfo['pmt_goods'] += ($updateObjectData['pmt_price'] + $updateObjectData['part_mjz_discount']);
$orderInfo['total_amount'] += $updateObjectData['sale_price'];
$orderInfo['payed'] += $updateObjectData['divide_order_fee'];
}
//更新订单总金额
$updateOrderData = array(
'pay_status' => '1',
'cost_item' => $orderInfo['cost_item'], //商品金额
'pmt_goods' => $orderInfo['pmt_goods'], //订单商品优惠
'total_amount' => $orderInfo['total_amount'], //订单总额
'final_amount' => $orderInfo['total_amount'], //订单换算汇率后总额
'payed' => $orderInfo['payed'], //已付金额
'discount' => 0.00, //订单折扣
'pmt_order' => 0.00, //订单优惠
);
$orderMdl->update($updateOrderData, array('order_id'=>$orderInfo['order_id']));
//创建支付单
$paymentData = array(
'order_id' => $orderInfo['order_id'],
'shop_id' => $orderInfo['shop_id'],
'money' => $orderInfo['payed'],
'memo' => $orderInfo['platform_order_bn'],
);
kernel::single('ome_order')->_paymentadd($paymentData);
//logs
$logMdl->write_log('order_confirm@ome', $orderInfo['order_id'], '请求Smart接口成功:更新订单金额并且创建支付单成功');
return $this->succ();
}
/**
* 获取ERP分销订单、发货单信息
*
* @param $filter
* @return array
*/
public function getFenxiaoErpInfo($filter)
{
$orderMdl = app::get('ome')->model('orders');
$deliveryMdl = app::get('ome')->model('delivery');
$dlyItemMdl = app::get('ome')->model('delivery_items');
$branchMdl = app::get('ome')->model('branch');
$corpMdl = app::get('ome')->model('dly_corp');
$businessLib = kernel::single('dealer_business');
//filter
$filter = array_filter($filter);
if(empty($filter)){
return array();
}
//order
$orderInfo = $orderMdl->dump($filter, '*', array('order_objects'=>array('*', array('order_items'=>array('*')))));
if(empty($orderInfo)){
return array();
}
//获取贸易公司列表
$betcList = $businessLib->getAssignBetcs();
//delivery_status
$dlyStatus = array (
'succ' => '已发货',
'failed' => '发货失败',
'cancel' => '已取消',
'progress' => '等待配货',
'timeout' => '超时',
'ready' => '待处理',
'stop' => '暂停',
'back' => '打回',
'return_back'=>'退回',
);
//分销订单信息
$fenxiaoOrder = array();
foreach ($orderInfo['order_objects'] as $objKey => $objVal)
{
foreach ($objVal['order_items'] as $itemKey => $itemVal)
{
$itemVal['order_bn'] = $orderInfo['order_bn'];
$itemVal['download_time'] = $orderInfo['download_time'];
$itemVal['cos_id'] = $orderInfo['cos_id'];
$itemVal['oid'] = $objVal['oid'];
$itemVal['goods_bn'] = $objVal['bn'];
$itemVal['goods_name'] = $objVal['name'];
//贸易公司
$itemVal['betc_id'] = $orderInfo['betc_id'];
if($itemVal['betc_id']){
$itemVal['betc_name'] = $betcList[$itemVal['betc_id']]['betc_name'];
}
$fenxiaoOrder[] = $itemVal;
}
}
//分销发货单信息
$fenxiaoDlys = array();
$fields = 'branch_id,create_time,delivery_id,delivery_bn,logi_id,logi_no,logi_name,ship_name,delivery,branch_id,stock_status,deliv_status,expre_status,status,weight,betc_id';
$tempList = $deliveryMdl->getDeliveryByOrder($fields, $orderInfo['order_id']);
if($tempList){
$deliveryIds = array_column($tempList, 'delivery_id');
$deliveryList = array_column($tempList, null, 'delivery_id');
//branch_id
$branchIds = array_column($tempList, 'branch_id');
//logi_id
$logiIds = array_column($tempList, 'logi_id');
//仓库信息
$branchList = $branchMdl->getList('branch_id,branch_bn,name', array('branch_id'=>$branchIds), 0, -1);
$branchList = array_column($branchList, null, 'branch_id');
//物料公司信息
$corpList = $corpMdl->getList('corp_id,type,name', array('corp_id'=>$logiIds), 0, -1);
$corpList = array_column($corpList, null, 'corp_id');
//items
$itemList = $dlyItemMdl->getList('*', array('delivery_id'=>$deliveryIds));
//items
foreach($itemList as $itemKey => $itemVal)
{
$delivery_id = $itemVal['delivery_id'];
$deliveryInfo = $deliveryList[$delivery_id];
$branch_id = intval($deliveryInfo['branch_id']);
$logi_id = intval($deliveryInfo['logi_id']);
//merge
$itemVal = array_merge($itemVal, $deliveryInfo);
//status
$itemVal['delivery_status'] = $dlyStatus[$deliveryInfo['status']];
//order_bn
$itemVal['order_bn'] = $orderInfo['order_bn'];
//branch
$itemVal['branch_bn'] = (isset($branchList[$branch_id]) ? $branchList[$branch_id]['branch_bn'] : '');
$itemVal['branch_name'] = (isset($branchList[$branch_id]) ? $branchList[$branch_id]['name'] : '');
//logi
$itemVal['logi_type'] = (isset($corpList[$logi_id]) ? $corpList[$logi_id]['type'] : '');
$itemVal['logi_name'] = (isset($corpList[$logi_id]) ? $corpList[$logi_id]['name'] : '');
//贸易公司
if($itemVal['betc_id']){
$itemVal['betc_name'] = $betcList[$itemVal['betc_id']]['betc_name'];
}
$fenxiaoDlys[] = $itemVal;
}
}
return array('orders'=>$fenxiaoOrder, 'delivery'=>$fenxiaoDlys);
}
/**
* 平台原订单顾客修改地址
* 1、撤消审核生成的OMS发货单;
* 2、不用取消审核生成的OMS订单;
*
* @param int $order_id
* @return array
*/
public function pausePlatformOrder($plat_order_id)
{
$jxOrderMdl = app::get('dealer')->model('platform_orders');
$logMdl = app::get('ome')->model('operation_log');
//平台订单信息
$filter = array('plat_order_id'=>$plat_order_id);
$orderInfo = $this->getOrderDetail($filter);
if(empty($orderInfo)){
$error_msg = '平台订单信息不存在';
return $this->error($error_msg);
}
//订单已经是暂停状态,直接返回
if ($orderInfo['pause'] != 'false'){
$error_msg = '订单已经是暂停状态,直接返回成功';
return $this->succ($error_msg);
}
//format
$erpOrders = array();
foreach($orderInfo['order_objects'] as $objKey => $objVal)
{
//check
if(empty($objVal['order_items'])){
continue;
}
//items
foreach($objVal['order_items'] as $itemKey => $itemVal)
{
$erp_order_id = $itemVal['erp_order_id'];
//check
if($itemVal['is_shopyjdf_type'] != '2'){
continue;
}
if(empty($itemVal['erp_order_bn'])){
continue;
}
$erpOrders[$erp_order_id] = array('erp_order_id'=>$erp_order_id, 'erp_order_bn'=>$itemVal['erp_order_bn']);
}
}
//更新订单状态
$updateSdf = array();
$updateSdf['pause'] = 'true';
$updateSdf['pause'] = 'true';
//check没有关联的OMS订单
if(empty($erpOrders)){
//update
$jxOrderMdl->update($updateSdf, array('plat_order_id'=>$plat_order_id));
//logs
$log_msg = '暂停订单成功';
$logMdl->write_log('order_modify@dealer', $plat_order_id, $log_msg);
return $this->succ('没有ERP订单');
}
//撤消OMS发货单
$is_fail = false;
$error_msg = '';
foreach ($erpOrders as $erp_order_id => $erpOrderInfo)
{
//取消OMS订单并且撤消发货单
$rebackResult = $this->rebackOmsDelivery($erpOrderInfo);
if($rebackResult['rsp'] != 'succ'){
//logs
$error_msg = 'OMS订单号['. $erpOrderInfo['erp_order_bn'] .']撤消发货单失败:'. $rebackResult['error_msg'];
$logMdl->write_log('order_modify@dealer', $plat_order_id, $error_msg);
$is_fail = true;
}else{
//更新OMS订单收货人信息
$this->updateOmeConsignee($erpOrderInfo, $orderInfo);
}
}
if($is_fail){
//logs
$log_msg = '暂停订单失败,撤消OMS发货单失败';
$logMdl->write_log('order_modify@dealer', $plat_order_id, $log_msg);
return $this->fail($error_msg);
}
//update
$jxOrderMdl->update($updateSdf, array('plat_order_id'=>$plat_order_id));
//logs
$log_msg = '暂停订单成功';
$logMdl->write_log('order_modify@dealer', $plat_order_id, $log_msg);
return $this->succ($log_msg);
}
/**
* 取消分销订单审核生成的OMS发货单
*
* @param $orderInfo
* @return void
*/
public function rebackOmsDelivery($erpOrderInfo)
{
$orderMdl = app::get('ome')->model('orders');
$logMdl = app::get('ome')->model('operation_log');
//check没有关联的OMS订单
if(empty($erpOrderInfo)){
return $this->succ('没有OMS订单信息');
}
//ERP订单列表
$order_id = $erpOrderInfo['erp_order_id'];
$order_bn = $erpOrderInfo['erp_order_bn'];
$orderRow = $orderMdl->dump(array('order_bn'=>$order_bn), 'order_id,order_bn,process_status');
if(empty($orderRow)){
return $this->succ('OMS订单数据未找到');
}
//orders
if(!in_array($orderRow['process_status'], array('confirmed','splitting','splited'))){
return $this->succ('OMS订单未审核');
}
//取消发货单
$cancelDlyResult = $orderMdl->cancel_delivery($order_id);
if($cancelDlyResult['rsp'] != 'succ'){
if($cancelDlyResult['succ_num'] > 0){
//只有部分发货单取消成功
$error_msg = 'ERP订单号:'. $order_bn .'取消发货单部分失败';
}else{
//发货单取消失败
$error_msg = 'ERP订单号:'. $order_bn .'取消发货单失败';
}
return $this->succ($error_msg);
}
//logs
$logMdl->write_log('order_modify@ome', $order_id, '平台原订单有变化,发货单撤销成功');
return $this->succ('取消OMS发货单成功');
}
/**
* 更新OMS订单收货人信息
*
* @param $erpOrderInfo
* @param $platformOrderInfo
* @return void
*/
public function updateOmeConsignee($erpOrderInfo, $platformOrderInfo)
{
$orderMdl = app::get('ome')->model('orders');
$logMdl = app::get('ome')->model('operation_log');
//check没有关联的OMS订单
if(empty($erpOrderInfo)){
return $this->succ('OMS订单信息为空');
}
if(empty($platformOrderInfo)){
return $this->succ('平台订单信息为空');
}
//get
$order_id = $erpOrderInfo['erp_order_id'];
$order_bn = $erpOrderInfo['erp_order_bn'];
//data
$newOrderInfo = array('order_id'=>$order_id);
$newOrderInfo['consignee']['name'] = $platformOrderInfo['consignee']['name'];
$newOrderInfo['consignee']['area'] = $platformOrderInfo['consignee']['area'];
$newOrderInfo['consignee']['addr'] = $platformOrderInfo['consignee']['addr'];
$newOrderInfo['consignee']['zip'] = $platformOrderInfo['consignee']['zip'];
$newOrderInfo['consignee']['telephone'] = $platformOrderInfo['consignee']['telephone'];
$newOrderInfo['consignee']['email'] = $platformOrderInfo['consignee']['email'];
$newOrderInfo['consignee']['r_time'] = $platformOrderInfo['consignee']['r_time'];
$newOrderInfo['consignee']['mobile'] = $platformOrderInfo['consignee']['mobile'];
//save
$orderMdl->save($newOrderInfo);
//logs
$log_msg = '平台订单顾客修改地址,更新收货人信息成功';
$logMdl->write_log('order_modify@ome', $order_id, $log_msg);
return $this->succ($log_msg);
}
}