[ '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; } }