// +---------------------------------------------------------------------- declare (strict_types=1); namespace app\store\model\goods; use app\common\library\helper; use think\Paginator; use think\Collection; use app\common\model\goods\GoodsPrice as GoodsPriceModel; use app\common\model\Category as CategoryModel; /** * 商品价格配比 * Class Service */ class GoodsPrice extends GoodsPriceModel { /** * 获取全部记录 * @param array $param * @return array|Collection * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function getAll($params) { $catFids = CategoryModel::where(['parent_id' => 0])->column('category_id'); $catList = CategoryModel::with(['price'])->whereIn('parent_id', $catFids)->select()->toArray(); $all = []; foreach ($catList as $k => $v) { $temp = []; if (!empty($v['price'])) { foreach ($v['price'] as $pk => $pv) { if (!empty($params['type'])) { if ($pv['type'] == $params['type']) { $temp[] = $pv; } } else { if ($pv['type'] == 1) { $temp[] = $pv; } } } } $all[] = [ 'category_id' => $v['category_id'], 'name' => $v['name'], 'price' => $temp ]; } return $all; } /** * 新增记录 * @param array $data * @return bool|false */ public function add(array $data): bool { if (empty($data['type']) || empty($data['max_price']) || empty($data['cat_id']) || empty($data['markup_rate'])) { $this->error = "请补全信息"; return false; } //校验是否有冲突的区间 $catList = $this->where(['cat_id' => $data['cat_id'], 'type' => $data['type']])->select(); if (!empty($catList)) { foreach ($catList as $k => $v) { if ($data['min_price'] >= $v->min_price && $data['min_price'] <= $v->max_price) { $this->error = "该分类价格区间冲突,请重新设置价格"; return false; } if ($data['max_price'] <= $v->max_price && $data['max_price'] >= $v->min_price) { $this->error = "该分类价格区间冲突,请重新设置价格"; return false; } } } $data['profit_min'] = round($data['min_price'] * $data['markup_rate'] / 100, 2); $data['profit_max'] = round($data['max_price'] * $data['markup_rate'] / 100, 2); $data['store_id'] = self::$storeId; return $this->save($data); } /** * 更新记录 * @param array $data * @return bool */ public function edit(array $data): bool { if (empty($data['type']) || empty($data['max_price']) || empty($data['cat_id']) || empty($data['markup_rate']) || empty($data['id'])) { $this->error = "请补全信息"; return false; } $detail = $this->where('id', '=', $data['id'])->find(); if ($detail->isEmpty()) { $this->error = "异常数据"; return false; } //校验是否有冲突的区间 $catList = $this->where(['cat_id' => $data['cat_id'], 'type' => $data['type']])->where('id', '<>', $data['id'])->select(); if (!empty($catList)) { foreach ($catList as $k => $v) { if ($data['min_price'] >= $v->min_price && $data['min_price'] <= $v->max_price) { $this->error = "该分类价格区间冲突,请重新设置价格"; return false; } if ($data['max_price'] <= $v->max_price && $data['max_price'] >= $v->min_price) { $this->error = "该分类价格区间冲突,请重新设置价格"; return false; } } } $data['profit_min'] = round($data['min_price'] * $data['markup_rate'] / 100, 2); $data['profit_max'] = round($data['max_price'] * $data['markup_rate'] / 100, 2); return $detail->save($data) !== false; } /** * 删除记录(软删除) * @return bool * @throws \Exception */ public function del($data): bool { // 判断该服务是否被商品引用 $detail = $this->where('id', '=', $data['id'])->find(); if ($detail->isEmpty()) { $this->error = "异常数据"; return false; } return $detail->delete() !== false; } /** * 获取和计算折扣后的价格 * @param $catId * @param $type * @param $originalPrice * @return string */ public static function getDiscountPrice($catId, $type = 1, $originalPrice): string { $info = self::where(['cat_id' => $catId, 'type' => $type]) ->where('min_price', '<=', $originalPrice) ->order('min_price desc') ->find(); //没有配置返回原价 if (!$info) { return $originalPrice; } // 使用高精度方法计算等级折扣; $discountPrice = helper::bcmul($originalPrice, $info->markup_rate / 100, 2); //取优惠后的价格 $lastPrice = bcsub($originalPrice, $discountPrice, 2); return helper::number2($lastPrice, true); } }