| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649 |
- <?php
- namespace bizHd\item\classes;
- use biz\item\classes\PtItemCatClass;
- use biz\item\classes\PtItemCatRelateClass;
- use biz\item\classes\PtItemClass;
- use biz\item\classes\PtItemClassClass;
- use bizGhs\order\classes\CheckOrderClass;
- use bizGhs\order\classes\CheckOrderItemClass;
- use bizGhs\stock\classes\StockRecordClass;
- use bizHd\base\classes\BaseClass;
- use bizHd\product\classes\ProductClass;
- use bizHd\shop\classes\ShopClass;
- use common\components\imgUtil;
- use common\components\orderSn;
- use common\components\stringUtil;
- use common\components\util;
- use common\services\xhItemService;
- use Yii;
- class ItemClass extends BaseClass
- {
- public static $baseFile = '\bizHd\item\models\Item';
- //修改product
- public static function updateProduct($data, $shop)
- {
- $id = $data['id'] ?? 0;
- $sjId = $shop->sjId ?? 0;
- $shopId = $shop->id ?? 0;
- $mainId = $shop->mainId ?? 0;
- $product = self::getLockById($id);
- if (empty($product)) {
- util::fail("该花材不存在");
- }
- $upData = [];
- //库存可以修改
- if (isset($data['stock']) && is_numeric($data['stock'])) {
- $preStock = $product->stock ?? 0;
- if ($data['stock'] != $preStock) {
- if ($data['stock'] < 0) {
- util::fail("库存不能小于0");
- }
- if (floor($data['stock']) != $data['stock']) {
- util::fail('库存请填写整数');
- }
- //增加盘点记录 2021.7.27
- $ratio = $product->ratio ?? 0;
- $formNum = self::formatStock($data['stock'], $ratio);
- $ghsItemInfo = [['productId' => $product->id, 'bigNum' => $formNum['bigNum'], 'smallNum' => $formNum['smallNum'],]];
- $pdData = [];
- $pdData['itemInfo'] = $ghsItemInfo;
- $pdData['sjId'] = $sjId;
- $pdData['shopId'] = $shopId;
- $pdData['adminId'] = $data['adminId'];
- $pdData['mainId'] = $mainId;
- $pdData['staffName'] = $data['staffName'] ?? '';
- CheckOrderClass::opOrder($pdData, false, false);
- }
- unset($data['stock']);
- }
- unset($data['adminId']);
- if (isset($data['name'])) {
- if (empty($data['name'])) {
- util::fail("请输入花材名称");
- }
- $upData['name'] = $data['name'];
- }
- if (isset($data['py']) && !empty($data['py'])) {
- $upData['py'] = $data['py'];
- }
- if (isset($data['cover']) && !empty($data['cover'])) {
- $upData['cover'] = $data['cover'];
- }
- if (isset($data['discountPrice']) && is_numeric($data['discountPrice'])) {
- $discountPrice = $data['discountPrice'] ?? 0;
- $currentPrice = $data['price'] ?? 0;
- if ($discountPrice >= $currentPrice) {
- util::fail('今日特价要小于售价');
- }
- $upData['discountPrice'] = $discountPrice;
- }
- //加价
- $upData['skAddPrice'] = $data['skAddPrice'] ?? 0;
- //价格
- $price = $data['skPrice'] ?? 0;
- if (is_numeric($price) == false || $price < 0) {
- util::fail('请填写价格');
- }
- $upData['skPrice'] = $price;
- if (isset($data['stockWarning'])) {
- $upData['stockWarning'] = $data['stockWarning'];
- }
- if (isset($data['inTurn'])) {
- $upData['inTurn'] = $data['inTurn'];
- }
- if (isset($data['delStatus'])) {
- $upData['delStatus'] = $data['delStatus'];
- }
- //分类ID
- if (isset($data["classId"])) {
- $classId = $data['classId'];
- $upData['classId'] = $classId;
- }
- $paramsBack = $upData;
- $ptItemId = $product->itemId ?? 0;
- //修改价格
- if ($price != $product->price) {
- self::changeSinglePrice($shop, $ptItemId, $price);
- unset($upData['skPrice']);
- }
- //修改其它
- self::updateById($id, $upData);
- if (isset($shop->default) && $shop->default == 1) {
- //首店修改同步到所有直营店
- $chainShopList = ShopClass::getAllByCondition(['sjId' => $sjId], null, '*', null, true);
- foreach ($chainShopList as $chainShop) {
- $chainShopId = $chainShop->id ?? 0;
- if (isset($chainShop->join) && $chainShop->join == 1) {
- continue;
- }
- if ($chainShopId == $shop->id) {
- //前面已经添加过了
- continue;
- }
- $params = $paramsBack;
- //所有直营店的分类、上下架、启用停用不同步
- unset($params['classId']);
- unset($params['status']);
- unset($params['delStatus']);
- $chainMainId = $chainShop->mainId ?? 0;
- $chainProduct = ProductClass::getByCondition(['mainId' => $chainMainId, 'itemId' => $ptItemId], true);
- if (empty($chainProduct)) {
- continue;
- }
- if ($price != $chainProduct->price) {
- self::changeSinglePrice($chainShop, $ptItemId, $price);
- unset($params['skPrice']);
- }
- self::updateById($chainProduct->id, $params);
- }
- }
- }
- //单个价格修改 ssh 20220503
- public static function changeSinglePrice($shop, $ptItemId, $price)
- {
- $mainId = $shop->mainId ?? 0;
- $productInfo = ProductClass::getByCondition(['itemId' => $ptItemId, 'mainId' => $mainId], true);
- if (empty($productInfo)) {
- return false;
- }
- $productInfo->skPrice = $price;
- $productInfo->save();
- }
- //新增花材
- public static function addItem($data, $currentShop)
- {
- $currentMainId = $currentShop->mainId ?? 0;
- $classId = $data['classId'] ?? 0;
- $mainId = $data['mainId'] ?? 0;
- $stockWarning = $data['stockWarning'] ?? false;
- $data['py'] = stringUtil::py($data['name']);
- $name = $data['name'] ?? false;
- $data['alias'] = $data['alias'] ?? '';
- $data['cover'] = isset($data['cover']) && !empty($data['cover']) ? $data['cover'] : '';
- $ratio = $data['ratio'] ?? false;
- $weight = $data['weight'] ?? false;
- $data['bigUnit'] = $data['bigUnit'] ?? '扎';
- $data['smallUnit'] = $data['smallUnit'] ?? '支';
- $data['shopId'] = $data['shopId'] ?? 0;
- $currentShopId = $data['shopId'];
- $data['sjId'] = $data['sjId'] ?? 0;
- if (!$data['sjId']) {
- util::fail("参数错误");
- }
- $stock = 0;
- if (isset($data['stock']) && is_numeric($data['stock'])) {
- if ($data['stock'] < 0) {
- util::fail("库存数不能小于0");
- }
- $stock = $data['stock'];
- }
- //没有库存则下架
- $data['status'] = $stock == 0 ? 2 : 1;
- if (!$classId) {
- util::fail("请选择分类");
- }
- if (isset($data['skPrice']) == false || is_numeric($data['skPrice']) == false || $data['skPrice'] < 0) {
- util::fail("请输入价格");
- }
- if (isset($data['skAddPrice']) == false || is_numeric($data['skAddPrice']) == false) {
- util::fail("请输入加价");
- }
- if ($stockWarning === false) {
- util::fail("请输入库存预警值");
- }
- if ($name === false) {
- util::fail("请输入花材名称");
- }
- if ($ratio === false) {
- util::fail("请输入花材比例");
- }
- if ($weight === false) {
- util::fail("请输入花材重量");
- }
- $cat = ItemClassClass::getById($classId, true);
- if (empty($cat)) {
- util::fail("花材分类不存在");
- }
- if ($cat->mainId != $mainId) {
- util::fail('不是您的分类');
- }
- $connection = Yii::$app->db;
- $transaction = $connection->beginTransaction();
- try {
- if (isset($data['itemId']) == false || empty($data['itemId'])) {
- //添加新品种先在平台新增花材
- $defaultInfo = PtItemClassClass::getByCondition(['isDefault' => 1]);
- $defaultClassId = $defaultInfo['id'] ?? 0;
- if (empty($defaultClassId)) {
- Yii::info('添加花材时没有找到默认分类');
- util::fail('添加失败');
- }
- $itemData = $data;
- $itemData['classId'] = $defaultClassId;
- $itemData['skAddPrice'] = $itemData['skAddPrice'] ?? 3;
- $itemData['hjAddPrice'] = $itemData['hjAddPrice'] ?? 2;
- $itemData['zsAddPrice'] = $itemData['zsAddPrice'] ?? 1;
- $ptItemInfo = PtItemClass::addItem($itemData);
- $data['itemId'] = $ptItemInfo['id'];
- } else {
- //从平台导入花材
- $has = self::getByCondition(['mainId' => $mainId, 'itemId' => $data['itemId']], true);
- if (!empty($has)) {
- util::fail('已经导入过了哈');
- }
- }
- $ptItemId = $data['itemId'] ?? 0;
- $res = self::add($data, true);
- if ($stock > 0) {
- //有库存数量,增加盘盈记录 2021.7.9 lqh
- //增加盘点订单
- $pdOrderSn = orderSn::getGhsCheckSn();
- $pdOrderData = [];
- $pdOrderData['orderSn'] = $pdOrderSn;
- $pdOrderData['sjId'] = $data['sjId'];
- $pdOrderData['shopId'] = $data['shopId'];
- $pdOrderData['status'] = CheckOrderClass::STATUS_COMPLETE;
- $pdOrderData['bigNum'] = $stock;
- $pdOrderData['adminId'] = $data['adminId'];
- $pdOrderData['smallNum'] = 0;
- $pdOrderData['price'] = $data['price'];
- $pdOrderData['remark'] = '添加花材时初始化库存';
- CheckOrderClass::add($pdOrderData);
- $pdOrderItemData = [];
- $pdOrderItemData['orderSn'] = $pdOrderSn;
- $pdOrderItemData['productId'] = $res->id;
- $pdOrderItemData['itemId'] = $data['itemId'];
- $pdOrderItemData['itemId'] = $data['itemId'];
- $pdOrderItemData['itemNum'] = $stock;
- $pdOrderItemData['itemStock'] = 0;
- $pdOrderItemData['profitLostNum'] = $stock;
- $itemInfo = [
- 'itemName' => $name,
- 'itemCover' => $data['cover'],
- 'bigNum' => $stock,
- 'smallNum' => 0,
- 'bigNumStock' => 0,
- 'smallNumStock' => 0,
- 'bigNumProfitLoss' => $stock,
- 'smallNumProfitLoss' => 0,
- 'itemUnit' => 0,
- 'ratio' => $ratio,
- 'rank' => 'A',
- 'bigUnit' => $data['bigUnit'],
- 'smallUnit' => $data['smallUnit'],
- ];
- $pdOrderItemData['itemInfo'] = json_encode($itemInfo);
- $pdOrderItemData['itemPrice'] = $data['price'];
- $pdOrderItemData['itemCost'] = $data['cost'];
- CheckOrderItemClass::add($pdOrderItemData);
- $record = [];
- $record['sjId'] = $data['sjId'];
- $record['shopId'] = $data['shopId'];
- //增加中央ID
- $record['mainId'] = $currentMainId;
- $record['orderSn'] = $pdOrderSn;
- $record['itemId'] = $data['itemId'];
- $record['productId'] = $res->id;
- $record['itemNum'] = $stock;//盈亏数
- $record['oldStock'] = 0;
- $record['newStock'] = $stock; //新库存直接等于盘点的数量
- StockRecordClass::addCheckOrderRecord($record);
- }
- if (isset($currentShop->default) && $currentShop->default == 1) {
- //找到父级sj下的所有直营店,添加花材
- $shopList = ShopClass::getAllByCondition(['sjId' => $data['sjId']], null, '*', null, true);
- foreach ($shopList as $shop) {
- if (isset($shop->join) && $shop->join == 1) {
- continue;
- }
- $shopId = $shop->id ?? 0;
- if ($shopId == $currentShop->id) {
- //前面已经添加过了
- continue;
- }
- $thisMainId = $shop->mainId ?? 0;
- $data['shopId'] = $shopId;
- $data['mainId'] = $thisMainId;
- //不是当前门店,库存默认为0并且是下架状态
- //不是当前门店,花材分类放在默认分类下
- if ($currentShopId != $shopId) {
- $data['stock'] = 0;
- $data['status'] = 2;
- $defaultCat = ItemClassClass::getByCondition(['mainId' => $thisMainId, 'isDefault' => 1], true);
- $defaultCatId = $defaultCat->id ?? 0;
- if (empty($defaultCatId)) {
- util::fail($shop->shopName . "没有默认分类");
- }
- $data['classId'] = $defaultCatId;
- }
- //已经有了不再添加
- $chainHas = self::getByCondition(['mainId' => $thisMainId, 'itemId' => $ptItemId], true);
- if (!empty($chainHas)) {
- continue;
- }
- self::add($data);
- }
- }
- $transaction->commit();
- } catch (\Exception $exception) {
- $transaction->rollBack();
- Yii::info('失败原因:' . $exception->getMessage());
- util::fail('添加失败');
- }
- }
- //初始化花材 lqh 2021.4.12 modify ssh 20210711
- public static function initItem($mainId)
- {
- $ptClass = PtItemCatClass::getAllList("*", ['type' => 1], 'inTurn desc');
- if (empty($ptClass)) {
- return false;
- }
- $hasClassIds = array_column($ptClass, 'id');
- $relate = PtItemCatRelateClass::getAllByCondition(['catId' => ['in', $hasClassIds]], null, '*');
- $relateInfo = [];
- $hasItemIds = [];
- if (!empty($relate)) {
- foreach ($relate as $key => $val) {
- $catId = $val['catId'] ?? 0;
- $itemId = $val['itemId'] ?? 0;
- $relateInfo[$catId][] = $itemId;
- $hasItemIds[] = $itemId;
- }
- $hasItemIds = array_unique(array_filter($hasItemIds));
- }
- $itemInfo = PtItemClass::getAllByCondition(['id' => ['in', $hasItemIds]], null, '*', 'id');
- foreach ($ptClass as $v) {
- $classId = $v['id'];
- $className = $v['name'];
- $inTurn = $v['inTurn'];
- $classData = [
- 'mainId' => $mainId,
- 'name' => $className,
- 'inTurn' => $inTurn,
- ];
- //初始化花材分类
- $addClassRespond = ItemClassClass::add($classData);
- $ghsClassId = $addClassRespond['id'];
- if (isset($relateInfo[$classId]) == false) {
- continue;
- }
- $itemAddData = [];
- $productAddData = [];
- foreach ($relateInfo[$classId] as $currentId) {
- if (isset($itemInfo[$currentId]) == false) {
- continue;
- }
- $currentItem = $itemInfo[$currentId] ?? [];
- unset($currentItem['addTime']);
- unset($currentItem['updateTime']);
- $itemData = $currentItem;
- $itemData['classId'] = $ghsClassId;
- $itemData['itemId'] = $currentItem['id'];
- unset($itemData['id']);
- $itemData['rank'] = 'A';
- $itemAddData[] = $itemData;
- $productData = $currentItem;
- $productData['mainId'] = $mainId;
- $productData['itemId'] = $currentItem['id'];
- $productData['classId'] = $ghsClassId;
- unset($productData['id']);
- $productData['rank'] = 'B';
- $productData['price'] = bcadd($currentItem['cost'], $currentItem['addPrice'], 2);
- //花材默认是下架状态
- $productData['status'] = 2;
- $productAddData[] = $productData;
- }
- if (empty($itemAddData)) {
- continue;
- }
- ProductClass::batchAdd($productAddData);
- }
- //增加默认分类
- $classData = ['mainId' => $mainId, 'name' => '默认分类', 'inTurn' => -1, 'isDefault' => 1,];
- ItemClassClass::add($classData);
- }
- //从首店复制花材和分类 ssh 20220522
- public static function copyItem($oldMainId, $newMainId)
- {
- $classList = ItemClassClass::getAllByCondition(['mainId' => $oldMainId], null, '*');
- $classMap = [];
- if (!empty($classList)) {
- foreach ($classList as $class) {
- $preId = $class['id'] ?? 0;
- $class['mainId'] = $newMainId;
- $class['shopId'] = 0;
- unset($class['addTime']);
- unset($class['updateTime']);
- unset($class['id']);
- $ret = ItemClassClass::add($class, true);
- $newId = $ret->id ?? 0;
- $classMap[$preId] = $newId;
- }
- }
- $itemList = self::getAllByCondition(['mainId' => $oldMainId], null, '*');
- if (!empty($itemList)) {
- foreach ($itemList as $item) {
- unset($item['stock']);
- unset($item['addTime']);
- unset($item['updateTime']);
- unset($item['id']);
- $preId = $item['classId'] ?? 0;
- $newId = $classMap[$preId] ?? 0;
- $item['classId'] = $newId;
- $item['mainId'] = $newMainId;
- $item['shopId'] = 0;
- self::add($item);
- }
- }
- }
- public static function getShowList($where)
- {
- $level = 0;
- $list = self::getAllByCondition($where, ['inTurn' => SORT_DESC, 'actualSold' => SORT_DESC], "*");
- if (empty($list)) {
- return $list;
- }
- $list = self::groupProductInfo($list, $level);
- $data = [];
- $data[ItemClassClass::TJ_CLASS_ID] = [];
- foreach ($list as $it) {
- $classId = $it['classId'] ?? 0;
- $data[$classId][] = $it;
- if (isset($it['discountPrice']) && $it['discountPrice'] > 0) {
- $data[ItemClassClass::TJ_CLASS_ID][] = $it;
- }
- }
- return $data;
- }
- //花材图片,名称,大小单位,小单位价格
- public static function groupProductInfo($list, $level = 0)
- {
- foreach ($list as $k => $v) {
- $shortCover = $v['cover'] ?? '';
- $cover = imgUtil::getPrefix() . 'hhb_small.png';
- $bigCover = imgUtil::getPrefix() . 'hhb_small.png';
- if (!empty($shortCover)) {
- $parse = parse_url(self::groupImg($shortCover));
- if (empty($parse['query'])) {
- $cover = self::groupImg($shortCover) . "?x-oss-process=image/resize,m_fill,h_110,w_110";
- } else {
- $cover = self::groupImg($shortCover);
- }
- $bigCover = imgUtil::groupImg($shortCover) . "?x-oss-process=image/resize,m_fill,h_700,w_700";
- }
- $ratio = isset($v['ratio']) && $v['ratio'] > 0 ? $v['ratio'] : 1;
- $stockInfo = self::formatStock($v['stock'], $ratio);
- $list[$k]['cover'] = $cover;
- $list[$k]['bigCover'] = $bigCover;
- $list[$k]['shortCover'] = $shortCover;
- $list[$k]['bigNum'] = $stockInfo['bigNum'];
- $list[$k]['smallNum'] = $stockInfo['smallNum'];
- $list[$k]['itemName'] = $v['name'] ?? '';
- $skPrice = $v['skPrice'] ?? 0;
- $list[$k]['prePrice'] = $skPrice;
- $list[$k]['price'] = $skPrice;
- $list[$k]['bigPrice'] = $skPrice;
- $smallRatio = $v['smallRatio'] ?? 0;
- $div = bcdiv($skPrice, $ratio, 2);
- $smallPrice = bcmul($div, $smallRatio, 2);
- $list[$k]['smallPrice'] = $smallPrice;
- }
- return $list;
- }
- //花材的库存转换: 库存是小数,根据各个花材的unitNum, 计算出多少扎,多少支
- public static function formatStock($stock, $unitNum)
- {
- $pn = true; //正数
- if ($stock < 0) {
- $pn = false;
- $stock = abs($stock);
- }
- $bigNum = floor($stock); // 扎
- $stockArr = explode('.', $stock);
- $smallNum = 0; //支
- if (count($stockArr) === 2) {
- $smallNum = bcmul(($stock - $bigNum), $unitNum);
- }
- if (!$pn) {
- $bigNum *= -1;
- $smallNum *= -1;
- }
- return [
- 'bigNum' => $bigNum,
- 'smallNum' => $smallNum,
- ];
- }
- //列表数据
- public static function getItemList($where)
- {
- $data = self::getList('*', $where, 'inTurn DESC');
- $list = isset($data['list']) && !empty($data['list']) ? $data['list'] : [];
- if (empty($list)) {
- return $data;
- }
- $itemIds = array_column($list, 'itemId');
- $itemData = xhItemService::getByIds($itemIds);
- $itemData = array_column($itemData, null, 'id');
- foreach ($list as $k => $v) {
- $list[$k]['itemName'] = $itemData[$v['itemId']]['name'] ?? '';
- }
- $data['list'] = $list;
- return $data;
- }
- //批量新增花材(初始化使用)
- public static function batchAddItem($data)
- {
- return true;
- }
- //修改花材的信息(库存预警、每扎加价、每扎重量)
- public static function updateItem($id, $stockWarning, $addPrice, $weight, $cost)
- {
- $model = self::getById($id);
- if (!$model) {
- util::fail("该花材不存在");
- }
- $data['stockWarning'] = $stockWarning;
- $data['addPrice'] = $addPrice;
- $data['weight'] = $weight;
- $data['cost'] = $cost;
- self::updateById($id, $data);
- return true;
- }
- //删除花材
- public static function deleteItem($id)
- {
- self::deleteById($id);
- return true;
- }
- //根据花材分类ID,获取itemIds
- public static function getItemIdsByClassId($classId)
- {
- $data = self::getAllList("itemId", ['classId' => $classId]);
- if ($data) {
- $data = array_column($data, 'itemId');
- }
- return $data;
- }
- //获取当前供货商下的所有item
- public static function getItemAll($sjId, $select = "*")
- {
- $where = [
- 'sjId' => $sjId
- ];
- $data = self::getAllList($select, $where);
- return $data;
- }
- //根据拼音名称,获取itemIds
- public static function getItemIdsByPyName($pyName)
- {
- //统一转小写
- $pyName = strtolower($pyName);
- $where = ['py' => $pyName];
- $data = xhItemService::getAllByCondition($where, null, 'id');
- if ($data) {
- $data = array_column($data, 'id');
- }
- return $data;
- }
- //获取某个花材的信息 lqh 2021.1.28
- public static function getItemData($itemId, $sjId)
- {
- return self::getByCondition(['itemId' => $itemId, 'sjId' => $sjId]);
- }
- //修改某个花材的成本价(采购之后要用到) lqh 2021.1.28
- public static function changeCost($itemId, $sjId, $cost)
- {
- return self::updateByCondition(['itemId' => $itemId, 'sjId' => $sjId], ['cost' => $cost]);
- }
- }
|