| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- <?php
- namespace bizHd\shop\classes;
- use bizHd\base\classes\BaseClass;
- use common\components\util;
- use Yii;
- use yii\db\Expression;
- /**
- * 零售花店通知公告业务类
- */
- class ShopNoticeClass extends BaseClass
- {
- public static $baseFile = '\bizHd\shop\models\ShopNotice';
- /** 展示位置:商城首页 */
- const POSITION_HOME = 1;
- /** 展示位置:分类菜单 */
- const POSITION_CATEGORY = 2;
- /** 展示位置:购物车 */
- const POSITION_CART = 4;
- /** 展示位置:订单提交 */
- const POSITION_ORDER = 8;
- /**
- * 展示位置文案映射
- */
- public static function getPositionMap(): array
- {
- return [
- self::POSITION_HOME => '商城首页',
- self::POSITION_CATEGORY => '分类菜单',
- self::POSITION_CART => '购物车',
- self::POSITION_ORDER => '订单提交',
- ];
- }
- /**
- * 通用列表查询,供管理端与客户端复用
- */
- public static function searchList(array $params): array
- {
- $get = Yii::$app->request->get();
- $page = isset($get['page']) ? max(1, intval($get['page'])) : 1;
- $pageSize = !empty($get['pageSize']) ? intval($get['pageSize']) : Yii::$app->params['pageSize'];
- $query = self::getModel()::find()->where(['mainId' => intval($params['mainId'])]);
- if (isset($params['isDel'])) {
- $query->andWhere(['isDel' => intval($params['isDel'])]);
- }
- if (isset($params['status'])) {
- $query->andWhere(['status' => intval($params['status'])]);
- }
- if (!empty($params['title'])) {
- $query->andWhere(['like', 'title', trim($params['title'])]);
- }
- if (!empty($params['position'])) {
- $position = intval($params['position']);
- $query->andWhere(new Expression('FIND_IN_SET(:position, [[position]])', [':position' => (string)$position]));
- }
- $order = !empty($params['order']) ? $params['order'] : 'id DESC';
- $totalNum = (int)$query->count();
- $totalPage = $pageSize > 0 ? (int)ceil($totalNum / $pageSize) : 0;
- $list = $query->orderBy($order)
- ->offset(($page - 1) * $pageSize)
- ->limit($pageSize)
- ->asArray()
- ->all();
- return [
- 'totalNum' => $totalNum,
- 'totalPage' => $totalPage,
- 'moreData' => $page < $totalPage ? 1 : 0,
- 'list' => self::groupBaseInfo($list),
- ];
- }
- /**
- * 组装列表展示字段
- */
- public static function groupBaseInfo(array $list): array
- {
- $positionMap = self::getPositionMap();
- foreach ($list as $key => $item) {
- $positions = self::formatPositionToArr($item['position'] ?? '');
- $labels = [];
- foreach ($positions as $pos) {
- if (isset($positionMap[$pos])) {
- $labels[] = $positionMap[$pos];
- }
- }
- $list[$key]['positions'] = $positions;
- $list[$key]['positionLabels'] = $labels;
- }
- return $list;
- }
- /**
- * 多选位置转逗号分隔字符串
- */
- public static function formatPositionToStr($positions): string
- {
- if (is_string($positions)) {
- $positions = array_filter(array_map('trim', explode(',', $positions)));
- }
- if (!is_array($positions)) {
- return '';
- }
- $valid = array_keys(self::getPositionMap());
- $positions = array_values(array_unique(array_map('intval', $positions)));
- $positions = array_values(array_intersect($positions, $valid));
- sort($positions);
- return implode(',', $positions);
- }
- /**
- * 逗号分隔字符串转位置数组
- */
- public static function formatPositionToArr(string $position): array
- {
- if ($position === '') {
- return [];
- }
- $positions = array_filter(array_map('trim', explode(',', $position)));
- return array_values(array_map('intval', $positions));
- }
- /**
- * 校验公告表单数据
- */
- public static function validateNoticeData(array $data): array
- {
- $title = trim($data['title'] ?? '');
- $summary = trim($data['summary'] ?? '');
- if ($title === '') {
- util::fail('请输入公告标题');
- }
- if (mb_strlen($title) > 20) {
- util::fail('标题不能超过20个字');
- }
- if ($summary === '') {
- util::fail('请输入公告简介');
- }
- if (mb_strlen($summary) > 200) {
- util::fail('公告简介不能超过200个字');
- }
- $position = self::formatPositionToStr($data['position'] ?? '');
- if ($position === '') {
- util::fail('请选择展示位置');
- }
- $content = $data['content'] ?? '';
- if ($content === '' || $content === '[]') {
- util::fail('请添加公告内容');
- }
- if (is_string($content)) {
- $contentArr = json_decode($content, true);
- if (!is_array($contentArr) || empty($contentArr)) {
- util::fail('公告内容格式不正确');
- }
- }
- return [
- 'title' => $title,
- 'summary' => $summary,
- 'content' => is_string($content) ? $content : json_encode($content, JSON_UNESCAPED_UNICODE),
- 'position' => $position,
- 'sort' => intval($data['sort'] ?? 0),
- 'status' => intval($data['status'] ?? 1) === 1 ? 1 : 0,
- ];
- }
- /**
- * 新增公告
- */
- public static function addNotice(array $data): int
- {
- $noticeData = self::validateNoticeData($data);
- if (!empty($data['mainId'])) {
- $noticeData['mainId'] = intval($data['mainId']);
- }
- if (!empty($data['staffId'])) {
- $noticeData['staffId'] = intval($data['staffId']);
- }
- if ($noticeData['status'] === 1) {
- $noticeData['publishTime'] = date('Y-m-d H:i:s');
- }
- $result = self::add($noticeData);
- return is_array($result) ? intval($result['id'] ?? 0) : intval($result);
- }
- /**
- * 更新公告
- */
- public static function updateNotice(int $id, array $data): void
- {
- $noticeData = self::validateNoticeData($data);
- $info = self::getById($id);
- if (empty($info)) {
- util::fail('公告不存在');
- }
- if (!empty($data['staffId'])) {
- $noticeData['staffId'] = intval($data['staffId']);
- }
- self::updateById($id, $noticeData);
- }
- /**
- * 公告详情
- */
- public static function getDetail(int $id): array
- {
- $info = self::getById($id);
- if (empty($info)) {
- util::fail('公告不存在');
- }
- $list = self::groupBaseInfo([$info]);
- return current($list);
- }
- /**
- * 软删除公告
- */
- public static function deleteNotice(int $id, int $staffId = 0): void
- {
- $updateData = ['isDel' => 1];
- if ($staffId > 0) {
- $updateData['staffId'] = $staffId;
- }
- self::updateById($id, $updateData);
- }
- /**
- * 上下架公告
- */
- public static function updateStatus(int $id, int $status, int $staffId = 0): void
- {
- $status = $status === 1 ? 1 : 0;
- $updateData = ['status' => $status];
- if ($staffId > 0) {
- $updateData['staffId'] = $staffId;
- }
- self::updateById($id, $updateData);
- }
- /**
- * 校验公告归属权限
- */
- public static function valid(array $info, int $mainId): void
- {
- if (empty($info) || intval($info['mainId']) !== intval($mainId)) {
- util::fail('没有权限操作该公告');
- }
- if (intval($info['isDel']) === 1) {
- util::fail('公告已删除');
- }
- }
- }
|