| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326 |
- <?php
- namespace addons\WangDianTong\common\service;
- use addons\WangDianTong\common\enums\WangDianTongEnum;
- use addons\WangDianTong\common\expand\sdk\wangdian\model\Order;
- use addons\WangDianTong\common\expand\sdk\wangdian\model\OrderItem;
- use addons\WangDianTong\common\expand\sdk\wangdian\qjb\model\RawTradeItemModel;
- use addons\WangDianTong\common\expand\sdk\wangdian\qjb\model\RawTradeOrderItemModel;
- use addons\WangDianTong\common\helper\EmojiHelper;
- use common\enums\StatusEnum;
- use common\models\goods\GoodsAttr;
- use common\models\user\User;
- class CreateOrderService
- {
- /**
- * @param array $item 订单
- * @param int|null $refund_status
- * @return array
- */
- public function assembleData(array $item, int $refund_status = null): array
- {
- $user = User::getOne([
- ['id' => $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;
- }
- }
|