shish hace 5 años
padre
commit
92120b4e5a

+ 2 - 2
app-hd/controllers/PurchaseController.php

@@ -50,7 +50,7 @@ class PurchaseController extends BaseController
             ProductClass::valid($productList, $currentShopId);
             $post['product'] = $productList;
             $post['sendCost'] = isset($post['sendCost']) && is_numeric($post['sendCost']) ? $post['sendCost'] : 0;
-            $post['couponId'] = isset($post['couponId']) ? $post['couponId'] : 0;
+
             $respond = PurchaseService::createPurchase($post, $ghsInfo);
             $orderSn = $respond->orderSn ?? '';
             $actPrice = $respond->actPrice ?? '';
@@ -183,7 +183,7 @@ class PurchaseController extends BaseController
         $post = Yii::$app->request->post();
         $couponId = $post['couponId'] ?? 0;
         $orderSn = isset($post['orderSn']) ? $post['orderSn'] : 0;
-        $order = PurchaseClass::getByCondition(['orderSn' => $orderSn],true);
+        $order = PurchaseClass::getByCondition(['orderSn' => $orderSn], true);
         if (empty($order)) {
             util::fail('订单号无效');
         }

+ 21 - 0
biz-hd/purchase/classes/PurchaseClass.php

@@ -3,6 +3,7 @@
 namespace bizHd\purchase\classes;
 
 use biz\ghs\classes\GhsClass;
+use biz\shop\classes\ShopCouponClass;
 use biz\shop\models\Shop;
 use bizGhs\admin\classes\AdminClass;
 use bizGhs\order\traits\OrderTrait;
@@ -121,6 +122,26 @@ class PurchaseClass extends BaseClass
         $sendCost = $data['sendCost'] ?? 0.00;
         $prePrice = bcadd($prePrice, $sendCost, 2);
         $actPrice = $prePrice;
+
+        //验证优惠券
+        $couponId = isset($data['couponId']) ? $data['couponId'] : 0;
+        if (!empty($couponId)) {
+            $coupon = ShopCouponClass::getLockById($couponId);
+            ShopCouponClass::valid($coupon, $data['shopId']);
+            if ($coupon->miniCost != 0 || $coupon->miniCost > $prePrice) {
+                util::fail('达到最低消费才能使用优惠券');
+            }
+            if ($prePrice < $coupon->amount) {
+                util::fail('总价应大于优惠金额');
+            }
+            $coupon->take = ShopCouponClass::TAKE_HAS;
+            $coupon->save();
+            $actPrice = bcsub($prePrice, $coupon->amount, 2);
+            $data['discountType'] = dict::getDict('discountType', 'usePtCoupon');
+            $data['discountAmount'] = $coupon->amount;
+        }
+        $data['couponId'] = $couponId;
+
         $data['prePrice'] = $prePrice;
         $data['actPrice'] = $actPrice;
         $data['bigNum'] = $bigNum;

+ 27 - 1
biz-hd/purchase/services/PurchaseService.php

@@ -3,7 +3,9 @@
 namespace bizHd\purchase\services;
 
 use biz\ghs\models\Ghs;
+use biz\shop\classes\ShopCouponClass;
 use biz\shop\models\Shop;
+use biz\shop\models\ShopCoupon;
 use bizGhs\custom\classes\CustomClass;
 use bizGhs\order\classes\OrderClass;
 use bizGhs\order\services\OrderService;
@@ -47,6 +49,10 @@ class PurchaseService extends BaseService
         if ($getType == PurchaseClass::GET_TYPE_SELF_GET) {
             $sendType = OrderClass::SEND_TYPE_NO;
         }
+        $couponId = $data['couponId'] ?? 0;
+        $discountType = $respond->discountType ?? dict::getDict('discountType', 'noDiscount');
+        $discountAmount = $respond->discountAmount ?? 0;
+        $customPrice = $respond->actPrice;
         $arr = [
             'product' => $product,
             'merchantId' => $currentSjId,
@@ -69,6 +75,10 @@ class PurchaseService extends BaseService
             'customShopAdminName' => $shopAdminName,
             'ghsId' => $ghsId,
             'orderType' => OrderClass::ORDER_TYPE_HD_ADD,
+            'couponId' => $couponId,
+            'discountType' => $discountType,
+            'discountAmount' => $discountAmount,
+            'customPrice' => $customPrice,
         ];
         $result = OrderClass::addOrder($arr);
         $saleId = $result['id'] ?? 0;
@@ -142,6 +152,11 @@ class PurchaseService extends BaseService
             $saleId = $purchase->saleId;
             //销售单失效
             OrderClass::cancel($saleId);
+            $couponId = $purchase->couponId;
+            if (!empty($couponId)) {
+                $coupon = ShopCoupon::getById($couponId, true);
+                ShopCouponClass::rollback($coupon);
+            }
         }
         return $purchase;
     }
