jh-admin/addon/supply/v1/Order.php

443 lines
19 KiB
PHP

<?php
namespace addon\supply\v1;
use addon\supply\model\goods\Goods as GoodsModel;
use addon\supply\model\order\OrderCreate;
use addon\supply\model\order\OrderCommon;
use addon\supply\model\SupplyAccount;
use app\model\express\ExpressPackage;
class Order extends ApiBase
{
/***
* 创建订单
* @param $data
* @return mixed
*/
public function fastCreateOrder()
{
$outOrderId = input('outOrderId');
$AuthPay = input('AuthPay', 0);
$buyer_message = input('buyerMessage', '');
$addressParam = input('addressParam');
$cargoParamList = input('cargoParamList');
$invoiceParam = input('invoiceParam');
$addressParam = json_decode($addressParam, true);
$cargoParamList = json_decode($cargoParamList, true);
$invoiceParam = json_decode($invoiceParam, true);
if ($outOrderId) {
$info = model('supply_order')->getValue([['buyer_shop_id', '=', $this->appInfo['site_id']], ['custom_order_no', '=', $outOrderId]], 'order_id');
if ($info) {
return error(-1, '订单已存在');
}
}
$this->ValidateData('address', $addressParam);
$cargodata = $this->createOrderData($cargoParamList);//创建订单数据
$orderCreate = new OrderCreate();
$orderData['buyer_uid'] = $this->appInfo['id'];
$orderData['buyer_shop_id'] = $this->appInfo['site_id'];
$orderData['buyer_shop_name'] = $this->appInfo['app_name'];
$orderData['outOrderId'] = $outOrderId;
$orderData['buyer_message'] = $buyer_message;
$orderData['order_from'] = 'api';
$orderData['order_from_name'] = 'API下单';
$orderData['AuthPay'] = $AuthPay;
$orderData['is_balance'] = $AuthPay;
$orderData['orderData'] = $cargodata['order_lists'];
$orderData['sku_ids_num'] = $cargodata['sku_ids_num'];
$orderData['appInfo'] = $this->appInfo;
$address = [
['name', 'in', "{$addressParam['provinceText']},{$addressParam['cityText']},{$addressParam['areaText']}"]
];
$AddressArr = model('area')->getColumn($address, 'id', 'name');
$orderData['member_address'] = [
'name' => $addressParam['fullName'] ?? '',
'mobile' => $addressParam['mobile'] ?? '',
'telephone' => $addressParam['phone'] ?? '',
'province_id' => $AddressArr[$addressParam['provinceText']] ?? '',
'city_id' => $AddressArr[$addressParam['cityText']] ?? '',
'district_id' => $AddressArr[$addressParam['areaText']] ?? '',
'community_id' => $addressParam['community_id'] ?? '',
'address' => $addressParam['address'] ?? '',
'full_address' => "{$addressParam['provinceText']}-{$addressParam['cityText']}-{$addressParam['areaText']}",
'longitude' => $addressParam['longitude'] ?? '',
'latitude' => $addressParam['latitude'] ?? '',
];
$orderInfo = $orderCreate->SupplyCreateOrder($orderData, $addressParam, $invoiceParam);
return $orderInfo;
}
/***
* 预览订单
* @param $data
* @return mixed
*/
public function preview()
{
$outOrderId = input('outOrderId');
$AuthPay = input('AuthPay', 0);
$buyer_message = input('buyerMessage', '');
$addressParam = input('addressParam');
$cargoParamList = input('cargoParamList');
$invoiceParam = input('invoiceParam');
$addressParam = json_decode($addressParam, true);
$cargoParamList = json_decode($cargoParamList, true);
$invoiceParam = json_decode($invoiceParam, true);
if ($outOrderId) {
$info = model('supply_order')->getValue([['buyer_shop_id', '=', $this->appInfo['site_id']], ['custom_order_no', '=', $outOrderId]], 'order_id');
if ($info) {
return error(-1, '订单已存在');
}
}
$this->ValidateData('address', $addressParam);
$cargodata = $this->createOrderData($cargoParamList);//创建订单数据
$orderCreate = new OrderCreate();
$orderData['buyer_uid'] = $this->appInfo['id'];
$orderData['buyer_shop_id'] = $this->appInfo['site_id'];
$orderData['buyer_shop_name'] = $this->appInfo['app_name'];
$orderData['outOrderId'] = $outOrderId;
$orderData['buyer_message'] = $buyer_message;
$orderData['order_from'] = 'api';
$orderData['order_from_name'] = 'API下单';
$orderData['AuthPay'] = $AuthPay;
$orderData['is_balance'] = $AuthPay;
$orderData['orderData'] = $cargodata['order_lists'];
$orderData['sku_ids_num'] = $cargodata['sku_ids_num'];
$orderData['appInfo'] = $this->appInfo;
$address = [
['name', 'in', "{$addressParam['provinceText']},{$addressParam['cityText']},{$addressParam['areaText']}"]
];
$AddressArr = model('area')->getColumn($address, 'id', 'name');
$orderData['member_address'] = [
'name' => $addressParam['fullName'] ?? '',
'mobile' => $addressParam['mobile'] ?? '',
'telephone' => $addressParam['phone'] ?? '',
'province_id' => $AddressArr[$addressParam['provinceText']] ?? '',
'city_id' => $AddressArr[$addressParam['cityText']] ?? '',
'district_id' => $AddressArr[$addressParam['areaText']] ?? '',
'community_id' => $addressParam['community_id'] ?? '',
'address' => $addressParam['address'] ?? '',
'full_address' => "{$addressParam['provinceText']}-{$addressParam['cityText']}-{$addressParam['areaText']}",
'longitude' => $addressParam['longitude'] ?? '',
'latitude' => $addressParam['latitude'] ?? '',
];
$invoiceParam = [
// 'invoiceType' => '',
// 'provinceText' => '',
// 'cityText' => '',
// 'areaText' => '',
// 'townText' => '',
// 'postCode' => '',
// 'address' => '',
// 'fullName' => '',
// 'phone' => '',
// 'mobile' => '',
// 'companyName' => '',
// 'taxpayerIdentifier' => '',
// 'bankAndAccount' => '',
// 'localInvoiceId' => '',
];
// $addressParam = [
// 'fullName' => '胡哥',
// 'mobile' => '18982255122',
// 'phone' => '18982255122',
// 'postCode' => '000000',
// 'provinceText' => '四川省',
// 'cityText' => '成都市',
// 'areaText' => '西御街',
// 'townText' => '',
// 'address' => '西御大厦A1401',
// 'districtCode' => '',
// ];
// $cargoParamList = [
// [
// 'extend_sku_id' => '6f36321c9094a8dfc31616f9920f5c56',
// 'quantity' => 1,
// 'cloud_id' => 'ag',
// ],
// [
// 'sku_id' => 8,
// 'quantity' => 1,
// ]
// ];
}
/***
* 获取订单详情
* @param $data
* @return mixed
*/
public function buyerView()
{
$out_trade_no = input('outTradeNo');
if (empty($out_trade_no)) {
return error(-1, '订单号不能为空');
}
$condition = [
'out_trade_no' => $out_trade_no,
'buyer_uid' => $this->appInfo['id'],
];
$field = 'order_id,site_id,custom_order_no as outOrderId,out_trade_no as outTradeNo,order_id,order_status,order_money,pay_type,pay_status,goods_money,balance_money,pay_money,buyer_uid,name,mobile,telephone,full_address,address';
$order_list = model('supply_order')->getList($condition, $field);
$express_package_model = new ExpressPackage();
if (!empty($order_list)) {
$fields = 'sku_id,sku_name,sku_image,num,goods_money,delivery_no,refund_no,refund_status,refund_reason,refund_real_money,refund_remark';
foreach ($order_list as $k => $v) {
$order_goods_list = model("supply_order_goods")->getList(['order_id' => $v['order_id']], $fields);
$package_list = $express_package_model->package([["order_id", "=", $v['order_id']], ["site_id", '=', $v['site_id']]], '', '', false);
$order_list[$k]['order_goods'] = $order_goods_list;
$order_list[$k]['package_list'] = $package_list;
unset($v['order_id'], $v['site_id']);
}
}
return $order_list;
}
/***
* 取消订单
* @param $data
* @return mixed
*/
public function cancel()
{
$out_trade_no = input('outTradeNo');
if (empty($out_trade_no)) {
return error(-1, '订单号不能为空');
}
$cancelReason = input('cancelReason');
if (empty($cancelReason)) {
return error(-1, '请输入取消原因');
}
$remark = input('remark');
$upData = [
'remark' => $remark
];
$condition = [
'out_trade_no' => $out_trade_no,
'buyer_uid' => $this->appInfo['id'],
];
$order_model = new OrderCommon();
$member_account_model = new SupplyAccount();
$getLists = $order_model->getOrderList($condition, 'order_id,out_trade_no,buyer_shop_id,order_status,order_money,pay_type,pay_status,goods_money,balance_money,pay_money,buyer_uid')['data']; //获取订单信息
if (empty($getLists)) return error(-1, '订单不存在');
// $suk_ids =model('supply_order_goods')->getColumn([['order_id','in',array_column($getLists, 'order_id')]], 'sku_id');
// $supply_goods_sku=model('supply_goods_sku')->getColumn([['sku_id','in',$suk_ids]],'sku_id,goods_supplier_format,channel_type,extend_sku_id','sku_id');
foreach ($getLists as $k => $v) {
if ($v['order_status'] == 0 || $v['order_status'] == 1) {
if ($remark) {
$order_model->orderUpdate($upData, $condition);
}
$order_model->orderClose($v['order_id']);
if ($v['pay_status'] == 1 && $v['pay_type'] == 'BALANCE') {
$member_account_model->AddAppsAccount($v['buyer_shop_id'], $v['buyer_uid'], 'usable_price', $v['balance_money'] + $v['pay_money'], 'buy_order', $v['out_trade_no'], '订单取消退退回余额|' . $v['out_trade_no']);
}
}
}
return success();
}
/**
* 修改订单备注
* @param $data
* @return void
*/
public function modifymemo($data = [])
{
$out_trade_no = input('outTradeNo');
if (empty($out_trade_no)) {
return error(-1, '订单号不能为空');
}
$remark = input('remark');
$condition = [
'out_trade_no' => $out_trade_no,
'buyer_uid' => $this->appInfo['id'],
];
$data = [
'remark' => $remark
];
$order_model = new OrderCommon();
// $getLists=$order_model->getOrderList($condition)['data']; //获取订单信息
return $order_model->orderUpdate($data, $condition);
}
/***
* 获取订单列表
* @param $data
* @return mixed
*/
public function getBuyerOrderList()
{
$page = input('page', 1);
$pageSize = input('pageSize', 10);
$condition = [
['buyer_uid', '=', $this->appInfo['id']]
];
$field = 'custom_order_no as outOrderId,out_trade_no as outTradeNo,order_id,site_id,order_status,order_money,pay_type,pay_status,goods_money,balance_money,pay_money,name,mobile,telephone,full_address,address';
$order_list = model('supply_order')->pageList($condition, $field, '', $page, $pageSize);
$express_package_model = new ExpressPackage();
if (!empty($order_list['list'])) {
$fields = 'sku_id,sku_name,sku_image,num,goods_money,delivery_no,refund_no,refund_status,refund_reason,refund_real_money,refund_remark';
foreach ($order_list['list'] as $k => $v) {
$package_list = $express_package_model->package([["order_id", "=", $v['order_id']], ["site_id", '=', $v['site_id']]], '', '', false);
$order_goods_list = model("supply_order_goods")->getList(['order_id' => $v['order_id']], $fields);
$order_list['list'][$k]['order_goods'] = $order_goods_list;
$order_list['list'][$k]['package_list'] = $package_list;
unset($v['order_id'], $v['site_id']);
}
}
return $order_list;
}
/***
* 获取订单数据供应链订单
* @param $cargoParamList
* @param $addressParam
* @return array
*/
private function createOrderData($cargoParamList = [])
{
$sku_ids = []; //入口SKUID
$quantity_arr = [];//储存订单商品数量
$extend_sku_ids = [];//储存订单商品数量
$third_ids = [];//储存订单商品数量
foreach ($cargoParamList as $key => $value) {
if (isset($value['extend_sku_id'])) {
$this->ValidateData('extend_sku_id', $value);
$extend_sku_ids[] = $value['extend_sku_id'];
if (isset($quantity_arr[$value['extend_sku_id']])) {
$quantity_arr[$value['extend_sku_id']] += $value['quantity'];
} else {
$quantity_arr[$value['extend_sku_id']] = $value['quantity'];
}
if (is_numeric($value['cloud_id'])) {
$third_ids[$value['cloud_id']] = $value;
}
} else if (isset($value['sku_id'])) {
$this->ValidateData('sku_id', $value);
$sku_ids[] = $value;
if (isset($quantity_arr[$value['sku_id']])) {
$quantity_arr[$value['sku_id']] += $value['quantity'];
} else {
$quantity_arr[$value['sku_id']] = $value['quantity'];
}
}
}
$goods_sku_list = [];
$goods_model = new GoodsModel();
if ($extend_sku_ids) {
$where_extend_sku = [
['site_id', '=', $this->supplier_site_id],
['extend_sku_id', 'in', $extend_sku_ids]
];
$goods_sku_list = $goods_model->getGoodsSkuList($where_extend_sku, "site_id,sku_id,extend_sku_id,price_json,sku_image,channel_type,goods_supplier_format")['data'];
}
if ($sku_ids) { //处理SKUID订单信息
$where_sku_id = [
['site_id', '=', $this->supplier_site_id],
['sku_id', 'in', array_column($sku_ids, 'sku_id')]
];
$sku_list = $goods_model->getGoodsSkuList($where_sku_id, "site_id,sku_id,extend_sku_id,price_json,sku_image,channel_type,goods_supplier_format")['data'];
$goods_sku_list = array_merge($goods_sku_list, $sku_list);
}
$order_lists = [];
$sku_ids_num = [];
foreach ($goods_sku_list as $key1 => $value1) { //归纳订单信息
switch ($value1['channel_type']) {
case 1688:
$goods_supplier_format = json_decode($value1['goods_supplier_format'], true);
$orderDatas = [
'site_id' => $value1['site_id'],
'sku_id' => $value1['sku_id'],
'extend_sku_id' => $value1['extend_sku_id'],
'offerId' => $goods_supplier_format['offerId'],
'cloud_id' => 'ag',
];
if (isset($quantity_arr[$value1['extend_sku_id']])) {
$orderDatas['quantity'] = $quantity_arr[$value1['extend_sku_id']];
} else {
$orderDatas['quantity'] = $quantity_arr[$value1['sku_id']];
}
$order_lists['ag'][] = $orderDatas;
$sku_ids_num[$value1['sku_id']] = $orderDatas['quantity'];
break;
default://第三方数据
$orderDatas = [
'site_id' => $value1['site_id'],
'sku_id' => $value1['sku_id'],
'extend_sku_id' => $value1['extend_sku_id'],
'cloud_id' => 'own',
];
if (isset($quantity_arr[$value1['extend_sku_id']])) {
$orderDatas['quantity'] = $quantity_arr[$value1['extend_sku_id']];
} else {
$orderDatas['quantity'] = $quantity_arr[$value1['sku_id']];
}
$order_lists['own'][] = $orderDatas;
$sku_ids_num[$value1['sku_id']] = $orderDatas['quantity'];
break;
}
}
$orderData['third_ids'] = $third_ids;
$orderData['sku_ids_num'] = $sku_ids_num;
$orderData['order_lists'] = $order_lists;
return $orderData;
}
private function ValidateData($type = 'address', $data)
{
switch ($type) {
case 'address': //验证地址
$rule = [
'fullName' => 'require|min:2',
'mobile' => 'require',
// 'phone' => 'require',
'provinceText' => 'require',
'cityText' => 'require',
'areaText' => 'require',
'address' => 'require',
];
$message = [
'fullName.require' => '请填写收货人姓名',
'fullName.min' => '收货人姓名字符串长度不能小于2',
'mobile.require' => '请填写手机号',
// 'phone.require' => '请填写电话',
'provinceText.require' => '请填写省份',
'cityText.require' => '请填写市',
'areaText.require' => '请填写区',
'address.require' => '请填写详细地址',
];
break;
case 'invoice': //验证发票
break;
case 'sku_id': //验证地址
$rule = [
'sku_id' => 'require',
'quantity' => 'require|number',
];
$message = [
'sku_id.require' => '请选择商品',
'quantity.require' => '请填写商品数量',
'quantity.number' => '商品数量必须为数字',
];
break;
case 'extend_sku_id': //验证地址
$rule = [
'cloud_id' => 'require',
'extend_sku_id' => 'require',
'quantity' => 'require|number',
];
$message = [
'extend_sku_id.require' => '请选择商品',
'quantity.require' => '请填写商品数量',
'quantity.number' => '商品数量必须为数字',
'cloud_id.require' => '云仓ID不能为空',
];
break;
}
$validate = $this->validate($data, $rule, $message);
return $validate;
}
}