jh-admin/addon/supply/model/order/Order.php

635 lines
23 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
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
*/
namespace addon\supply\model\order;
use app\model\express\ExpressCompany;
use app\model\express\ExpressCompanyTemplate;
use app\model\express\ExpressDelivery;
use app\model\express\ExpressPackage;
use app\model\order\Order as OrderModel;
use app\model\system\Cron;
use think\facade\Cache;
use addon\supply\model\goods\GoodsStock as GoodsStockModel;
use addon\supply\model\SupplyCron;
/**
* 普通(快递)订单
*
* @author Administrator
*
*/
class Order extends OrderCommon
{
/*****************************************************************************************订单状态***********************************************/
// 订单创建
const ORDER_CREATE = 0;
// 订单已支付
const ORDER_PAY = 1;
// 订单备货中
const ORDER_PENDING_DELIVERY = 2;
// 订单已发货(配货)
const ORDER_DELIVERY = 3;
// 订单已收货
const ORDER_TAKE_DELIVERY = 4;
// 订单已结算完成
const ORDER_COMPLETE = 10;
// 订单已关闭
const ORDER_CLOSE = -1;
// 订单退款中
const ORDER_REFUND = 'refunding';
/**
* 订单类型
*
* @var int
*/
public $order_type = 1;
/***********************************************************************************订单项 配送状态**************************************************/
// 待发货
const DELIVERY_WAIT = 0;
// 已发货
const DELIVERY_DOING = 1;
// 已收货
const DELIVERY_FINISH = 2;
/**
*/
public $order_status = [
self::ORDER_CREATE => [
'status' => self::ORDER_CREATE,
'name' => '待支付',
'is_allow_refund' => 0,
'action' => [
[
'action' => 'orderClose',
'title' => '关闭订单',
'color' => ''
],
[
'action' => 'orderAddressUpdate',
'title' => '修改地址',
'color' => ''
],
[
'action' => 'orderAdjustMoney',
'title' => '调整价格',
'color' => ''
],
],
'member_action' => [
[
'action' => 'orderClose',
'title' => '关闭订单',
'color' => ''
],
[
'action' => 'orderPay',
'title' => '支付',
'color' => ''
],
],
'color' => ''
],
self::ORDER_PAY => [
'status' => self::ORDER_PAY,
'name' => '待发货',
'is_allow_refund' => 0,
'action' => [
[
'action' => 'orderDelivery',
'title' => '发货',
'color' => ''
],
[
'action' => 'orderAddressUpdate',
'title' => '修改地址',
'color' => ''
],
],
'member_action' => [
],
'color' => ''
],
self::ORDER_DELIVERY => [
'status' => self::ORDER_DELIVERY,
'name' => '已发货',
'is_allow_refund' => 1,
'action' => [
],
'member_action' => [
[
'action' => 'memberTakeDelivery',
'title' => '确认收货',
'color' => ''
],
[
'action' => 'trace',
'title' => '查看物流',
'color' => ''
]
],
'color' => ''
],
self::ORDER_TAKE_DELIVERY => [
'status' => self::ORDER_TAKE_DELIVERY,
'name' => '已收货',
'is_allow_refund' => 1,
'action' => [
],
'member_action' => [
],
'color' => ''
],
self::ORDER_COMPLETE => [
'status' => self::ORDER_COMPLETE,
'name' => '已完成',
'is_allow_refund' => 1,
'action' => [
],
'member_action' => [
],
'color' => ''
],
self::ORDER_CLOSE => [
'status' => self::ORDER_CLOSE,
'name' => '已关闭',
'is_allow_refund' => 0,
'action' => [
],
'member_action' => [
],
'color' => ''
],
self::ORDER_REFUND => [
'status' => self::ORDER_REFUND,
'name' => '退款中',
'is_allow_refund' => 0,
'action' => [
],
'member_action' => [
],
'color' => ''
]
];
/**
* 配送状态
*/
public $delivery_status = [
self::DELIVERY_WAIT => [
'status' => self::DELIVERY_WAIT,
'name' => '待发货',
'color' => ''
],
self::DELIVERY_DOING => [
'status' => self::DELIVERY_DOING,
'name' => '已发货',
'color' => ''
],
self::DELIVERY_FINISH => [
'status' => self::DELIVERY_FINISH,
'name' => '已收货',
'color' => ''
]
];
/**
* 订单状态(发货列表)
*/
public $delivery_order_status = [
self::ORDER_PAY => [
'status' => self::ORDER_PAY,
'name' => '待发货',
'is_allow_refund' => 0,
'icon' => 'upload/uniapp/order/order-icon-send.png',
'action' => [
[
'action' => 'orderDelivery',
'title' => '发货',
'color' => ''
],
[
'action' => 'orderAddressUpdate',
'title' => '修改地址',
'color' => ''
],
],
'member_action' => [],
'color' => ''
]
];
/**
* 订单支付
* @param unknown $order_info
*/
public function orderPay($order_info, $pay_type)
{
$pay_type_list = $this->getPayType();
if ($order_info['order_status'] != 0) {
return $this->error();
}
$condition = array(
["order_id", "=", $order_info["order_id"]],
["order_status", "=", self::ORDER_CREATE],
);
$data = array(
"order_status" => self::ORDER_PAY,
"order_status_name" => $this->order_status[self::ORDER_PAY]["name"],
"pay_status" => 1,
"order_status_action" => json_encode($this->order_status[self::ORDER_PAY], JSON_UNESCAPED_UNICODE),
"pay_time" => time(),
"is_enable_refund" => 1,
"pay_type" => $pay_type,
"pay_type_name" => $pay_type_list[$pay_type]
);
$result = model("supply_order")->update($data, $condition);
return $this->success($result);
}
/**
* 订单项发货(物流)
* @param $param
* @param int $type //1 订单项发货 2整体发货
* @return array
*/
public function orderGoodsDelivery($param, $type = 1)
{
model('supply_order_goods')->startTrans();
try {
$delivery_no = $param["delivery_no"];//物流单号
$delivery_type = $param["delivery_type"];
if ($delivery_type == 0) {
$express_company_id = 0;
} else {
$express_company_id = $param["express_company_id"] ?? 0;
}
$site_id = $param["site_id"];
if ($type == 1) {
if (empty($param['order_goods_ids'])) {
model('supply_order_goods')->rollback();
return $this->error('', "发送货物不可为空!");
}
$order_goods_id_array = explode(",", $param['order_goods_ids']);
} else {
$order_goods_id_array = model("supply_order_goods")->getColumn(
[
['order_id', '=', $param['order_id']],
['site_id', '=', $site_id],
['delivery_status', "=", self::DELIVERY_WAIT]
],
'order_goods_id'
);
}
$order_id = 0;
$member_id = 0;
$goods_id_array = [];
foreach ($order_goods_id_array as $k => $v) {
$order_goods_info = model("supply_order_goods")->getInfo([["order_goods_id", "=", $v], ["site_id", "=", $site_id]], "sku_id,num,order_id,sku_name,sku_image,buyer_shop_id,refund_status,delivery_status,buyer_shop_name");
//已退款的订单项不可发货
if ($order_goods_info["refund_status"] == 3) {
model('supply_order_goods')->rollback();
return $this->error([], "ORDER_GOODS_IS_REFUND");
}
if ($order_goods_info["delivery_status"] == self::DELIVERY_DOING) {
model('supply_order_goods')->rollback();
return $this->error([], 'ORDER_GOODS_IS_DELIVERYED');
}
$order_id = $order_goods_info["order_id"];
$member_id = $order_goods_info['buyer_shop_id'];
$member_name = $order_goods_info['buyer_shop_name'];
$goods_id_array[] = $order_goods_info["sku_id"] . ":" . $order_goods_info["num"] . ":" . $order_goods_info["sku_name"] . ":" . $order_goods_info["sku_image"];
$data = ["delivery_status" => self::DELIVERY_DOING, "delivery_status_name" => $this->delivery_status[self::DELIVERY_DOING]["name"]];
if (!empty($delivery_no)) {
$data['delivery_no'] = $delivery_no;
}
$res = model('supply_order_goods')->update($data, [
['order_goods_id', "=", $v],
['delivery_status', "=", self::DELIVERY_WAIT]
]);
}
//创建包裹
$order_common_model = new OrderCommon();
$lock_result = $order_common_model->verifyOrderLock($order_id);
if ($lock_result["code"] < 0) {
model('supply_order_goods')->rollback();
return $lock_result;
}
$express_delivery_model = new ExpressDelivery();
$delivery_data = array(
"order_id" => $order_id,
"order_goods_id_array" => $order_goods_id_array,
"goods_id_array" => $goods_id_array,
"goods_array" => $goods_id_array,
"site_id" => $site_id,
"delivery_no" => $delivery_no,
"member_id" => $member_id,
'member_name' => $member_name,
"express_company_id" => $express_company_id,
"delivery_type" => $delivery_type,
'type' => $param['type'],
'template_id' => $param['template_id'],
);
$result = $express_delivery_model->delivery($delivery_data);
//检测整体, 订单中订单项是否全部发放完毕
$res = $this->orderCommonDelivery($order_id);
model('supply_order_goods')->commit();
return $this->success($result);
} catch (\Exception $e) {
model('supply_order_goods')->rollback();
return $this->error('', $e->getMessage());
}
}
/**
* 订单发货
*
* @param array $condition
*/
public function orderDelivery($order_id)
{
//统计订单项目
$count = model('supply_order_goods')->getCount([['order_id', "=", $order_id], ['delivery_status', "=", self::DELIVERY_WAIT], ["refund_status", "<>", 3]], "order_goods_id");
$delivery_count = model('supply_order_goods')->getCount([['order_id', "=", $order_id], ['delivery_status', "=", self::DELIVERY_DOING], ["refund_status", "<>", 3]], "order_goods_id");
if ($count == 0 && $delivery_count > 0) {
//修改订单项的配送状态
$order_data = array(
'order_status' => self::ORDER_DELIVERY,
'order_status_name' => $this->order_status[self::ORDER_DELIVERY]["name"],
'delivery_status' => self::DELIVERY_FINISH,
'delivery_status_name' => $this->delivery_status[self::DELIVERY_FINISH]["name"],
'order_status_action' => json_encode($this->order_status[self::ORDER_DELIVERY], JSON_UNESCAPED_UNICODE),
'delivery_time' => time()
);
$res = model('supply_order')->update($order_data, [['order_id', "=", $order_id]]);
//获取订单自动收货时间
$config_model = new Config();
$event_time_config_result = $config_model->getOrderTradeConfig();
$event_time_config = $event_time_config_result["data"];
$now_time = time();//当前时间
if (!empty($event_time_config)) {
$execute_time = $now_time + $event_time_config["value"]["auto_take_delivery"] * 86400;//自动收货时间
} else {
$execute_time = $now_time + 86400;//尚未配置 默认一天
}
//默认自动时间
$cron_model = new Cron();
$cron_model->addCron(1, 1, "供应商订单自动收货", "CronSupplyOrderTakeDelivery", $execute_time, $order_id);
event('SupplyOrderDelivery', ['order_id' => $order_id]);
return $this->success($res);
} else {
return $this->error();
}
}
/**
* 订单收货
*
* @param int $order_id
*/
public function orderTakeDelivery($order_id, $order_info = [])
{
return $this->success();
}
/**
* 订单收货地址修改
*/
public function orderAddressUpdate($param, $condition)
{
$province_id = $param["province_id"];
$city_id = $param["city_id"];
$district_id = $param["district_id"];
$community_id = $param["community_id"];
$address = $param["address"];
$full_address = $param["full_address"];
$longitude = $param["longitude"];
$latitude = $param["latitude"];
$mobile = $param["mobile"];
$telephone = $param["telephone"];
$name = $param["name"];
$data = array(
"province_id" => $province_id,
"city_id" => $city_id,
"district_id" => $district_id,
"community_id" => $community_id,
"address" => $address,
"full_address" => $full_address,
"longitude" => $longitude,
"latitude" => $latitude,
"mobile" => $mobile,
"telephone" => $telephone,
"name" => $name,
);
$order_info = model("supply_order")->getInfo($condition, "order_status");
$order_status_array = [self::ORDER_PAY, self::ORDER_CREATE];
if (!in_array($order_info["order_status"], $order_status_array))
return $this->error("", "当前订单状态不可编辑收货地址!");
$result = model('supply_order')->update($data, $condition);
return $this->success($result);
}
/**
* 退款完成操作
* @param $order_info
*/
public function refund($order_goods_info)
{
//是否入库
if ($order_goods_info["is_refund_stock"] == 1) {
$goods_stock_model = new GoodsStockModel();
$item_param = array(
"sku_id" => $order_goods_info["sku_id"],
"num" => $order_goods_info["num"],
);
//返还库存
$goods_stock_model->incStock($item_param);
}
//检测订单项是否否全部发放完毕
$this->orderDelivery($order_goods_info["order_id"]);
}
/**
* 订单详情
* @param $order_info
*/
public function orderDetail($order_info, $is_logistics = true)
{
$express_package_model = new ExpressPackage();
$package_list = $express_package_model->package([["order_id", "=", $order_info['order_id']], ["site_id", '=', $order_info['site_id']]], '', '', $is_logistics);
$order_info = [];
$order_info["package_list"] = $package_list;
return $order_info;
}
/**
* 计算订单销售额
* @param array $condition
* @param string $field
* @return array
*/
public function getOrderMoneySum($condition = [], $field = 'order_money')
{
$res = model('supply_order')->getSum($condition, $field);
return $this->success($res);
}
/***
* 订单发货处理
* @param $order_id
* @return array|void
*/
public function orderDeliveryCron($order_id)
{
$orderInfo = $this->getOrderDetail($order_id, false)['data'];
if ($orderInfo) {
$res = [];
$buyer_shop_id = $orderInfo['buyer_shop_id'];
$custom_order_no = $orderInfo['custom_order_no'];
$package_list = $orderInfo['package_list'];
$orderInfo['order_from']='api';
$sup_order_sku = [];
foreach ($package_list as $k => $v) {
$goods_list = $v['goods_list'];
$sup_order_sku = array_column($goods_list, null, 'sku_id');
foreach ($goods_list as $k1 => $v1) {
unset($v1['sku_name'], $v1['sku_image']);
$sup_order_sku[$v1['sku_id']] = $v1;
$sup_order_sku[$v1['sku_id']]['delivery_no'] = $v['delivery_no'];
$sup_order_sku[$v1['sku_id']]['express_company_name'] = $v['express_company_name'];
$sup_order_sku[$v1['sku_id']]['delivery_time'] = $v['delivery_time'];
$sup_order_sku[$v1['sku_id']]['logisticsCode'] = $v['logisticsCode'];
}
}
if ($orderInfo['order_from'] == 'shop') { //自营产品订单同步
$join = [
['supply_sub_order sub', 'o.order_id=sub.order_id', 'inner'],
];
$field = 'sub.id,sub.result_product_specs_id,sub.sku_id,sub.order_id,sub.order_id,o.order_goods_id';
$order_info = model('order_goods')
->getList([['o.site_id', '=', $buyer_shop_id], ['o.order_no', '=', $custom_order_no]], $field, '', 'o', $join);
$order_goods = array_column($order_info, null, 'result_product_specs_id');
$user_info = model('user')->getInfo([['site_id', '=', $buyer_shop_id], ['app_module', '=', 'shop']]);
$order_model = new OrderModel();
$log_data = [
'uid' => $user_info['uid'],
'nick_name' => $user_info['username'],
'action' => '商家对订单进行了发货',
'action_way' => 2,
];
foreach ($order_goods as $k => $v) {
$supInfo = $sup_order_sku[$v['result_product_specs_id']];
$companyName = $supInfo['express_company_name'];
$companyNo = $supInfo['logisticsCode'];
$delivery_no = $supInfo['delivery_no'];
$express_company_id = $this->getExpressCompanyId($buyer_shop_id, $companyName, $companyNo);
$data = array(
'type' => 'manual', //发货方式(手动发货、电子面单)
'order_goods_ids' => $v['order_goods_id'],//商品id
'express_company_id' => $express_company_id,//物流公司
'delivery_no' => $delivery_no,//快递单号
'order_id' => $v['order_id'],//订单id
'delivery_type' => 1,//是否需要物流
'site_id' => $buyer_shop_id,
'template_id' => 0,//电子面单模板id
'user_info' => $user_info
);
model('supply_sub_order')->update(
[
'result_express_number' => $delivery_no,
'result_express_time' => time(),
'result_express_company' => $companyName
], [
'id' => $v['id']
]);
$res = $order_model->orderGoodsDelivery($data, 1, $log_data);
}
} else if ($orderInfo['order_from'] == 'api') {
$data=[
'out_trade_no'=>$orderInfo['out_trade_no'],
'outOrderId'=>$custom_order_no,
'message'=>$sup_order_sku,
];
$cron=new SupplyCron();
$res =$cron->AddCron($orderInfo['buyer_uid'],'LOGISTICS_BUYER_VIEW_TRACE',$data);
}
return $this->success($res);
}
}
/***
* 自动添加物流信息
* @param $site_id
* @param $company_name
* @param $express_no
* @return mixed
*/
public function getExpressCompanyId($site_id, $company_name, $express_no)
{
$where = [
['site_id', '=', $site_id],
['express_no', '=', $express_no]
];
$express_company_id = model('express_company')->getValue($where, 'company_id');
if (empty($express_company_id)) {
$data = [
'site_id' => $site_id,
'company_name' => $company_name,//物流公司名称
'sort' => 0,//排序
'logo' => '',//logo
'url' => '',//网址
'express_no' => $express_no,//编码
'express_no_kd100' => strtolower($express_no),//编码快递100
'express_no_cainiao' => strtoupper($express_no),//编码(菜鸟)
'express_no_alipay' => strtoupper($express_no),//编码(支付宝)
'content_json' => '',//打印内容
'background_image' => '',//打印背景图
'font_size' => 14,//打印字体大小 单位px
'width' => 0,//显示尺寸宽度 px
'height' => 0,//显示尺寸高度 px
'scale' => 1,//真实尺寸mm与显示尺寸px的比例
'create_time' => time(),
'is_electronicsheet' => 0,//是否支持电子面单
'print_style' => 0,//电子面单打印风格
];
$template_model = new ExpressCompanyTemplate();
$res = $template_model->addExpressCompanyTemplate($data);
if ($res['code'] >= 0) {
//添加店铺模版
$express_company_model = new ExpressCompany();
$company = $express_company_model->addExpressCompany(['site_id' => $site_id, 'company_id' => $res['data']]);
$express_company_id = $company['data'];
Cache::tag("cache_tableexpress_company")->clear();
}
}
return $express_company_id;
}
}