$item['user_id']] ], false, null, null, 'id, nickname, username, avatar_url, mobile'); $order = new Order(); $order->tid = $item['order_no']; // 判断退款是否为5 $trade_status = WangDianTongEnum::ORDER_STATUS_MAP[$item['order_status']] ?? 0; $order->trade_status = $trade_status; // wangdianbao 1:款到发货,2:货到付款(包含部分货到付款),3:分期付款,4:挂账 // local 订单配送方式【1 物流配送 2 买家自提 3 货到付款 4 本地配送】 $order->delivery_term = StatusEnum::ENABLED; // 平台订单付款状态:0:未付款,1:部分付款,2:已付款 // 平台订单付款状态:0:未付款,1:部分付款,2:已付款 $order->pay_status = $item['pay_status'] == 0 ? $item['pay_status'] : 2; $order->trade_time = date('Y-m-d H:i:s', $item['created_at']); $order->pay_time = $item['pay_status'] == StatusEnum::ENABLED ? date('Y-m-d H:i:s', $item['pay_time']) : '0000-00-00 00:00:00'; $order->buyer_nick = EmojiHelper::convert(!empty($user->nickname) ? $user->nickname : "无昵称"); // $order->buyer_email = ''; // 如果是虚拟订单那么就没有收货地址 $regions = explode(' ', $item['region_name']); $order->receiver_mobile = $item['mobile']; // $order->receiver_telno = ''; $order->receiver_zip = $item['zip']; $order->receiver_province = $regions[0] ?? ''; $order->receiver_name = $item['receiver_name']; $order->receiver_city = $regions[1] ?? ''; $order->receiver_district = $regions[2] ?? ''; $order->receiver_address = EmojiHelper::convert(sprintf("%s%s", ($regions[3] ?? ''), $item['address'])); // 物流 // $order->logistics_type = -1; // 发票相关 // $order->invoice_kind = ''; // $order->invoice_title = ''; // $order->invoice_content = ''; // 货品明细备注推送此字段ERP客户端需升级至V2.3.9.2及以上 // 备注相关 $order->remark = ''; $order->buyer_message = EmojiHelper::convert(!empty($item['remark']) ? $item['remark'] : ''); $order->seller_memo = EmojiHelper::convert(!empty($item['seller_remark']) ? $item['seller_remark'] : ''); $order->remark_flag = StatusEnum::DISABLED; // 金额相关 $order->post_amount = $item['shipping_money']; $order->other_amount = '0'; $order->paid = $item['pay_money']; // 货到付款金额 cod金额=(price * num + adjust_amount -discount – share_discount)+post_amount+ext_cod_fee-paid $order->cod_amount = '0'; // 货到付款买家费用,扣除货到付款订单金额后,卖家仍需支付的货到付款其他金额。这个钱卖家收不回来,是快递公司直接收走,但在快递单里是要打印出来,否则快递收款就错了 $order->ext_cod_fee = '0'; $order_list = []; // 订单金额对不上 -》 使用积分抵扣/支付随机抵扣 $detail_total_amount = 0; $detail_total_amount_arr = []; $can_close = true; foreach ($item['detail'] as $key => $detail) { $tmp_total_amount = bcmul($detail['goods_price'], 1, 2); $detail_total_amount = bcadd($detail_total_amount, $tmp_total_amount, 2); $detail_total_amount_arr[$key] = $tmp_total_amount; $orderItem = new OrderItem(); $orderItem->oid = "{$item['order_no']}_{$detail['id']}"; $orderItem->num = $detail['num']; $orderItem->goods_id = $detail['goods_id']; $orderItem->price = $detail['price']; $orderItem->status = $refund_status == WangDianTongEnum::REFUND_STATUS_FINISH ? WangDianTongEnum::ORDER_STATUS_REFUND_FINISH : WangDianTongEnum::ORDER_STATUS_MAP[$detail['order_status']] ?? 0; // wangdianbao: 0:无退款,1:取消退款,2:已申请退款,3:等待退货,4:等待收货,5:退款成功。本字段在售前退款的时候,根据不同的场景填写不同的值,eg:申请退款值为2,取消退款值为1 // local: 订单售后状态【0未售后 1售后中 2售后完成】 if ($refund_status !== null) { $orderItem->refund_status = $refund_status; } else { $orderItem->refund_status = WangDianTongEnum::ORDER_REFUND_MAP[$detail['is_feedback']] ?? StatusEnum::DISABLED; } if ($orderItem->refund_status != WangDianTongEnum::ORDER_STATUS_REFUND_FINISH) { $can_close = false; } //获取商品规格信息 $attr_info = GoodsAttr::getOne([ ['id' => $detail['goods_attr_id']], ], true); // 平台系统单品(SKU)的的唯一标识,尽量不为空,spec_id和spec_no区别与SPU、SKU $orderItem->spec_id = $detail['goods_attr_id']; // 平台货品SPU编码,对应ERP货品编号,尽量不为空 // $orderItem->goods_no = $detail['goods_attr_id']; // 平台货品SKU唯一码,对应ERP商家编码,goods_no和spec_no不能同时为空 $orderItem->spec_no = $detail['goods_attr_id']; // 商品规格如果开启了‘是否启用商品编码’按钮,则使用规格对应填写的商家编码 if ($attr_info['is_show_code'] == 1) { $orderItem->spec_no = $attr_info['spec_no']; } $orderItem->goods_name = EmojiHelper::convert(!empty($detail['goods_name']) ? $detail['goods_name'] : ''); $orderItem->spec_name = EmojiHelper::convert(!empty($detail['goods_attr_name']) ? $detail['goods_attr_name'] : ''); $orderItem->adjust_amount = abs($detail['adjust_money']); // 下单总折扣,客户下单时折扣(比如促销打折,不包含客服调整、分摊折扣,没有传0) // 确保 delivery_term = 1 trade_status = 30 pay_status = 2 ,且根据公式计算出正确的paid值,paid计算公式:paid = Σ(price * num + adjust_amount -discount – share_discount)+ post_amount+other_amount。 $orderItem->discount = bcadd(abs($detail['adjust_money']), bcsub(bcmul($detail['price'], $detail['num'], 2), $tmp_total_amount, 2), 2); // 分摊总折扣,由总订单分摊而来,一般是付款时产生,如使用优惠券,没有传0。分摊优惠传值注意:例如三个商品,优惠10,分摊优惠可以是:3/3/4,或者3.33/3.33/3.34.即最后一个商品的分摊优惠使用减法计算 $orderItem->share_discount = 0; // $orderItem->remark = ''; // 子订单备注 // $orderItem->cid = ''; // 所属类目 $order_list[] = $orderItem->toArray(); } if ($can_close) { $order->trade_status = WangDianTongEnum::ORDER_STATUS_REFUND_FINISH; } // 抵扣信息 $goods_total_price = bcsub($item['pay_money'], $item['shipping_money'], 2); $diff_amount = bcmul(bcsub($detail_total_amount, $goods_total_price, 2), 100, 0); if ($diff_amount > 0) { // 金额需要调整 $index = count($detail_total_amount_arr) - 1; $total_discount = 0; foreach ($detail_total_amount_arr as $key => $amount) { if ($key == $index) { $order_list[$key]['share_discount'] = bcdiv(bcsub($diff_amount, $total_discount, 0), 100, 2); } else { $discount_rate = round(bcdiv($amount, $detail_total_amount, 3), 2); $total_discount += bcmul($diff_amount, $discount_rate, 0); $order_list[$key]['share_discount'] = bcdiv(bcmul($diff_amount, $discount_rate, 0), 100, 2); } } } $order->order_list = $order_list; return $order->toArray(); } /** * 旗舰版 * @param array $order * @return array */ public function flagshipAssembleData(array $order) { date_default_timezone_set("Asia/Shanghai"); $raw_trade_list = $raw_trade_order_list = $discount_list = []; // 取出买家信息 $user = User::getOne([ ['id' => $order['user_id']] ], false, null, null, 'id, nickname, username, avatar_url, mobile'); $rawTradeItemModel = new RawTradeItemModel(); $rawTradeItemModel->tid = $order['order_no']; // 默认10, 发货40, 签收60 $rawTradeItemModel->process_status = WangDianTongEnum::ORDER_PROCESS_STATUS_MAP[$order['order_status']] ?? 10; // 默认是 $rawTradeItemModel->trade_status = WangDianTongEnum::ORDER_STATUS_MAP[$order['order_status']] ?? 0; // 0无退款 1申请退款 2部分退款 3全部退款,单据状态变更点击文档查看 // 判断是否 $rawTradeItemModel->refund_status = $this->refundStatus($order); $rawTradeItemModel->pay_status = $order['pay_status'] == 0 ? $order['pay_status'] : 2; // 0未付款1部分付款2已付款 $rawTradeItemModel->order_count = count($order['detail']); $rawTradeItemModel->goods_count = array_sum(array_column($order['detail'], 'num')); // if ($order['pay_status'] == StatusEnum::ENABLED) { $rawTradeItemModel->pay_method = WangDianTongEnum::PAYMENT_TYPE_MAP[$order['payment_type']] ?? ($order['pay_status'] == StatusEnum::ENABLED ? 1 : 0); // 1在线转帐 2现金,3银行转账,4邮局汇款 5预付款 6刷卡 7支付宝 8微信支付 } $rawTradeItemModel->trade_time = date('Y-m-d H:i:s', $order['created_at']); if ($order['pay_status'] == StatusEnum::ENABLED) $rawTradeItemModel->pay_time = date('Y-m-d H:i:s', $order['pay_time']); $rawTradeItemModel->end_time = null; $rawTradeItemModel->buyer_nick = EmojiHelper::convert(!empty($user->nickname) ? $user->nickname : '无昵称'); $rawTradeItemModel->buyer_message = ''; // $rawTradeItemModel->buyer_email = $order['order_no']; // $rawTradeItemModel->buyer_area = $order['order_no']; $rawTradeItemModel->receiver_name = EmojiHelper::convert(!empty($order['receiver_name']) ? $order['receiver_name'] : '');; $rawTradeItemModel->receiver_area = $order['region_name']; $rawTradeItemModel->receiver_address = $order['address']; $rawTradeItemModel->receiver_mobile = $order['mobile']; $rawTradeItemModel->post_amount = empty($order['shipping_money']) ? 0 : $order['shipping_money']; $rawTradeItemModel->other_amount = '0'; $rawTradeItemModel->discount = '0'; $rawTradeItemModel->receivable = $order['pay_money']; // 应收金额,售前退款会变化,“详细金额逻辑点击查看” $rawTradeItemModel->platform_cost = "0"; // $rawTradeItemModel->logistics_type = $order['order_no']; // $rawTradeItemModel->cust_data = $order['order_no']; $rawTradeItemModel->delivery_term = 1; // 1款到发货 2货到付款(包含部分货到付款) 3分期付款 // $rawTradeItemModel->pay_id = $order['order_no']; $rawTradeItemModel->remark = EmojiHelper::convert(!empty($item['seller_remark']) ? $item['seller_remark'] : '');; $rawTradeItemModel->remark_flag = StatusEnum::DISABLED; // $rawTradeItemModel->cod_amount = $order['order_no']; // 若delivery_term=2,则为应付金额,否则为0 $rawTradeItemModel->is_auto_wms = false; // true自流转,false 非自流转 // $rawTradeItemModel->warehouse_no = $order['order_no']; // 仅自流转订单填写该仓库编号, 非自流转订单传入空字符串即可 $refund_status = null; // 订单金额对不上 -》 使用积分抵扣/支付随机抵扣 $detail_total_amount = 0; $detail_total_amount_arr = []; $can_close = true; foreach ($order['detail'] as $key => $detail) { $tmp_total_amount = bcmul($detail['num'], $detail['price'], 2); $detail_total_amount = bcadd($detail_total_amount, $tmp_total_amount, 2); $detail_total_amount_arr[$key] = $tmp_total_amount; $rawTradeOrderModel = new RawTradeOrderItemModel(); $rawTradeOrderModel->tid = $order['order_no']; $rawTradeOrderModel->oid = "{$order['order_no']}_{$detail['id']}"; $rawTradeOrderModel->status = $refund_status == WangDianTongEnum::REFUND_STATUS_FINISH ? WangDianTongEnum::ORDER_STATUS_REFUND_FINISH : WangDianTongEnum::ORDER_STATUS_MAP[$detail['order_status']] ?? 0; if ($refund_status !== null) { $rawTradeOrderModel->refund_status = $refund_status; } else { $rawTradeOrderModel->refund_status = WangDianTongEnum::ORDER_REFUND_MAP[$detail['is_feedback']] ?? StatusEnum::DISABLED; } if ($rawTradeOrderModel->refund_status != WangDianTongEnum::ORDER_STATUS_REFUND_FINISH) { $can_close = false; } $rawTradeOrderModel->goods_id = $detail['goods_id']; $rawTradeOrderModel->spec_id = $detail['goods_attr_id']; $rawTradeOrderModel->goods_no = $detail['goods_attr_id']; $rawTradeOrderModel->spec_no = $detail['goods_attr_id']; $rawTradeOrderModel->goods_name = EmojiHelper::convert(!empty($detail['goods_name']) ? $detail['goods_name'] : ''); $rawTradeOrderModel->spec_name = EmojiHelper::convert(!empty($detail['goods_attr_name']) ? $detail['goods_attr_name'] : ''); $rawTradeOrderModel->order_type = $order['is_virtual']; // 0正常货品 1虚拟货品 2服务(不传默认为0) $rawTradeOrderModel->num = $detail['num']; $rawTradeOrderModel->price = $detail['price']; $rawTradeOrderModel->discount = bcadd(abs($detail['adjust_money']), bcsub(bcmul($detail['price'], $detail['num'], 2), $tmp_total_amount, 2), 2); $rawTradeOrderModel->share_discount = 0; $rawTradeOrderModel->total_amount = $detail['goods_price']; $rawTradeOrderModel->adjust_amount = abs($detail['adjust_money']); $rawTradeOrderModel->refund_amount = 0; $rawTradeOrderModel->remark = "暂无备注"; $rawTradeOrderModel->json = ""; $raw_trade_order_list[] = $rawTradeOrderModel->toArray(); } if ($can_close) { $rawTradeItemModel->trade_status = WangDianTongEnum::ORDER_STATUS_REFUND_FINISH; } // 抵扣信息 $goods_total_price = bcsub($order['pay_money'], $order['shipping_money'], 2); $diff_amount = bcmul(bcsub($detail_total_amount, $goods_total_price, 2), 100, 0); if ($diff_amount > 0) { // 金额需要调整 // 拥有折扣金额需要分摊优惠金额 $share_num = count($raw_trade_order_list);// 需要分摊的订单数量 $total_amount_price = 0; // 平摊优惠总金额 $last_key = $share_num - 1; // 最后一个商品key // 获取每一个商品平摊优惠金额 $avg_discount_price = bcdiv($diff_amount, $share_num, 2); foreach ($raw_trade_order_list as $key=>$rawTradeOrderModel) { if ($key == $last_key) { // 最后一个商品使用减法计算 $raw_trade_order_list[$key]['share_discount'] = bcsub($diff_amount, $total_amount_price, 2); } else { // 其他订单平均分配折扣金额 $total_amount_price = bcadd($avg_discount_price, $total_amount_price, 2); $raw_trade_order_list[$key]['share_discount'] = $avg_discount_price; } } } // 优惠 return [ [$rawTradeItemModel->toArray()], $raw_trade_order_list, [] ]; } protected function refundStatus(array $order) { if ($order['is_feedback'] == 2) { return 3; } if ($order['is_feedback'] == 1) { return 1; } // 判断是否含有部分退款 // 订单状态【0待付款 1待发货 2 已发货 3已收货 4已完成 -1申请售后 -2售后中 -3售后完成 -4 已关闭 -5撤销售后】 $order_status = array_column($order['detail'], 'order_status'); if (in_array(-3, $order_status)) { return 2; } return 0; } }