200], [['goods_attr_name', 'sign_id', 'pic_url'], 'string', 'max' => 255], ]; } /** * {@inheritdoc} */ public function attributeLabels() { return [ 'id' => '订单项ID', 'cashier_order_id' => '收银台订单ID', 'user_id' => '用户id', 'mall_id' => '商城ID', 'goods_id' => '商品ID', 'goods_name' => '商品名称', 'goods_attr_id' => '规格ID', 'goods_attr_name' => '规格名称', 'sign_id' => '规格ID标识', 'attr_groups_format' => '格式化规格组', 'price' => '商品价格', 'cost_price' => '商品成本价', 'original_goods_price' => '商品原本总价', 'goods_price' => '商品优惠后总价', 'num' => '购买数量', 'pic_url' => '商品图片', 'order_status' => '订单状态【0待付款 1待发货 2 已发货 3已收货 4已完成 -1申请售后 -2售后中 -3售后完成 -4 已关闭 -5撤销售后】', 'is_virtual' => '是否包含 虚拟商品 0 不包含 1 包含', 'status' => '状态[-1:删除;0:禁用;1启用]', 'extra_info' => '额外信息', 'created_at' => 'Created At', 'updated_at' => 'Updated At', 'store_id' => '门店id', ]; } /** * @Description: 批量保存数据 * @Author: zsan * @DateTime 2023-08-10 18:27:53 * @param array $attrs * @param array $info * @return boolean * @throws \Exception */ public static function batchDataSave($attrs, $info) { $cashier_order_id = $info['cashier_order_id']; $user_id = $info['user_id']; $mall_id = $info['mall_id']; $store_id = $info['store_id']; $goods_attrs = StoreGoodsAttr::lists([ 'where' => [['id' => array_column($attrs, 'attr_id')], ['status' => StatusEnum::ENABLED]], 'with' => ['goods' => function ($q) { return $q->select('id, goods_name, goods_type, cover_pic'); }] ]); if (empty($goods_attrs)) throw new \Exception('商品属性ID错误'); $nums = array_column($attrs, 'num', 'attr_id'); $goods_type = []; $goods_stock_ids = []; foreach ($goods_attrs as $v) { $result = StoreGoodsAttr::handleStock($v['id'], $nums[$v['id']] * -1); if ($result === false) { throw new \Exception(StoreGoodsAttr::getStaticError()); } $goods_stock_ids[] = $v['goods_id']; $goods_type[$v['goods_id']] = $v['goods']['goods_type']; } $stock_locks = []; foreach($goods_stock_ids as $id){ $lock_key = RedisKeyEnum::suffix(RedisKeyEnum::LOCK_GOODS , $id); $identification = uniqid(); if (!LockHelper::lock($lock_key, $identification, 30, 60)) throw new \Exception('当前访问人数过多'); $stock_locks[$lock_key] = $identification; $stock = StoreGoodsAttr::find()->where(['goods_id'=>$id])->sum('stock'); $stock=$stock??0; $res = StoreGoods::updateAll(['stock'=>$stock],['id'=>$id]); if(!$res) throw new \Exception(StoreGoods::getStaticError()); } LockHelper::batchUlock($stock_locks); $rows = []; foreach ($goods_attrs as $goods_attr) { $rows[] = [ $cashier_order_id, $user_id, $mall_id, $store_id, $goods_attr['goods_id'], $goods_attr['goods']['goods_name'], $goods_attr['id'], $goods_attr['name'], $goods_attr['sign_id'], $goods_attr['price'], $goods_attr['cost_price'], bcmul($goods_attrs['original_goods_price'], $nums[$goods_attr['id']], 2), $info['pay_money'], $nums[$goods_attr['id']],$goods_type[$goods_attr['goods_id']],($goods_attr['pic_url'] ? $goods_attr['pic_url'] : $goods_attr['goods']['cover_pic']), OrderStatusEnum::NOT_PAY, StatusEnum::ENABLED, time(), time() ]; } $columns = [ 'cashier_order_id', 'user_id', 'mall_id', 'store_id', 'goods_id', 'goods_name', 'goods_attr_id', 'goods_attr_name', 'sign_id', 'price', 'cost_price', 'original_goods_price', 'goods_price', 'num', 'is_virtual', 'pic_url', 'order_status', 'status', 'created_at', 'updated_at' ]; $res = \Yii::$app->db->createCommand()->batchInsert(self::tableName(), $columns, $rows)->execute(); if ($res == 0) { throw new \Exception('订单详情数据存储失败'); } return true; } }