123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- <?php
- namespace app\data\service;
- use think\admin\extend\DataExtend;
- use think\admin\Service;
- /**
- * 商品数据服务
- * Class GoodsService
- * @package app\data\service
- */
- class GoodsService extends Service
- {
- /**
- * 更新商品库存数据
- * @param string $code
- * @return bool
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\DbException
- * @throws \think\db\exception\ModelNotFoundException
- */
- public function syncStock(string $code): bool
- {
- // 商品入库统计
- $query = $this->app->db->name('ShopGoodsStock');
- $query->field('goods_code,goods_spec,ifnull(sum(goods_stock),0) stock_total');
- $stockList = $query->where(['goods_code' => $code])->group('goods_code,goods_spec')->select()->toArray();
- // 商品销量统计
- $query = $this->app->db->table('shop_order a')->field('b.goods_code,b.goods_spec,ifnull(sum(b.stock_sales),0) stock_sales');
- $query->leftJoin('shop_order_item b', 'a.order_no=b.order_no')->where([['b.goods_code', '=', $code], ['a.status', 'in', [1, 2, 3, 4, 5]]]);
- $salesList = $query->group('b.goods_code,b.goods_spec')->select()->toArray();
- // 组装更新数据
- $dataList = [];
- foreach (array_merge($stockList, $salesList) as $vo) {
- $key = "{$vo['goods_code']}@@{$vo['goods_spec']}";
- $dataList[$key] = isset($dataList[$key]) ? array_merge($dataList[$key], $vo) : $vo;
- if (empty($dataList[$key]['stock_sales'])) $dataList[$key]['stock_sales'] = 0;
- if (empty($dataList[$key]['stock_total'])) $dataList[$key]['stock_total'] = 0;
- }
- unset($salesList, $stockList);
- // 更新商品规格销量及库存
- foreach ($dataList as $vo) {
- $map = ['goods_code' => $code, 'goods_spec' => $vo['goods_spec']];
- $set = ['stock_total' => $vo['stock_total'], 'stock_sales' => $vo['stock_sales']];
- $this->app->db->name('ShopGoodsItem')->where($map)->update($set);
- }
- // 更新商品主体销量及库存
- $this->app->db->name('ShopGoods')->where(['code' => $code])->update([
- 'stock_total' => intval(array_sum(array_column($dataList, 'stock_total'))),
- 'stock_sales' => intval(array_sum(array_column($dataList, 'stock_sales'))),
- 'stock_virtual' => $this->app->db->name('ShopGoodsItem')->where(['goods_code' => $code])->sum('number_virtual'),
- ]);
- return true;
- }
- /**
- * 获取分类数据
- * @return array
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\DbException
- * @throws \think\db\exception\ModelNotFoundException
- */
- public function getCateTree(): array
- {
- $map = ['deleted' => 0, 'status' => 1];
- $query = $this->app->db->name('ShopGoodsCate')->where($map)->order('sort desc,id desc');
- return DataExtend::arr2tree($query->withoutField('sort,status,deleted,create_at')->select()->toArray());
- }
- /**
- * 获取分类数据
- * @param boolean $simple 简化数据
- * @return array
- */
- public function getCateData($simple = true): array
- {
- $cates = $this->app->db->name('ShopGoodsCate')->column('id,pid,name', 'id');
- foreach ($cates as $cate) if (isset($cates[$cate['pid']])) {
- $cates[$cate['id']]['parent'] =& $cates[$cate['pid']];
- }
- foreach ($cates as $key => $cate) {
- $id = $cate['id'];
- $cates[$id]['ids'][] = $cate['id'];
- $cates[$id]['names'][] = $cate['name'];
- while (isset($cate['parent']) && $cate = $cate['parent']) {
- $cates[$id]['ids'][] = $cate['id'];
- $cates[$id]['names'][] = $cate['name'];
- }
- $cates[$id]['ids'] = array_reverse($cates[$id]['ids']);
- $cates[$id]['names'] = array_reverse($cates[$id]['names']);
- if ($simple && count($cates[$id]['names']) !== $this->getCateMax()) {
- unset($cates[$key]);
- }
- }
- return $cates;
- }
- /**
- * 获取商品标签数据
- * @return array
- */
- public function getMarkData(): array
- {
- $map = ['status' => 1];
- $query = $this->app->db->name('ShopGoodsMark');
- return $query->where($map)->order('sort desc,id desc')->column('name');
- }
- /**
- * 最大分类级别
- * @return integer
- */
- public function getCateMax(): int
- {
- return 3;
- }
- /**
- * 商品数据绑定
- * @param array $data 商品主数据
- * @param boolean $simple 简化数据
- * @return array
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\DbException
- * @throws \think\db\exception\ModelNotFoundException
- */
- public function buildData(array &$data = [], $simple = true): array
- {
- [$cates, $codes] = [$this->getCateData(), array_unique(array_column($data, 'code'))];
- $marks = $this->app->db->name('ShopGoodsMark')->where(['status' => 1])->column('name');
- $items = $this->app->db->name('ShopGoodsItem')->whereIn('goods_code', $codes)->where(['status' => 1])->select()->toArray();
- foreach ($data as &$vo) {
- [$vo['marks'], $vo['cateids'], $vo['cateinfo']] = [str2arr($vo['marks'], ',', $marks), str2arr($vo['cateids']), []];
- [$vo['slider'], $vo['specs'], $vo['items']] = [str2arr($vo['slider'], '|'), json_decode($vo['data_specs'], true), []];
- foreach ($cates as $cate) if (in_array($cate['id'], $vo['cateids'])) $vo['cateinfo'] = $cate;
- foreach ($items as $item) if ($item['goods_code'] === $vo['code']) $vo['items'][] = $item;
- if ($simple) unset($vo['marks'], $vo['sort'], $vo['status'], $vo['deleted'], $vo['data_items'], $vo['data_specs'], $vo['cateinfo']['parent']);
- }
- return $data;
- }
- }
|