| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- <?php
- namespace app\workerapi\logic\shops;
- use app\common\logic\BaseLogic;
- use app\common\model\article\Article;
- use app\common\model\decorate\DecoratePage;
- use app\common\model\decorate\DecorateTabbar;
- use app\common\model\setting\PostageRegion;
- use app\common\model\shops\ShopAddress;
- use app\common\model\shops\ShopCart;
- use app\common\model\shops\ShopGoods;
- use app\common\model\shops\ShopGoodSpecsInventory;
- use app\common\model\shops\ShopOrderGoods;
- use app\common\model\shops\ShopOrders;
- use app\common\model\user\UserAddress;
- use app\common\service\ConfigService;
- use app\common\service\FileService;
- use think\db\Query;
- use think\Exception;
- use think\facade\Db;
- /**
- * 订单
- */
- class ShopOrderLogic extends BaseLogic
- {
- /**
- * 提交订单
- * @param array $params
- * @return array|false
- */
- public static function submitOrder($params)
- {
- Db::startTrans();
- try {
- //获取购物车商品
- $shop_carts = ShopCart::whereIn('id',$params['shop_cart_id'])->where('worker_id',$params['user_id'])->select()->toArray();
- if(empty($shop_carts)){
- throw new Exception('购物车商品不存在');
- }
- $addressInfo = ShopAddress::field('area,address,house_number,contact_number,contact_people')->findOrEmpty($params['address_id']);
- if($addressInfo->isEmpty()){
- throw new \Exception('收货地址不存在');
- }
- //生成订单编号
- $sn = generate_sn(ShopOrders::class, 'sn');
- $shop_order_goods = array();
- $amount_total = 0;//总价
- $amount = 0;//应支付价格
- //验证商品库存是否存在
- foreach ($shop_carts as $v){
- $inventory = ShopGoodSpecsInventory::where('id',$v['goods_specs_inventory_id'])->findOrEmpty();
- $shop_good = ShopGoods::where('id',$v['shop_goods_id'])->findOrEmpty()->toArray();
- if($inventory->remaining_inventory<$v['number']){
- throw new Exception($shop_good['goods_name'].'库存不足');
- }
- //新增订单商品镜像
- $shop_order_goods[] = [
- 'sn'=>$sn,
- 'shop_goods_id'=>$shop_good['id'],
- 'goods_category_ids' => $shop_good['goods_category_ids'],
- 'goods_category_id' => $shop_good['goods_category_id'],
- 'goods_name' => $shop_good['goods_name'],
- 'goods_image' => $shop_good['goods_image'],
- 'goods_banners' => $shop_good['goods_banners'],
- 'company_name' => $shop_good['company_name'],
- 'description' => $shop_good['description'],
- 'specs_type' => $shop_good['specs_type'],
- 'custom_attribute_items'=>json_encode($shop_good['custom_attribute_items'],JSON_UNESCAPED_UNICODE),
- 'goods_specs_inventory_id'=>$v['goods_specs_inventory_id'],
- 'specs'=>json_encode($inventory->specs,JSON_UNESCAPED_UNICODE),
- 'number'=>$v['number'],
- 'service_total'=>$inventory->service_total,
- 'service_fee'=>$inventory->service_fee
- ];
- //减少商品库存
- $inventory->remaining_inventory = $inventory->remaining_inventory-$v['number'];
- $inventory->save();
- $amount_total += $inventory['service_total'];
- $amount += $inventory['service_fee'];
- }
- //生成订单
- $order = ShopOrders::create([
- 'shop_order_type' => 1,
- 'worker_id' => $params['user_id'],
- 'sn' => $sn,
- 'real_name' => $addressInfo->contact_people,
- 'mobile' => $addressInfo->contact_number,
- 'address' => trim($addressInfo->area .$addressInfo->address . $addressInfo->house_number),
- 'pay_status' => 0,
- 'paw_way' => 2,
- 'order_terminal' => $params['terminal'],
- 'amount_total' => $amount_total,
- 'order_amount' => $amount,
- 'address_json' => $addressInfo->toArray()
- ]);
- //生成订单商品镜像
- $ShopOrderGoods = new ShopOrderGoods();
- $ShopOrderGoods->saveAll($shop_order_goods);
- //清除购物车商品
- ShopCart::whereIn('id',$params['shop_cart_id'])->delete();
- Db::commit();
- } catch (\Exception $e) {
- self::setError($e->getMessage());
- return false;
- }
- return [
- 'order_id' => (int)$order['id'],
- ];
- }
- /**
- * @notes 获取详情
- * @param $params
- * @return array
- * @author likeadmin
- * @date 2024/07/18 13:51
- */
- public static function detail($params): array
- {
- $detail = ShopOrders::with(['orderGoods'=>function(Query $query){
- $query->field(['sn','goods_name','goods_image','number','service_fee','service_total','company_name','delivery_type','shop_goods_type','goods_specs_inventory_id','specs_type','custom_attribute_items','specs'])->append(['spec_arr','delivery_type_text','shop_goods_type_text']);
- }])->field('id, sn, real_name,mobile, address,address_json,pay_time, paw_way,pay_sn, pay_status, refund_status, refund_transaction_id,create_time,shop_order_type,amount_total, order_amount')
- ->append(['pay_way_text','pay_status_text','refund_status_text'])->where(['sn'=> $params['sn'],'worker_id'=>$params['worker_id']])->findOrEmpty()->toArray();
- $orderGoodsArr = [];
- $companyNameArr = array_unique(array_column($detail['orderGoods'],'company_name'));
- foreach($companyNameArr as $val) {
- $orderGoods = [];
- foreach ($detail['orderGoods'] as $goodVal) {
- if($val == $goodVal['company_name']){
- unset($goodVal['goodsSpecsInventory'], $goodVal['custom_attribute_items'], $goodVal['specs'], $goodVal['sn'], $goodVal['goods_specs_inventory_id'],$goodVal['company_name']);
- $orderGoods[] = $goodVal;
- }
- }
- if(!empty($orderGoods)){
- $orderGoodsArr[] = [
- 'company_name' => $val,
- 'goods' => $orderGoods
- ];
- }
- }
- $detail['orderGoods'] = $orderGoodsArr;
- return $detail;
- }
- public static function cancelOrder($params):bool
- {
- Db::startTrans();
- try {
- $orderModel = ShopOrders::where([
- 'shop_order_type' => 1,
- 'worker_id' => $params['worker_id'],
- 'sn'=>$params['sn']
- ])->findOrEmpty();
- if($orderModel->isEmpty()){
- throw new \Exception('订单不存在或不是待支付状态');
- }
- $orderModel->shop_order_type = 0;
- $orderModel->save();
- Db::commit();
- return true;
- } catch (\Exception $e) {
- Db::rollback();
- self::setError($e->getMessage());
- return false;
- }
- }
- }
|