| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- <?php
- /**
- * 我的地址
- */
- namespace app\common\model;
- use think\facade\Db;
- use think\Model;
- use utils\RedisCache;
- class UserAddressModel extends Model
- {
- protected $name = 'user_address';
- /**
- * 保存地址
- * @param $param
- * @return string
- */
- public function saveUserAddress ($param)
- {
- self::startTrans();
- try {
- $data = $param->data;
- if (isset($data['is_default']) && $data['is_default'] && $data['is_default'] == 1) {
- self::where('uid', $param->uid)->save(['is_default' => 0]);
- }
- if (isset($data['id']) && $data['id']) { // 修改
- $data['mergename'] = $data['area_text'] . $data['remark'];
- self::update($data);
- } else {
- $insert = [
- 'remark' => $data['remark'],
- 'province' => $data['province'],
- 'city' => $data['city'],
- 'county' => $data['county'],
- 'name' => $data['name'],
- 'mobile' => $data['mobile'],
- 'is_default' => isset($data['is_default']) ? $data['is_default'] : 0,
- ];
- $insert['mergename'] = $data['area_text'] . $data['remark'];
- $insert['uid'] = $param->uid;
- self::insert($insert);
- }
- RedisCache::keyDel("caches:address:user:u_{$param->uid}_*");
- self::commit();
- } catch (\Exception $e) {
- self::rollback();
- return api_error_return('保存失败');
- }
- return api_succ_return('保存成功');
- }
- /**
- * 设置默认地址
- * @param $param
- * @return mixed
- */
- public function setDefaultAddress ($param)
- {
- self::startTrans();
- try {
- if (!self::where(['id' => $param->data['id']])->value('id')){
- return api_error_return('参数错误');
- }
- self::where('uid', $param->uid)->save(['is_default' => 0]);
- self::where(['id' => $param->data['id'], 'uid' => $param->uid])->save(['is_default' => 1]);
- RedisCache::keyDel("caches:address:user:u_{$param->uid}_*");
- self::commit();
- } catch (\Exception $e) {
- self::rollback();
- return api_error_return('设置失败');
- }
- return api_succ_return('设置成功');
- }
- /**
- * 删除地址
- * @param $param
- * @return string
- */
- public function delUserAddress ($param)
- {
- try {
- $addressId = isset($param->data['id'])? intval($param->data['id']) : 0;
- if (!self::where(['id' => $addressId])->find()){
- return api_error_return('参数错误');
- }
- self::where(['id' => $addressId, 'uid' => $param->uid])->delete();
- // 清除缓存
- RedisCache::keyDel("caches:address:user:u_{$param->uid}_*");
- RedisCache::clear("caches:address:info:{$addressId}");
- } catch (\Exception $e) {
- return api_error_return('删除失败');
- }
- return api_succ_return('删除成功');
- }
- /**
- * 获取我的地址
- * @param $param
- * @return mixed
- */
- public function getUserAddress ($param, $is_default)
- {
- try {
- $cacheKey = "caches:address:user:u_{$param->uid}_$is_default";
- $list = RedisCache::get($cacheKey);
- if($list){
- return api_succ_return(['msg'=>'获取缓存成功', 'data'=>$list]);
- }
- $list = self::where('uid', $param->uid)
- ->where('is_default', 'in', ($is_default==1?['1']:['1', '0']))
- ->order('is_default desc')
- ->select();
- if (empty($list->toArray())){
- return api_succ_return(['msg'=>'获取成功', 'data'=>null]);
- }
- foreach ($list as $k => $v) {
- $list[$k]['area_text'] = Db::name('area')->where('id', 'in', $v['province'] . ',' . $v['city'] . ',' . $v['county'])->value('GROUP_CONCAT(name separator "")');
- }
- $list = $list->toArray();
- RedisCache::set($cacheKey, $list, rand(10, 20));
- return api_succ_return(['msg'=>'获取成功', 'data'=> $list]);
- } catch (\Exception $e) {
- return api_error_return('获取失败');
- }
- }
- /**
- * 获取地址信息/或用户默认地址
- * @param int $addressId 地址ID,
- * @param int $uid 用户ID,无地址ID必传
- * @param int $returnDefault 是否返回默认地址
- * @return array
- */
- public static function getAddressIdDetails (int $addressId, $uid=0, $returnDefault=0): array
- {
- $cacheKey = "caches:address:info:{$addressId}_{$uid}_{$returnDefault}";
- $data = RedisCache::get($cacheKey);
- if($data){
- return $data;
- }
- $field = 'a.id,a.uid,a.name,a.mobile,a.province, a1.name as sp_province,a.city,a2.name as sp_city,a.county,a3.name as sp_county,a.mergename,a.remark';
- $data = self::alias('a')
- ->leftJoin('area a1','a1.id=a.province')
- ->leftJoin('area a2','a2.id=a.city')
- ->leftJoin('area a3','a3.id=a.county')
- ->where(function($query) use($addressId, $uid, $returnDefault){
- if($uid){
- $query->where('a.uid', $uid);
- }
- if($addressId){
- $query->where('a.id', $addressId);
- }else if($returnDefault){
- $query->where('a.is_default', 1);
- }
- })
- ->field($field)
- ->findOrEmpty()->toArray();
- if($data){
- RedisCache::set($cacheKey, $data, rand(5,10));
- }
- return $data;
- }
- }
|