diff --git a/plugs/think-plugs-points-mall/src/controller/api/Goods.php b/plugs/think-plugs-points-mall/src/controller/api/Goods.php
index 529761e..f6d2cd2 100644
--- a/plugs/think-plugs-points-mall/src/controller/api/Goods.php
+++ b/plugs/think-plugs-points-mall/src/controller/api/Goods.php
@@ -39,14 +39,8 @@ class Goods extends Controller
$query->equal('code')->like('name#keys')->like('marks,cates', ',');
if (!empty($code = input('code'))) {
// 查询单个商品详情
- $query->with(['discount', 'items', 'comments' => function (Query $query) {
- $query->limit(2)->where(['status' => 1, 'deleted' => 0]);
- }])->withCount(['comments' => function (Query $query) {
- $query->where(['status' => 1, 'deleted' => 0]);
- }]);
+ $query->with(['items']);
PointsMallGoods::mk()->where(['code' => $code])->inc('num_read')->update([]);
- } else {
- $query->with('discount')->withoutField('content');
}
// 数据排序处理
$sort = intval(input('sort', 0));
diff --git a/plugs/think-plugs-points-mall/src/controller/api/auth/Address.php b/plugs/think-plugs-points-mall/src/controller/api/auth/Address.php
new file mode 100644
index 0000000..ead46d1
--- /dev/null
+++ b/plugs/think-plugs-points-mall/src/controller/api/auth/Address.php
@@ -0,0 +1,60 @@
+where("unid", $this->usid);
+ $this->success('获取成功!', $query->select(), false, false, 10);
+ });
+ }
+
+ public function info()
+ {
+ $data = $this->_vali([
+ "id.require" => "获取失败,请稍候再试!",
+ "unid.value" => $this->usid,
+ ]);
+ $this->success('获取成功!', PointsMallAddress::query()->where($data)->find());
+ }
+
+ public function save()
+ {
+ $data = $this->request->post();
+ $data['unid'] = $this->usid;
+ if (empty($data['id']) || $data['id'] == 0) {
+ unset($data['id']);
+ $pointsMallAddress = PointsMallAddress::create($data);
+ } else {
+ $pointsMallAddress = PointsMallAddress::find($data['id']);
+ if ($pointsMallAddress->unid != $this->usid) {
+ $this->error('非法操作!');
+ }
+ }
+ if ($pointsMallAddress->save($data)) {
+ $this->success('保存成功!');
+ } else {
+ $this->error('保存失败!');
+ }
+ }
+
+ public function delete()
+ {
+ $input = $this->_vali([
+ "id.require" => "删除失败,请稍候再试!",
+ "unid.value" => $this->usid,
+ ]);
+ if (PointsMallAddress::query()->where($input)->delete()) {
+ $this->success('删除成功!');
+ } else {
+ $this->error('删除失败!');
+ }
+ }
+}
\ No newline at end of file
diff --git a/plugs/think-plugs-points-mall/src/controller/api/auth/Order.php b/plugs/think-plugs-points-mall/src/controller/api/auth/Order.php
index f95fd34..5e08832 100644
--- a/plugs/think-plugs-points-mall/src/controller/api/auth/Order.php
+++ b/plugs/think-plugs-points-mall/src/controller/api/auth/Order.php
@@ -4,6 +4,7 @@ namespace plugin\points_mall\controller\api\auth;
use plugin\points_mall\controller\api\Auth;
use plugin\points_mall\model\PointsMallAddress;
+use plugin\points_mall\model\PointsMallGoods;
use plugin\points_mall\model\PointsMallOrder;
use plugin\points_mall\model\PointsMallOrderCart;
use plugin\points_mall\model\PointsMallOrderItem;
@@ -18,7 +19,7 @@ use think\exception\HttpResponseException;
class Order extends Auth
{
- protected $checkBind = true;
+ protected $checkBind = false;
/**
* 获取订单数据
* @return void
@@ -29,19 +30,101 @@ class Order extends Auth
if (empty(input('order_no'))) {
$query->with('items')->where(['refund_status' => 0]);
} else {
- $query->with(['items', 'address', 'sender', 'payments' => function (Query $query) {
- $query->where(static function (Query $query) {
-// $query->whereOr(['channel_type' => Payment::VOUCHER, 'payment_status' => 1, 'audit_status' => 1]);
- $query->whereOr(['payment_status' => 1, 'audit_status' => 1]);
- });
- }]);
+ $query->with(['items', 'address', 'sender']);
}
$query->in('status')->equal('order_no');
- $query->where(['unid' => $this->unid, 'deleted_status' => 0])->order('id desc');
+ $query->where(['unid' => $this->usid, 'deleted_status' => 0])->order('id desc');
$this->success('获取订单成功!', $query->page(intval(input('page')), false, false, 10));
});
}
+ public function add_goods() {
+ $input = $this->_vali([
+ 'code.require' => '请传入商品编号',
+ ]);
+ $order = [
+ 'unid' => $this->usid,
+ ];
+ do $extra = ['order_no' => $order['order_no'] = CodeExtend::uniqidNumber(16, 'N')];
+ while (PointsMallOrder::mk()->master()->where($extra)->findOrEmpty()->isExists());
+ [$items, $deliveryType] = [[], 1];
+ $goods = PointsMallGoods::query()->with(['items'])->where(['code' => $input['code']])->findOrEmpty();
+ if ($goods->isEmpty()) $this->error('商品不存在!');
+ $gspec = $goods->items->first();
+ $count = 1;
+ // 商品库存检查
+ if ($gspec['stock_sales'] + $count > $gspec['stock_total']) $this->error('库存不足!');
+ // 订单详情处理
+ $items[] = [
+ 'unid' => $order['unid'],
+ 'order_no' => $order['order_no'],
+ // 商品字段
+ 'gsku' => $gspec['gsku'],
+ 'gname' => $goods['name'],
+ 'gcode' => $gspec['gcode'],
+ 'ghash' => $gspec['ghash'],
+ 'gspec' => $gspec['gspec'],
+ 'gunit' => $gspec['gunit'],
+ 'gcover' => empty($gspec['gimage']) ? $goods['cover'] : $gspec['gimage'],
+ // 库存数量处理
+ 'stock_sales' => $count,
+ // 快递发货数据
+ 'delivery_code' => $goods['delivery_code'],
+ 'delivery_count' => $goods['rebate_type'] > 0 ? $gspec['number_express'] * $count : 0,
+ // 商品费用字段
+ 'price_cost' => $gspec['price_cost'],
+ 'price_market' => $gspec['price_market'],
+ 'price_selling' => $gspec['price_selling'],
+ // 商品费用统计
+ 'total_price_cost' => $gspec['price_cost'] * $count,
+ 'total_price_market' => $gspec['price_market'] * $count,
+ 'total_price_selling' => $gspec['price_selling'] * $count,
+ 'total_allow_balance' => $gspec['allow_balance'] * $count,
+ 'total_allow_integral' => $gspec['allow_integral'] * $count,
+ 'total_reward_balance' => $gspec['reward_balance'] * $count,
+ 'total_reward_integral' => $gspec['reward_integral'] * $count,
+ ];
+ // 默认使用销售销售
+ $order['rebate_amount'] = array_sum(array_column($items, 'rebate_amount'));
+ $order['allow_balance'] = array_sum(array_column($items, 'total_allow_balance'));
+ $order['allow_integral'] = array_sum(array_column($items, 'total_allow_integral'));
+ $order['reward_balance'] = array_sum(array_column($items, 'total_reward_balance'));
+ $order['reward_integral'] = array_sum(array_column($items, 'total_reward_integral'));
+ // 订单发货类型
+ $order['status'] = $deliveryType ? 1 : 2;
+ $order['delivery_type'] = $deliveryType;
+ $order['ratio_integral'] = 100;
+ // 统计商品数量
+ $order['number_goods'] = array_sum(array_column($items, 'stock_sales'));
+ $order['number_express'] = array_sum(array_column($items, 'delivery_count'));
+ // 统计商品金额
+ $order['amount_cost'] = array_sum(array_column($items, 'total_price_cost'));
+ $order['amount_goods'] = array_sum(array_column($items, 'total_price_selling'));
+ // 折扣后的金额
+ $order['amount_discount'] = array_sum(array_column($items, 'discount_amount'));
+ $order['amount_reduct'] = $order['amount_goods'];
+ // 统计订单金额
+ $order['amount_real'] = round($order['amount_discount'] - $order['amount_reduct'], 2);
+ $order['amount_total'] = $order['amount_goods'];
+ $order['amount_profit'] = round($order['amount_real'] - $order['amount_cost']);
+ // 写入商品数据
+ $model = PointsMallOrder::mk();
+ $this->app->db->transaction(function () use ($order, $items, &$model) {
+ $model->save($order) && PointsMallOrderItem::mk()->saveAll($items);
+ });
+ // 同步库存销量
+ foreach (array_unique(array_column($items, 'gcode')) as $gcode) {
+ GoodsService::stock($gcode);
+ }
+ // 触发订单创建事件
+ $this->app->event->trigger('PluginWemallOrderCreate', $order);
+ // 无需发货且无需支付,直接完成支付流程
+ if ($order['status'] === 2 && empty($order['amount_real'])) {
+ $this->success('下单成功!', $model->toArray());
+ }
+ // 返回处理成功数据
+ $this->success('下单成功!', array_merge($order, ['items' => $items]));
+ }
/**
* 创建订单数据
* @return void
@@ -208,18 +291,18 @@ class Order extends Auth
public function perfect()
{
$data = $this->_vali([
- 'unid.value' => $this->unid,
+ 'unid.value' => $this->usid,
'order_no.require' => '单号不能为空',
'address_id.require' => '地址不能为空',
]);
// 用户收货地址
- $where = ['id' => $data['address_id'], 'unid' => $this->unid, 'deleted' => 0];
+ $where = ['id' => $data['address_id'], 'unid' => $this->usid, 'deleted' => 0];
$address = PointsMallAddress::mk()->where($where)->findOrEmpty();
if ($address->isEmpty()) $this->error('地址异常!');
// 订单状态检查
- $where = ['unid' => $this->unid, 'order_no' => $data['order_no'], 'delivery_type' => 1];
+ $where = ['unid' => $this->usid, 'order_no' => $data['order_no'], 'delivery_type' => 1];
$order = PointsMallOrder::mk()->where($where)->whereIn('status', [1, 2])->findOrEmpty();
if ($order->isEmpty()) $this->error('不能修改!');
@@ -251,15 +334,15 @@ class Order extends Auth
public function payment()
{
$data = $this->_vali([
- 'unid.value' => $this->unid,
- 'balance.default' => '0.00',
- 'integral.default' => '0',
+ 'unid.value' => $this->usid,
+// 'balance.default' => '0.00',
+// 'integral.default' => '0',
'order_no.require' => '单号不能为空',
- 'order_ps.default' => '',
- 'coupon_code.default' => '', # 优惠券编号
- 'channel_code.require' => '支付不能为空',
- 'payment_back.default' => '', # 支付回跳地址
- 'payment_image.default' => '', # 支付凭证图片
+// 'order_ps.default' => '',
+// 'coupon_code.default' => '', # 优惠券编号
+// 'channel_code.require' => '支付不能为空',
+// 'payment_back.default' => '', # 支付回跳地址
+// 'payment_image.default' => '', # 支付凭证图片
]);
try {
$order = $this->getOrderModel();
diff --git a/plugs/think-plugs-points-mall/src/model/PointsMallGoods.php b/plugs/think-plugs-points-mall/src/model/PointsMallGoods.php
index 9f59658..e22cab3 100644
--- a/plugs/think-plugs-points-mall/src/model/PointsMallGoods.php
+++ b/plugs/think-plugs-points-mall/src/model/PointsMallGoods.php
@@ -31,15 +31,6 @@ class PointsMallGoods extends Model
->where(['status' => 1]);
}
- /**
- * 关联商品评论数据
- * @return \think\model\relation\HasMany
- */
- public function comments()
- {
- return $this->hasMany(PluginWemallUserActionComment::class, 'gcode', 'code')->with('bindUser');
- }
-
/**
* 关联产品列表
* @return array
diff --git a/plugs/think-plugs-points-mall/src/model/PointsMallOrder.php b/plugs/think-plugs-points-mall/src/model/PointsMallOrder.php
index e6086fd..0ad321a 100644
--- a/plugs/think-plugs-points-mall/src/model/PointsMallOrder.php
+++ b/plugs/think-plugs-points-mall/src/model/PointsMallOrder.php
@@ -44,54 +44,58 @@ class PointsMallOrder extends Model
// {
// return $this->hasMany(PluginPaymentRecord::class, 'order_no', 'order_no')->order('id desc')->withoutField('payment_notify');
// }
+
+ /**
+ * 关联收货地址
+ * @return \think\model\relation\HasOne
+ */
+ public function address()
+ {
+ return $this->hasOne(PointsMallAddress::class, 'id', 'address_id');
+ }
+ public function sender()
+ {
+ return $this->hasOne(PointsMallOrderSender::class, 'order_no', 'order_no');
+ }
//
// /**
-// * 关联收货地址
-// * @return \think\model\relation\HasOne
+// * 格式化支付通道
+// * @param mixed $value
+// * @return array
// */
-// public function address()
+// public function getPaymentAllowsAttr($value): array
// {
-// return $this->hasOne(PluginWemallOrderSender::class, 'order_no', 'order_no');
+// $payments = is_string($value) ? str2arr($value) : [];
+// return in_array('all', $payments) ? ['all'] : $payments;
+// }
+//
+// /**
+// * 时间格式处理
+// * @param mixed $value
+// * @return string
+// */
+// public function getPaymentTimeAttr($value): string
+// {
+// return $this->getCreateTimeAttr($value);
+// }
+//
+// /**
+// * 时间格式处理
+// * @param mixed $value
+// * @return string
+// */
+// public function setPaymentTimeAttr($value): string
+// {
+// return $this->setCreateTimeAttr($value);
+// }
+//
+// public function setConfirmTimeAttr($value): string
+// {
+// return $this->setCreateTimeAttr($value);
+// }
+//
+// public function getConfirmTimeAttr($value): string
+// {
+// return $this->getCreateTimeAttr($value);
// }
-
- /**
- * 格式化支付通道
- * @param mixed $value
- * @return array
- */
- public function getPaymentAllowsAttr($value): array
- {
- $payments = is_string($value) ? str2arr($value) : [];
- return in_array('all', $payments) ? ['all'] : $payments;
- }
-
- /**
- * 时间格式处理
- * @param mixed $value
- * @return string
- */
- public function getPaymentTimeAttr($value): string
- {
- return $this->getCreateTimeAttr($value);
- }
-
- /**
- * 时间格式处理
- * @param mixed $value
- * @return string
- */
- public function setPaymentTimeAttr($value): string
- {
- return $this->setCreateTimeAttr($value);
- }
-
- public function setConfirmTimeAttr($value): string
- {
- return $this->setCreateTimeAttr($value);
- }
-
- public function getConfirmTimeAttr($value): string
- {
- return $this->getCreateTimeAttr($value);
- }
}
\ No newline at end of file
diff --git a/plugs/think-plugs-points-mall/src/model/PointsMallOrderSender.php b/plugs/think-plugs-points-mall/src/model/PointsMallOrderSender.php
index 4e42081..bde96fc 100644
--- a/plugs/think-plugs-points-mall/src/model/PointsMallOrderSender.php
+++ b/plugs/think-plugs-points-mall/src/model/PointsMallOrderSender.php
@@ -16,23 +16,11 @@ class PointsMallOrderSender extends Model
return $this->hasOne(PointsMallOrder::class, 'order_no', 'order_no')->with(['items']);
}
- /**
- * 设置发货时间
- * @param mixed $value
- * @return string
- */
- public function setExpressTimeAttr($value): string
- {
- return $this->setCreateTimeAttr($value);
+ public function setExtraAttr($value) {
+ return json_encode($value);
}
- /**
- * 获取发货时间
- * @param mixed $value
- * @return string
- */
- public function getExpressTimeAttr($value): string
- {
- return $this->getCreateTimeAttr($value);
+ public function getExtraAttr($value) {
+ return json_decode($value, true);
}
}
\ No newline at end of file
diff --git a/plugs/think-plugs-points-mall/src/service/GoodsService.php b/plugs/think-plugs-points-mall/src/service/GoodsService.php
index b62d379..dac1dd7 100644
--- a/plugs/think-plugs-points-mall/src/service/GoodsService.php
+++ b/plugs/think-plugs-points-mall/src/service/GoodsService.php
@@ -9,6 +9,7 @@ use plugin\points_mall\model\PointsMallGoodsItem;
use plugin\points_mall\model\PointsMallOrder;
use plugin\points_mall\model\PointsMallOrderCart;
use plugin\points_mall\model\PointsMallOrderItem;
+use think\admin\Model;
/**
* 商品数据服务
diff --git a/plugs/think-plugs-points-mall/src/view/goods/form.html b/plugs/think-plugs-points-mall/src/view/goods/form.html
index 0835bca..1d0bcb5 100644
--- a/plugs/think-plugs-points-mall/src/view/goods/form.html
+++ b/plugs/think-plugs-points-mall/src/view/goods/form.html
@@ -167,8 +167,8 @@
{block name='script'}