PostageRules.php 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. <?php
  2. /**
  3. * 厦门云联储网络科技有限公司
  4. * https://www.baokuaiyun.com
  5. * Copyright (c) 2023 爆块云 All rights reserved.
  6. */
  7. namespace app\models;
  8. use app\jobs\storeSync\DiyCommon;
  9. use yii\behaviors\TimestampBehavior;
  10. use yii\helpers\Json;
  11. /**
  12. * This is the model class for table "{{%postage_rules}}".
  13. *
  14. * @property integer $id
  15. * @property integer $store_id
  16. * @property integer $mch_id
  17. * @property string $name
  18. * @property integer $express_id
  19. * @property string $detail
  20. * @property integer $created_at
  21. * @property integer $is_enable
  22. * @property integer $is_delete
  23. * @property string $express
  24. * @property string $updated_at
  25. * @property integer $is_new
  26. */
  27. class PostageRules extends \yii\db\ActiveRecord
  28. {
  29. /**
  30. * @inheritdoc
  31. */
  32. public static function tableName()
  33. {
  34. return '{{%postage_rules}}';
  35. }
  36. public function behaviors()
  37. {
  38. return [
  39. [
  40. // 自动更新创建和更新时间
  41. 'class' => TimestampBehavior::class,
  42. 'value' => time()
  43. ]
  44. ];
  45. }
  46. /**
  47. * @inheritdoc
  48. */
  49. public function rules()
  50. {
  51. return [
  52. [['store_id', 'mch_id', 'name', 'detail', 'type'], 'required'],
  53. [['store_id', 'mch_id', 'express_id', 'created_at', 'is_enable', 'is_delete', 'type', 'updated_at', 'is_new'], 'integer'],
  54. [['detail'], 'string'],
  55. ['mch_id', 'default', 'value' => 0],
  56. [['name', 'express'], 'string', 'max' => 255],
  57. ];
  58. }
  59. /**
  60. * @inheritdoc
  61. */
  62. public function attributeLabels()
  63. {
  64. return [
  65. 'id' => 'ID',
  66. 'store_id' => 'Store ID',
  67. 'mch_id' => '商户id',
  68. 'name' => '名称',
  69. 'express_id' => '物流公司',
  70. 'detail' => '规则详细',
  71. 'created_at' => '创建时间',
  72. 'is_enable' => '是否启用:0=否,1=是',
  73. 'is_delete' => 'Is Delete',
  74. 'express' => '快递公司',
  75. 'type' => '计费方式',
  76. 'updated_at' => '更新时间',
  77. 'is_new' => '是否是新版本'
  78. ];
  79. }
  80. /**
  81. * 购物车结算 多种运费规则组合计算运费
  82. * @param $store_id
  83. * @param $province_id
  84. * @param $goods
  85. * @return float|int
  86. */
  87. public static function getExpressPriceMore($store_id, $city_id, $goodsList, $province_id, &$error_data = [])
  88. {
  89. $newGoodsList = [];
  90. foreach ($goodsList as $row) {
  91. if (isset($newGoodsList[$row['freight']])) {
  92. $newGoodsList[$row['freight']]['num'] += $row['num'];
  93. $newGoodsList[$row['freight']]['weight'] += $row['weight'];
  94. } else {
  95. $newGoodsList[$row['freight']] = $row;
  96. }
  97. }
  98. $price = 0;
  99. foreach ($newGoodsList as $key => $goods) {
  100. $open = true;
  101. if ($goods['freight'] != '0') {
  102. $postage_rules = PostageRules::find()->andWhere([
  103. 'is_delete' => 0,
  104. 'id' => $goods['freight'],
  105. ])->asArray()->one();
  106. }
  107. if (!$postage_rules) {
  108. $goodsInfo = Goods::findOne($goods['goods_id']);
  109. if (isset($goodsInfo['mch_id']) && $goodsInfo['mch_id']) {
  110. $postage_rules = PostageRules::find()->andWhere([
  111. 'is_delete' => 0,
  112. 'is_enable' => 1,
  113. 'mch_id' => $goodsInfo['mch_id'],
  114. ])->asArray()->one();
  115. } else {
  116. $postage_rules = PostageRules::find()->andWhere([
  117. 'store_id' => $store_id,
  118. 'is_delete' => 0,
  119. 'is_enable' => 1,
  120. 'mch_id' => 0,
  121. ])->asArray()->one();
  122. }
  123. }
  124. if ($postage_rules) {
  125. $list = json_decode($postage_rules['detail'], true);
  126. foreach ($list as $i => $item) {
  127. if (intval($postage_rules['type']) === 1) {
  128. if (!empty($item['rules'])) {
  129. //按照重量
  130. foreach ($item['rules'] as $rules_item) {
  131. if ($rules_item['min_weight'] <= $goods['weight'] && $goods['weight'] < $rules_item['max_weight']) {
  132. foreach ($item['province_list'] as $j => $province) {
  133. if ($province['id'] == $province_id || $province['id'] == $city_id) {
  134. $price += (float)$rules_item['frist_price'];
  135. if ($goods['weight'] > $rules_item['frist']) {
  136. $diff = $goods['weight'] - $rules_item['frist'];
  137. if ($rules_item['second'] > 0 && $rules_item['second_price'] > 0) {
  138. $diff = ceil($diff / $rules_item['second']);
  139. $price += $diff * (float)$rules_item['second_price'];
  140. }
  141. }
  142. $open = false;
  143. goto postage_rules_end;
  144. }
  145. }
  146. }
  147. }
  148. }
  149. } else {
  150. foreach ($item['province_list'] as $j => $province) {
  151. if ($province['id'] == $province_id || $province['id'] == $city_id) {
  152. if (!empty($item['rules'])) {
  153. //按照数量
  154. foreach ($item['rules'] as $rules_item) {
  155. $price += (float)$rules_item['frist_price'];
  156. if ($goods['num'] > intval($rules_item['frist'])) {
  157. $diff = $goods['num'] - intval($rules_item['frist']);
  158. if (intval($rules_item['second']) > 0 && floatval($rules_item['second_price']) > 0) {
  159. $diff = ceil($diff / $rules_item['second']);
  160. $price += $diff * (float)$rules_item['second_price'];
  161. }
  162. }
  163. }
  164. $open = false;
  165. goto postage_rules_end;
  166. }
  167. }
  168. }
  169. }
  170. }
  171. postage_rules_end:
  172. if ($open) {
  173. $error_data[$goods['goods_id']] = [
  174. 'a' => $postage_rules,
  175. '$item' => $item,
  176. 'msg' => '该订单重量超过配送范围,请联系客服调整运费规则',
  177. 'status' => false
  178. ];
  179. return 0;
  180. }
  181. }
  182. }
  183. return $price;
  184. }
  185. public static function getExpressPrice($store_id, $city_id, $goods, $num, $province_id)
  186. {
  187. if ($goods->freight != '0') {
  188. $postage_rules = PostageRules::findOne([
  189. // 'store_id' => $store_id,
  190. 'is_delete' => 0,
  191. 'id' => $goods->freight,
  192. ]);
  193. } else {
  194. $postage_rules = PostageRules::findOne([
  195. 'store_id' => $store_id,
  196. 'is_delete' => 0,
  197. 'is_enable' => 1,
  198. ]);
  199. }
  200. if (!$postage_rules) {
  201. $postage_rules = PostageRules::findOne([
  202. 'store_id' => $store_id,
  203. 'is_delete' => 0,
  204. 'is_enable' => 1
  205. ]);
  206. }
  207. $price = 0.00;
  208. $list = Json::decode($postage_rules->detail);
  209. $matching = null;
  210. if (empty($list)) {
  211. return 0;
  212. }
  213. foreach ($list as $i => $item) {
  214. $in_array = false;
  215. foreach ($item['province_list'] as $j => $province) {
  216. if (isset($province->id) && ($province->id == $province_id || $province->id == $city_id)) {
  217. $in_array = true;
  218. break;
  219. }
  220. }
  221. if ($in_array) {
  222. $matching = $list[$i];
  223. }
  224. }
  225. if ($matching == null) {
  226. return 0;
  227. }
  228. if ($postage_rules->type == 1) {
  229. // 按重计费
  230. $totalWeight = $goods->weight * $num;
  231. $totalWeight -= $matching->frist;
  232. $price += $matching->frist_price;
  233. $leave = $matching->second ? (ceil($totalWeight / $matching->second) > 0 ? ceil($totalWeight / $matching->second) : 0) : 0;
  234. $price += $leave * $matching->second_price;
  235. } else {
  236. // 按件计费
  237. $num -= $matching->frist;
  238. $price += $matching->frist_price;
  239. $leave = $matching->second ? (ceil($num / $matching->second) > 0 ? ceil($num / $matching->second) : 0) : 0;
  240. $price += $leave * $matching->second_price;
  241. }
  242. return $price;
  243. }
  244. public function afterSave($insert, $changedAttributes)
  245. {
  246. parent::afterSave($insert, $changedAttributes); // TODO: Change the autogenerated stub
  247. $postageRules = self::findOne($this->id);
  248. (new DiyCommon)->JobBehaviors($postageRules->store_id, StoreSyncExtLog::TYPE_POSTAGE_RULES, [$this->id]);
  249. }
  250. }