@@ -151,7 +166,6 @@ class PurchaseService extends BaseService
     {
         $payWay = dict::getDict('payWay', 'debtPay');
         self::payAfter($info, $payWay);
-
         $saleId = $info->saleId ?? 0;
         $order = OrderClass::getById($saleId, true);
         OrderService::payAfter($order, $payWay);
@@ -230,6 +244,18 @@ class PurchaseService extends BaseService
         $shop->cgUnSend += 1;
         $shop->save();
 
+        //使用优惠券
+        $couponId = $info->couponId;
+        if (!empty($couponId)) {
+            $coupon = ShopCouponClass::getLockById($couponId);
+            if ($coupon->take != ShopCouponClass::TAKE_UN) {
+                Yii::info("优惠券已经被使用 orderId:{$info->id} couponId:{$couponId}");
+                util::fail('优惠券已经被使用');
+            }
+            $coupon->status = ShopCouponClass::STATUS_USED;
+            $coupon->save();
+        }
+
         /**零售的供货商资产变化**/
         $ghsId = $info->ghsId ?? 0;
         $ghs = Ghs::findBySql('select * from ' . Ghs::tableName() . ' where id = :id for update', ['id' => $ghsId])->one();

+ 33 - 2
biz/shop/classes/ShopCouponClass.php

@@ -3,6 +3,7 @@
 namespace biz\shop\classes;
 
 use biz\base\classes\BaseClass;
+use common\components\util;
 
 class ShopCouponClass extends BaseClass
 {
@@ -13,6 +14,9 @@ class ShopCouponClass extends BaseClass
     const STATUS_USED = 2;
     const STATUS_EXPIRE = 3;
 
+    const TAKE_UN = 1;
+    const TAKE_HAS = 2;
+
     public static $defaultCoupon = [
         [
             'name' => '优惠券',
@@ -59,7 +63,6 @@ class ShopCouponClass extends BaseClass
             ];
             $couponData[] = $coupon;
         }
-
         return self::batchAdd($couponData);
     }
 
@@ -78,4 +81,32 @@ class ShopCouponClass extends BaseClass
         ]);
         return $count > 0 ? true : false;
     }
-}
+
+    public static function valid($coupon, $shopId)
+    {
+        if (empty($coupon)) {
+            util::fail('没有找到优惠券');
+        }
+        if (isset($coupon->shopId) && $coupon->shopId != $shopId) {
+            util::fail('不是您的优惠券');
+        }
+        if (isset($coupon->take) && $coupon->take == self::TAKE_HAS) {
+            util::fail('优惠券已被使用');
+        }
+        $current = date("Y-m-d H:i:s");
+        if ($coupon->endTime < $current) {
+            util::fail('优惠券已经过期');
+        }
+        return true;
+    }
+
+    //优惠券回滚 shish 2021.5.18
+    public static function rollback($coupon)
+    {
+        if (isset($coupon->take) && $coupon->take == self::TAKE_HAS) {
+            $coupon->take = self::TAKE_UN;
+            $coupon->save();
+        }
+    }
+
+}

+ 7 - 0
common/base/classes/BaseClass.php

@@ -170,4 +170,11 @@ class BaseClass
         return $model->counters($counters, $condition, $params);
     }
 
+    //根据主键获取被销的信息 shish 2021.5.18
+    public static function getLockById($id)
+    {
+        $model = Yii::createObject(['class' => static::$baseFile]);
+        return $model->getLockById($id);
+    }
+
 }

+ 7 - 0
common/base/models/Base.php

@@ -344,4 +344,11 @@ class Base extends ActiveRecord
         //同样第一个参数指定关联的子表模型类名
         return $this->hasOne(Author::className(), ['id' => 'author_id']);
     }
+
+    //根据主键获取被销的信息 shish 2021.5.18
+    public function getLockById($id)
+    {
+        return self::findBySql('select * from ' . self::tableName() . ' where id = :id for update', ['id' => $id])->one();
+    }
+
 }

+ 10 - 1
common/components/dict.php

@@ -10,7 +10,7 @@ class dict
     public static $data = [
 
         //采购和销售单的有效期
-        'sale_purchase_order_valid' => 300,
+        'sale_purchase_order_valid' => 120,
 
         //需要显示国兰的信息 0不需要 1需要(要审核小程序请显示国兰信息)
         'showGlInfo' => 1,
@@ -42,6 +42,7 @@ class dict
         //涨价方式
         'riseType' => ['noRise' => 0, 'percent' => 1, 'amount' => 2,],
         'riseTypeName' => [0 => '不涨价', 1 => '按百分比', 2 => '按金额'],
+
         //支付方式
         'payWay' => ['wxPay' => 0, 'alipay' => 1, 'balancePay' => 2, 'debtPay' => 3],
         'payWayName' => [0 => '微信', 1 => '支付宝', 2 => '余额', 3 => '欠款'],
@@ -52,6 +53,14 @@ class dict
             ['name' => '支付宝', 'id' => 1],
         ],
 
