Files
CompanyProject/金壶/ydyd_service/application/common/service/OrderService.php
2024-09-27 01:32:49 +08:00

1192 lines
46 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
namespace app\common\service;
use app\facade\AppConstant;
use app\facade\HyData;
use app\facade\UserCart;
use app\ydyd_service\model\AdminLogModel;
use app\ydyd_service\model\GoodsBatchModel;
use think\Db;
use think\Exception;
use think\facade\Cache;
use think\facade\Config;
use think\facade\Request;
class OrderService
{
const APP_AGENT = [2];
//售后列表
public function getServiceList($parames)
{
$_where = [];
if(isset($parames['user_id']) && $parames['user_id']){
$_where[] = ['ogs.user_id','=',$parames['user_id']];
}
$search_data['page'] = 1;
$search_data['limit'] = 3;
if(isset($parames['page']) && $parames['page']){
$search_data['page'] = $parames['page'];
}
if(isset($parames['limit']) && $parames['limit']){
$search_data['limit'] = $parames['limit'];
}
$_field = '';
//order
$_field.='o.order_sn,';
//goods
$_field.='g.name,g.app_thumb,g.pc_thumb,g.spec_desc,';
//order_goods
$_field.='og.extend_data,og.goods_number,og.unit_price,';
//goods_batch
$_field.='gb.retail_flag,';
//manufacturer
$_field.='m.name as manufacturer_name,';
//order_goods_service
$_field.='ogs.*';
$service_list = Db::name('order_goods_service')->alias('ogs')
->leftJoin('order_info o','o.order_id=ogs.order_id')
->leftJoin('order_goods og','og.id=ogs.order_goods_id')
->leftJoin('goods g','g.goods_id=og.goods_id')
->leftJoin('goods_batch gb','og.batch_id=gb.batch_id')
->leftJoin('manufacturer m','m.id=g.manufacturer_id')
->field($_field)
->where($_where)
->order('ogs.id','desc')
->paginate($search_data['limit'], false, ['page' => $search_data['page']])->each(function($item, $key){
if(!$item['name']){
$extend_data = json_decode($item['extend_data'],true);
$item['name'] = $extend_data['name'];
$item['spec_desc'] = $extend_data['spec_desc'];
$item['retail_flag'] = $extend_data['retail_flag'];
$item['manufacturer_name'] = $extend_data['manufacturer_name'];
}
$item['total_price'] = $item['unit_price'] * $item['goods_number'];
$item['retail_flag'] = $item['retail_flag']?'零':'整';
$item['status_text'] = '';
$item['app_thumb'] = $item['app_thumb']?$item['app_thumb']:$item['pc_thumb'];
$item['app_thumb'] = 'http://'.$item['app_thumb'];
$item['status_text'] = '';
switch ($item['status'])
{
case 1:
$item['status_text'] = '待审核';
break;
case 2:
case 3:
$item['status_text'] = '审核通过';
break;
case 4:
$item['status_text'] = '审核拒绝';
break;
case 5:
$item['status_text'] = '客服待收货';
break;
case 6:
$item['status_text'] = '财务待退款';
break;
case 7:
$item['status_text'] = '已完成';
break;
case 8:
$item['status_text'] = '拒绝退款';
break;
case 99:
$item['status_text'] = '已取消';
break;
}
$item['create_time'] = date("Y-m-d",$item['create_time']);
$item['update_time'] = date("Y-m-d",$item['update_time']);
return $item;
});
return $service_list;
}
//售后详情
public function getServiceInfo($parames)
{
$_field = '';
//order
$_field.='o.order_sn,';
//goods
$_field.='g.name,g.app_thumb,g.pc_thumb,g.spec_desc,';
//order_goods
$_field.='og.extend_data,og.goods_number,og.unit_price,';
//goods_batch
$_field.='gb.retail_flag,';
//manufacturer
$_field.='m.name as manufacturer_name,';
//order_goods_service
$_field.='ogs.*';
$service_info = Db::name('order_goods_service')->alias('ogs')
->leftJoin('order_info o','o.order_id=ogs.order_id')
->leftJoin('order_goods og','og.id=ogs.order_goods_id')
->leftJoin('goods g','g.goods_id=og.goods_id')
->leftJoin('goods_batch gb','og.batch_id=gb.batch_id')
->leftJoin('manufacturer m','m.id=g.manufacturer_id')
->field($_field)
->where('ogs.id',$parames['id'])
->find();
$service_info['status_text'] = '';
if(!$service_info['name']){
$extend_data = json_decode($service_info['extend_data'],true);
$service_info['name'] = $extend_data['name'];
$service_info['spec_desc'] = $extend_data['spec_desc'];
$service_info['retail_flag'] = $extend_data['retail_flag'];
$service_info['manufacturer_name'] = $extend_data['manufacturer_name'];
}
$service_info['total_price'] = $service_info['unit_price'] * $service_info['goods_number'];
$service_info['retail_flag'] = $service_info['retail_flag']?'零':'整';
$service_info['status_text'] = '';
$service_info['app_thumb'] = $service_info['app_thumb']?$service_info['app_thumb']:$service_info['pc_thumb'];
$service_info['app_thumb'] = 'http://'.$service_info['app_thumb'];
$service_info['status_text'] = '';
switch ($service_info['status'])
{
case 1:
$service_info['status_text'] = '待审核';
break;
case 2:
case 3:
$service_info['status_text'] = '审核通过';
break;
case 4:
$service_info['status_text'] = '审核拒绝';
break;
case 5:
$service_info['status_text'] = '客服待收货';
break;
case 6:
$service_info['status_text'] = '财务待退款';
break;
case 7:
$service_info['status_text'] = '已完成';
break;
case 8:
$service_info['status_text'] = '拒绝退款';
break;
case 99:
$service_info['status_text'] = '已取消';
break;
}
$service_info['type_text'] = '';
switch ($service_info['type'])
{
case 1:
$service_info['type_text'] = '仅退款';
break;
case 2:
$service_info['type_text'] = '退货退款';
break;
}
$service_info['reason_text'] = '';
switch ($service_info['reason'])
{
case 1:
$service_info['reason_text'] = '质量问题';
break;
case 2:
$service_info['reason_text'] = '发货错';
break;
case 3:
$service_info['reason_text'] = '未按照约定时间发货';
break;
case 3:
$service_info['reason_text'] = '其他';
break;
}
$service_info['create_time'] = date("Y-m-d",$service_info['create_time']);
$service_info['update_time'] = date("Y-m-d",$service_info['update_time']);
return $service_info;
}
//申请售后
public function addService($parames)
{
if(!isset($parames['user_id']) || !$parames['user_id']){
throw new Exception('用户不存在');
}
if(!isset($parames['order_id']) || !$parames['order_goods_id']){
throw new Exception('订单不存在');
}
if(!isset($parames['order_goods_id']) || !$parames['order_goods_id']){
throw new Exception('订单商品不存在');
}
if(!isset($parames['type']) || !$parames['type']){
throw new Exception('类型不能为空');
}
if(!isset($parames['reason']) || !$parames['reason']){
throw new Exception('原因不能为空');
}
if(!isset($parames['refund_price']) || !$parames['refund_price']){
throw new Exception('退款金额不能为空');
}
if(!isset($parames['refund_content']) || !$parames['refund_content']){
throw new Exception('退款说明不能为空');
}
try{
Db::startTrans();
$parames['status'] = 1;
$parames['create_time'] = time();
$parames['update_time'] = time();
$service_id = Db::name('order_goods_service')->insertGetId($parames);
$order_goods = Db::name('order_goods')->where('id',$parames['order_goods_id'])->update(['service_id'=>$service_id]);
Db::commit();
return $this->getServiceInfo($parames);
}catch (Exception $exception){
Db::rollback();
throw new Exception($exception->getMessage());
}
}
//审核售后
public function auditService($id,$status,$admin_user_id)
{
try{
Db::startTrans();
$service = Db::name('order_goods_service')->find($id);
if($service){
$update['id'] = $id;
$update['status'] = $status;
$update['admin_user_id'] = $admin_user_id;
$update['update_time'] = time();
$count = Db::name('order_goods_service')->update($update);
if($count){
if($status == 7){
//todo 支付宝和微信现金退款操作
//todo 扣除订单提成总额
$order = Db::name('order_info')->where('order_id',$service['order_id'])->find();
$order_goods = Db::name('order_goods')->where('id',$service['order_goods_id'])->find();
$order['cs_percentage'] = $order['cs_percentage'] - $order_goods['cs_proportion_price'];
Db::name('order_info')->where('order_id',$service['order_id'])->update(['cs_percentage'=>$order['cs_percentage']]);
}
$admin_log['type'] = 'update';
$admin_log['mark_type'] = 'process_order';
$admin_log['mark_key'] = $service['order_id'];
switch ($status)
{
case 2:
$admin_log['content'] = "<p>审核通过订单售后需退货服务单, 订单ID为" . $service['order_id'] . "。服务单ID为".$id."。 </p>";
break;
case 3:
$admin_log['content'] = "<p>审核通过订单售后直接退款服务单, 订单ID为" . $service['order_id'] . "。服务单ID为".$id."。 </p>";
break;
case 4:
$admin_log['content'] = "<p>审核拒绝订单售后服务单, 订单ID为" . $service['order_id'] . "。服务单ID为".$id."。 </p>";
break;
case 6:
$admin_log['content'] = "<p>客服收到售后退货商品, 订单ID为" . $service['order_id'] . "。服务单ID为".$id."。 </p>";
break;
case 7:
$admin_log['content'] = "<p>财务已退款订单售后服务单, 订单ID为" . $service['order_id'] . "。服务单ID为".$id."。 </p>";
break;
case 8:
$admin_log['content'] = "<p>财务拒绝退款订单售后服务单, 订单ID为" . $service['order_id'] . "。服务单ID为".$id."。 </p>";
break;
}
AdminLogModel::create($admin_log);
Db::commit();
return true;
}
}
Db::rollback();
throw new Exception('售后单不存在');
}catch (Exception $exception){
Db::rollback();
throw new Exception($exception->getMessage());
}
}
//提交退货物流
public function submitService($parames)
{
if(!isset($parames['user_id']) || !$parames['user_id']){
throw new Exception('用户不存在');
}
if(!isset($parames['id']) || !$parames['id']){
throw new Exception('服务不存在');
}
if(!isset($parames['express']) || !$parames['express']){
throw new Exception('物流公司不能为空');
}
if(!isset($parames['express_sn']) || !$parames['express_sn']){
throw new Exception('物流单号不能为空');
}
$parames['status'] = 5;
$count = Db::name('order_goods_service')->update($parames);
if($count){
return $this->getServiceInfo($parames);
}
throw new Exception('操作失败');
}
//取消售后
public function cancelService($parames)
{
if(!isset($parames['user_id']) || !$parames['user_id']){
throw new Exception('用户不存在');
}
if(!isset($parames['id']) || !$parames['id']){
throw new Exception('服务不存在');
}
$parames['status'] = 99;
$count = Db::name('order_goods_service')->update($parames);
if($count){
return $this->getServiceInfo($parames);
}
throw new Exception('操作失败');
}
//ajax获取订单列单
public function getOrderList($parames){
if(!isset($parames['user_id']) || !$parames['user_id']){
throw new Exception('用户不存在');
}
$_where[] = ['user_id','=',$parames['user_id']];
$where_string = '';
$now_time = date("Y-m-d H:i:s");
$agent = $parames['agent']??2;
$_order = ["order_id" => 'desc'];
$order_status = $parames['order_status']??'';
switch ($order_status){
case 1://待付款
$where_string = "(pay_status = 0 AND status = 0) or (pay_status = 0 AND status = 6)";
break;
case 2://待发货
case 5://待确认
$where_string = "(status = 6 AND ((pay_type in (2,3,4,5) AND express_status = 0 AND pay_status = 1) or (pay_type = 1 AND express_status = 0) or (pay_type = 2 AND express_status = 0 AND pay_status = 1)))";
break;
// case 5://待确认
// $_where[] = ['status','=',0];
// $_where[] = ['deadline_time','>',$now_time];
case 3://已完成
$_where[] = ['status','in',[1,7]];
break;
case 4://已取消
$where_string = "status in (2,3,4) or (status = 0 and deadline_time < '".$now_time."')";
break;
case 6://已发货
$_where[] = ['express_status','=',1];
$_where[] = ['status','not in',[1,7]];
break;
}
$search_data['page'] = 1;
$search_data['limit'] = 8;
if(isset($parames['page']) && $parames['page']){
$search_data['page'] = $parames['page'];
}
if(isset($parames['limit']) && $parames['limit']){
$search_data['limit'] = $parames['limit'];
}
$order_list = [];
$_field = "order_id,order_sn,status,pay_type,pay_status,express_status,express_name,express_sn,shipping_fee,pay_voucher,goods_amount,total_amount,create_time,deadline_time,order_contract_url";
$order_list = Db::name("order_info")->field($_field)->where($_where)->where($where_string)->order($_order)->paginate($search_data['limit'], false, ['page' => $search_data['page']]);
$order_id_group = [];
foreach ($order_list as $order)
{
$order_id_group[] = $order['order_id'];
}
unset($_where);
$_where[] = ['og.order_id','in',$order_id_group];
$order_goods = Db::name("order_goods")->alias("og")
->leftJoin('goods g','g.goods_id = og.goods_id')
->leftJoin('manufacturer m','m.id=g.manufacturer_id')
->where($_where)->field("og.id,og.order_id,og.batch_id,og.type,og.extend_data,og.goods_number,og.unit_price,g.name,g.unit,g.spec_desc,g.pc_thumb,g.app_thumb,m.name as manufacturer_name")->select();
$goods_list = [];
foreach ($order_goods as $item){
if (!empty($item['type']) && $item['type'] == 'extend'){
$json_data = json_decode($item['extend_data'],true);
$item['name'] = $json_data['name'];
$item['unit'] = $json_data['unit'];
$item['spec_desc'] = $json_data['spec_desc'];
$item['app_thumb'] = $json_data['gallery'][0]??'';
$item['manufacturer_name'] = $json_data['manufacturer_name'];
}else{
$item['app_thumb'] = $item['app_thumb']??$item['pc_thumb'];
}
if(!$item['app_thumb']){
$item['app_thumb'] = $item['pc_thumb'];
}
if(strpos($item['app_thumb'],'null') !== false && $item['app_thumb']){
$item['app_thumb'] = '';
}
if(strpos($item['app_thumb'],'http') === false && $item['app_thumb']){
$item['app_thumb'] = 'https://'.$item['app_thumb'];
}
$goods_list[$item['order_id']]['list'][] = $item;
if(!isset($goods_list[$item['order_id']]['num'])){
$goods_list[$item['order_id']]['num'] = 0;
}
$goods_list[$item['order_id']]['num'] += $item['goods_number'];
}
$order_arr = [];
foreach ($order_list as $key => $item){
if($item['pay_voucher'] && $item['pay_voucher'] != '[""]' && $item['pay_voucher'] != 'null'){
$item['pay_voucher'] = implode(',',json_decode($item['pay_voucher']));
}else{
$item['pay_voucher'] = '';
}
$item['need_cs_confirm'] = 0;
if ($item['status'] == 0 && $item['deadline_time'] > date("Y-m-d H:i:s")){
$item['need_cs_confirm'] = 1;
}
$item['cancel_flag'] = 0;
if(($item['status'] == 6 && $item['pay_status'] == 0 && $item['express_status'] == 0) || ($item['status'] == 0 && $item['deadline_time'] > date("Y-m-d H:i:s"))){
$item['cancel_flag'] = 1;
}
$item['need_pay'] = 0;
if($item['pay_status'] == 0 && ($item['status'] == 6 || ($item['status'] == 0 && $item['deadline_time'] > date("Y-m-d H:i:s")))){
$item['need_pay'] = 1;
}
$item['agent'] = $agent;
$item['order_status'] = get_order_icon_status($item,$now_time);
$item['order_status_str'] = get_order_status_text($item['order_status']);
$item['goods_list'] = $goods_list[$item['order_id']]['list']??[];
$item['total_num'] = $goods_list[$item['order_id']]['num']??0;
$order_list[$key] = $item;
}
return $order_list;
}
//ajax获取订单列单
public function getOrderCount($parames){
if(!isset($parames['user_id']) || !$parames['user_id']){
throw new Exception('用户不存在');
}
$_where[] = ['user_id','=',$parames['user_id']];
$where_string = '';
$now_time = date("Y-m-d H:i:s");
$agent = $parames['agent']??2;
$_order = ["order_id" => 'desc'];
$order_status = $parames['order_status']??'';
switch ($order_status){
case 1://待付款
$where_string = "(pay_status = 0 AND status = 0) or (pay_status = 0 AND status = 6)";
break;
case 2://待发货
case 5://待确认
$where_string = "(status = 6 AND ((pay_type in (2,3,4,5) AND express_status = 0 AND pay_status = 1) or (pay_type = 1 AND express_status = 0) or (pay_type = 2 AND express_status = 0 AND pay_status = 1)))";
break;
// case 5://待确认
// $_where[] = ['status','=',0];
// $_where[] = ['deadline_time','>',$now_time];
case 3://已完成
$_where[] = ['status','in',[1,7]];
break;
case 4://已取消
$where_string = "status in (2,3,4) or (status = 0 and deadline_time < '".$now_time."')";
break;
case 6://已发货
$_where[] = ['express_status','=',1];
$_where[] = ['status','not in',[1,7]];
break;
}
$_field = "order_id";
$count = Db::name("order_info")->field($_field)->where($_where)->where($where_string)->order($_order)->count();
return $count;
}
//获取订单详情
public function orderDetail($parames){
if(!isset($parames['user_id']) || !$parames['user_id']){
throw new Exception('用户不存在');
}
if(!isset($parames['order_id']) || !$parames['order_id']){
throw new Exception('订单不存在');
}
$order_id = $parames['order_id']??'';
$agent = $parames['agent']??2;
$_where[] = ['user_id',"=",$parames['user_id']];
$_where[] = ['order_id',"=",$parames['order_id']];
$_field = "order_id,order_sn,status,pay_type,pay_status,express_status,express_name,shipping_fee,goods_amount,total_amount,address_id,express_name,express_sn,create_time,shipping_time,pay_time,finished_time,deadline_time,remark";
$order_detail = Db::name("order_info")->field($_field)->where($_where)->find();
if (empty($order_detail)){
throw new Exception('订单不存在');
}
$now_time = time();
$order_detail['count_down'] = 0;
if ($order_detail['status'] == 0 && $order_detail['pay_type'] == 2 && ($order_detail['deadline_time'] > date("Y-m-d H:i:s"))){
$order_detail['count_down'] = 1;
$left_time = strtotime($order_detail['deadline_time']) - $now_time;
$order_detail['left_time'] = get_left_time($left_time);
}
$order_detail['agent'] = $agent;
$order_detail['order_status'] = get_order_icon_status($order_detail,$now_time);
$order_detail['order_status_str'] = get_order_status_text($order_detail['order_status']);
$order_detail['can_pay'] = 0;
if($order_detail['pay_status'] == 0 && (($order_detail['status'] == 0 && $order_detail['deadline_time'] > date("Y-m-d H:i:s")) || ($order_detail['status'] == 6))){
$order_detail['can_pay'] = 1;
}
$order_detail['need_cs_confirm'] = 0;
if ($order_detail['status'] == 0 && $order_detail['deadline_time'] > date("Y-m-d H:i:s")){
$order_detail['need_cs_confirm'] = 1;
}
$order_detail['cancel_flag'] = 0;
if(($order_detail['status'] == 6 && $order_detail['pay_status'] == 0 && $order_detail['express_status'] == 0) || ($order_detail['status'] == 0 && $order_detail['deadline_time'] > date("Y-m-d H:i:s"))){
$order_detail['cancel_flag'] = 1;
}
switch ($order_detail['pay_type'])
{
case 1:
$order_detail['pay_type_text'] = '货到付款';
break;
case 2:
$order_detail['pay_type_text'] = '线下支付';
break;
case 3:
$order_detail['pay_type_text'] = '小程序支付';
break;
case 4:
$order_detail['pay_type_text'] = '微信支付';
break;
case 5:
$order_detail['pay_type_text'] = '支付宝支付';
break;
}
//订单商品
$_field = 'og.goods_id,og.batch_id,og.unit_price,og.spread_unit_price,og.spread_flag,og.type,og.goods_number,og.is_delete,g.name,g.spec_desc,g.pc_thumb,g.app_thumb,gb.batch_number,m.name as manufacturer_name,gb.term_validity,gb.retail_flag';
$_order_where[] = ["og.order_id","=",$order_id];
$_order_where[] = ["og.type","=",""];
$order_goods = Db::name("order_goods")->alias("og")->field($_field)->join('goods_batch gb','og.batch_id = gb.batch_id')
->join('goods g','g.goods_id = gb.goods_id')->join('manufacturer m','m.id = g.manufacturer_id')->where($_order_where)->select();
//已无效商品初始化
$invalid_order_goods = [];
foreach ($order_goods as $k => $item){
if ($item['spread_flag']){
$order_goods[$k]['total'] = sprintf("%.2f",$item['goods_number'] * $item['spread_unit_price']);
}else{
$order_goods[$k]['total'] = sprintf("%.2f",$item['goods_number'] * $item['unit_price']);
}
if ($item['is_delete']){
$invalid_order_goods[] = $order_goods[$k];
unset($order_goods[$k]);
}
$order_goods[$k]['app_thumb'] = $order_goods[$k]['app_thumb']?:$order_goods[$k]['pc_thumb'];
if(strpos($order_goods[$k]['app_thumb'],'null') !== false && $order_goods[$k]['app_thumb']){
$order_goods[$k]['app_thumb'] = '';
}
if(strpos($order_goods[$k]['app_thumb'],'http') === false && $order_goods[$k]['app_thumb']){
$order_goods[$k]['app_thumb'] = 'https://'.$order_goods[$k]['app_thumb'];
}
}
/****************************/
$extend_where[] = ["order_id","=",$order_id];
$extend_where[] = ["type","=","extend"];
$extend_goods_list = Db::name("order_goods")->field("id,goods_id,batch_id,unit_price,spread_unit_price,spread_flag,goods_number,extend_data,is_delete")->where($extend_where)->select();
//已无效拓展商品初始化
$invalid_extend_order_goods = [];
foreach ($extend_goods_list as $k=>$item){
$json_data = json_decode($item['extend_data'],true);
$extend_goods_list[$k]['name'] = $json_data['name'];
$extend_goods_list[$k]['type'] = 'extend';
$extend_goods_list[$k]['retail_flag'] = $json_data['retail_flag'];
$extend_goods_list[$k]['unit'] = $json_data['unit'];
$extend_goods_list[$k]['batch_number'] = $json_data['batch_number'];
$extend_goods_list[$k]['manufacturer_name'] = $json_data['manufacturer_name'];
$extend_goods_list[$k]['spec_desc'] = $json_data['spec_desc'];
$extend_goods_list[$k]['total'] = sprintf("%.2f",$item['unit_price'] * $item['goods_number']);
$extend_goods_list[$k]['app_thumb'] = $json_data['gallery'][0]??'';
$extend_goods_list[$k]['term_validity'] = $json_data['term_validity'];
if ($item['is_delete']){
$invalid_extend_order_goods[] = $extend_goods_list[$k];
unset($extend_goods_list[$k]);
}
}
$order_goods = array_values(array_merge($order_goods, $extend_goods_list));
$invalid_order_goods = array_values(array_merge($invalid_order_goods, $invalid_extend_order_goods));
/*******************************/
//收货地址
$user_address = Db::name("user_address")->field("area_id,address,consignee,tel")->where('id',$order_detail['address_id'])->find();
$area_list = AppConstant::getAreaList();
$area_id = $user_address['area_id'];
$area_name = '';
if($area_id){
if (isset($area_list[$area_id]['grand_pa_id'])){
$grand_pa_id = $area_list[$area_id]['grand_pa_id'];
$area_name .= $area_list[$grand_pa_id]['area_name'];
}
if (isset($area_list[$area_id]['parent_area_id'])){
$parent_area_id = $area_list[$area_id]['parent_area_id'];
$area_name .= $area_list[$parent_area_id]['area_name'];
}
$area_name .= $area_list[$area_id]['area_name'];
$area_name .= $user_address['address'];
}
$user_address['address'] = $area_name;
// 买家信息
$buyer_info = Db::name("buyer")->field("organization_code,invoice_title")->where('buyer_user_id',$parames['user_id'])->find();
$res_return['invalid_order_goods'] = $invalid_order_goods;
$res_return['buyer_info'] = $buyer_info;
$res_return['user_address'] = $user_address;
$res_return['order_goods'] = $order_goods;
$res_return['order_detail'] = $order_detail;
$res_return['cancel_reason'] = config('SYSTEM_CONSTANT')['PRE_SET_CANCEL_ORDER_REASON'];
return $res_return;
}
//提交处理
public function submitOrder($parames)
{
if(!isset($parames['user_id']) || !$parames['user_id']){
throw new Exception('用户不存在');
}
if (!isset($parames['id_group']) || !$parames['id_group']){
throw new Exception('参数错误');
}
$id_group = explode(",", $parames['id_group']);
//关于用户资质到期--初始化处理,此处不处理
//收货信息:地址、电话、联系人
//1.客户选择前文系统返回的收货信息 2.客户新增收货信息
$address = $parames['address']??'';
if (!$address){
throw new Exception('收货地址未设置');
}
//收货地址-逻辑对应前文预购单页面返回唯一地址(默认收货地址唯一 or 默认收货地址)@todo 多收货地址后期处理
$area_list = AppConstant::getAreaList();
$user_address = Db::name("user_address")->field("id,area_id,address,consignee,tel")->where("user_id",$parames['user_id'])->find();
if(!$user_address){
throw new Exception('系统异常,请稍后重试!');
}
$area_id = $user_address['area_id'];
$area_name = '';
if (isset($area_list[$area_id]['grand_pa_id'])){
$grand_pa_id = $area_list[$area_id]['grand_pa_id'];
$area_name .= $area_list[$grand_pa_id]['area_name'];
}
if (isset($area_list[$area_id]['parent_area_id'])){
$parent_area_id = $area_list[$area_id]['parent_area_id'];
$area_name .= $area_list[$parent_area_id]['area_name'];
}
$area_name .= $area_list[$area_id]['area_name'].$user_address['address'];
//购物车表是否存在该用户当前提交的数据;联结价格表获取价格以及提成设置
$where = [];
$where[] = ['uc.id','in',$id_group];
$where[] = ['uc.user_id','=',$parames['user_id']];
$cart_check = Db::name('user_cart')->alias('uc')->where($where)->leftJoin('goods_batch_area_relation gba','gba.id=uc.price_id')
->join('goods_batch gb','gba.batch_id=gb.batch_id')
->column('uc.id,uc.goods_number,uc.unit_price,uc.batch_id,uc.type,uc.extend_data,gba.price,gba.platform_royalty,gb.goods_id,uc.price_id','uc.id');
if (count($cart_check)!=count($id_group)){
throw new Exception('商品状态已变化,请检查购物车再提交!');
}
//数量、金额校验
$total_amount = 0;
$total_number = 0;
$plat_product_data = [];
$extend_product_data = [];//下文流通商品校验预设数据
$cs_percentage = 0.00;//提成金额预设--order_info
foreach ($cart_check as $uid=>$item){
$total_amount += sprintf("%.2f",$item['unit_price']*$item['goods_number']);
$total_number += $item['goods_number'];
if ($item['type']=='extend'){
$tmp1 = json_decode($item['extend_data'],true);
$tmp2 = $item;
$tmp2['extend_data'] = $tmp1;
$extend_product_data[] = $tmp2;
$cs_percentage+= sprintf("%.2f",$item['unit_price']*$item['goods_number']*0.005);
}else{
$cs_percentage+= sprintf("%.4f",$item['unit_price']*$item['goods_number']*$item['platform_royalty']);
$item['name'] = '';
$item['spec_desc'] = '';
$item['manufacturer_name'] = '';
$plat_product_data[] = $item;
}
}
//商品详情校验:优势+流通
//优势
$fields = 'uc.id,uc.price_type,uc.price_id,uc.goods_number,uc.unit_price,uc.type,uc.extend_data,g.name as goods_name,g.country_code,g.drug_form,g.unit,g.spec_desc,m.name as manufacturer_name,';
$fields .= 'gb.batch_id,gb.goods_id,gb.supplier_id,gb.retail_flag,gb.batch_number,gb.retail_num,gb.entirety_num,gb.term_validity,gb.stock_num,gb.sale_num,gb.total_num,';
$fields .= 'gba.price,gba.platform_royalty,gba.new_price,gba.discount_price,gba.discount_num,gba.discount_start_time,gba.discount_end_time';
$where = [];
$where[] = ['uc.id','in',$id_group];
$where[] = ['gba.is_onshelf','=',1];
$where[] = ['gba.is_delete','=',0];
$where[] = ['gb.batch_status','=',1];
$where[] = ['g.status','=',1];
$where[] = ['g.is_online_sale','=',0];
$where[] = ['uc.type','=',''];//限定检测优势商品
$user_cart_data = Db::name('user_cart')->alias('uc')
->join('goods_batch_area_relation gba','uc.price_id=gba.id')
->join('goods_batch gb','gb.batch_id=uc.batch_id')
->join('goods g','g.goods_id=gb.goods_id')
->join('manufacturer m','m.id=g.manufacturer_id')
->where($where)->column($fields,'uc.id');
$cart_check_status = true;
$cart_check_msg = '';
//数量
if (count($user_cart_data)!=count($plat_product_data)){
$cart_check_status = false;
$cart_check_msg = '商品数量不一致!';
}
//价格+库存; add活动商品减去活动商品数量(仅优势商品)
if ($cart_check_status){
$goods_batch_stock_update = [];
$price_change_up = false;//更新价格
foreach ($user_cart_data as $uid=>$value){
//价格更新:优势+流通
$price_query = model(GoodsService::class)->getGoodsDetail($parames['user_info'],$value['price_id']);
if ($price_query['code']!=200){
throw new Exception($price_query['message'],$price_query['code']);
}else{
$price_compare = $price_query['data']['price']??0;
if ((!$price_compare) || (!($price_compare*10000))){
throw new Exception('部分商品状态已变化,请查看后重新下单!',-1015);
}
if ($price_compare!=$value['unit_price']){
//先更新价格,循环结束后再抛异常
$_where_tmp = [];
$_where_tmp[] = ['id','=',$value['id']];
$_where_tmp[] = ['user_id','=',$parames['user_id']];
$up_data_tmp = [];
$up_data_tmp['unit_price'] = $price_compare;
$up_data_tmp['update_time'] = date('Y-m-d H:i:s',time());
$up_res_tmp = Db::name('user_cart')->where($_where_tmp)->update($up_data_tmp);
if ($up_res_tmp){
$price_change_up = true;
}
}
}
if ((!($value['unit_price']*10000)) || ($value['goods_number']>$value['stock_num'])){
$cart_check_status = false;
$cart_check_msg .= $value['goods_name'].':价格/库存异常!';
continue;
}
//减库存
$tmp_data = [];
$tmp_data['batch_id'] = $value['batch_id'];
$tmp_data['stock_num'] = $value['stock_num']-$value['goods_number'];
$tmp_data['sale_num'] = $value['sale_num']+$value['goods_number'];
$tmp_data['total_num'] = $value['total_num']+$value['goods_number'];
$tmp_data['update_time'] = date('Y-m-d H:i:s');
$tmp_data['update_ip'] = \request()->ip();
$goods_batch_stock_update[] = $tmp_data;
if ($value['supplier_id']!=10006 && $value['price_type']==0){
$ac_where = [];
$ac_where[] = ['price_id','=',$value['price_id']];
$ac_where[] = ['goods_id','=',$value['goods_id']];
$is_activity_goods = Db::name('activity_goods_relation')->where($ac_where)->find();
if($is_activity_goods && $value['discount_num']){
//减活动商品数量
$ac_goods_num_now = $value['discount_num'];
if ($ac_goods_num_now){
if ($ac_goods_num_now-$value['goods_number'] >= 0){
$price_up_tmp = [];
$price_up_tmp['discount_num'] = $ac_goods_num_now-$value['goods_number'];
Db::name('goods_batch_area_relation')->where('id',$value['price_id'])->update($price_up_tmp);
}
}
}
}
}
if ($price_change_up){
throw new Exception('部分商品在售价格已变化,请到购物车或商品页查看后重新下单!',-1019);
}
if ($goods_batch_stock_update){
$goodsBatchObj = new GoodsBatchModel();
$goodsBatchObj->isUpdate(true)->saveAll($goods_batch_stock_update);//异常自动抛出
}
}
if (!$cart_check_status){
throw new Exception($cart_check_msg);
}
//事务写入order_info+order_goods其他buyer采购历史总量+goods商品销售累积在收到货款以后实现
$order_sn = generate_order_sn($parames['user_id']);//生成单号
Db::startTrans();
try{
//order_info;未处理字段如pay_status、express_xx(快递字段)数据表默认值实现
//订单合同生成业务其他位置处理
$shipping_fee_amount = 0;//运费暂时单独客服跟进沟通方式处理,@todo 后期规划运费计算模型
$shipping_fee_amount = getShippingFee($total_amount,$total_number);
$valid_duration = config('SYSTEM_CONSTANT')['ORDER_VALID_DURATION'];//截止期
//@todo 收货地址及收件人写入订单信息
$orderInfoData = [];
$orderInfoData['order_sn'] = $order_sn;
$orderInfoData['user_id'] = $parames['user_id'];
$orderInfoData['address_id'] = $parames['address_id']??0;
$orderInfoData['shipping_fee'] = $shipping_fee_amount;
$orderInfoData['goods_amount'] = $total_amount;
$orderInfoData['total_amount'] = $total_amount+$shipping_fee_amount;
$orderInfoData['remark'] = $parames['remark'];
$orderInfoData['pay_type'] = 0;
// $custom_service_id = $data['custom_service_id']??0;
// $orderInfoData['custom_service_id'] = $custom_service_id ;
$orderInfoData['cs_percentage'] = number_format(ceil($cs_percentage*100)/100,2,'.','')??'0.00';//完善提成金额
$orderInfoData['create_time'] = date('Y-m-d H:i:s');
$orderInfoData['deadline_time'] = date('Y-m-d H:i:s', (time() + (20 * 86400)));
//$order_info_res = OrderInfoModel::create($orderInfoData);
$order_info_res =Db::name('order_info')->insertGetId($orderInfoData);
//此处模型操作没有自动抛出异常,手动抛出
if (!$order_info_res){
throw new \think\Exception('fail to insert into table oi',-114);
}
//order_goods
$order_id = $order_info_res;
$order_goods_insert = [];
$order_goods_data = array_merge($plat_product_data,$extend_product_data);
foreach ($order_goods_data as $k=>$v){
$tmp = [];
$tmp['order_id'] = $order_id;
$tmp['goods_id'] = $v['goods_id']??$v['extend_data']['extend_goods_id'];
$tmp['batch_id'] = $v['batch_id'];
$tmp['price_id'] = $v['price_id'];
//$tmp['batch_type'] = '';//直销、控销、分销
$tmp['unit_price'] = $v['unit_price'];
$tmp['spread_unit_price'] = $v['unit_price'];//业务员推广价--暂不请用设置为销售价
$tmp['spread_flag'] = 0;//暂不启用业务员推广价/代理价
$tmp['goods_number'] = $v['goods_number'];
$tmp['first_buy'] = 0;//@todo 首营检测默认0-否
//配合数据库修改
$tmp['cs_proportion'] = sprintf("%.2f",($v['platform_royalty']??0.0050));
$tmp['cs_proportion_price'] = sprintf("%.2f",($v['platform_royalty']??0.0050)*$v['unit_price']*$v['goods_number']);
$tmp['create_time'] = date('Y-m-d H:i:s');
$tmp['type'] = $v['type'];
$tmp['extend_data'] = $v['extend_data'];
if ($v['extend_data']){
// $v['extend_data'] = json_decode($v['extend_data'],true);
$tmp['name'] = $v['extend_data']['name'];
$tmp['spec_desc'] = $v['extend_data']['spec_desc'];
$tmp['manufacturer_name'] = $v['extend_data']['manufacturer_name'];
}else{
$tmp['name'] = '';
$tmp['spec_desc'] = '';
$tmp['manufacturer_name'] = '';
}
$order_goods_insert[] = $tmp;
}
if ($order_goods_insert){
try{
$og_insert = Db::name('order_goods')->json(['extend_data'])->insertAll($order_goods_insert);
}catch (Exception $e){
throw new Exception($e->getMessage());
}
}
//购物车更新-删除已下单商品
$uc_where = [];
$uc_where[] = ['user_id','=',$parames['user_id']];
$uc_where[] = ['id','in',$id_group];
$uc_result = Db::name('user_cart')->where($uc_where)->delete();
if ($uc_result!=count($id_group)){
throw new \think\Exception('error in uc',-189);
}
//更新购物车缓存数据,处理优势商品即可,流通商品实时更新
UserCart::instance($parames['user_id'])->reCreateCartCache(true);
Db::commit();
$res['order_id'] = $order_info_res;
return $res;
}catch (\think\Exception $e){
Db::rollback();
throw new \think\Exception($e->getMessage());
}
}
//预览订单
public function preOrder($parames){
if(!isset($parames['user_id']) || !$parames['user_id']){
throw new Exception('用户不存在');
}
if (!isset($parames['id_group']) || !$parames['id_group']){
throw new Exception('参数不合法');
}
$auth = model(UserService::class)->checkAuth($parames);
if($auth != 'finish'){
throw new Exception('请先进行企业认证');
}
$cart_id_group = explode(',',$parames['id_group']);
$product_plat = [];//优势
$product_extend = [];//流通
//用户状态检测初始化已处理,此处无需处理
$fields = 'id,user_id,batch_id,price_id,unit_price,goods_number,type,extend_data';
$user_id = $parames['user_id'];
$where = [];
$where[] = ['user_id','=',$user_id];
$where[] = ['id','in',$cart_id_group];
//@todo 改为从缓存获取(购物车数据维护类实现缓存)
$pre_data = Db::name('user_cart')->alias('uc')->field($fields)->where($where)->column($fields,'id');
if (!$pre_data){
throw new Exception('请检查购物车!');
}
foreach ($pre_data as $id=>$v){
if ($v['type']=='extend'){
$product_extend[] = $v;
$product_extend['batch_id'][] = $v['batch_id'];
}else{
$product_plat[] = $v;
$product_plat['price_id'][] = $v['price_id'];
}
}
$errorIds = [];
//优势商品,返回错误,小程序页面主动刷新,并更新到最新状态
if (isset($product_plat['price_id'])&&$product_plat['price_id']){
$_where = [];
$_where[] = ['gba.id','in',$product_plat['price_id']];
$_where[] = ['gba.is_onshelf','=',1];
$_where[] = ['gba.is_delete','=',0];
$_where[] = ['gb.batch_status','=',1];
$_where[] = ['g.status','=',1];
$_where[] = ['g.is_online_sale','=',0];
$fields = 'gba.price,gba.is_onshelf,batch_number,gb.batch_status,gb.batch_id,g.status,g.name';
$plat_product_now = Db::name('goods_batch_area_relation')->alias('gba')
->join('goods_batch gb','gb.batch_id=gba.batch_id')
->join('goods g','g.goods_id=gb.goods_id')
->where($_where)->column($fields,'gba.id');
if (count($plat_product_now)!=count($product_plat['price_id'])){
$priceArr = array_column($plat_product_now, null,'price_id');
foreach ($product_plat['price_id'] as $k=>$v)
{
if(!isset($priceArr[$v])){
$batch_id = Db::name('goods_batch_area_relation')->alias('gba')
->join('goods_batch gb','gb.batch_id=gba.batch_id')
->where('gba.id',$v)->value('gb.batch_id');
$errorIds[] = $batch_id;
}
}
}else{
foreach ($plat_product_now as $pid=>$item){
foreach ($product_plat as $kk=>$vv){
//@todo 此处较乱后期更改数量上述if判断已经校验
if ($kk!='price_id' && $vv['price_id']==$pid){
if ($vv['unit_price']!=$item['price']){
$errorIds[] = $item['batch_id'];
}
}
}
}
}
}
//预提交订单页面所需数据
$res = [];
//收货地址
$area_list = AppConstant::getAreaList();
$user_address = Db::name("user_address")->field("id,area_id,address,consignee,tel")->where("user_id",$parames['user_id'])->find();
if ($user_address){
$area_id = $user_address['area_id'];
$area_name = '';
if (isset($area_list[$area_id]['grand_pa_id'])){
$grand_pa_id = $area_list[$area_id]['grand_pa_id'];
$area_name .= $area_list[$grand_pa_id]['area_name'];
}
if (isset($area_list[$area_id]['parent_area_id'])){
$parent_area_id = $area_list[$area_id]['parent_area_id'];
$area_name .= $area_list[$parent_area_id]['area_name'];
}
$area_name .= $area_list[$area_id]['area_name'];
$user_address['address'] = $area_name.$user_address['address'];
}
$res['address'] = $user_address;//多个收货地址前端展示select
//商品信息(名称、数量、单价、合计金额)
$res['goods_list'] = [];
if ($product_plat){
$plat_where = [];
$plat_where[] = ['uc.price_id','in',$product_plat['price_id']];
$plat_where[] = ['uc.user_id','=',$parames['user_id']];
$fields_plat = 'uc.id,uc.goods_number,uc.unit_price,g.name as goods_name,g.country_code,g.drug_form,g.unit,g.spec_desc,m.name as manufacturer_name,g.pc_thumb,g.app_thumb,';
$fields_plat .= 'gb.batch_id,gb.retail_flag,gb.batch_number,gb.retail_num,gb.entirety_num,gb.term_validity,gb.stock_num';
$plat_product_info = Db::name('user_cart')->alias('uc')->field($fields_plat)
->join('goods_batch gb','gb.batch_id=uc.batch_id')
->join('goods g','g.goods_id=gb.goods_id')
->join('manufacturer m','m.id=g.manufacturer_id')->where($plat_where)->select();
$res['goods_list']['plat'] = $plat_product_info;
}
$res['goods_list']['extend']=[];
if ($product_extend){
$res['goods_list']['extend']=[];
foreach ($pre_data as $k=>$v){
if ($v['type']=='extend'){
$tmp = json_decode($v['extend_data'],true);
$pc_thumb_tmp = '';
if (isset($tmp['pc_thumb'])&&$tmp['pc_thumb']){
$pc_thumb_tmp = $tmp['pc_thumb'];
}else{
if (isset($tmp['gallery'])&&$tmp['gallery']){
$pc_thumb_tmp = json_decode($tmp['gallery'],JSON_UNESCAPED_UNICODE)[0]??'ydyd-develop-file.oss-cn-hangzhou.aliyuncs.com/pc_shop_pic_url_1588925532218.jpg';
}else{
$pc_thumb_tmp = 'ydyd-develop-file.oss-cn-hangzhou.aliyuncs.com/pc_shop_pic_url_1588925532218.jpg';
}
}
if($pc_thumb_tmp == 'www.hyey.cn'){
$pc_thumb_tmp = 'ydyd-develop-file.oss-cn-hangzhou.aliyuncs.com/pc_shop_pic_url_1588925532218.jpg';
}
$res['goods_list']['extend'][] = [
'id'=>$v['id'],
'batch_id'=>$tmp['extend_goods_id'],
'goods_name'=>$tmp['name'],
'unit_price'=>$v['unit_price'],
'goods_number'=>$v['goods_number'],
'unit'=>$tmp['unit'],
'spec_desc'=>$tmp['spec_desc'],
'drug_form'=>$tmp['drug_form'],
'retail_flag'=>$tmp['retail_flag'],
'retail_num'=>$tmp['retail_num'],
'entirety_num'=>$tmp['entirety_num'],
'term_validity'=>$tmp['term_validity'],
'stock_num'=>$tmp['stock_num'],
'manufacturer_name'=>$tmp['manufacturer_name'],
'app_thumb'=>$pc_thumb_tmp,
'pc_thumb' => $pc_thumb_tmp
];
}
}
}
//运费 线下沟通 此处不处理
//$res['shipping_fee'] = '';//shipping_type送货方式
//应付总额
$total_amount = 0;
$total_number = 0;
foreach ($res['goods_list'] as $key=>$value){
if ($value){
foreach ($value as $k=>$v){
$total_amount+=sprintf("%.2f",$v['unit_price']*$v['goods_number']);
$total_number+=$v['goods_number'];
if(in_array($v['batch_id'],$errorIds)){
$res['goods_list'][$key][$k]['is_buy'] = 0;
}else{
$res['goods_list'][$key][$k]['is_buy'] = 1;
}
$res['goods_list'][$key][$k]['app_thumb'] = $res['goods_list'][$key][$k]['app_thumb']?:$res['goods_list'][$key][$k]['pc_thumb'];
if(strpos($res['goods_list'][$key][$k]['app_thumb'],'http') === false && $res['goods_list'][$key][$k]['app_thumb']){
$res['goods_list'][$key][$k]['app_thumb'] = 'https://'.$res['goods_list'][$key][$k]['app_thumb'];
}
}
}
}
$res['goods_amount'] = number_format($total_amount,2,".","");
$res['total_number'] = $total_number;
$shipping_fee = getShippingFee($total_amount,$total_number);
$res['shipping_fee'] = number_format($shipping_fee,2,".","");
$res['shipping_fee_text'] = '运费规则: 满2000元包邮 不满2000元数量每满300运费增加20元数量不满300按300算以此类推。';
$res['total_amount'] = number_format(($total_amount + $shipping_fee),2,".","");
$res['is_buy'] = 0;
if(!$errorIds){
$res['is_buy'] = 1;
}
return $res;
}
//取消订单
public function cancelOrder($parames)
{
if(!isset($parames['user_id']) || !$parames['user_id']){
throw new Exception('用户不存在');
}
if(!isset($parames['order_id']) || !$parames['order_id']){
throw new Exception('订单不存在');
}
try{
Db::startTrans();
$parames['status'] = 2;
$count = Db::name('order_info')->update($parames);
if($count){
$goods_batch_stock_update = [];
$goods_activity_stock_update = [];//活动商品数量回滚
$fields = 'og.goods_number,og.price_id,og.unit_price,';
$fields .= 'gb.supplier_id,gb.goods_id,gb.batch_id,gb.stock_num,gb.sale_num,gb.total_num';
$orderGoodsArray = Db::name('order_goods')->alias('og')->field($fields)
->join('goods_batch gb','gb.batch_id=og.batch_id')
->where('og.order_id',$parames['order_id'])
//->where('og.type','')//hy商品库存同样操作
->select();
foreach ($orderGoodsArray as $orderGoods){
//库存回滚
//1.总库存goods_batch表stock_num字段
$tmp_data = [];
$tmp_data['batch_id'] = $orderGoods['batch_id'];
$tmp_data['stock_num'] = $orderGoods['stock_num']+$orderGoods['goods_number'];
$tmp_data['sale_num'] = $orderGoods['sale_num']-$orderGoods['goods_number'];
$tmp_data['total_num'] = $orderGoods['total_num']-$orderGoods['goods_number'];
$tmp_data['update_time'] = date('Y-m-d H:i:s');
$tmp_data['update_ip'] = \request()->ip();
$goods_batch_stock_update[] = $tmp_data;
//2.活动商品数量回滚
if ($orderGoods['supplier_id']!=10006){
$ac_where = [];
$ac_where[] = ['goods_id','=',$orderGoods['goods_id']];
$ac_where[] = ['price_id','=',$orderGoods['price_id']];
$ac_exist = Db::name('activity_goods_relation')->where($ac_where)->find();
if ($ac_exist){
Db::name('goods_batch_area_relation')->where('id',$orderGoods['price_id'])->inc('discount_num',$orderGoods['goods_number'])->update();
}
}
}
if ($goods_batch_stock_update){
$goodsBatchObj = new GoodsBatchModel();
$goodsBatchObj->isUpdate(true)->saveAll($goods_batch_stock_update);//异常自动抛出
}
Db::commit();
return $count;
}else{
Db::rollback();
throw new Exception('订单状态异常');
}
}catch (Exception $exception){
Db::rollback();
throw new Exception($exception->getMessage());
}
}
//去支付
public function toPay($parames){
if(!isset($parames['user_id']) || !$parames['user_id']){
throw new Exception('用户不存在');
}
if (!isset($parames['order_id']) || !$parames['order_id']){
throw new Exception('参数不合法');
}
$order = Db::name('order_info')
->where('user_id',$parames['user_id'])
->where('order_id',$parames['order_id'])
->field('order_id,order_sn,shipping_fee,goods_amount,total_amount,create_time,deadline_time')
->find();
if(!$order){
throw new Exception('数据异常');
}
$is_new_user = Db::name('users')->where('user_id',$parames['user_id'])->value('is_new_user');
$order['is_new_user'] = $is_new_user;
return $order;
}
}