+        //优惠类型
+        'discountType' => [
+            //没有优惠
+            'noDiscount' => 1,
+            //使用平台优惠券
+            'usePtCoupon' => 2,
+        ],
+
         'payStatus' => ['cancel' => -1, 'waitForPay' => 0, 'waitForSend' => 1],
 
         'sendStatusName' => [0 => '待发货', 1 => '送货中', 2 => '已送达'],

+ 0 - 2
console/controllers/PurchaseController.php

@@ -31,10 +31,8 @@ class PurchaseController extends Controller
                     $id = $purchase['id'] ?? 0;
                     $current = PurchaseClass::getById($id, true);
                     PurchaseService::expire($current);
-
                     $log = "过期的采购单:{$id} json:" . json_encode($purchase);
                     $arr[] = $log;
-
                 }
             }
             $transaction->commit();

+ 20 - 1
sql.sql

@@ -2513,6 +2513,8 @@ ALTER TABLE xhShopAdmin ADD remark VARCHAR(1000) NOT NULL DEFAULT '' COMMENT ''
 -----shish 2021
 #采购单到期脚本
 */1 * * * * /usr/local/nginx/html/huahuibao/yii purchase/expire-order
+#优惠券过期脚本
+*/2 * * * * /usr/local/nginx/html/huahuibao/yii shop-coupon/expire
 
 阿里云 线上 bucket 需要独立出来 不再跟测试环境混在一起使用
 
@@ -2562,7 +2564,24 @@ CREATE TABLE `xhCashSn` (
   PRIMARY KEY (`id`)
 ) ENGINE=INNODB AUTO_INCREMENT=12123500 COMMENT='提现申请订单号';
 ALTER TABLE xhCash ADD orderSn CHAR(30) NOT NULL DEFAULT '' COMMENT '订单编号' AFTER `id`;
+ALTER TABLE xhPurchase ADD couponId INT NOT NULL DEFAULT 0 COMMENT '优惠券id' AFTER `clearId`;
+ALTER TABLE xhShopCoupon ADD take TINYINT NOT NULL DEFAULT 1 COMMENT '1未占用 2占用' AFTER `capitalType`;
+ALTER TABLE xhPurchase ADD discountAmount DECIMAL(9,2) NOT NULL DEFAULT '0.00' COMMENT '优惠金额' AFTER `couponId`;
+ALTER TABLE xhPurchase ADD `discountType` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '优惠类型 1使用平台优惠' AFTER `discountAmount`;
+ALTER TABLE xhGhsOrder ADD couponId INT NOT NULL DEFAULT 0 COMMENT '优惠券id' AFTER `shopId`;
+ALTER TABLE xhGhsOrder ADD discountAmount DECIMAL(9,2) NOT NULL DEFAULT '0.00' COMMENT '优惠金额' AFTER `couponId`;
+ALTER TABLE xhGhsOrder ADD `discountType` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '优惠类型 1使用平台优惠' AFTER `discountAmount`;
+ALTER TABLE xhOrder MODIFY `discountType` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '优惠类型 1使用平台优惠。类型放在dict.php里';
+ALTER TABLE xhGhsOrder MODIFY `discountType` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '优惠类型 1使用平台优惠。类型放在dict.php里';
+ALTER TABLE xhPurchase MODIFY `discountType` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '优惠类型 1使用平台优惠。类型放在dict.php里';
+
+ALTER TABLE xhOrder MODIFY `discountType` TINYINT(4) NOT NULL DEFAULT '1' COMMENT '优惠类型 1没有优惠 2使用平台优惠。类型放在dict.php里';
+ALTER TABLE xhGhsOrder MODIFY `discountType` TINYINT(4) NOT NULL DEFAULT '1' COMMENT '优惠类型 1没有优惠 2使用平台优惠。类型放在dict.php里';
+ALTER TABLE xhPurchase MODIFY `discountType` TINYINT(4) NOT NULL DEFAULT '1' COMMENT '优惠类型 1没有优惠 2使用平台优惠。类型放在dict.php里';
 
 --------linqh 2021.5.17
 ALTER TABLE `xhGhsStockRecord`
-ADD COLUMN `productId`  int(11) NOT NULL DEFAULT 0 AFTER `orderSn`;
+ADD COLUMN `productId`  int(11) NOT NULL DEFAULT 0 AFTER `orderSn`;
+
+---shish 20210518
+ALTER TABLE xhGhsOrder ADD customPrice DECIMAL(9,2) NOT NULL DEFAULT '0.00' COMMENT '客户实际付款金额' AFTER `actPrice`;